如果我在GPU內核中使用了很多變量,變量是否會駐留在全局內存中?所以讀寫本地變量將需要訪問全局內存?如果我在GPU內核中使用很多局部變量,變量是否駐留在全局內存中?
GPU內核中變量數量的典型限制是什麼,以便變量駐留在寄存器中?
感謝, 山姆
如果我在GPU內核中使用了很多變量,變量是否會駐留在全局內存中?所以讀寫本地變量將需要訪問全局內存?如果我在GPU內核中使用很多局部變量,變量是否駐留在全局內存中?
GPU內核中變量數量的典型限制是什麼,以便變量駐留在寄存器中?
感謝, 山姆
有個CUDA GPU佔用率計算器,在CUDA的安裝目錄找到。
cuda-5.0/tools/CUA_Occupancy_Calculator.xls
它可以顯示爲不同的GPU計算能力的物理極限硬件種源(線/塊,寄存器,共享MEM)和經紗之間佔用的的關係,以及。
快速回答:是的。 典型限制?如果您想要達到0.5左右的佔用率,那麼每個線程的寄存器大約爲32-64個寄存器,具體取決於架構。
稍微長一點的答案: 請記住,寄存器的數量與「局部變量的數量」不完全相同。這是因爲,在給定的時間,你通常不需要所有的局部變量,編譯器會嘗試重用寄存器。您可能最終將多個變量映射到同一個寄存器。其次,即使用完了寄存器空間,編譯器也會嘗試將這些值泄漏到很少使用的全局內存中。通常在你的代碼中有很少的寄存器溢出並不是那費時。此外,這些寄存器溢出導致完全對齊的全局內存訪問模式。
如果您想知道每個內核正在使用多少寄存器和(溢出)本地內存,請將--ptxas-options=-v
添加到您的編譯參數中。