我是CUDA的初学者,我正在尝试实施Sobel Edge检测内核。 我正在使用此代码,但它不起作用。 任何人都可以告诉我它有什么问题。我只得到一些-1和一些非常大的值。
__global__ void EdgeDetect_Hor(int *gpu_Edge_Hor, int *gpu_P,
int *gpu_Hor, int W, int H)
{
int X = threadIdx.x;
int Y = threadIdx.y;
int sum = 0;
int k1, k2;
int min1, min2;
for (k1 = 0; k1 < 3; k1++)
for(k2 = 0; k2 <3;k2++)
sum += gpu_Hor[k1*3+k2]*gpu_P[(X-k1)*H+Y-k2];
gpu_Edge_Hor[X*H+Y] = sum/5000;
}
我将此内核称为:
dim3 dimBlock(W,H);
dim3 dimGrid(1,1);
EdgeDetect_Hor<<<dimGrid, dimBlock>>>(gpu_Edge_Hor, gpu_P, gpu_Hor, W, H);
答案 0 :(得分:3)
首先,您的问题是您处理480x720像素的图像。 CUDA支持最大大小的线程块1024用于计算能力2.0和更高版本以及512用于以前的。所以你不能在一个块中执行这么多线程。第dim3 dimBlock(W,H);
行不正确。您应该将线程划分为几个块。
另一个问题是CUDA以行主顺序处理数据。所以你应该改变你的内存访问模式。
CUDA中2D阵列的正确内存访问模式是
BaseAddress + width * Y + X
其中
unsigned int X = blockIdx.x * blockDim.x + threadIdx.x;
unsigned int Y = blockIdx.y * blockDim.y + threadIdx.y;