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