CUDA優化之執行配置和暫存器優化

yyfn風辰發表於2010-07-01
3.7  暫存器
        暫存器是NVIDIA GPU儲存器空間中,最快的硬體,讀取它幾乎不用耗費時間。因此合理的使用它是至關重要的。

3.7.1  暫存器溢位和本地儲存器
由於GPU上暫存器的數目是有限的,在計算能力1.0,1.1的裝置上,其數目是8 K,在計算能力1.2,1.3的裝置上,其值是16 K。如果我們使用的暫存器數目超過了系統的最大數目,編譯器便會將其轉入裝置儲存器上的一個區域內,這個區域稱為本地儲存器。本地儲存器的速度和全域性儲存器一樣。
使用2.3及以前的toolkit,可以使用-keep指令輸出中間檔案,然後直接檢視cubin檔案就可以知道核心使用的暫存器數目,同時也能看到共享儲存器、常量儲存器和本地儲存器的使用量。如果使用的是3.0的toolkit,此時cubin檔案已經不是文字格式,因此不能直接檢視,此時可以在用nvcc 編譯的時候,使用—ptxas-options=-v選項,編譯器會報告儲存器使用資訊。

3.8 執行配置和佔用率
        使用<<>>語法指定執行執行緒配置的時候,grid 和block大小也影響程式的效率。一般而言,grid要大於多處理器的數目,這樣才能讓多處理器不至於空閒,但是這樣也會導致一些問題,比如負載均衡,如果grid大小不能比sm 數目整除的話,就會有SM計算的時候,另外一些SM空閒,如果grid遠大於sm數目的話,可忽略,但是如果SM數目與grid大小相差不大的話,效能損耗就很可觀了。一般而言,grid大小至少是sm數目的三倍,如果有塊內同步的話,grid要大於sm的四倍以上。一般而言,block大小要是束大小的四倍以上,此時基本上可隱藏訪存延遲。如果資料量比較小的話,grid大小和block大小可能相互牽制,此時要綜合考慮。在資料量比較大的時候,只要考慮block大小就行了。
        另外,CUDA還有一個佔用率問題,所謂佔用率就是SM上活躍塊數目和最大允許數目的比例。使用cuda visual profiler的時候會有這個值。這個值的影響因素有核心內暫存器、共享儲存器的用量。由於CUDA執行緒在切換的時候並不轉儲執行緒的狀態,這是CUDA執行緒極輕的原因,但是這也使得為了保證執行緒能夠切換,核心內使用的資源最多隻能是最大資源的一半,此時佔用率是0.25,一般而言佔用率要在0.5左右。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23057064/viewspace-666874/,如需轉載,請註明出處,否則將追究法律責任。

相關文章