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

我们可以从这个问题中完全消除原子性,因为 和 的值temptemp2依赖于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 并放入temp2. temp2在 temp 的值右移 8 位后,在最后一行被覆盖。所以我们得到以下值:

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

我无法从您的问题中看出Image初始化为什么(因为有 4 个值,而您似乎只给出了一个)。

于 2012-11-02T18:31:56.577 回答