提交 8c4c0074 authored 作者: James Bergstra's avatar James Bergstra

added try/finally in OpWiseCLinker.make_all to release lock

上级 399c0721
...@@ -818,85 +818,87 @@ class OpWiseCLinker(link.LocalLinker): ...@@ -818,85 +818,87 @@ class OpWiseCLinker(link.LocalLinker):
# Acquire lock on compilation directory. # Acquire lock on compilation directory.
get_lock() get_lock()
try:
env = self.env env = self.env
order = env.toposort() order = env.toposort()
no_recycling = self.no_recycling no_recycling = self.no_recycling
input_storage, output_storage, storage_map = link.map_storage(env, order, input_storage, output_storage)
if self.allow_gc:
computed, last_user = link.gc_helper(order)
post_thunk_old_storage = []
else:
post_thunk_old_storage = None
thunks = []
for node in order:
node_input_storage = [storage_map[r] for r in node.inputs]
node_output_storage = [storage_map[r] for r in node.outputs]
try:
e = Env(*graph.clone(node.inputs, node.outputs))
e.toposort = lambda: e.nodes
if any(isinstance(input, graph.Value) for input in node.inputs): input_storage, output_storage, storage_map = link.map_storage(env, order, input_storage, output_storage)
desc = None if self.allow_gc:
else: computed, last_user = link.gc_helper(order)
desc = (node.op, post_thunk_old_storage = []
tuple(input.type for input in node.inputs), else:
tuple(input.type for input in node.inputs), post_thunk_old_storage = None
tuple(output in no_recycling for output in node.outputs),
tuple(node.inputs.count(input) for input in node.inputs))
thunks = []
for node in order:
node_input_storage = [storage_map[r] for r in node.inputs]
node_output_storage = [storage_map[r] for r in node.outputs]
try: try:
cl = self.__cache__.get(desc) e = Env(*graph.clone(node.inputs, node.outputs))
except Exception, exc: e.toposort = lambda: e.nodes
#print >> sys.stderr, "INFO: failed to hash %s: %s. Node will not be cached." % (node, exc)
cl = None if any(isinstance(input, graph.Value) for input in node.inputs):
if cl is None: desc = None
cl = CLinker().accept(e, [r for r, r2 in zip(e.outputs, node.outputs) if r2 in no_recycling]) else:
if desc is not None: desc = (node.op,
try: tuple(input.type for input in node.inputs),
self.__cache__[desc] = cl tuple(input.type for input in node.inputs),
except: tuple(output in no_recycling for output in node.outputs),
pass tuple(node.inputs.count(input) for input in node.inputs))
thunk, node_input_filters, node_output_filters = cl.make_thunk( try:
input_storage = node_input_storage, cl = self.__cache__.get(desc)
output_storage = node_output_storage) except Exception, exc:
thunk.inputs = node_input_storage #print >> sys.stderr, "INFO: failed to hash %s: %s. Node will not be cached." % (node, exc)
thunk.outputs = node_output_storage cl = None
thunks.append(thunk) if cl is None:
except (NotImplementedError, utils.MethodNotDefined): cl = CLinker().accept(e, [r for r, r2 in zip(e.outputs, node.outputs) if r2 in no_recycling])
if self.fallback_on_perform: if desc is not None:
p = node.op.perform try:
thunk = lambda p = p, i = node_input_storage, o = node_output_storage, n = node: p(n, [x[0] for x in i], o) self.__cache__[desc] = cl
except:
pass
thunk, node_input_filters, node_output_filters = cl.make_thunk(
input_storage = node_input_storage,
output_storage = node_output_storage)
thunk.inputs = node_input_storage thunk.inputs = node_input_storage
thunk.outputs = node_output_storage thunk.outputs = node_output_storage
thunk.perform = p
thunks.append(thunk) thunks.append(thunk)
else: except (NotImplementedError, utils.MethodNotDefined):
raise if self.fallback_on_perform:
p = node.op.perform
if self.allow_gc: thunk = lambda p = p, i = node_input_storage, o = node_output_storage, n = node: p(n, [x[0] for x in i], o)
post_thunk_old_storage.append([storage_map[input] thunk.inputs = node_input_storage
for input in node.inputs thunk.outputs = node_output_storage
if (input in computed) and (input not in env.outputs) and node == last_user[input]]) thunk.perform = p
thunks.append(thunk)
if no_recycling is True: else:
no_recycling = storage_map.values() raise
no_recycling = utils.difference(no_recycling, input_storage)
else: if self.allow_gc:
no_recycling = [storage_map[r] for r in no_recycling if r not in env.inputs] post_thunk_old_storage.append([storage_map[input]
for input in node.inputs
if (input in computed) and (input not in env.outputs) and node == last_user[input]])
if no_recycling is True:
no_recycling = storage_map.values()
no_recycling = utils.difference(no_recycling, input_storage)
else:
no_recycling = [storage_map[r] for r in no_recycling if r not in env.inputs]
f = link.streamline(env, thunks, order, f = link.streamline(env, thunks, order,
post_thunk_old_storage, post_thunk_old_storage,
no_recycling = no_recycling, no_recycling = no_recycling,
nice_errors = self.nice_errors) nice_errors = self.nice_errors)
f.allow_gc = self.allow_gc f.allow_gc = self.allow_gc
# Release lock on compilation directory. finally:
release_lock() # Release lock on compilation directory.
release_lock()
return f, [link.Container(input, storage) for input, storage in zip(env.inputs, input_storage)], \ return f, [link.Container(input, storage) for input, storage in zip(env.inputs, input_storage)], \
[link.Container(output, storage, True) for output, storage in zip(env.outputs, output_storage)], \ [link.Container(output, storage, True) for output, storage in zip(env.outputs, output_storage)], \
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论