This question is from 3 years ago, and Cython currently has features available that support the OpenMP server. See, for example, documentation here . One very handy feature is prange . This is one example of how you can implement a (more naive) dot function using prange .
Remember to compile passing the argument "/opemmp" C compiler.
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]
source share