Python和OpenMP C扩展

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)

  • 现在,如何以跨平台的方式实现这一点,与gcc,msvc和Clang版本一起使用,否则优雅地支持openmp和fallback? (2认同)

kir*_*rth 8

我知道这是一篇过时的帖子,但我会分享我的经验,因为我也遇到了同样的问题,但在命令行使用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)

就是这样,问题解决了,我现在可以导入我的子程序了.