使用纹理 1D 的 PyCuda 1D 插值



我是CUDA的新手,我的目标是使用PyCUDA和CUDA 1D纹理实现简单的1D插值。出于测试目的,我只需要一个内核,它将数组中的原始图像值(从纹理中提取(返回给我。问题是tex1D(tex, pos);返回始终为 0。

这是我的 CUDA 内核代码:

interp1 = """
#include <stdint.h>
texture<uint8_t, 1> tex;

__global__ 
void interp1(uint8_t *out) {
unsigned int pos = blockIdx.x * blockDim.x + threadIdx.x;
out[pos] = tex1D(tex, pos);
}
"""

这是我截取的python代码,我在其中读取测试图像,在GPU上分配内存,将图像复制到GPU上,通过set_address创建纹理引用并调用我的内核:

...
img = cv2.imread("lena.jpg", 0)    
img_in = pycuda.driver.to_device(img.flatten())
texref.set_address(img_in, img.nbytes)
texref.set_format(pycuda.driver.array_format.UNSIGNED_INT8, 1)
img_out = pycuda.driver.mem_alloc(img.nbytes)
interp1_func(img_out, block=(512, 1, 1), grid=(7200, 1, 1)) # image is 1920 x 1920
context.synchronize()
imgnew = np.zeros_like(img.flatten())
pycuda.driver.memcpy_dtoh(imgnew, img_out)
imgnew = imgnew.reshape(img.shape)
...

我希望有人可以帮助我解决这个问题。

由于已将线性内存绑定到纹理引用,因此必须使用tex1Dfetch,而不是内核中的tex1D来访问纹理。

请注意,在这种情况下,也无法执行插值,只能执行查找。

最新更新