Расширения 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. Так кто-нибудь знает как-нибудь обойти это? Будут ли работать ctypes?

РЕШЕНО! Это была простая проблема с ссылками. (Я перестроил Python для этого ?!) OpenMP не был должным образом связан во время компиляции модуля. Поэтому можно загрузить расширение C Python, использующее OpenMP.

29
задан ajduff574 30 August 2010 в 01:53
поделиться

1 ответ

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

3
ответ дан 28 November 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: