1

我是 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);
4

1 回答 1

3

首先,您的问题是您处理 480x720 像素的图像。CUDA 支持计算能力 2.0 及更高版本的线程块的最大大小为 1024,之前的线程块大小为 512。所以你不能在一个块中执行这么多线程。线路dim3 dimBlock(W,H); 不正确。你应该把你的线程分成几个块。

另一个问题是 CUDA 以行优先顺序处理数据。所以你应该改变你的内存访问模式。

CUDA 中二维数组的正确内存访问模式是

BaseAddress + width * Y + X

在哪里

unsigned int X = blockIdx.x * blockDim.x + threadIdx.x;
unsigned int Y = blockIdx.y * blockDim.y + threadIdx.y;
于 2012-05-29T12:18:36.663 回答