2013-04-12 3 views
4

Est-ce que le verrouillage d'interpréteur global (GIL) est libéré lorsque j'appelle une fonction enveloppée f2py?Libération de la fonction f2py GIL

(Je suis heureux d'essayer de découvrir moi-même, mais je ne suis pas assez au courant de la source numpy de savoir où commencer à chercher) ...

Pour clarifier les choses, une bonne réponse à cette question serait soit m'aider à savoir où dans la source numpy pour trouver un Py_BEGIN_ALLOW_THREADSou il me ferait simplement savoir si le GIL est publié (de préférence avec des preuves).

+0

Quel aspect de cette question doit être rendu plus clair? Cela me semble bien. – Mark

+0

@Mark - Oui, j'ai tendance à être d'accord :-). – mgilson

+0

Je suis d'accord c'est assez clair. Très spécifique et f2py, mais assez clair sinon. Avez-vous essayé de demander sur http://central.scipy.org? –

Répondre

5

Non, f2py par défaut est de laisser le GIL en place. Cependant, vous pouvez libérer le GIL en ajoutant la directive threadsafe.

exemple:

subroutine foo(a) 
!f2py threadsafe 
!f2py intent(out) :: a 
integer a 
a = 5 
end subroutine foo 

maintenant compiler:

f2py -c -m foo --build-dir test_build foo.f90 

Et nous pouvons vérifier le code source:

grep THREAD test_build/src.*/*.c 
build/src.linux-x86_64-2.7/testmodule.c:  Py_BEGIN_ALLOW_THREADS 
build/src.linux-x86_64-2.7/testmodule.c:  Py_END_ALLOW_THREADS 

Cependant, si l'on répète le processus de suppression de la ligne !f2py threadsafe , alors les macros pour libérer le GIL ne sont pas incluses.