我有三个数组 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 应该并行运行,但是由于某种原因它是顺序运行的。我怎样才能解决这个问题?发生了什么事?
感谢您的关注。