[問題] CUDA CPU和GPU執行同步問題

看板C_and_CPP (C/C++)作者時間12年前 (2014/05/23 18:45), 12年前編輯推噓2(2016)
留言18則, 3人參與, 最新討論串1/1
開發平台(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
GPU跟CPU的同步現在都是使用cudaDeviceSynchronize
05/24 07:44, 1F

05/24 07:45, , 2F
ThreadSynchronize似乎是比較舊的版本http://ppt.cc/5M1V
05/24 07:45, 2F

05/24 07:47, , 3F
然後kernelB和C會順序執行 除非你是用stream 但CPU依然跑
05/24 07:47, 3F

05/24 07:47, , 4F
下一個function
05/24 07:47, 4F

05/24 07:48, , 5F
stream部分可以參考官方PDF http://ppt.cc/i2oe
05/24 07:48, 5F

05/24 07:49, , 6F
然後你說的除非3 cudaMemcpy我的理解應該是 你不是用Async
05/24 07:49, 6F

05/24 07:49, , 7F
的話,應該都是算是cpu的指令
05/24 07:49, 7F

05/24 07:50, , 8F
最近我也在用CUDA寫程式,不足的地方還請版友補充
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
<<<a,b>>>的呼叫法都是非同步的,不等做完就往下走
05/24 12:36, 9F

05/24 12:37, , 10F
GPU有自己的queue就是stream的意思,不寫都是預設的
05/24 12:37, 10F

05/24 12:37, , 11F
每個queue都會保證依序執行,所以kerenlBC是順序的做
05/24 12:37, 11F

05/24 12:38, , 12F
memcpy會保證queue執行完後才作複製的動作且CPU也會stall
05/24 12:38, 12F

05/24 12:40, , 13F
學CUDA建議直接看官方的說明書,CUDA的東西變化很快
05/24 12:40, 13F

05/24 13:25, , 14F
了解,非常感謝Lepton版友解釋!!
05/24 13:25, 14F

05/24 15:42, , 15F
你可以寫隻測試程式cuda kernel內可以printf
05/24 15:42, 15F

05/24 15:43, , 16F
kernel讓他跑個<<1,1>>然後裡面一個大迴圈在printf
05/24 15:43, 16F

05/24 15:52, , 17F
喔喔,看了一下我的平台好像只能用cuPrintf,不過我會試
05/24 15:52, 17F

05/24 15:52, , 18F
看看,感謝!
05/24 15:52, 18F
文章代碼(AID): #1JVoQkEr (C_and_CPP)
文章代碼(AID): #1JVoQkEr (C_and_CPP)