我在fast_nn
编写了一个名为Cython
的多线程模块,并使用以下setup.py
编译它:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy
setup(
ext_modules = cythonize([
Extension("fast_nn", ["fast_nn.pyx"], language = 'c++', extra_compile_args = ['-O3', '-fopenmp'], extra_link_args = ['-fopenmp'], include_dirs = [numpy.get_include()])
])
)
此外,我使用caffe
框架的python绑定。
如果我单独使用我的模块或单独使用pycaffe
,一切都很好。但是,以下组合存在问题:
import caffe.io
import fast_nn
在一台机器上,它不会导致任何问题。在另一台机器上,我得到以下异常:
Traceback (most recent call last):
File "test.py", line 2, in <module>
import fast_nn
ImportError: dlopen: cannot load any more object with static TLS
从this thread我知道有太多带有initial-exec静态TLS的库已动态加载。但是我该怎么做才能解决这个问题呢?有没有办法在禁用静态TLS的情况下编译我的模块或更好的解决方案?
但是,readelf -a fast_nn.cpython-35m-x86_64-linux-gnu.so | grep TLS
的输出在我的库中不显示任何TLS符号。但是一些依赖库包含这样的符号。
更改两个导入的顺序(即,在caffe
模块之后导入cython
)可以解决问题。但是,由于我的实际案例要复杂得多,并且两个模块都是从其他进口间接导入的,所以我无法改变导入的顺序。
同样,将已编译模块库的路径导出到LD_PRELOAD
具有相同的效果,但也不是一个优雅的解决方案。