CUDA優化之執行配置和暫存器優化
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左右。
暫存器是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 執行配置和佔用率
使用<<
另外,CUDA還有一個佔用率問題,所謂佔用率就是SM上活躍塊數目和最大允許數目的比例。使用cuda visual profiler的時候會有這個值。這個值的影響因素有核心內暫存器、共享儲存器的用量。由於CUDA執行緒在切換的時候並不轉儲執行緒的狀態,這是CUDA執行緒極輕的原因,但是這也使得為了保證執行緒能夠切換,核心內使用的資源最多隻能是最大資源的一半,此時佔用率是0.25,一般而言佔用率要在0.5左右。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23057064/viewspace-666874/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- cuda優化之常量儲存器和紋理儲存器優化
- CUDA優化之指令優化優化
- CUDA程式優化心得之序列優化優化
- 【C/C++】 C++暫存器優化C++優化
- 程式分析與優化 - 8 暫存器分配優化
- CUDA優化優化
- MySQL查詢優化之優化器工作流程以及優化的執行計劃生成MySql優化
- 漫談CUDA優化優化
- mysql伺服器和配置優化MySql伺服器優化
- CUDA總體優化策略優化
- 共享儲存器優化優化
- 資料庫應用優化(二)伺服器和配置優化資料庫優化伺服器
- CUDA程式優化心得之錯誤處理優化
- 全域性儲存器優化優化
- 淺談mysql配置優化和sql語句優化MySql優化
- 滴滴Ceph分散式儲存系統優化之鎖優化分散式優化
- MySQL優化-安裝配置優化MySql優化
- 前端效能優化之桌面瀏覽器優化策略前端優化瀏覽器
- MSSQL優化之索引優化SQL優化索引
- JavaScript 的效能優化:載入和執行JavaScript優化
- JavaScript的效能優化:載入和執行JavaScript優化
- NoSQL之Redis的配置優化SQLRedis優化
- mysql效能優化-慢查詢分析、優化索引和配置MySql優化索引
- Android 執行緒優化之執行緒池shutdown方法Android執行緒優化
- 優化-瀏覽器快取和壓縮優化優化瀏覽器快取
- 【優化】Oracle 執行計劃優化Oracle
- sql優化之邏輯優化SQL優化
- MySQL 效能優化之索引優化MySql優化索引
- MySQL 效能優化之SQL優化MySql優化
- websphere配置和優化參考Web優化
- 理解JVM(六):執行緒安全和鎖優化JVM執行緒優化
- 【建議】 暫提三種優化優化
- 前端效能優化之移動端瀏覽器優化策略前端優化瀏覽器
- webpack配置優化Web優化
- LNMP配置優化LNMP優化
- 優化器優化
- CS 暫存器 和 IP 暫存器
- CUDA 矩陣乘法終極優化指南矩陣優化