我有一个 C 扩展,我想在其中使用 OpenMP。但是,当我导入模块时,出现导入错误:
ImportError: /home/.../_entropysplit.so: undefined symbol: GOMP_parallel_end
我已经用-fopenmp 和-lgomp 编译了这个模块。这是因为我的 Python 安装没有使用 -fopenmp 标志编译吗?我必须从源代码构建 Python 吗?或者还有其他的可能吗?这是我在模块中真正使用 openmp 的唯一一次:
unsigned int feature_index;
#pragma omp parallel for
for (feature_index = 0; feature_index < num_features; feature_index++) {
如果可能的话,我想坚持使用 openmp,因为它非常简单,而且这种情况下的并行化非常适合它。
编辑:我硬着头皮重新编译了支持 OpenMP 的 Python。我的模块现在可以完美运行,但这并不是一个很好的解决方案。如果它需要完全重新编译 Python,我无法真正分发它。那么有人知道解决这个问题的方法吗?ctypes 会起作用吗?
解决了!这是一个简单的链接问题。(我为此重建了 Python?!)在模块编译期间未正确链接 OpenMP。因此可以加载使用 OpenMP 的 C Python 扩展。