29

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拡張機能をロードすることは可能です

4

3 に答える 3

20

わかりやすくするために、setup.pyは次のようになります。

ext = Extension(
      'milk.unsupervised._som',
      sources = ['milk/unsupervised/_som.cpp'],
      extra_compile_args=['-fopenmp'],
      extra_link_args=['-lgomp'])


...
setup(..., ext_modules = [ext])
于 2010-10-08T19:25:14.073 に答える
8

これが古い投稿であることは知っていますが、私もまったく同じ問題に遭遇したので、私の経験を共有しますが、コマンドラインでf2pyを使用している場合です。私はもともと、OpenMP対応のFortran90サブルーチンを使用してコンパイルしていました

f2py --fcompiler=gfortran --f90flags='-fopenmp -lgomp' -m sub -c sub.90

これにより、共有オブジェクトsub.soが正常に作成されました。ただし、これをPythonシェルからインポートしようとすると、同様の未定義のシンボルImportErrorが生成されました。ただし、元の作成者が述べたように、-fopenmpと-lgompの両方をコンパイラに渡そうとしたためですが、-fopenmpのみをコンパイラに渡し、-lgompをリンカに渡す必要があります。

したがって、私は次のことをすべきでした

f2py --fcompiler=gfortran --f90flags='-fopenmp' -lgomp -m sub -c sub.f90

これで問題は解決しました。サブルーチンをインポートできるようになりました。

于 2013-12-06T02:33:24.777 に答える
3

それは単純なリンクの問題でした。モジュールのコンパイル中にOpenMPが適切にリンクされていませんでした。したがって、OpenMPを使用するCPython拡張機能をロードすることは可能です。-fopenmpをコンパイラに渡し、-lgompをリンカに渡す必要があります--distutilsを使用している場合は、setup.pyが正しく構成されていることを確認してください。私はOpenMPをPythonと適切にリンクしていたので、Pythonの再構築も機能したと思います。そのため、Pythonがモジュールをロードしたときに、ライブラリはすでに適切にリンクされていました。

于 2010-08-30T03:00:06.003 に答える