2013-03-01 52 views
2

有在CUDA Compiler Driver NVCC - Options for steering GPU code generation的線是模糊的,以我:ABI如何定義GPU中寄存器的數量?

值大於由ABI所需的最小寄存器將被編譯器以ABI最小極限被顛簸以下。

ABI是否對__global____device__函數使用的寄存器數有任何標準或限制?

+1

我想(現在找不到參考)ABI需要至少16個寄存器。因此,如果您指定較低的寄存器數(例如使用-maxrregcount),編譯器會將指定的限制增加到ABI所要求的最小值,並將打印一條建議消息,指出它已這樣做。至於每個線程可用的最大32位寄存器數量,取決於GPU架構:sm_1x爲124個寄存器,sm_2x爲63個寄存器,sm_3x爲254個寄存器。 – njuffa 2013-03-01 18:10:54

+0

但ABI與GPU寄存器有什麼關係?在CUDA誕生之前它在那裏嗎? – 2013-03-01 18:14:39

+0

一般來說,ABI(應用程序二進制接口)是存儲佈局,將參數傳遞給函數,將函數結果傳遞迴調用程序等的體系結構特定約定。ABI(包括x86_64,ARM)經常爲特定指定特定寄存器諸如堆棧指針,函數返回值,函數參數等任務。由於GPU架構允許每個線程可變數量的寄存器,因此使用ABI需要最少數量的寄存器來填充這些定義的角色。如果我沒有記錯,CUDA推出了2.0版的ABI。 – njuffa 2013-03-01 18:25:34

回答

3

我認爲(現在找不到參考),CUDA ABI需要至少16個寄存器。因此,如果您指定較低的寄存器數(例如使用-maxrregcount),編譯器會將指定的限制增加到ABI所要求的最小值,並將打印一條建議消息,指出它已這樣做。至於每個線程可用的最大32位寄存器數量,取決於GPU架構:sm_1x爲124個寄存器,sm_2x爲63個寄存器,sm_3x爲254個寄存器。一般而言,ABI(應用程序二進制接口)是存儲佈局,參數傳遞給函數,將函數結果傳遞迴調用程序等的體系結構特定約定.ABI(包括x86_64,ARM)通常指定特定註冊特定任務,如堆棧指針,函數返回值,函數參數等。由於GPU架構允許每個線程有不定數量的寄存器,因此使用ABI需要最少數量的寄存器來填充這些定義的角色。如果我沒有記錯,CUDA推出了3.0版本的ABI,這是支持費米級GPU的第一個版本。

ABI需要計算能力2.0或更高。較舊的GPU架構缺乏ABI所需的硬件功能。大多數較新的CUDA特性(如設備端printf()和malloc())稱爲函數,單獨編譯等都依賴於並需要使用ABI,並且默認情況下在編譯器生成的代碼中使用sm_20和以上。您可以使用-Xptxas -abi = no禁用ABI。我強烈建議不要這樣做。

相關問題