pymp parallel python parallel-processing openmp python-c-extension

pymp - parallel processing python



Extensiones Python y OpenMP C (3)

Era un simple problema de vinculación. OpenMP no se estaba enlazando correctamente durante la compilación del módulo. Por lo tanto, es posible cargar una extensión de C Python que utiliza OpenMP. -fopenmp se debe pasar al compilador y -lgomp al vinculador: si está utilizando distutils, asegúrese de que su setup.py esté configurado correctamente. La reconstrucción de Python también funcionó, supongo, porque había vinculado correctamente OpenMP con Python, por lo que cuando Python cargó el módulo, la biblioteca ya estaba vinculada correctamente.

Tengo una extensión C en la que me gustaría usar OpenMP. Cuando importo mi módulo, sin embargo, obtengo un error de importación:

ImportError: /home/.../_entropysplit.so: undefined symbol: GOMP_parallel_end

He compilado el módulo con -fopenmp y -lgomp. ¿Esto se debe a que mi instalación de Python no se compiló con el indicador -fopenmp? ¿Tendré que construir Python desde la fuente? ¿O hay alguna otra posibilidad? Esta es la única vez que uso openmp en mi módulo:

unsigned int feature_index; #pragma omp parallel for for (feature_index = 0; feature_index < num_features; feature_index++) {

Me gustaría seguir con openmp si es posible, solo porque es muy fácil y la paralelización en este caso se adapta bien.

EDITAR: Mordí la bala y recompilé Python con soporte OpenMP. Mi módulo funciona perfectamente ahora, pero esta no es realmente una gran solución. Realmente no puedo distribuir esto si requiere una compilación completa de Python. Entonces, ¿alguien sabe algo de esto? ¿Trabajarían los tipos, tal vez?

Resuelto Era un simple problema de vinculación. (¡¿Reconstruí Python para eso ?!) OpenMP no estaba correctamente vinculado durante la compilación del módulo. Por lo tanto, es posible cargar una extensión de C Python que utiliza OpenMP.


Sé que esta es una publicación fechada, pero compartiré mi experiencia ya que también me encontré con este mismo problema, pero al usar f2py en la línea de comandos. Originalmente estaba compilando mi subrutina Fortran 90 habilitada para OpenMP usando

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

que creó con éxito el objeto compartido sub.so. Sin embargo, al intentar importar esto desde un shell de Python se generó el similar símbolo indefinido ImportError. Sin embargo, como dijo el autor original es porque intenté pasar tanto -fopenmp como -lgomp al compilador , mientras que solo se debería pasar a -fopenmp, y -lgomp se debería pasar al vinculador.

Por lo tanto, debería haber estado haciendo lo siguiente

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

Y eso es todo, problema resuelto, ahora puedo importar mi subrutina.


Solo para que quede más claro, esto es lo que debería ver su setup.py:

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