提交 8a8bfaaa authored 作者: Frederic Bastien's avatar Frederic Bastien

Fix crash when calling perform on a node where make_thunk wasn't called.

上级 7ef44dfd
...@@ -508,12 +508,6 @@ class Elemwise(OpenMPOp): ...@@ -508,12 +508,6 @@ class Elemwise(OpenMPOp):
self.nfunc_spec = nfunc_spec self.nfunc_spec = nfunc_spec
if nfunc_spec: if nfunc_spec:
self.nfunc = getattr(numpy, nfunc_spec[0]) self.nfunc = getattr(numpy, nfunc_spec[0])
elif scalar_op.nin > 0 and scalar_op.nin < 32:
# NumPy ufunc support only up to 31 inputs.
# But our c code support more.
# when nin == -1, we will build the ufunc in the make_thunk.
self.ufunc = numpy.frompyfunc(scalar_op.impl, scalar_op.nin,
scalar_op.nout)
# precompute the hash of this node # precompute the hash of this node
self._rehash() self._rehash()
...@@ -800,13 +794,22 @@ class Elemwise(OpenMPOp): ...@@ -800,13 +794,22 @@ class Elemwise(OpenMPOp):
def make_thunk(self, node, storage_map, compute_map, no_recycling): def make_thunk(self, node, storage_map, compute_map, no_recycling):
node_ = node node_ = node
if self.ufunc is None and self.scalar_op.nin == -1: # Postpone the ufunc building to the last minutes
node_ = copy(node) # NumPy ufunc support only up to 31 inputs.
assert node.op is node_.op # But our c code support more.
if (len(node.inputs) < 32 and
(self.nfunc is None or
self.scalar_op.nin != len(node.inputs)) and
self.ufunc is None):
ufunc = numpy.frompyfunc(self.scalar_op.impl, ufunc = numpy.frompyfunc(self.scalar_op.impl,
len(node.inputs), len(node.inputs),
self.scalar_op.nout) self.scalar_op.nout)
node_.op.ufunc = ufunc if self.scalar_op.nin > 0:
# We can reuse it for many nodes
self.ufunc = ufunc
else:
node.tag.ufunc = ufunc
return super(Elemwise, node_.op).make_thunk(node_, storage_map, return super(Elemwise, node_.op).make_thunk(node_, storage_map,
compute_map, no_recycling) compute_map, no_recycling)
...@@ -882,6 +885,13 @@ class Elemwise(OpenMPOp): ...@@ -882,6 +885,13 @@ class Elemwise(OpenMPOp):
if self.ufunc: if self.ufunc:
ufunc = self.ufunc ufunc = self.ufunc
else: else:
if not hasattr(node.tag, 'ufunc'):
# It happen that make_thunk isn't called, like in
# get_scalar_constant_value
node.tag.ufunc = numpy.frompyfunc(self.scalar_op.impl,
len(node.inputs),
self.scalar_op.nout)
ufunc = node.tag.ufunc ufunc = node.tag.ufunc
nout = ufunc.nout nout = ufunc.nout
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论