[討論] 浮點數運算的效能與誤差
各位好
各種不同 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 次相同浮點數運算有不同結果於記憶體存取
不知道大家看法如何?
這問題困擾了我很久!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.229.44.220
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1507407177.A.D71.html
※ 編輯: a34021501 (36.229.44.220), 10/08/2017 04:16:10
推
10/08 04:29,
8年前
, 1F
10/08 04:29, 1F
→
10/08 10:34,
8年前
, 2F
10/08 10:34, 2F
推
10/08 15:38,
8年前
, 3F
10/08 15:38, 3F
推
10/08 18:04,
8年前
, 4F
10/08 18:04, 4F
→
10/08 18:05,
8年前
, 5F
10/08 18:05, 5F
→
10/09 04:27,
8年前
, 6F
10/09 04:27, 6F
推
10/09 09:32,
8年前
, 7F
10/09 09:32, 7F
→
10/09 09:33,
8年前
, 8F
10/09 09:33, 8F
→
10/09 09:33,
8年前
, 9F
10/09 09:33, 9F
→
10/09 09:33,
8年前
, 10F
10/09 09:33, 10F
→
10/09 09:33,
8年前
, 11F
10/09 09:33, 11F
→
10/09 09:34,
8年前
, 12F
10/09 09:34, 12F
推
10/09 13:26,
8年前
, 13F
10/09 13:26, 13F
→
10/09 18:19,
8年前
, 14F
10/09 18:19, 14F
→
10/09 22:38,
8年前
, 15F
10/09 22:38, 15F
→
10/09 22:39,
8年前
, 16F
10/09 22:39, 16F
→
10/09 22:40,
8年前
, 17F
10/09 22:40, 17F
→
10/09 22:45,
8年前
, 18F
10/09 22:45, 18F
→
10/10 15:34,
8年前
, 19F
10/10 15:34, 19F
→
10/10 15:35,
8年前
, 20F
10/10 15:35, 20F
→
10/10 15:36,
8年前
, 21F
10/10 15:36, 21F
→
10/10 15:37,
8年前
, 22F
10/10 15:37, 22F
→
10/10 15:38,
8年前
, 23F
10/10 15:38, 23F
推
10/10 15:38,
8年前
, 24F
10/10 15:38, 24F
→
10/10 15:39,
8年前
, 25F
10/10 15:39, 25F
→
10/10 15:39,
8年前
, 26F
10/10 15:39, 26F
推
10/10 15:42,
8年前
, 27F
10/10 15:42, 27F
→
10/10 15:44,
8年前
, 28F
10/10 15:44, 28F
→
10/10 15:44,
8年前
, 29F
10/10 15:44, 29F
→
10/10 15:44,
8年前
, 30F
10/10 15:44, 30F
→
10/10 15:45,
8年前
, 31F
10/10 15:45, 31F
→
10/10 15:46,
8年前
, 32F
10/10 15:46, 32F
→
10/10 15:50,
8年前
, 33F
10/10 15:50, 33F
→
10/10 15:50,
8年前
, 34F
10/10 15:50, 34F
→
10/10 17:36,
8年前
, 35F
10/10 17:36, 35F
→
10/16 19:21,
8年前
, 36F
10/16 19:21, 36F
推
10/16 23:45,
8年前
, 37F
10/16 23:45, 37F
→
10/17 19:53,
8年前
, 38F
10/17 19:53, 38F
→
10/17 21:31,
8年前
, 39F
10/17 21:31, 39F
→
10/17 21:49,
8年前
, 40F
10/17 21:49, 40F
→
10/17 23:28,
8年前
, 41F
10/17 23:28, 41F