2012-08-08 98 views
4

我有一個從for循環中調用的CUDA內核。類似於CUDA內核調用來自內循環

for(i=0; i<10; i++) { 
    myKernel<<<1000,256>>>(A,i); 
} 

現在假設我有一個帶有15個流式多處理器(SM)的NVIDIA卡。 爲簡單起見,我們還假定只有一個塊可以映射到SM上,基本上說大多數時候我會在設備上執行15個塊。 由於內核執行是異步的,基本上在i = 1的調用在第一個內核啓動後立即執行(i = 0的調用)。

我的問題是:在某一點,當第一內核(其中i = 0)被執行時,將只有14個SM的忙,則只有13,那麼只有12,那麼只有11等

當一個SM可用時,i = 1的內核是否會在設備上發送執行,或者第二個內核的啓動是否等待所有SM完成處理第一個內核(i = 0的內核) ?

假設我正在一個CUDA流中工作。

回答

4

在同一個流中啓動的內核被序列化。在給定足夠資源(SM,共享內存等)的情況下,來自不同流的內核調用可能會重疊

+0

對同一個流上的操作進行序列化。在流中的先前工作完成之前,GPU不能讀取pushbuffer中的下一個條目。 CC2.x-3.0可以支持16個併發內核(如果從不同的流發佈,並且沒有錯誤的依賴性或顯着的狀態改變)。 GPU將按照內核通過驅動程序提交的順序將工作分配給SM。這意味着併發工作可能無序完成,但總是按順序進行分配。有關更多信息,請參閱http://developer.download.nvidia.com/CUDA/training/StreamsAndConcurrencyWebinar.pdf – 2012-08-09 04:57:40