各位好
各种不同 GPGPU 与 CPU 之间的浮点数运算
拥有很多不同的方式可以计算出不同精确度
例如 PhenomII 时代的 GPU 就已经是 GPGPU
可以透过 OpenCL 将大量 MIMD 交给 GPGPU
因此有些浮点数运算会 offload 到 GPGPU
一直以来不同 Device 有不同的浮点数误差
但近期发现同 Device 多次运算却不同结果
其实我只是想要写个 GPGPU Benchmark 程式
http://cargon.net/GMEMD/GMEMD_GPU_Color_Real16bit_Benchmark.7z
但我发现每次交给 OpenCL 运算后有时出错
也有可能是总线传输时发生错误导致误差
因此我在比较的时候还重复比较反复确认之
token=0;
for(int j=0;j<t_height;++j){
for(int i=0;i<t_width;++i){
if( !( cvGetReal2D(fimg2_ch[0],j,i) == cvGetReal2D(fimg2_ch[1],j,i) &&
cvGetReal2D(fimg2_ch[2],j,i) == cvGetReal2D(fimg2_ch[0],j,i) &&
cvGetReal2D(fimg2_ch[1],j,i) == cvGetReal2D(fimg2_ch[2],j,i) )
) token=1;
if( !( cvGetReal2D(fimg2_ch[2],j,i) == cvGetReal2D(fimg2_ch[1],j,i) &&
cvGetReal2D(fimg2_ch[0],j,i) == cvGetReal2D(fimg2_ch[2],j,i) &&
cvGetReal2D(fimg2_ch[1],j,i) == cvGetReal2D(fimg2_ch[0],j,i) )
) token=1;
if( !( cvGetReal2D(fimg2_ch[1],j,i) == cvGetReal2D(fimg2_ch[2],j,i) &&
cvGetReal2D(fimg2_ch[2],j,i) == cvGetReal2D(fimg2_ch[0],j,i) &&
cvGetReal2D(fimg2_ch[0],j,i) == cvGetReal2D(fimg2_ch[1],j,i) )
) token=1;
}
}
printf("token=%d ",token);
因为输入的影像是 Grayscale 所以在重复执行 OpenCL Kernel 三次的数值应该完全相同
但有时候 token 还是会被写入 1,即代表 3 次相同浮点数运算有不同结果于内存存取
不知道大家看法如何?
这问题困扰了我很久!