Распараллеливание исчерпывающего поиска в Cython - PullRequest
0 голосов
/ 08 ноября 2018

Я довольно новичок в Cython, и я пытаюсь Cythonize некоторый мой код. У меня есть 3D-массив X комплексных значений (который я рассматриваю как большой «стек» квадратных массивов), который имеет форму в масштабе (small, small, huge), и мне нужно найти местоположение и абсолютное значение значение наибольшего элемента выше диагонали. У меня сейчас исчерпывающий поиск, подобный этому:

cdef double complex[:,:,:] Xcp = X.copy()

cdef Py_ssize_t h = Xcp.shape[0]
cdef Py_ssize_t w = Xcp.shape[1]
cdef Py_ssize_t l = Xcp.shape[2]
cdef Py_ssize_t j, k, m

cdef double tmptop = 0.0
cdef Py_ssize_t[:] coords = np.zeros((3), dtype="intp")
cdef double it

for j in range(l):
    for k in range(w):
        for m in range(k+1, h):
            it = cabs(Xcp[m, k, j])
            if it > tmptop:
                tmptop = it
                coords[0] = m
                coords[1] = k
                coords[2] = j 

Обратите внимание, что я получаю cabs отсюда:

cdef extern from "complex.h":
    double cabs(double complex)

Этот код уже намного быстрее, чем тот, что я имел ранее в Numpy, но я чувствую, что его можно ускорить, в частности, парализовать.

Я попытался изменить цикл так:

with nogil:
    for j in prange(l):
        for k in range(w):
            for m in range(k+1, h):
                it = abs(Xcp[m, k, j])
                if it > tmptop:
                    tmptop = it
                    coords[0] = m
                    coords[1] = k
                    coords[2] = j

Хотя сейчас я получаю неправильный результат. Что здесь происходит?

...