Quali sono le implicazioni di chiamare le funzioni API C di NumPy da più thread?
-
08-10-2019 - |
Domanda
Questo è rischioso, e capisco il Global Interpreter Lock per essere un nemico formidabile di parallelismo. Tuttavia, se sto utilizzando di NumPy C API (specificamente la macro PyArray_DATA
su un array NumPy), ci sono potenziali conseguenze invoca da più thread simultanei?
Si noti che sarò ancora proprio il GIL e non rilasceremo con supporto threading di NumPy . Inoltre, anche se NumPy non fornisce alcuna garanzia circa la sicurezza thread, ma PyArray_DATA
è thread-safe, in pratica, che è abbastanza buono per me .
Io corro Python 2.6.6 con NumPy 1.3.0 su Linux.
Soluzione
Rispondendo alla mia domanda proprio qui, ma dopo frugando nel codice sorgente per NumPy 1.3.0, credo che la risposta è: Sì, PyArray_DATA
è thread-safe
-
PyArray_DATA
è definito in ndarrayobject.h:#define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
-
Il tipo struct PyArrayObject è definito nello stesso file; il campo di interesse è:
char *data;
Ora, la domanda è se l'accesso ai
data
da più thread è sicuro o meno. -
Creazione di un nuovo array NumPy da zero (cioè, non derivanti da una struttura di dati esistente) passa un puntatore di dati
NULL
aPyArray_NewFromDescr
, definito arrayobject.c. -
This cause
PyArray_NewFromDescr
invocarePyDataMem_NEW
per allocare memoria per campodata
del PyArrayObject. Questo è semplicemente una macro per malloc:#define PyDataMem_NEW(size) ((char *)malloc(size))
In sintesi, PyArray_DATA
è thread-safe e finché gli array NumPy vengono creati separatamente, è sicuro di scrivere a loro da diversi thread.