Расширения Python и OpenMP C

у меня есть расширение 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, если это возможно, просто потому что это так просто, и распараллеливание в этом случае хорошо подходит.

EDIT: я укусил пулю и перекомпилировал Python с поддержкой OpenMP. Мой модуль работает отлично, но это не очень подходящее решение. Я не могу распространять это, если для этого требуется полная перекомпиляция Python. Кто-нибудь знает, как это обойти? Может быть, сработают томографы?

решена! Это была простая проблема. (Я перестроил Python для этого?!) OpenMP не был должным образом связан во время компиляции модуля. Так это IS можно загрузить расширение C Python, которое использует OpenMP.

3 ответов


просто чтобы сделать его более ясным, вот что ваш setup.py должно выглядеть так:

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


...
setup(..., ext_modules = [ext])

Я знаю, это старый пост, но я поделюсь своим опытом как я тоже столкнулся с этой же проблемой, но при использовании f2py в командной строке. Первоначально я компилировал свою подпрограмму с поддержкой OpenMP Fortran 90, используя

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

который успешно создал общий объект sub.так что. Однако попытка импортировать это из оболочки Python привела к аналогичному неопределено символ ImportError. Однако, как заявил первоначальный автор, потому что я пытался передать оба-fopenmp и-lgomp в компилятор, тогда как только -fopenmp должен быть передан ему, и-lgomp должен быть передан компоновщику.

поэтому я должен был сделать следующее

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

и это все, проблема решена, теперь я могу импортировать свою подпрограмму.


Это была простая проблема связывания. OpenMP не был должным образом связан во время компиляции модуля. Таким образом, можно загрузить расширение C Python, которое использует OpenMP. -fopenmp должен быть передан компилятору и-lgomp компоновщику -- если вы используете distutils, убедитесь, что ваш setup.py настроен правильно. Перестройка Python также работала, я предполагаю, потому что я правильно связал OpenMP с Python, поэтому, когда Python загрузил модуль, библиотека уже была правильно связана к.