我试图得到一个python双边过滤器,我写的工作在我的GPU上,但我不断遇到错误,我得到了一个对我来说非常神秘的。当我运行代码时,我得到
Call to cuMemcpyDtoH results in UNKNOWN_CUDA_ERROR
从其他帖子来看,似乎是内存问题?但是,由于我没有在cuda中编写代码,也没有弄乱内存(我只是添加了一些标签,让它在GPU上运行),所以我不确定解决这个问题的最佳方法是什么。我是否错误地将代码转换为在GPU上运行
import numpy as np
import cv2
import sys
import math
import cmath
import tqdm
from numba import jit, cuda, vectorize, guvectorize, float64, int64
sIntesity = 12.0
sSpace = 16.0
diameter = 100
@guvectorize([(float64[:,:], float64[:,:])], '(n,m)->(n,m)',target='cuda',nopython =True)
def apply_filter(img, filteredImage):
#imh, imw = img.shape[:2]
imh = 600
imw = 600
hd = int((diameter - 1) / 2)
for h in range(hd, imh - hd):
for w in range(hd, imw - hd):
Wp = 0
filteredPixel = 0
radius = diameter // 2
for x in range(0, diameter):
for y in range(0, diameter):
currentX = w - (radius - x)
cureentY = h - (radius - y)
intensityDifferent = img[currentX][cureentY] - img[w][h]
intensity = (1.0/ (2 * math.pi * (sIntesity ** 2))* math.exp(-(intensityDifferent ** 2) / (2 * sIntesity ** 2)))
foo = (currentX - w) ** 2 + (cureentY - h) ** 2
distance = cmath.sqrt(foo)
smoothing = (1.0 / (2 * math.pi * (sSpace ** 2))) * math.exp( -(distance.real ** 2) / (2 * sSpace ** 2))
weight = intensity * smoothing
filteredPixel += img[currentX][cureentY] * weight
Wp += weight
filteredImage[h][w] = int(round(filteredPixel / Wp))
if __name__ == "__main__":
src = cv2.imread("messy2.png", cv2.IMREAD_GRAYSCALE)
src = src.astype(float)
filtered_image_own = np.zeros(src.shape)
print(type(src),type(filtered_image_own))
apply_filter(src, filtered_image_own)
filtered_image_own = filtered_image_own.astype(np.uint8)
cv2.imwrite("filtered_image4.png", filtered_image_own)
将它从CUDA切换到cpu让我看到代码中有一个bug,它试图获取一个无效的索引,这个错误就是它告诉我出了问题的方式
相关问题 更多 >
编程相关推荐