2013-02-05 32 views
3

據說每個內核寄存器的數量對於CUDA優化非常重要,並且該數字的上邊界可以通過nvcc中的「-maxrregcount = N」來設置。我無法理解這一點,因爲我認爲寄存器的數量可以通過計算內核中的局部變量(以及可能傳遞的參數)來確定。我知道我錯了,因爲來自「nvcc --ptxas-options = -v」的報告遠遠超過了我以我的想法計算的數據。有人能對此有所考慮嗎?如何在CUDA編譯中分配寄存器

回答

2

每個線程有最大數量的寄存器,具有計算能力2.1的設備中的GPU當前有63個寄存器。每個流式多處理器包含有限數量的寄存器,這些寄存器分佈在線程塊中執行的線程中。如果每個塊的線程數量很少可以確定線程將獲得最大數量的寄存器,但是如果線程很多,它們將獲得較少數量的寄存器(這全部取決於所使用的內存總量通過線程和需求tayloring每個應用程序)。

現在,所有變量不能存儲在寄存器中,因爲它們缺少它們進入本地存儲器,這是全局設備存儲器的一部分,與寄存器相比,存儲器延遲時間很長。這稱爲寄存器溢出,您可以在這裏閱讀更多信息http://www.ece.umn.edu/~wxiao/ee5940/lecture8-2.pdf

嘗試將所有變量保留在寄存器中非常重要。新Cuda開發商往往低估了註冊溢出的影響。我做了一些測試,其中人爲地使線程的內存使用量增加了一倍,並導致寄存器溢出而沒有任何其他計算成本,並且它增加了5次計算的時間! 在小型CUDA應用中,寄存器的數量就足夠了。您可以按照上述pdf中的說明找出有多少變量進入本地存儲器。