ajd*_*574 29 python parallel-processing openmp python-c-extension
我有一个C扩展,我想使用OpenMP.但是,当我导入我的模块时,出现导入错误:
ImportError: /home/.../_entropysplit.so: undefined symbol: GOMP_parallel_end
Run Code Online (Sandbox Code Playgroud)
我用-fopenmp和-lgomp编译了模块.这是因为我的Python安装没有用-fopenmp标志编译吗?我是否必须从源代码构建Python?还是有其他可能性吗?这是我在模块中实际使用openmp的唯一时间:
unsigned int feature_index;
#pragma omp parallel for
for (feature_index = 0; feature_index < num_features; feature_index++) {
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想坚持使用openmp,因为它非常简单,并且在这种情况下并行化非常适合它.
编辑:我咬了一口气,用OpenMP支持重新编译了Python.我的模块现在完美运行,但这不是一个很好的解决方案.如果需要完全重新编译Python,我无法真正分发它.所以有人知道这方面的一些方法吗?或许ctypes会起作用吗?
解决了!这是一个简单的链接问题.(我为此重建了Python?!)在编译模块期间,OpenMP没有正确链接.因此,IS可以加载使用OpenMP的一个C Python扩展.
lui*_*dro 18
为了更清楚,这是你的setup.py应该是这样的:
ext = Extension(
'milk.unsupervised._som',
sources = ['milk/unsupervised/_som.cpp'],
extra_compile_args=['-fopenmp'],
extra_link_args=['-lgomp'])
...
setup(..., ext_modules = [ext])
Run Code Online (Sandbox Code Playgroud)
我知道这是一篇过时的帖子,但我会分享我的经验,因为我也遇到了同样的问题,但在命令行使用f2py时.我最初编译我的OpenMP启用的Fortran 90子程序使用
f2py --fcompiler=gfortran --f90flags='-fopenmp -lgomp' -m sub -c sub.90
Run Code Online (Sandbox Code Playgroud)
这成功地创建的共享对象sub.so.但是,尝试从Python shell导入它会产生类似的未定义符号 ImportError.但是,正如原作者所说,这是因为我试图将-fopenmp和-lgomp都传递给编译器,而只应将-fopenmp传递给它,并且应将-lgomp传递给链接器.
因此,我本应该做的如下
f2py --fcompiler=gfortran --f90flags='-fopenmp' -lgomp -m sub -c sub.f90
Run Code Online (Sandbox Code Playgroud)
就是这样,问题解决了,我现在可以导入我的子程序了.
| 归档时间: |
|
| 查看次数: |
6004 次 |
| 最近记录: |