作者ofd168 (大色狼來襲)
看板C_and_CPP
標題[問題] CUDA穩定性很差
時間Tue Jul 31 22:15:06 2012
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++ 2008
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
CUDA 4.1
問題(Question):
CUDA 穩定性很差
有時候對有時候會錯
case 1:
當我定義 dim3 b(32,32,1);
我使用逐步執行會發現
b.x = 64
b.y = xxxxxxx <---每次run都不太一樣 但都5還6位數(位數忘記了 反正很大)
b.z = xxx
就覺得很扯
所以我改用
dim3 b;
b.x = 32;
b.y = 32;
b.z = 1;
逐步執行 發現內容結果一樣是錯的
不然就是有的時候會發現監看式說 b不存在
逐步執行的時候 個別指定法 (分別給x,y,z) 會直接跳過...
可是最扯是
假設我是 dim b, c;
然後 b和c都分成x,y,z個別給值
只是 c.x = num/b.x;
c.y = num/b.y;
c.z = 1;
結果上面的c 逐步執行不會跳過 但是b的會直接跳過
最後解決方法是
只要寫 printf("%d %d",b.x, b.y);
就是顯示出來
逐步執行就不會跳過 且正常
case 2:
我有寫2個矩陣相乘
一個用gobal memory的寫法
一個用share memory
我是寫在副程式
及 main -> 呼叫 副程式 -> 呼叫kernal
如果我只使用一個kernal 2種寫法的結果都OK
可是如果我 呼叫kernal 執行結束回到 副程式 在run另一個kernal
出現結果是 gobal(第一個kernal)的會錯 share(第二個kernal)是正確的
就很奇怪.....
補充說明(Supplement):
我有想到是 可能我沒安裝好(但run 版上a大的教學文章中的陣列相加是正確的)
另一種就是CUDA和VS2008 結合性不夠好 被最佳化掉了....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.35.190.114
→ blackwindy:先懷疑是不是自己寫錯 07/31 22:32
→ kdjf:被最佳化掉==自己寫錯啊... Orz 07/31 22:34
→ MasterChang:不會用說工具爛的典範...XD 07/31 22:44
→ akasan:通常這種情況是有 race condition 07/31 23:36
→ gozule:直覺就是race condition 08/01 09:14
推 damody:電腦是不會錯的,一定是你不了解它程式寫錯! 08/01 21:38
推 diabloevagto:想到一句話,程式不是照你想的跑,是照你寫的跑。 08/01 22:01
推 purpose:開發者也是人也會出錯啊,Hello World都能被當成病毒了 08/01 22:05
→ purpose:當然機率比較低就是了,一般還是先懷疑自己這邊錯卡實際 08/01 22:05
推 damody:其實沒有重開機就要偷笑了,以前寫cuda時跑一次重開機一次 08/01 22:42
→ LifePattern:直覺就是你有寫錯... 08/02 14:49
→ joe7226107:case2裡的兩個kernel有sync嗎? 程式流並不會block在CPU 08/03 22:32
→ joe7226107:而是你副程式call完第一個kernel就會馬上call第二個ker 08/03 22:33
→ joe7226107:nel ...CUDA 4以後已經沒什麼bug了吧,問題應該是在devi 08/03 22:34
→ joe7226107:ce和CPU間混淆了 08/03 22:35
→ ofd168:2個kernal之間有用cudathreadsync隔開 08/03 23:14