2011-06-28 31 views
4

CUDA初學者在這裏。CUDA:將參數傳遞給內核是否會減慢內核的啓動速度?

在我的代碼中,我目前在宿主代碼的循環中多次啓動內核。 (因爲我需要塊之間的同步)。所以我想知道我是否可以優化內核啓動。

我的內核啓動是這個樣子:

MyKernel<<<blocks,threadsperblock>>>(double_ptr, double_ptr, int N, double x); 

所以推出一個內核中某些信號顯然有從CPU到GPU中去,但我想知道,如果參數的傳遞讓這個過程明顯較慢。

的參數傳遞給內核是相同的,每一次,所以也許我可以拷貝一次他們節省時間,通過

__device__ int N; 
<and somehow (how?) copy the value to this name N on the GPU once> 

定義的名稱訪問它們在內核和簡單地啓動與內核沒有像這樣的論據

MyKernel<<<blocks,threadsperblock>>>(); 

這會使我的程序更快嗎? 這樣做的最好方法是什麼? AFAIK參數存儲在一些不變的全局內存中。我如何確保手動傳輸的值存儲在內存中,速度更快或更快?

在此先感謝您的幫助。

回答

5

我希望這種優化的好處很小。在理智的平臺上(即除WDDM之外的任何其他平臺),內核啓動開銷僅爲10-20微秒,所以可能沒有太多的改進空間。如上所述,如果你想嘗試,影響這一點的邏輯方法是使用常量內存。在翻譯單元範圍內將每個參數定義爲__constant__符號,然後使用cudaMemcpyToSymbol函數將值從主機複製到設備常量存儲器。

3

簡單的回答:沒有。

更詳細一點:無論如何,您需要將一些信號從主機發送到GPU,以啓動內核本身。此時,參數數據的更多字節再也無關緊要了。

+0

在極端情況下,當使用非常「緊密」的內核時,它可能確實很重要,但當然這隻有在沒有其他更高延遲操作的情況下才會發生。 – pszilard

+1

即使是非常緊密的內核。發送1個字節或10KB到GPU並不重要。由於延遲而不是吞吐量,它將花費相同的時間量。當你開始發送兆字節的數據時,吞吐量可能會發揮作用... – CygnusX1