Я сталкиваюсь со странной проблемой при компиляции расширения Python с OpenMP с помощью Clang.
Минимальный пример
Мне удалось свести мою настоящую проблему к следующему коду: The * Расширение 1047 * не может быть намного проще, хотя и с поддержкой OpenMP. Помимо функции bar
, это в основном стандартный шаблон:
# include <Python.h>
static PyObject * bar(PyObject *self)
{
#pragma omp parallel sections
{
#pragma omp section
{float x=42.0; x+=1;}
}
Py_RETURN_NONE;
}
static PyMethodDef foo_methods[] = {
{"bar", (PyCFunction) bar, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef moduledef = {
PyModuleDef_HEAD_INIT, "foo", NULL, -1,
foo_methods, NULL, NULL, NULL, NULL
};
PyMODINIT_FUNC PyInit_foo(void)
{
return PyModule_Create(&moduledef);
}
С учетом вышеупомянутого foo.c
я компилирую и загружаю это с помощью:
clang -fPIC -fopenmp -I/usr/include/python3.7m -c foo.c -o foo.o
clang -shared foo.o -o foo.so -lgomp
python3 -c "import foo"
Последняя строка при импорте модуля выдается следующая ошибка:
ImportError: /home/wrzlprmft/…/foo.so: неопределенный символ: __kmpc_for_static_fini
Что я до сих пор не выяснено
- Этого не происходит при замене Clang на G CC.
- Этого не происходит с обычными общими библиотеками (без Python).
- Использование Setuptools для компиляции расширения не помогает. (Фактически, мои команды компиляции - это сокращение от того, что Setuptools делает, чтобы выяснить, использует ли он какие-либо несущественные расширения компилятора, которые вызывают это.)
- Все это происходит в Ubuntu 19.10 с Python 3.7, Clang 9.0.0-2 и G CC 9.2.1.
- Я также могу повторить проблему на текущем Arch Linux с Python 3.8 и Clang 9.0.1.
- Это работало до года go, возможно, дольше.
- Использование Python 3.6 не помогает.
- Использование Clang 3.8, 4.0, 6.0, 7 или 8 не помогает .
- Здесь , кто-то сообщает об аналогичной проблеме при попытке скомпилировать TensorFlow. Это еще не решено.
Вопрос
Что здесь не так и как я могу это исправить? Прямо сейчас у меня даже нет идеи, является ли это ошибкой мной, в Clang, OpenMP или Python.