2012-09-05 129 views
7

當我們使用xptxas檢查寄存器使用,我們看到這樣的內容:CUDA不斷內存銀行

ptxas info : Used 63 registers, 244 bytes cmem[0], 51220 bytes cmem[2], 24 bytes cmem[14], 20 bytes cmem[16] 

不知目前還清楚地解釋CMEM [X]的任何文件。將不變內存分成多個銀行,總共有多少家銀行,以及除0,2,14,16以外的其他銀行用於什麼?

一個側面說明,@njuffa(特別感謝你)NVIDIA的論壇先前解釋什麼是銀行0,2,14,16:

使用的常內存在不斷的節目「變量」分區(銀行1),加上編譯器生成的常量(銀行14)。

CMEM [0]:內核參數

CMEM [2]:用戶定義的常量對象 CMEM [16]

:編譯器生成的常數(其中的一些可能對應於字面在源代碼中的常量)

+5

不客氣。我想我在NVIDIA論壇上的帖子中提到,GPU架構中恆定銀行的數量不同,銀行分配也不同。換句話說,這些是程序員不應該擔心的實現細節,因爲它們不是編程模型的一部分。使用多個銀行的一個原因是儘量減少常量內存衝突使用的可能性,特別是儘可能多地爲用戶代碼提供程序員可見的常量銀行。 – njuffa

+0

@njuffa我認爲這應該被轉換爲答案(與上面論壇帖子中的引號一起)。 :) – harrism

+0

@njuffa我有一個後續問題。編程指南說_執行配置的參數在實際的函數參數之前被評估,並且像函數參數一樣,目前通過共享內存傳遞給設備。我的理解是在編譯時,參數被複制到cmem [0 ],但在運行時,它們會在新塊開始之前從cmem複製到smem。那是對的嗎? –

回答

4

GPU常數銀行通過CUDA的使用是沒有正式記錄在案,以我的知識。恆定銀行的數量和使用情況在GPU世代之間確實有所不同。這些是程序員不必擔心的低級實現細節。

常數銀行的使用可被反向工程,如果需要的話,通過尋找在一個給定平臺所產生的機器代碼(SASS)。事實上,這就是我如何提出原始問題中引用的信息(這些信息來自我的NVIDIA開發人員論壇帖子)。據我所知,我在那裏給出的信息是基於專門應用於費米級設備的adhoc逆向工程,但由於目前論壇無法訪問,因此目前無法驗證這一點。

對於具有多個恆定銀行

一個原因是爲了保留用於使用CUDA程序員的用戶是可見的常數存儲器中,同時存儲由硬件或工具在附加恆定銀行提供額外的只讀信息。

請注意,CUDA數學庫是作爲源文件提供的,函數是內聯到用戶代碼中的,因此用戶可見常量內存的統計信息中包含了CUDA數學庫函數的常量內存使用情況。

0

請參閱 「Miscellaneous NVCC Usage」。 他們提到,恆定的銀行分配是特定於配置文件的。

PTX guide,他們說,除了64KB常量內存,他們有10多個銀行常量內存。驅動程序可以在這些區域中分配和初始化常量緩衝區,並將指向緩衝區的指針作爲內核函數參數傳遞。

我想,對於給定的NVCC會照顧什麼常數進入其內存配置文件。無論如何,我們不必擔心每個常量內存cmem [n]是否小於64KB,因爲每個bank的大小都是64KB,並且對於網格中的所有線程都是通用的。