У меня есть три массива 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 является лишь примером, моя оригинальная функция намного больше, и нет смысла показывать ее здесь.Дело в том, что все работает нормально, за исключением части прокачки, которая полностью игнорируется.Функция Op должна была выполняться параллельно, но по какой-то причине она является последовательной.Как я могу это исправить?А что происходит?
Спасибо за внимание.