各位好
各種不同 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 次相同浮點數運算有不同結果於記憶體存取
不知道大家看法如何?
這問題困擾了我很久!