请教一个关于abs求值的问题

  • 0 replies
  • 265 views
请教一个关于abs求值的问题
« 于: 十一月 11, 2023, 11:42:01 pm »
我在OpenCL中实现了一个关于对unsigned char类型的数据进行求绝对值累加和的计算过程,但是在计算过程中出现了一个比较奇怪的问题,也可能是我经验不足,请大家帮忙看看这是什么情况。
我的PC端的代码是
   int* pOut_Multi = new int[1280 * 1280];
   memset(pOut_Multi, 0, sizeof(int) * 1280 * 1280);
   int idx_o = 0;
   for (int r = 0; r < (1600 - 512 + 1); r++)
   {
      if( r%10==0)std::cout << "r = " << r << std::endl;
      for (int c = 0; c < (1600 - 512 + 1); c++)
      {
         for (int r_real = 0; r_real < 512; r_real++)
         {
            for (int c_real = 0; c_real < 512; c_real++)
            {
               pOut_Multi[idx_o] += abs(126-abs(pReal[r_real*512+c_real]-pBase[(r+r_real)*1600+c+c_real]) );
            }
         }
         idx_o++;
      }
   }
我的OpenCL代码是:
__kernel void __FullMatch(__global unsigned char* pBase, __global unsigned char* pReal, __global unsigned char* pMask,
             __global int* out, const int w, const int h, const int w_base)
 {
   __local int r, c;
   __local int idx;
   __local int idx_base;
   __local int offset;
   __local int id;
   id = get_global_id(0);
   idx = 0;
   idx_base = 0;
   offset = 0;
   out[id] = 0;
   int r_base = id/w_base;
   int c_base = id%w_base;
   __local int tmpint;
   //采用嵌套计算abs有问题。如果采用与pc一样的嵌套abs表达式,计算结果有差异。
   for(r=0; r<h;r++ )
   {
      idx_base = (r_base + r) * 1600 + c_base;
      for (c = 0; c < w; c++)
      {
         tmpint = pMask[idx]* (126-abs(pReal[idx]-pBase[idx_base]));      
         out[id] += abs(tmpint);
         idx++;
         idx_base++;
      }
   }
 }
其中,pMask是一个全为1的数组。
采用上面的写法,结果是与pc端一致的。
如果         tmpint = pMask[idx]* (126-abs(pReal[idx]-pBase[idx_base]));   
out[id] += abs(tmpint);
这两句写成
         out[id] += pMask[idx]* abs(126-abs(pReal[idx]-pBase[idx_base]));,结果就与PC端计算的结果不一致。请问这是什么原因导致的?多谢。