1. 程式人生 > >CUDA全域性記憶體讀取

CUDA全域性記憶體讀取

正如前文所述,CUDA全域性記憶體的訪問是通過”記憶體事務“實現的,其分類128位元組(L1/L2快取均參與)和32位元組(L2快取參與)兩種。本文則主要介紹全域性讀取的載入示例,分為”快取載入(L1+L2)“和”非快取載入(L2)“,程式碼會貼在後面。

一.快取載入(L1+L2)

這種情況下,”記憶體事務“中載入的快取粒度是128位元組。 (1)對齊合併訪問,執行緒束首地址對齊128位元組,且連續訪問128位元組記憶體。只需一次”128位元組記憶體事務“即可完成記憶體請求。效率100%。
  (2)訪問對齊,隨機訪問128位元組記憶體。由於所請求的記憶體地址仍然在一個快取行中,因此,也只需一次”128位元組記憶體事務“即可完成記憶體請求。效率100%。

 (3)非對齊的連續訪問,執行緒束請求的位元組未對齊128,而是分佈在兩個128位元組段範圍內。由於啟用L1快取,因此載入必須從首地址128的倍數開始,因此需要載入0-127和127-255兩個”128位元組記憶體事務“才能完成記憶體請求。其中一半資料是請求之外的,因此效率=請求載入的全域性記憶體/所需載入的全域性記憶體=50%。 這主要是由於快取的載入模式導致,因為快取不是一次性只加載一個數據,而是一批資料,如128位元組,而且又必須保證對齊操作,這就導致了載入的浪費。
(4)同一warp中執行緒只訪問一個地址。只需要一個”128記憶體事務“就可以完成請求,但是效率卻非常低。因為所需4位元組,而載入了128位元組。效率為4/128=3.125%。
(5)最壞的情況,warp中32執行緒所請求的記憶體全部分散,因此載入的”記憶體事務“的可能在0-32之間不等。完成一次記憶體請求最差需要進行32次”記憶體事務“,而載入的128位元組中,卻只有4位元組是warp所需的。

二.非快取載入(L2)

這種情況下,”記憶體事務“中載入的快取粒度是32位元組,這是比128位元組更細粒度的載入,會對非對齊或非合併的訪問帶來好處。類似地,對比上述情況,逐一分析。 (1)對齊合併訪問,一個warp的128位元組的請求,需要4個32位元組”記憶體事務“完成。效率100%。
(2)對齊,但訪問是不連續。所需地址將佔用4個記憶體段,不會產生載入浪費。效率100%。 (3)非對齊的連續訪問。由於請求記憶體首地址沒有對齊128位元組,請求的地址最多落在5個記憶體段中,匯流排利用率至少為80%,相比快取載入50%有了很大的提供,這主要是由於載入了更少的未請求位元組。

(4)warp中執行緒束訪問一個記憶體地址。效率為4/32=12.5。非快取載入要優於快取載入。
(5)warp中執行緒的請求記憶體地址全部分散,則需要的”記憶體事務“的也是0-32個,但每個記憶體事務是32位元組,而不再是128位元組。這也是非快取載入優於快取載入的地方。