PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
C_and_CPP
[問題] CUDA CPU和GPU執行同步問題
作者:
LOXAERIC
2014-05-23 18:44:58
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux , 顯卡 cuda compute capability: 1.3, CUDA 2.3版
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
CUDA
問題(Question):
最近因為要處理矩陣運算,所以開始研究CUDA,有看過一些精華區的教學文章了,
不過有些地方還不是很清楚,因此想請問版友下面的一些情況,
CPU和GPU的執行順序以及效能影響各會是如何?
Case 1. :
kernel_A<<<GridSize,BlockSize>>>(d_result1,d_arg1);
...CPU function1...
cudaThreadSynchronize();
kernel_B<<<GridSize,BlockSize>>>(d_result2,d_data1);
kernel_C<<<GridSize,BlockSize>>>(d_result2,d_data1);
...CPU function2...
Case 2. :
kernel_A<<<GridSize,BlockSize>>>(d_result1,d_arg1);
//複製kernel_A的結果(d_resut1)回CPU(result1)
cudaMemcpy(result1, d_result1, size, cudaMemcpyDeviceToHost);
...CPU function1(result1)...
預期的正確結果(Expected Output):
這是我自己的想法,不曉得正不正確
Case 1. : CPU呼叫kernel_A後,自己不等GPU執行完kernel_A,
CPU直接繼續執行function1,直到cudaThreadSynchronize(),
確保kernel_A被執行完,接下來CPU連續呼叫kernel B和C,
一樣不等GPU是否執行完這兩個kernel,繼續直接執行function2,
而kernel B和C因為會使用相同的d_data1,可能因為同時執行而
互搶著向memory access data1,造成效能下降,且因為都會寫
data到d_result2,所以會有race condition。
Case 2. : CPU呼叫kernel_A後,自己不等GPU執行完kernel_A,
CPU直接繼續執行cudaMemcpy,但是因為cudaMemcpy的是kernel_A的結果,
所以CPU會等到kernel_A被執行完才複製結果回CPU端,
接下來CPU就執行function1。
綜合以上,我目前的想法是,CPU呼叫完kernel後,不會等kernel是否執行完,
除非 1.使用cudaThreadSynchronize() 2.使用cudaEventSynchronize
3.使用cudaMemcpy,且複製的資料需要是前面kernel所用的參數
這幾種情形才會強制讓CPU和GPU端同步,不曉得這樣理解是否正確@@?
補充說明(Supplement):
作者:
k387259
(台灣李宏感)
2014-05-24 07:44:00
GPU跟CPU的同步現在都是使用cudaDeviceSynchronizeThreadSynchronize似乎是比較舊的版本
http://ppt.cc/5M1V
然後kernelB和C會順序執行 除非你是用stream 但CPU依然跑下一個functionstream部分可以參考官方PDF
http://ppt.cc/i2oe
然後你說的除非3 cudaMemcpy我的理解應該是 你不是用Async的話,應該都是算是cpu的指令最近我也在用CUDA寫程式,不足的地方還請版友補充
作者:
Lepton
(輕子)
2014-05-24 12:36:00
<<<a,b>>>的呼叫法都是非同步的,不等做完就往下走GPU有自己的queue就是stream的意思,不寫都是預設的每個queue都會保證依序執行,所以kerenlBC是順序的做memcpy會保證queue執行完後才作複製的動作且CPU也會stall學CUDA建議直接看官方的說明書,CUDA的東西變化很快
作者:
LOXAERIC
2014-05-24 13:25:00
了解,非常感謝Lepton版友解釋!!
作者:
k387259
(台灣李宏感)
2014-05-24 15:42:00
你可以寫隻測試程式cuda kernel內可以printfkernel讓他跑個<<1,1>>然後裡面一個大迴圈在printf
作者:
LOXAERIC
2014-05-24 15:52:00
喔喔,看了一下我的平台好像只能用cuPrintf,不過我會試看看,感謝!
繼續閱讀
[問題] 關於指標的問題
LeeGarDer
[問題] 陣列名稱與指標
kumusou
[問題] 陣列無法宣告太大?(最短路徑演算法)
hfuman
[問題] 面試遇到的問題
kumusou
[問題] 如何讓C語言依據時間去執行某件事情..
BIAO
[問題] loop迴圈數不固定
parkko
[分享] unreal engine 4 跨平台建置
damody
Re: [問題] 請問如何用程式把IP Camera畫面抓下來
Jockey66666
[問題] 程式使用記憶體的上限
googled
[問題] 影像去模糊
tsmctsmc
Links
booklink
Contact Us: admin [ a t ] ucptt.com