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

Python 如何在Cython中使用openMP之类的东西?,python,parallel-processing,openmp,cython,Python,Parallel Processing,Openmp,Cython,基本上,我有一个问题,这个问题相当复杂,我想我已经达到了极限,我可以用简单的python和多处理来实现它,所以我现在正试图通过Cython和openMP将它提升到一个较低的级别 因此,简而言之,我想知道如何将openMP与Cython结合使用,或者是否需要包装一些原始C代码并通过Cython加载/绑定到它 或者我可以让Cython编译成C代码,然后修改C代码以添加到openMP pragmas中,然后编译到库并将其加载到Python中吗?我没有openMP的经验,但您可能会有机会尝试(包括Pyt

基本上,我有一个问题,这个问题相当复杂,我想我已经达到了极限,我可以用简单的python和多处理来实现它,所以我现在正试图通过Cython和openMP将它提升到一个较低的级别

因此,简而言之,我想知道如何将openMP与Cython结合使用,或者是否需要包装一些原始C代码并通过Cython加载/绑定到它


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

我没有openMP的经验,但您可能会有机会尝试(包括Python绑定):

easy\u install pyzmq

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


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

如果有人在这个问题上遇到了问题:

现在,cython中通过cython.parallel模块直接支持OpenMP,请参阅

这个问题是3年前提出来的,现在Cython拥有支持OpenMP后端的可用功能。例如,见。一个非常方便的功能是
prange
。这是一个如何使用
prange
实现(相当幼稚的)
dot
函数的示例

不要忘记将
“/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]
作者Stefan Behnel,Cython的核心开发者之一,将给你一个精彩的介绍。循环的多线程处理在最后30分钟进行(
prange
section)。代码是一组压缩的


简言之,编写优化的无线程代码,使用Cython类型进行优化,并通过替换
range
和释放GIL来实现多线程。

我听说了zeromq的好处,应该把它放在我要做的事情列表中:)但我的问题是我想避免进程间通信,因为这会增加开销,并会爆炸内存使用。这就是为什么我想转移到openMP/pthreads,这样我就可以拥有一个由numpy数组组成的共享数据数组(只读),这就是我以前所做的,它可以正常工作,但每个进程通过复制数据都会消耗大量内存。。。然后我做了:通过共享内存无锁改进了一些东西,但还是太慢了。所以我相信是时候用C了。在这种情况下,您最好还是编写支持OpenMP的C(或fortran)代码。我发现fortran的指令运行得非常好,您可能可以在C中执行类似的操作,然后使用cython方便地包装它。我更喜欢fortran 90而不是C,因为您可以编写数组操作,就像在python中使用numpy一样。我已经在C中成功实现了这一点,并使用cython将其链接到中。@Pharaun您可以发布代码片段作为答案吗?+1作为的代码示例。注意:
numpy.dot()。您可以接受作为输入。@J.F.Sebastian谢谢,与
numpy.dot
后面的LAPACK(或类似)例程相比,这个
dot
版本是幼稚的,但这是一个很好的例子。我不相信内存视图会比这个快,你试过了吗?我知道这很幼稚。通常使用并行计算来提高时间性能。值得一提的是,事实并非如此。关于类型化memoryview:它们生成的代码更简单(没有用于memoryview索引、切片的GIL),更通用(也接受非numpy类型),有时更快(我在本例中没有检查)。