2017-09-30 6 views
0

Je suis capable de compiler l'exemple de travail minimal ci-dessous dans Fortran qui utilise Openmp et s'exécute pour donner le résultat attendu (impressions 1).F2py avec Openmp donne l'erreur d'importation en Python

subroutine test 
use omp_lib 
write(*,*) omp_get_num_threads() 
end subroutine 

Cependant, l'utilisation de cette en python avec f2py donne l'erreur:

ImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.

J'ai utilisé le promeneur dépendance à tester si la question est à relier à la dll OpenMP, mais le .dll suivant est lié à la fois l'exécutable Fortran et le .pyd compilé à partir f2py:

c:\tdm-gcc-64\bin\LIBGOMP_64-1.DLL

donc je suis confus quant à pourquoi python ne manquera pas de charger le fichier .dll, car il semble être correctement liés à partir de f2py. La commande f2py que j'utilise pour générer le .pyd est

python -m numpy.f2py -c -m %output% %input%.f90 --fcompiler=gnu95 --compiler=mingw32 --f90flags="-fopenmp " -lgomp 

Toute aide serait grandement appréciée, merci.

EDIT: J'ai testé cela avec un autre PC Windows avec la même configuration d'installation, et obtenez le même message d'erreur. Est-ce que je manque quelque chose?

EDIT 2: Apparemment, ce programme ne fonctionnerait pas réellement dans f2py, donc mauvais exemple. Mes excuses. Je travaille actuellement avec des sous-programmes, qui sont capables de fonctionner avec f2py correctement tant qu'aucune commande openmp n'est présente. : J'ai remplacé l'exemple de code par un sous-programme à la place du programme en raison de la réaction de Pierre de Buyl, même si cela ne change rien à ma question.

+0

Avez-vous essayé ceci avec «test de programme» ou avez-vous édité le code dans un module («module test»)? 'f2py' n'enveloppera que le sous-programme, les fonctions ou les modules. –

+0

Merci pour ton commentaire, je ne le savais pas. Cependant les sous-routines avec lesquelles j'ai travaillé sont capables de compiler et d'importer correctement en python tant qu'il n'y a pas de commandes openmp présentes. –

+0

Avez-vous regardé https://stackoverflow.com/questions/44957887/python-import-error-for-f2py-modules-compiled-with-openmp (où le problème de PATH contenant le chemin d'accès à la DLL)? –

Répondre

0

Il semble que le problème était dans l'utilisation tdm-gcc-64 comme un compilateur, et donc je suis au lieu d'utiliser une installation de mingw64 qui fonctionne comme prévu.

0

Cela fonctionne pour moi:

tesf.f95

subroutine nthreads 
    !$ use omp_lib 
    integer :: nt 

    nt = 0 
    !$ nt = omp_get_max_threads() 

    write(*,*) 'Nthreads' 
    write(*,*) nt 

end subroutine 

Compile avec:

f2py -c test.f95 -m test --f90flags='-fopenmp' -lgomp -lpthread --compiler=mingw32 --fcompiler=gfortran 

Si je lance:

python -c "import test; test.nthreads()" 

T il obtient:

Nthreads 
      8 
+0

Un grand merci pour votre réponse, mais il semble que c'était plutôt un problème avec mon installation que j'ai maintenant résolu. –