¿Cuáles son las implicaciones de llamar a las funciones de la API C de NumPy desde varios subprocesos?
-
08-10-2019 - |
Pregunta
Este es un negocio riesgoso, y entiendo el Intérprete de bloqueo global para ser un enemigo formidable de paralelismo. Sin embargo, si estoy usando de NumPy C API (específicamente el macro PyArray_DATA
en una matriz de NumPy), ¿hay consecuencias potenciales para la invoca desde varios subprocesos concurrentes?
Tenga en cuenta que todavía voy a poseer el GIL y no lanzará con soporte roscado de NumPy . Además, incluso si NumPy no ofrece ninguna garantía sobre la seguridad hilo, pero PyArray_DATA
es seguro para subprocesos en la práctica, que es lo suficientemente bueno para mí .
Me estoy quedando Python 2.6.6 con NumPy 1.3.0 en Linux.
Solución
contestar a mi propia pregunta aquí, pero después de empujar en el código fuente para NumPy 1.3.0, creo que la respuesta es: Sí, PyArray_DATA
es seguro para subprocesos
-
PyArray_DATA
se define en ndarrayobject.h:#define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
-
El tipo struct PyArrayObject es definido en el mismo archivo; el campo de interés es:
char *data;
Así que ahora, la pregunta es si el acceso
data
desde varios subprocesos es seguro o no. -
Creación de una nueva matriz NumPy desde cero (es decir, no que lo deriva a partir de una estructura de datos existente) pasa un puntero de datos
NULL
aPyArray_NewFromDescr
, definido en arrayobject.c. -
Esto causa
PyArray_NewFromDescr
para invocarPyDataMem_NEW
con el fin de asignar memoria para el campo de ladata
PyArrayObject. Esto es simplemente una macro para malloc:#define PyDataMem_NEW(size) ((char *)malloc(size))
En resumen, PyArray_DATA
es seguro para subprocesos y siempre que las matrices NumPy se crean por separado, es seguro escribir en ellos desde diferentes hilos.