提交 c6e02ef2 authored 作者: Frederic's avatar Frederic

Added the linker config value vm_lazy that force the use of the Stack version.

上级 70f6c8eb
......@@ -67,6 +67,7 @@ predefined_linkers = {
'c|py_nogc': gof.OpWiseCLinker(allow_gc=False),
'c&py': gof.DualLinker(checker=check_equal),
'vm': gof.vm.VM_Linker(use_cloop=False),
'vm_lazy': gof.vm.VM_Linker(use_cloop=False, lazy=True),
'cvm': gof.vm.VM_Linker(use_cloop=True),
'vm_nogc': gof.vm.VM_Linker(allow_gc=False, use_cloop=False),
'cvm_nogc': gof.vm.VM_Linker(allow_gc=False, use_cloop=True),
......
......@@ -100,14 +100,14 @@ try:
("Default linker used if the theano flags mode is Mode "
"or ProfileMode"),
EnumStr('cvm', 'c|py', 'py', 'c', 'c|py_nogc', 'c&py',
'vm', 'vm_nogc', 'cvm_nogc'),
'vm', 'vm_lazy', 'vm_nogc', 'cvm_nogc'),
in_c_key=False)
except OSError:
# g++ is not present, linker should default to python only
AddConfigVar('linker',
("Default linker used if the theano flags mode is Mode "
"or ProfileMode"),
EnumStr('py', 'vm', 'vm_nogc'),
EnumStr('py', 'vm', 'vm_lazy', 'vm_nogc'),
in_c_key=False)
_logger.warning('g++ not detected ! Theano will be unable to execute '
'optimized C-implementations (for both CPU and GPU) and will '
......
......@@ -464,7 +464,7 @@ class VM_Linker(link.LocalLinker):
Class that satisfies the Linker interface by acting as a VM factory.
"""
def __init__(self, allow_gc=True, use_cloop=False, callback=None):
def __init__(self, allow_gc=None, use_cloop=False, callback=None, lazy=None):
"""
allow_gc - force the virtual machine to clean up unnecessary
references, in order to allow garbage collection on
......@@ -477,6 +477,11 @@ class VM_Linker(link.LocalLinker):
the virtual machine. It will be called with four arguments called
'node', 'thunk', 'storage_map', and 'compute_map'.
lazy - Useful only when use_cloop is False. When lazy is None, auto
detect if lazy evaluation is needed and use the apropriate
version. If lazy it True/False, for the version used between
Loop/LoopGC and Stack.
"""
if allow_gc is None:
allow_gc = config.allow_gc
......@@ -484,6 +489,7 @@ class VM_Linker(link.LocalLinker):
self.allow_gc = allow_gc
self.use_cloop = use_cloop
self.callback = callback
self.lazy = lazy
self.updated_vars = {}
def accept(self, fgraph, no_recycling=None):
......@@ -677,7 +683,10 @@ class VM_Linker(link.LocalLinker):
)
assert c0 == sys.getrefcount(node_n_inputs)
else:
if all([(not th.lazy) for th in thunks]):
lazy = self.lazy
if lazy is None:
lazy = not all([(not th.lazy) for th in thunks])
if not lazy:
# there is no conditional in the graph
if self.allow_gc:
vm = LoopGC(
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论