了解opencl内核中的转换和屏蔽

时间:2012-11-01 11:50:36

标签: opencl pyopencl

考虑以下内核:

__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和  图像[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 

1 个答案:

答案 0 :(得分: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。在temp的值右移8位后,最后一行会覆盖temp2。所以我们得到的值是:

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

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