(comme vous le voyez, je ne suis pas très familier avec les concepts comme le Python GIL et multithreading PYTHON (ou cython))En utilisant openMP avec Cython: paralléliser une boucle intérieure
J'ai écrit une fonction Cython qui consiste d'un fragment de code avec un double pour boucle où une fonction f est appelée plusieurs fois.
for i in range(I):
for j in range(J):
res=f(A[i],B[j])
J'ai une machine avec 4 cœurs de processeurs et je veux paralléliser pas la première, mais la deuxième boucle. J'ai trouvé this wonderful website mais il ne traite pas le cas de la boucle interne et ne va pas dans les détails. Donc, à mon avis, je peux écrire:
for i in range(I):
#In what case can I release the GIL safely ? Is that necessary at all ?
with nogil, parallel(num_threads=4):
for j in prange(J,shedule="dynamic"):
res=f(A[i],B[j])
Est-ce que ça marche? Est-ce que je dois mettre le nogil à l'extérieur des deux boucles de façon à ce qu'il ne se répète pas à l'intérieur et ne «capture» pas ce truc de GIL? Quelqu'un pourrait-il m'expliquer comment et quelle est la logique derrière l'écriture de telles déclarations afin que je puisse généraliser à des problèmes insaisissables.
Merci @DavidW réponse définitivement intéressante! Évidemment, il y a une bonne raison pour que je ne parallélise pas la boucle extérieure. Je n'ai pas écrit les détails de mon code et les trucs res sont stupides. Je vais améliorer ma question un peu. J'ai upvoted et l'accepterai si ça marche! – jean