我为图像的框过滤编写了一个简单的 CUDA 内核。
texture<unsigned char,2> tex8u;
#define FILTER_SIZE 7
#define FILTER_OFFSET (FILTER_SIZE/2)
__global__ void box_filter_8u_c1(unsigned char* out, int width, int height, int pitch)
{
unsigned int x = blockIdx.x * blockDim.x + threadIdx.x;
unsigned int y = blockIdx.y * blockDim.y + threadIdx.y;
if(x>=width || y>=height) return;
float val = 0.0f;
for(int i = -FILTER_OFFSET; i<= FILTER_OFFSET; i++)
for(int j= -FILTER_OFFSET; j<= FILTER_OFFSET; j++)
val += tex2D(tex8u,x + i, y + j);
out[y * pitch + x] = static_cast<unsigned char>(val/(FILTER_SIZE * FILTER_SIZE));
}
上面代码的问题是图像的顶部和左侧边框被错误地过滤了。它们分别包含来自底部和右侧边界的值。不正确边框的宽度等于FILTER_OFFSET
。
但是当我将x
andy
索引更改为int
而不是 时unsigned int
,输出是完美的。
问:为什么会这样?
PS:纹理寻址模式设置cudaAddressModeClamp
为 x 和 y 方向。