Cuda 二维卷积核

Cuda 二维卷积核,cuda,convolution,Cuda,Convolution,我是CUDA的初学者,我正在尝试实现一个Sobel边缘检测内核。 我使用这个代码,但它不工作。 谁能告诉我它有什么毛病吗。我只得到一些-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;

我是CUDA的初学者,我正在尝试实现一个Sobel边缘检测内核。 我使用这个代码,但它不工作。 谁能告诉我它有什么毛病吗。我只得到一些-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;
} 
\uuuuu全局\uuuuu无效边缘检测区域(int*gpu\u边缘区域,int*gpu\P,
int*gpu_Hor,int W,int H)
{ 
int X=threadIdx.X;
int Y=threadIdx.Y;
整数和=0;
int k1,k2;
int min1,min2;
对于(k1=0;k1<3;k1++)

对于(k2=0;k2首先,您的问题是处理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;

谢谢,我正在处理一个480x720帧的视频,因为你的块大小是非法的,所以你的内核永远不会运行。关于块大小的限制,请参阅Cuda C编程指南的附录F。将来,通过Cuda调试程序Linux上的Cuda gdb运行你的程序。你真的不必通过猜测来编码。谢谢,我做了这些更改es:dim3 dimBlock(32,32);dim3 dimGrid(19,19);还改变了我的寻址模式。现在好多了(我确实看到了一些东西!)但是有一些块有一些垂直的空白条。你知道它可能是什么吗?你检查线程索引是否小于实际的图像大小?我用18个块而不是19个来确定它,但是输出没有改变,这些条也出现在帧的中间。所以我不认为是这样。它被解决了。谢谢。是D。imGrid(23,15);你帮了大忙!
unsigned int X = blockIdx.x * blockDim.x + threadIdx.x;
unsigned int Y = blockIdx.y * blockDim.y + threadIdx.y;