[問題] 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,不過我會試看看,感謝!

Links booklink

Contact Us: admin [ a t ] ucptt.com