1. 程式人生 > >一文解決Memory的channel,chip,bank。如何優化記憶體訪問?

一文解決Memory的channel,chip,bank。如何優化記憶體訪問?

https://www.techbang.com/posts/18381-from-the-channel-to-address-computer-main-memory-structures-to-understand

這篇文章寫的很清楚。

我們配電腦的時候經常會聽到雙通道,一個通道就是一個channel

圖解RAM結構與原理,系統記憶體的Channel、Chip與Bank

一個channel下可以放不同的rank就是記憶體條。

圖解RAM結構與原理,系統記憶體的Channel、Chip與Bank

記憶體條上的小方塊就是chip

chip內部就有好多bank

bank下就是儲存單元了。

都是根據電路來訪問,所以記憶體條突破了磁碟柱面的那種旋轉的瓶頸。可以根據訊號直接訪問相應某個bank的某個行列裡面的值。快快快~~~~

圖解RAM結構與原理,系統記憶體的Channel、Chip與Bank

bank的寫入操作。

 

圖解RAM結構與原理,系統記憶體的Channel、Chip與Bank

 

雙通道加速原理?

圖解RAM結構與原理,系統記憶體的Channel、Chip與Bank

與指令流水線的思路一摸一樣

 

優化記憶體訪問

for(int i=0;i<N;i++)
    read(fd,buf+i,128);

for(int i=0;i<N;i++)
    memcpy(addr1+i,addr2+i,128);

就拿上面這兩個函式來說。

這種for迴圈的讀取,就無法滿足流水線的

取址,譯碼,執行

因為執行這個階段,大概率一直在讀取同一個bank,這時就會出現問題,一個bank的地址解碼器只有一個,一直被佔用的

我們無法流水地執行。即使我們有多核多執行緒的CPU,效能還是卡在了讀取同一個bank的資料這裡,還是變成了單核單執行緒的效果。

所以,如果迴圈次數不大,最好可以插入幾個其他的指令過來。

但是具體量化插入什麼指令,插入多少指令。還是要精確計算,根據我們瞭解的CPU主頻,指令的ARM/MIPS/X86?

最好迴歸到彙編去量化。

 

所以說程式碼優化需要非常豐富和準確的知識。。。