2013-01-18 118 views
0

我希望對以下內容有所幫助。多個內核調用

我有一個內核函數,它具有數組作爲輸入,並且在計算之後,其中一個數組會更改其值。我將它稱爲dev_array。

我想dev_array再次用作我的內核計算的輸入大約80次,所以我可以得到dev_array的正確結果,後者在我的主要使用。

我該怎麼做? 我已經嘗試在線程條件之前在內核中使用循環。

while(i<80){ 
    i++; 
    if(tidx<N){` 
    //calculating dev_array then using it again at the beginning of while 
} 
} 

但它沒有工作。它看起來像是在一個無限循環中。

從主80次調用內核並一直進行memcopy操作並不令人滿意。

while(i<80){ 
i++; 
cudaMemcpy(dev_array,cudaMemcpyHostToDevice); 
kernel<<<grid,block>>>(dev_array); 
cudaMemcpy(dev_array,cudaMemcpyDeviceToHost); 
} 

感謝您的幫助

+0

你真的沒有描述這個問題。你究竟做了什麼?發生了什麼?你期望會發生什麼? –

+0

也許你可以用'{}'來定義像int i = 0這樣的循環內容。 while(i <80){kernel <<<> >>();我++;}' – kangshiyin

回答

1

您不必MEMCOPY所有的時間。內核執行後,數據保留在設備內存中,並且指針始終指向正確的點。

您可以循環內核以迭代您要運行該函數的次數,甚至將結果傳遞給第二個內核。

當一個接一個調用內核時,可以確保它們在隊列中執行並具有所需的同步。當內核屬於同一個Cuda 時這是有效的。 Here您可以瞭解更多關於流的信息以及它們的工作方式。

如果您可以管理一種在您的內核中進行同步並使用for循環的方式,那麼只有在例如使用內存時纔會更快,並且您可以避免始終讀取和複製到(較慢的)全局內存。但是如果你想避免閱讀和寫作衝突,那麼就沒有辦法阻擋所有的障礙。 只有__syncthreads()可用於一個塊內的線程