作者t19861203 (雉)
看板C_and_CPP
標題[問題] CUDA Double precision 矩陣運算有問題
時間Tue Nov 24 17:54:59 2009
解決方法:
因為問題已經解決了, 所以將解決方法打上來, 也許以後有相同問題的人會有幫助.
因為版友 lgen7604 利用 GTX295測試之後, 發現跑出來的結果正常
我還麻煩他跑大一點的迴圈, 上萬次之後依然沒出現問題 (之前大約100次就會出錯)
然後我就描述給借我 c1060 的朋友, 跟他說發生的狀況
之後他用實驗室的 s1070 再重覆一次試驗, 發現結果完全正確
所以推測是原先 c1060 的電腦太久沒有重開機, 導致記憶體出錯
(畢竟 GPU 的 Memory 沒有 ECC)
所以嘗試重開機之後, 就完全可以正常運作了
以後用 GPU 跑程式的可能要多注意這個問題
感謝協助我找出問題的版友們
遇到的問題: (題意請描述清楚)
CUDA 在 Double precision 才會出現的問題
將一個二維矩陣 A(i,j) = B(i,j) 利用迴圈重複計算 CUDA kernal 數十次
一開始幾個迴圈計算的結果都正確, 但算到後來會突然錯誤
數值錯誤不是整個矩陣都出錯, 是只有矩陣中的特定元素有錯
而且出現錯誤的元素位置, i index 都會與 14, 15有關
e.g. 14, 15, 30, 31, 270, 271, 286, 287
而且這個錯誤是只有在 Double precision 的情況下才出現
開發平台:
OS: Ubuntu 9.04 server 64bit
GPU: nVidia Tesla C1060
Compile: nvcc filename.cu -arch=sm_13
有問題的code: (請善用置底文標色功能)
https://gist.github.com/c446433349c218de2dc3
補充說明:
一開始是測試矩陣元素平移 A(i,j)=B(i+1,j) 的時候發現有錯誤 後來為了找出錯誤
直接寫一個最簡單的矩陣相等, 沒想到還是會有問題, 而且只有在 Double precision
重複利用迴圈不斷計算 Cuda kernal 才發生的問題, 發生的迴圈次數不一定, 但是數值
有錯誤的元素只有特定位置才會出錯
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.123.72.3
1F:推 holymars:聽起來非常像是硬體問題..你要不要同樣的code換一個平臺 11/24 18:56
2F:→ holymars:或換一張硬體試試看? 11/24 18:56
3F:→ holymars:1.發生的迴圈次數不一定 2.index只有在特定位置會出錯 11/24 18:58
4F:→ holymars:剛好nVidia的第二代硬體架構 是每個陣列24組SP,每個陣 11/24 18:59
5F:→ holymars:列共用8個texture unit.. 11/24 19:01
6F:推 holymars:你能不能把所有出問題的index都列出來@@? 11/24 19:13
7F:→ lgen7604:用GTX295執行正常 換個硬體試試吧 11/24 19:34
8F:推 andyjy12:會不會是DRam有問題? 11/25 12:55
9F:→ t19861203:因為我的i是跟著threadIdx.x, 所以我推測是thread有問題 11/25 13:16
10F:→ t19861203:但後來我修改程式, 讓他前32個threadIdx.x 不使用, 程式 11/25 13:16
11F:→ t19861203:依然會在 i=14, 15, 31, 32 這些位置有問題 11/25 13:17
※ 編輯: t19861203 來自: 140.123.72.3 (11/27 09:55)