提交 abe49e6c authored 作者: Pascal Lamblin's avatar Pascal Lamblin

Do not constant-fold Alloc if it is the output

Also fix an optimization bug in that case.
上级 daf7d9c9
...@@ -2005,14 +2005,19 @@ class GpuAlloc(Op): ...@@ -2005,14 +2005,19 @@ class GpuAlloc(Op):
return (3,) return (3,)
def do_constant_folding(self, node): def do_constant_folding(self, node):
if any([isinstance(client[0].op, ( for client in node.outputs[0].clients:
if client[0] == 'output':
# If the output is a constant, it will have to be deepcopied
# each time the function is called. So we do not fold.
return False
elif (not isinstance(client[0], basestring)
and isinstance(client[0].op, (
tensor.IncSubtensor, tensor.IncSubtensor,
tensor.AdvancedIncSubtensor1, tensor.AdvancedIncSubtensor1,
GpuIncSubtensor, GpuIncSubtensor,
GpuAdvancedIncSubtensor1 GpuAdvancedIncSubtensor1
)) ))):
for client in node.outputs[0].clients]): return False
return False
return True return True
gpu_alloc = GpuAlloc() gpu_alloc = GpuAlloc()
......
...@@ -2617,12 +2617,18 @@ class Alloc(gof.Op): ...@@ -2617,12 +2617,18 @@ class Alloc(gof.Op):
return self.make_node(eval_points[0], *inputs[1:]).outputs return self.make_node(eval_points[0], *inputs[1:]).outputs
def do_constant_folding(self, node): def do_constant_folding(self, node):
if python_any([isinstance(client[0].op, (IncSubtensor, for client in node.outputs[0].clients:
AdvancedIncSubtensor1, if client[0] == 'output':
AdvancedIncSubtensor, # If the output is a constant, it will have to be deepcopied
)) # each time the function is called. So we do not fold.
for client in node.outputs[0].clients]): return False
return False elif (not isinstance(client[0], basestring)
and isinstance(client[0].op, (
IncSubtensor,
AdvancedIncSubtensor1,
AdvancedIncSubtensor,
))):
return False
return True return True
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论