Класс Cython cdef не распознает prange - PullRequest
0 голосов
/ 24 сентября 2018

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

Спасибо за внимание.

...