¿Cuáles son las implicaciones de llamar a las funciones de la API C de NumPy desde varios subprocesos?

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

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.

¿Fue útil?

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

.
  1. PyArray_DATA se define en ndarrayobject.h:

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

  3. 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 a PyArray_NewFromDescr, definido en arrayobject.c.

  4. Esto causa PyArray_NewFromDescr para invocar PyDataMem_NEW con el fin de asignar memoria para el campo de la data 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top