如何在Cython中使用诸如openMP之类的东西?

Pha*_*aun 5 python parallel-processing openmp cython

基本上,我有一个问题,这是相当多embrassing平行的,我想我已经打了极限有多快可以用普通的Python和多处理所以现在我试图把它带到通过用Cython,希望OpenMP的较低水平使它.

所以简而言之,我想知道如何在Cython中使用openMP,或者我是否必须通过Cython包装一些原始C代码并加载/绑定到它?

或者我可以将Cython编译成C代码然后修改C代码以在openMP pragma中添加然后编译到库并将其加载到Python中吗?

Sau*_*tro 8

这个问题来自3年前,现在Cython有可用的功能支持OpenMP后端.例如,请参阅此处的文档.一个非常方便的功能是prange.这是如何使用(相当幼稚)dot功能实现的一个示例prange.

不要忘记编译将"/opemmp"参数传递给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]
Run Code Online (Sandbox Code Playgroud)

  • @ [yanlend的答案]的代码示例为+1(http://stackoverflow.com/a/18378354/4279).[`gcc`需要`-fopenmp`](http://gcc.gnu.org/onlinedocs/libgomp/Enabling-OpenMP.html).注意:`numpy.dot()`在我的[时间测量]中更快(https://gist.github.com/zed/2051661).您可以接受[typed memoryviews](http://docs.cython.org/src/userguide/memoryviews.html)作为输入. (2认同)

Dav*_*veP 1

根据cython wiki,开发人员已经考虑了多种选择,但我认为他们还没有实现任何东西。

如果你的问题是令人尴尬的并行,并且你已经有了一个多处理解决方案,为什么不让每个工作进程调用一些 cython 代码而不是 python 代码呢?