我有一个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扩展程序。