Почему эта функция работает медленнее с CUDA по сравнению с параллельным? - PullRequest
0 голосов
/ 26 мая 2020

Я создал двусторонний фильтр в python и добавил numba, чтобы (теоретически) запустить его на моем GPU. Тем не менее, когда я устанавливаю режим CUDA, он становится очень медленным и, похоже, вообще не использует мою видеокарту, а параллельный режим делает его очень быстрым. Лучшая причина, по которой у меня есть, заключается в том, что моя функция просто не оптимизирована для работы на моем графическом процессоре, потому что она не может применять одну функцию ко всем элементам сразу (потому что для работы требуются координаты x и y). Итак, мой вопрос: почему это работает медленно с установленной целью CUDA?

@guvectorize([(float64[:,:], float64[:,:])],'(n,m)->(n,m)',target='cuda',nopython =True)
def apply_filter(img, filteredImage):

imh, imw = img.shape[:2]
radius = diameter // 2
hd = int((diameter - 1) / 2)

#print("starting work in cuda")
for h in prange(hd, imh - hd):
    for w in prange(hd, imw - hd):
        Wp = 0
        filteredPixel = 0
        startX = h
        startY = w
        for x in prange(0, diameter):
            for y in prange(0, diameter):

                currentX = startX - (radius - x)
                cureentY = startY - (radius - y)

                intensityDifferent = img[currentX][cureentY] - img[startX][startY]
                intensity = (1.0 / (2 * math.pi * (sIntesity ** 2)) * math.exp(- (intensityDifferent ** 2) / (2 * sIntesity ** 2)))
                distance = ((currentX-startX)**2 + (cureentY-startY)**2)**(1/2)
                smoothing = (1.0 / (2 * math.pi * (sSpace ** 2))) * math.exp(- (distance ** 2) / (2 * sSpace ** 2))
                weight =  intensity * smoothing;

                filteredPixel += img[currentX][cureentY] * weight
                Wp += weight

        filteredImage[h][w] = int(round(filteredPixel / Wp))
#print("done!")
...