當乙個warp中的不同執行緒訪問乙個bank中的不同的字位址時,就會發生bank衝突。
如果沒有bank衝突的話,共享記憶體的訪存速度將會非常的快,大約比全域性記憶體的訪問延遲低100多倍,但是速度沒有暫存器快。然而,如果在使用共享記憶體時發生了bank衝突的話,效能將會降低很多很多。在最壞的情況下,即乙個warp中的所有執行緒訪問了相同bank的32個不同字位址的話,那麼這32個訪問操作將會全部被序列化,大大降低了記憶體頻寬。
note:不同warp中的執行緒之間不存在什麼bank衝突。
要解決bank衝突,首先我們要了解一下共享記憶體的位址對映方式。
在共享記憶體中,連續的32-bits字被分配到連續的32個bank中,這就像電影院的座位一樣:一列的座位就相當於乙個bank,所以每行有32個座位,在每個座位上可以「坐」乙個32-bits的資料(或者多個小於32-bits的資料,如4個char
型的資料,2個short
型的資料);而正常情況下,我們是按照先坐完一行再坐下一行的順序來坐座位的,在shared memory中位址對映的方式也是這樣的。下圖中記憶體位址是按照箭頭的方向依次對映的:
上圖中數字為bank編號。這樣的話,如果你將申請乙個共享記憶體陣列(假設是int型別)的話,那麼你的每個元素所對應的bank編號就是位址偏移量(也就是陣列下標)對32取餘所得的結果,比如大小為1024的一維陣列myshmem:
記憶體位址對齊方式
對齊的作用和原因 各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台的要求對資料存放進行對齊,會在訪問效率上帶來損失。比如有些平台每次讀都是從偶位址開始,如果乙個int型 假設為 32位 如...
記憶體位址分配
inti 1 intj 1 cout i endl j endl 2 函式引數列表的存放方式是,先對最右邊的形參分配位址,後對最左邊的形參分配位址。3 little endian模式的cpu對運算元的存放方式是從低位元組到高位元組的 0x1234的存放方式入下 0x4000 0x34 0x4001 ...
理解記憶體位址
物理記憶體 記憶體條實際提供的記憶體空間 記憶體定址 在記憶體上找到正確的位置以便進行訪問的過程 硬編碼 通過實體地址操作物理記憶體的寫碼方式 線性記憶體和物理記憶體 相似點 從0編號,線性增加 不同 1.實體地址一一對應於實際物理記憶體空間的位置,而線性位址可多對一 多個線性位址對應乙個實體地址 ...