Quelles sont les implications de l'appel des fonctions API de numpy C à partir de plusieurs threads?

StackOverflow https://stackoverflow.com/questions/4358320

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.

Était-ce utile?

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

.
  1. PyArray_DATA est défini dans ndarrayobject.h:

    #define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
    
  2. 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.

  3. 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.

  4. Cela provoque PyArray_NewFromDescr d'invoquer PyDataMem_NEW afin d'allouer de la mémoire pour le champ de data 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top