2010-12-12 108 views
3

CUDA目前不允許嵌套內核。CUDA中的嵌套內核

具體而言,我有以下問題: 我有N個M維數據。爲了處理N個數據點中的每一個,需要按順序運行三個內核。由於內核的嵌套是不允許的,我不能創建一個調用這三個內核的內核。因此,我必須連續處理每個數據點。

一個解決方案是編寫一個包含所有其他三個內核功能的大內核,但我認爲它不是最優的。

任何人都可以建議如何使用流並行運行N個數據點,同時保留三個較小的內核。

感謝。

+0

大內核有什麼問題? – Anycorn 2010-12-12 04:23:58

+0

我無法實現細粒度並行。假設我正在一個數據點上進行三種不同的矩陣運算。我可以爲它們中的每一個編寫內核。假定其中一個內核是矩陣乘法C = A * B。乘法內核將並行發現C(i,j)的每個條目。當我擁有一個包含所有三個操作的大內核時,我無法做到這一點。大內核將會做的只是並行處理數據點。 – Prasanna 2010-12-12 04:43:25

+0

你當然可以運行多個流。相當簡單,基本上內核啓動的第四個參數是流。在同一個流上啓動的內核將按順序執行,但在不同的流上啓動的內核將以非同步的順序執行。如果你有關於實現的具體問題,我可以幫助你, – Anycorn 2010-12-12 05:00:08

回答

3

好吧,如果你想使用流......你將要創建N個流:

cudaStream_t streams; 
streams = malloc(N * sizeof(cudaStream_t)); 
for(i=0; i<N; i++) 
{ 
    cudaStreamCreate(&streams[i]); 
} 

然後爲第i個數據點,你想用cudaMemcpyAsync用於傳輸:

cudaMemcpyAsync(dst, src, kind, count, streams[i]); 

,並打電話給你的所有四個配置參數內核(共享內存可以爲0,當然):

kernel_1 <<< nBlocks, nThreads, sharedMemory, streams[i] >>> (args); 
kernel_2 <<< nBlocks, nThreads, sharedMemory, streams[i] >>> (args); 

當然清理:

for(i=0; i<N; i++) 
{ 
    cudaStreamDestroy(streams[i]); 
} 
free(streams) 
0

如今,隨着費米兼容性,能夠發動平行內核

2

作爲更新到所選擇的答案,NVIDIA的GPU計算能力3.5現在允許嵌套仁,他們稱之爲Dynamic Parallelism