4
//This is my kernel function

__global__ void createSCM(Pixel*pixelMat, //image
                          int imgRows, //image dimensions
                          int imgCols,
                          int*matrizSCM, //Coocurrence matrix
                          int numNiveles, //coocurrence matrix levels = 256
                          int delta_R, //value = {-1,0 or 1}
                          int delta_C) //value = {-1,0 or 1}
{
    int i = blockIdx.y*blockDim.y+threadIdx.y;
    int j = blockIdx.x*blockDim.x+threadIdx.x;

    int cols = numNiveles;

    int posx,posy;

    if ( (j + delta_C) < imgCols && (i + delta_R) < imgRows && 
       ((j + delta_C) >= 0) && ((i + delta_R) >= 0) )
    {
       posx = pixelMat[i*imgCols+j].channel_0;
       posy = pixelMat[(i + delta_R)*imgCols+(j + delta_C)].channel_0;

       matrizSCM[posx*cols+posy]++;
       matrizSCM[posy*cols+posx]++;
    }

}

struct Pixel {

    int channel_0;
};

共起行列にカウントエラーがあります。

pixelMat[i*imgCols+j]pixelMat[(i + delta_R)*imgCols+(j + delta_C)]

同じスレッドで異なる位置にアクセスしています。

これは私のカーネル呼び出しです

int Grid_Dim_x=imagenTest.rows, Grid_Dim_y=imagenTest.cols;
int Block_Dim_x=1, Block_Dim_y=1;   

dim3 Grid(Grid_Dim_x, Grid_Dim_y);  
dim3 Block(Block_Dim_x,Block_Dim_x);

createSCM<<<Grid,Block>>>(...)

各ブロックにはスレッドが 1 つだけあり、各ブロックはピクセルを表します

この問題に対する良い解決策はありますか?

ありがとう :)

4

1 に答える 1

2

不変入力の異なるメモリ セルからの読み取りでは、対処しなければならない並列の危険は発生しません。問題はmatrizSCM、複数のスレッドが一度に同じメモリ セルをインクリメントできる場所にあります。

AnatomicAdd(addr,1)は簡単な修正です --- これによりアルゴリズムが正しくなるはずですが、かなり遅くなる可能性があります。それを正しくすることが最初のステップです。次に、ヒストグラム計算と並列削減アルゴリズムの Web で利用可能な例を見て、それが問題に適用できるかどうかを確認できます。

最後に、Robert がコメントで指摘したように、ブロック内のスレッドを 1 つだけ起動するのは非常に非効率的です。ハードウェア SIMD ユニットを利用するには 32 の倍数が必要で、さまざまなメモリ レイテンシを隠すには通常約 256 スレッドが必要です。

また、画像が大きく、まだ数千の 256 スレッド ブロックが必要な場合は、起動するブロックを少なくして (約 60 ~ 120)、各ブロックで複数のピクセルを順次処理することを検討できます。matrixSCMそうすれば、 のコピーを共有メモリに入れることができるかもしれません。matrixSCMこれにより、ブロックごとに個別のコピーが作成されるため、ブロック間のアトミックな競合が少なくなります。明らかに、カーネルの最後に、ブロックはまだ部分的な結果をグローバルなものに「送信」する必要がありますが、それは単一のステップ操作になります。

于 2012-11-27T09:16:45.890 に答える