1

私はCUDAの初心者であり、SobelEdge検出カーネルを実装しようとしています。このコードを使用していますが、機能しません。誰かがそれの何が悪いのか教えてもらえますか?-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をサポートします。したがって、1つのブロックでこれほど多くのスレッドを実行することはできません。行dim3 dimBlock(W,H); が正しくありません。スレッドをいくつかのブロックに分割する必要があります。

もう1つの問題は、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;
于 2012-05-29T12:18:36.663 に答える