Cython Cdef类无法识别prange

时间:2018-09-23 23:50:38

标签: methods parallel-processing cython

我有三个数组 a,b,x ,并希望对它们执行很多操作。 Op(a,b,x)是执行这些操作的功能。但是情况不仅仅如此。 x 数组的变化很大,因此最好存储 a,b 以节省时间。此外,有时 a,b 阵列也必须更改。考虑到这一点,我创建了以下类。

cimport numpy as np
from cython.parallel cimport prange
from cython cimport wraparound, boundscheck

cdef class parallel_ops:
    cdef double[:] a 
    cdef double[:] b
    cdef double[:] x

    @boundscheck(False)
    @wraparound(False)
    def __init__(self, double[:] a, double[:] b, double[:] x):
        self.a = a
        self.b = b
        self.x = x

    @boundscheck(False)
    @wraparound(False)
    def update(self, double[:] a, double[:] b):
        self.a = a
        self.b = b

    @boundscheck(False)
    @wraparound(False)
    cdef double Op(self, double[:] x):
        cdef int i, j, k
        cdef int m = self.a.shape[0]
        cdef int n = self.b.shape[0]
        cdef int p = self.x.shape[0]
        cdef double s = 0.0
        for i in prange(m, nogil=True):
            for j in range(0,n):
                for k in range(0,p):
                    s += self.a[i]**2*self.b[j]**2*self.x[k]**2    
        return s

    @boundscheck(False)
    @wraparound(False)
    def receive_input(self, double[:] x):
        return self.Op(x)

函数 Op 只是一个例子,我原来的函数要大得多,这里没有必要显示。关键是,除prange部分外,其他所有东西都工作正常。函数 Op 应该并行运行,但是由于某种原因它是顺序运行的。我怎样才能解决这个问题?发生了什么事?

感谢您的关注。

0 个答案:

没有答案