Я создал двусторонний фильтр в 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!")