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