CUDA 2D卷积核

时间:2012-05-29 11:35:23

标签: cuda convolution

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

1 个答案:

答案 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;