作者abliou (把青春freeze)
看板C_and_CPP
標題[問題] cuda運算時主程式暫停等cuda算完
時間Sat Apr 2 21:22:26 2011
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux + GCC (nvcc)
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
cublas
問題(Question):
各位先進大家好 我是c的新手 最近在modify一個程式
是把一個現成的cublas程式跟一個現成的c++程式要結合在一起
這程式中有使用到全域變數 然後對這一個全域變數做修改後放到cublas中去跑
結構大概就是這樣(不是很會表達...)
global variants[]
global *i
strcut i {
int score
int array[]
}
for( i in variants[])
do
sent i into Cublas
done
(原諒我表達很爛 orz)
這個cublas會運算完後直接對i的score成員做更改
也就Culas傳回的分數會存在i的score中
不過後來有發現到 當進入迴圈後 i一丟到culas中
主程式似乎就直接進入到下一個迴圈 所以i在score還沒有被運算以前
那個array就被改掉
不知道先進們有沒有甚麼辦法可以讓程式在運算cublas時停下來
等到culas確實運算完後再進行迴圈的下一步
這問題卡了好久 希望厲害的先進們可以給小弟一些指點
感激不盡
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版)
對不起 因為還沒經過老闆同意 不敢把實驗室的程式碼貼出來
我只是負責結合 原始碼的擁有者不是我 所以沒辦法做主擅自貼出來
真的很抱歉
補充說明(Supplement):
--
如果青春注定要向前跑
他媽的...那我的出口在那?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.70.124.55
→ loveme00835:至少簡化一下變成一個小範例吧? 如果你沒有辦法做到, 04/02 21:26
→ loveme00835:又怎麼有辦法結合得好? 04/02 21:26
→ abliou:版大說的是 我來試著簡化看看 04/02 21:43
→ youknowme09:cudaThreadSynchronize() 04/02 22:04
→ janyfor:回傳值? 不用先把計算結果複製回CPU嗎? 複製會使資料同步 04/03 00:17
→ abliou:我有試過回傳 但似乎沒有作用 04/03 06:46
推 soulgem:CPU 和 GPU RAM 是兩回事... (初學很容易中招) 04/03 10:16
→ soulgem:上面錯了w # 不過真的是需要 synchronize... 04/03 10:20
→ janyfor:是根據你上面的敘述, 認為你使用回傳取得結果 04/03 13:23
→ janyfor:但要取得計算結果需將結果複製回來 04/03 13:24
→ janyfor:複製的動作會使得 CPU 以及 GPU 同步 04/03 13:25
→ janyfor:CPU call GPU 應該也只能用 void 沒有回傳值(早期) 04/03 13:27
→ abliou:感謝樓上的先進提供的解決辦法 問題已經解決了 謝謝大家! 04/04 05:11
→ abliou:這趟下來功力增加不少 orz 04/04 05:14