1
OpenCL / 请教一个关于abs求值的问题
« 最后发表 作者 ljyoicqn 于 十一月 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端计算的结果不一致。请问这是什么原因导致的?多谢。
我的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端计算的结果不一致。请问这是什么原因导致的?多谢。