OpenMPを使用したいC拡張機能があります。ただし、モジュールをインポートすると、インポートエラーが発生します。
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を使用するCPython拡張機能をロードすることは可能です。