2013-07-01 71 views
1

我使用CUDA 5.5,VS2010和參數compute_35和sm_35。我有一個GFX泰坦。寄存器/線程說50,但他們實際上是56

我有註冊一個內核/螺紋說,它使​​用50個寄存器,每個塊的線程128和寄存器/塊是7168.

一百二十八分之七千一百六十八= 56

我不使用紋理。

見下面的圖片:

registers

如果我限制寄存器使用到48我得到這個: 47寄存器/線程,但實際上使用的是48%線程

回答

8

所有架構有註冊文件分配粒度。實際上,這意味着每個warp或block的已分配寄存器數量必須四捨五入到寄存器頁面大小的下一個最大倍數。

對於您的GTX泰坦,寄存器文件分配大小爲256個寄存器,分配單位爲每個warp。因此,使用你的例子:

50 registers per thread = 50 * 32 = 1600 registers per warp 
1600 registers per warp/256 registers per page = 7 pages per warp 
7 pages per warp = 7 * 256 = 1792 registers per warp 
128 threads per block = 4 warps per block = 4 * 1792 = 7168 registers per block 

從而內核的一個塊需要7168個寄存器,即使每塊線程*線程寄存器的數量只給出了6400個寄存器。您可以在每個版本的CUDA工具包附帶的佔用電子表格中看到所有這些數字。

+2

寄存器/線程來自CUDA驅動程序的編譯器輸出。寄存器/塊作爲Talonmies解釋說明寄存器分配粒度是256個寄存器/ warp(8個寄存器/線程)。第一個數字是代碼使用的每個線程的寄存器。第二個是分配大小。在大多數情況下,這絕不會超過RegisterAllocationGranualarityPerThread - 1.對於極端簡單的內核,ABI合規性可能導致16個寄存器/線程的最小寄存器分配。 –

相關問題