Quelles sont les implications de l'appel des fonctions API de numpy C à partir de plusieurs threads?
-
08-10-2019 - |
Question
est une entreprise risquée, et je comprends l'interprète de verrouillage global d'être un ennemi redoutable de parallélisme. Cependant, si j'utilise NumPy API C (en particulier la macro PyArray_DATA
sur un tableau numpy), y at-il des conséquences potentielles pour l'invoquer de multiples threads simultanés?
Notez que je vais encore posséder le GIL et ne pas être le relâcher avec support de filetage de NumPy. En outre, même si NumPy ne peut pas garantir la sécurité de fil, mais PyArray_DATA
est thread-safe dans la pratique, qui est assez bon pour moi .
Je suis en cours d'exécution Python 2.6.6 avec NumPy 1.3.0 sur Linux.
La solution
Répondre à ma propre question ici, mais après dans le code piquer source pour NumPy 1.3.0, je crois que la réponse est: Oui, PyArray_DATA
est thread-safe
-
PyArray_DATA
est défini dans ndarrayobject.h:#define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
-
Le type struct PyArrayObject est défini dans le même dossier; le champ d'intérêt est:
char *data;
Alors maintenant, la question est de savoir si l'accès
data
de plusieurs threads est sûr ou non. -
Création d'une nouvelle matrice NumPy à partir de zéro (à savoir, ne pas dériver à partir d'une structure de données existante) transmet un pointeur de données de
NULL
àPyArray_NewFromDescr
, défini dans arrayobject.c. -
Cela provoque
PyArray_NewFromDescr
d'invoquerPyDataMem_NEW
afin d'allouer de la mémoire pour le champ dedata
de PyArrayObject. Ceci est simplement une macro pour malloc:#define PyDataMem_NEW(size) ((char *)malloc(size))
En résumé, PyArray_DATA
est thread-safe et aussi longtemps que les tableaux numpy sont créés séparément, il est sûr de les écrire à partir de fils différents.