Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
pytensor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
testgroup
pytensor
Commits
2bae7b9b
提交
2bae7b9b
authored
2月 20, 2014
作者:
abergeron
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1741 from nouiz/cache
Fix recompilation of Ops in other repo then Theano
上级
7d30ab3c
f5582191
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
28 行增加
和
11 行删除
+28
-11
function_module.py
theano/compile/function_module.py
+17
-3
cmodule.py
theano/gof/cmodule.py
+11
-8
没有找到文件。
theano/compile/function_module.py
浏览文件 @
2bae7b9b
...
@@ -975,10 +975,24 @@ class FunctionMaker(object):
...
@@ -975,10 +975,24 @@ class FunctionMaker(object):
raise
TypeError
(
raise
TypeError
(
'profile passed via both "mode" and "profile" arguments'
)
'profile passed via both "mode" and "profile" arguments'
)
self
.
profile
=
profile
=
profile
or
mode_profile
self
.
profile
=
profile
=
profile
or
mode_profile
if
profile
:
if
profile
or
theano
.
config
.
cxx
:
# We preload the cache here to don't have its timming
# This is very important:
# 1) We preload the cache here to don't have its timming
# included in optimization that compile function.
# included in optimization that compile function.
theano
.
gof
.
cc
.
get_module_cache
()
# 2) If other repo that import Theano have Theano ops defined,
# we need to refresh the cache here. Otherwise, their is import
# order problems.
# When device=gpu, we compile during Theano import. This trigger
# the loading of the cache. But unpickling the cache ask that the
# other repos Ops are completly loaded, which isn't always the
# case!
# If a module isn't completly loaded and their unpickling fail,
# it mean it is safe for this function compilation to skip them,
# but not for futur compilation. So reloading the cache at each
# compilation fix this problem.
# 3) This help propagate knowledge of newly compiled module to
# concurrent process.
theano
.
gof
.
cc
.
get_module_cache
()
.
refresh
()
# Handle the case where inputs and/or outputs is a single Variable (not in a list)
# Handle the case where inputs and/or outputs is a single Variable (not in a list)
self
.
orig_outputs
=
outputs
self
.
orig_outputs
=
outputs
unpack_single
=
False
unpack_single
=
False
...
...
theano/gof/cmodule.py
浏览文件 @
2bae7b9b
...
@@ -308,11 +308,12 @@ def last_access_time(path):
...
@@ -308,11 +308,12 @@ def last_access_time(path):
return
os
.
stat
(
path
)[
stat
.
ST_ATIME
]
return
os
.
stat
(
path
)[
stat
.
ST_ATIME
]
def
module_name_from_dir
(
dirname
,
err
=
True
):
def
module_name_from_dir
(
dirname
,
err
=
True
,
files
=
None
):
"""
"""
Scan the contents of a cache directory and return full path of the
Scan the contents of a cache directory and return full path of the
dynamic lib in it.
dynamic lib in it.
"""
"""
if
files
is
None
:
files
=
os
.
listdir
(
dirname
)
files
=
os
.
listdir
(
dirname
)
names
=
[
file
for
file
in
files
names
=
[
file
for
file
in
files
if
file
.
endswith
(
'.so'
)
or
file
.
endswith
(
'.pyd'
)]
if
file
.
endswith
(
'.so'
)
or
file
.
endswith
(
'.pyd'
)]
...
@@ -640,18 +641,21 @@ class ModuleCache(object):
...
@@ -640,18 +641,21 @@ class ModuleCache(object):
time_now
=
time
.
time
()
time_now
=
time
.
time
()
# Go through directories in alphabetical order to ensure consistent
# Go through directories in alphabetical order to ensure consistent
# behavior.
# behavior.
root_dirs_files
=
sorted
(
os
.
walk
(
self
.
dirname
),
subdirs
=
sorted
(
os
.
listdir
(
self
.
dirname
))
key
=
operator
.
itemgetter
(
0
))
for
root
in
subdirs
:
for
root
,
dirs
,
files
in
root_dirs_files
:
root
=
os
.
path
.
join
(
self
.
dirname
,
root
)
key_pkl
=
os
.
path
.
join
(
root
,
'key.pkl'
)
key_pkl
=
os
.
path
.
join
(
root
,
'key.pkl'
)
if
key_pkl
in
self
.
loaded_key_pkl
:
if
key_pkl
in
self
.
loaded_key_pkl
:
continue
continue
elif
'delete.me'
in
files
or
not
files
:
if
not
os
.
path
.
isdir
(
root
):
continue
files
=
os
.
listdir
(
root
)
if
'delete.me'
in
files
or
not
files
:
_rmtree
(
root
,
ignore_nocleanup
=
True
,
_rmtree
(
root
,
ignore_nocleanup
=
True
,
msg
=
"delete.me found in dir"
)
msg
=
"delete.me found in dir"
)
elif
'key.pkl'
in
files
:
elif
'key.pkl'
in
files
:
try
:
try
:
entry
=
module_name_from_dir
(
root
)
entry
=
module_name_from_dir
(
root
,
files
=
files
)
except
ValueError
:
# there is a key but no dll!
except
ValueError
:
# there is a key but no dll!
if
not
root
.
startswith
(
"/tmp"
):
if
not
root
.
startswith
(
"/tmp"
):
# Under /tmp, file are removed periodically by the
# Under /tmp, file are removed periodically by the
...
@@ -814,8 +818,7 @@ class ModuleCache(object):
...
@@ -814,8 +818,7 @@ class ModuleCache(object):
# We do nothing here.
# We do nothing here.
# Clean up the name space to prevent bug.
# Clean up the name space to prevent bug.
if
root_dirs_files
:
del
root
,
files
,
subdirs
del
root
,
dirs
,
files
# Remove entries that are not in the filesystem.
# Remove entries that are not in the filesystem.
items_copy
=
list
(
self
.
module_hash_to_key_data
.
iteritems
())
items_copy
=
list
(
self
.
module_hash_to_key_data
.
iteritems
())
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论