【问题标题】:Understanding shifting and masking in opencl kernel理解 opencl 内核中的移位和屏蔽
【发布时间】:2012-11-01 11:50:35
【问题描述】:

考虑以下内核:

__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 

【问题讨论】:

  • 题主讲的是原子,题主问的是temp2的值。但我没有看到 temp2 的值受到原子的影响。原子的影响仅限于代码 sn-p 中的 s。
  • 好吧,你是对的。实际上我只展示了整个代码的一部分。无论如何,我正在编辑磁贴和代码...

标签: opencl pyopencl


【解决方案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 并放入 temp2temp2 在 temp 的值右移 8 位后在最后一行被覆盖。所以我们得到的值是:

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

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

【讨论】:

  • 这些是 4 个值: Image[idx]=idx+100 ,所以对于 idx=0, Image[o]=100, idx=1, Image[1]=101, idx=2 , 图像[2]=102, idx=3, 图像[3]=100
  • 那么Image[0].xImage[0].yImage[0].zImage[0].w 的值是多少?这是一个uint4;每个索引应该有 4 个值。
  • temp2 将有多少个值? 16?,假设合适的值你能告诉我吗?
  • 只需将每个值代入我给你的函数中,你就会得到正确的答案。数学对unit4 的每个元素单独进行。
  • 在您编写的最后一个等式中, Image[idx] 的值始终为 0-255,因此 Image[idx] / 256 在每种情况下都将计算为 0 (int/int)。因此 Temp2 将始终为 0。我错在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2016-03-10
相关资源
最近更新 更多