開發平台(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):