[問題] CUDA CPU和GPU執行同步問題
開發平台(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):
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.187.177
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1400841902.A.3B5.html
推
05/24 07:44, , 1F
05/24 07:44, 1F
→
05/24 07:45, , 2F
05/24 07:45, 2F
→
05/24 07:47, , 3F
05/24 07:47, 3F
→
05/24 07:47, , 4F
05/24 07:47, 4F
→
05/24 07:48, , 5F
05/24 07:48, 5F
→
05/24 07:49, , 6F
05/24 07:49, 6F
→
05/24 07:49, , 7F
05/24 07:49, 7F
→
05/24 07:50, , 8F
05/24 07:50, 8F
先感謝k387259版友回覆!! 這邊忘記說我的cuda版本只有2.3版,
所以是用ThreadSynchronize,而kernelB和C會順序執行是指說如果我沒有用stream的話,
對於"CPU"這邊會連續呼叫kernel B和C,不理B和C的執行狀況,但是在"GPU"那他會順序
執行B和C,也就是雖然同時呼叫B和C,但因為沒有使用stream,所以在GPU那反而是順序
執行而不必擔心同時access data1以及寫入d_result2而造成race condition嗎?
所以就我目前理解是CPU這邊遇到kernel都是呼叫完就不管是否執行完,會繼續往下執行
,而上面的除非3.只是因為cudamemcpy算是cpu端指令,所以可能會發生呼叫完kernel,
馬上複製GPU計算結果回來,造成資料可能有錯(也就是case2.),這樣理解正確嗎@@?
※ 編輯: LOXAERIC (114.35.252.74), 05/24/2014 10:29:11
→
05/24 12:36, , 9F
05/24 12:36, 9F
→
05/24 12:37, , 10F
05/24 12:37, 10F
→
05/24 12:37, , 11F
05/24 12:37, 11F
→
05/24 12:38, , 12F
05/24 12:38, 12F
→
05/24 12:40, , 13F
05/24 12:40, 13F
→
05/24 13:25, , 14F
05/24 13:25, 14F
推
05/24 15:42, , 15F
05/24 15:42, 15F
→
05/24 15:43, , 16F
05/24 15:43, 16F
→
05/24 15:52, , 17F
05/24 15:52, 17F
→
05/24 15:52, , 18F
05/24 15:52, 18F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章