本地記憶體:
本地記憶體訪問只對一些自動變數發生,如可變記憶體空間說明符中所述。 編譯器可能在本地記憶體中放置的自動變數是:
檢查ptx彙編**(通過使用-ptx orkeep選項編譯獲得)將會告訴在第乙個編譯階段變數是否被放置在本地記憶體中,因為它將使用.local助記符進行宣告,並使用ld.local進行訪問 和st.local助記符。 即使沒有,後續的編譯階段也可能會做出決定,但是如果他們發現它為目標體系結構消耗太多暫存器空間:使用cuobjdump檢查cubin物件會告訴是否是這種情況。 此外,使用--ptxas-options = -v選項進行編譯時,編譯器會報告每個核心的本地記憶體使用情況(lmem)。 請注意,一些數學函式具有可能訪問本地記憶體的實現路徑。
在某些計算能力的裝置上,3.x本地記憶體訪問總是以與全域性記憶體訪問相同的方式快取在l1和l2中(請參見計算功能3.x)。
在計算能力5.x和6.x的裝置上,本地記憶體訪問總是以與全域性記憶體訪問相同的方式快取在l2中(請參閱計算能力5.x和計算能力6.x)。
共享記憶體:
由於它是片上的,共享記憶體比本地或全域性記憶體具有更高的頻寬和更低的延遲。
為了實現高頻寬,共享記憶體被分成大小相同的記憶體模組,稱為banks,可以同時訪問。 因此,由n個位址落入n個不同儲存體的任何儲存器讀或寫請求可以同時得到服務,產生的總頻寬是單個模組頻寬的n倍。
但是,如果乙個記憶體請求的兩個位址落入同乙個記憶體區,則存在乙個bank衝突,並且訪問必須被序列化。 硬體將儲存器請求與銀行衝突拆分為許多單獨的無衝突請求,並將吞吐量降低乙個等於單獨儲存器請求數量的因子。 如果單獨的記憶體請求的數量是n,則初始的記憶體請求被認為是導致n路bank衝突。
為了獲得最大效能,重要的是要了解記憶體位址如何對映到記憶體組以便排程記憶體請求以最小化組衝突。 這在計算能力3.x,5.x,6.x和7.x的裝置中分別描述在計算能力3.x,計算能力5.x,計算能力6.x和計算能力7.x中。
紋理和表面記憶體:
紋理和表面記憶體空間駐留在裝置記憶體中,並快取在紋理快取中,所以紋理讀取或表面讀取只需要在快取未命中時從裝置記憶體讀取乙個記憶體,否則只花費一次從紋理快取讀取。 紋理快取針對2d空間區域性性進行了優化,因此讀取紋理或表面位址相同的變形的執行緒可以達到最佳效能。 此外,它設計用於具有恆定延遲的流式抓取; 快取記憶體命中減少了dram頻寬需求,但不能提取等待時間.
通過紋理或表面讀取讀取裝置記憶體可帶來一些好處,可以使其成為從全域性或常量記憶體中讀取裝置記憶體的有利替代方案:
CUDA學習(十二)
流 應用程式通過流管理上述併發操作。流是按順序執行的一系列命令 可能由不同的主機執行緒發出 另一方面,不同的流可以相對於彼此或同時地不按順序執行它們的命令 這種行為是不能保證的,因此不應該依賴於正確性 例如,核心間通訊是未定義的 流的創造和銷毀 通過建立流物件並將其指定為核心啟動序列和主機 裝置記憶...
Linux學習(三十二)screen
我們可以將screen看成乙個子視窗,我們可以通過命令將這個子視窗放入後台執行而不關閉它。當我們有需要時,我們還可以將它調出來。安裝 yum y install screen開啟乙個screen視窗 screen vmstat 1按ctrl a d將screen放入後台 root ruanwenwu...
演算法(三十二)
1 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點保留乙個,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 private static listnode fun2 listnode head temp temp.next res.next te...