1

次のカーネルについて考えてみます。

__kernel void histogramKernel(__global uint4 *Image,  ....)     
 {                         .
                     .
                     .
 const uint mask = (uint) (NBINS-1);  //NBINS=256
 uint4 temp = Image[idx];   
 uint4 temp2 = (temp & mask);
 temp = temp >> 8;
 temp2 = (temp & mask);
 . . .

 }

仮定する:

4つのスレッドが実行されています。idx=0,1,2,3およびImage[idx]= idx + 100

最後の行のtemp2の値はどうなりますか?

アップデート:

の適切な値を想定します

 Image[0].x, Image[0].y, Image[0].z, Image[0].w
 Image[1].x, Image[1].y, Image[1].z, Image[1].w
 Image[2].x, Image[2].y, Image[2].z, Image[2].w
 Image[3].x, Image[3].y, Image[3].z, Image[3].w 
4

1 に答える 1

1

tempと の値はにtemp2依存しないため、この問題からアトミックを完全に排除できますs

__kernel void histogramKernel(__global uint4 *Image,  ....)     
 {                        
     //...                                   
     const uint mask = (uint) (NBINS-1);  //NBINS=256
     uint4 temp = Image[idx];   
     uint4 temp2 = (temp & mask);
     //...
     temp = temp >> 8;
     temp2 = (temp & mask);
     //...
 }

最後に、マスクは等しい0x000000FFので、temp の値は 256 で modded され、 に入れられtemp2ます。 temp2temp の値が 8 ビット右にシフトされた後、最終行で上書きされます。したがって、次の値を取得します。

temp2 = (Image[idx] / 256) % 256

あなたの質問から、何Imageに初期化されているかわかりません(4つの値があり、1つしか与えていないように見えるため)。

于 2012-11-02T18:31:56.577 に答える