¿Cómo emplear algo como openMP en Cython?

Básicamente, tengo un problema bastante paralelo y creo que he llegado al límite de lo rápido que puedo hacerlo con Python y multiprocesamiento, por lo que ahora estoy intentando llevarlo a un nivel inferior a través de Cython y, con suerte, abrir. .

En resumen, me pregunto cómo puedo emplear openMP con Cython, o si tendré que ajustar un código C en bruto y cargarlo / enlazarlo a través de Cython.

¿O puedo hacer que Cython compile hasta el código C y luego modifique el código C para agregar los pragmas de openMP y luego compile en la biblioteca y lo cargue en Python?

Según la wiki de cython , los desarrolladores han pensado en una variedad de opciones, pero no creo que hayan implementado nada todavía.

Si su problema es vergonzosamente paralelo y ya tiene una solución de multiprocesamiento, ¿por qué no hace que cada proceso de trabajo llame a un código de cython en lugar de a un código de python?

Esta pregunta es de hace 3 años y hoy en día Cython tiene funciones disponibles que son compatibles con el backend OpenMP. Vea por ejemplo la documentación aquí . Una función muy conveniente es el prange . Este es un ejemplo de cómo una función de dot (más bien ingenua) podría implementarse usando prange .

No olvide comstackr pasando el argumento "/opemmp" al comstackdor de C.

 import numpy as np cimport numpy as np import cython from cython.parallel import prange ctypedef np.double_t cDOUBLE DOUBLE = np.float64 def mydot(np.ndarray[cDOUBLE, ndim=2] a, np.ndarray[cDOUBLE, ndim=2] b): cdef np.ndarray[cDOUBLE, ndim=2] c cdef int i, M, N, K c = np.zeros((a.shape[0], b.shape[1]), dtype=DOUBLE) M = a.shape[0] N = a.shape[1] K = b.shape[1] for i in prange(M, nogil=True): multiply(&a[i,0], &b[0,0], &c[i,0], N, K) return c @cython.wraparound(False) @cython.boundscheck(False) @cython.nonecheck(False) cdef void multiply(double *a, double *b, double *c, int N, int K) nogil: cdef int j, k for j in range(N): for k in range(K): c[k] += a[j]*b[k+j*K] 

Si alguien tropieza con esta pregunta:

Ahora, hay soporte directo para OpenMP en cython a través del módulo cython.parallel, consulte http://docs.cython.org/src/userguide/parallelism.html

No tengo experiencia con OpenMP, pero puede que tengas suerte con probar zeromq (incluidos los enlaces de python):

easy_install pyzmq