考虑以下内核:
__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
答案 0 :(得分: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并放入temp2
。在temp的值右移8位后,最后一行会覆盖temp2
。所以我们得到的值是:
temp2 = (Image[idx] / 256) % 256
我无法从你的问题中判断出Image
被初始化为什么(因为有4个值而你似乎只给了一个)。