CPU快取記憶體行對齊

2021-06-25 22:32:15 字數 1162 閱讀 9390

cpu的快取記憶體一般分為一級快取和二級快取,現今更多的cpu更是提供了**快取。cpu在執行時首先從一級快取讀取資料,如果讀取失敗則會從二級快取讀取資料,如果仍然失敗則再從記憶體中存讀取資料。而cpu從一級快取或二級快取或主記憶體中最終讀取到資料所耗費的時鐘週期差距是非常之大的。因此快取記憶體的容量和速度直接影響到cpu的工作效能。一級快取都內建在cpu內部並與cpu同速執行,可以有效的提高cpu的執行效率。一級快取越大,cpu的執行效率往往越高。

一級快取又分為資料快取和指令快取,他們都由快取記憶體行組成,對於x86架構的cpu來說,快取記憶體行一般是32個位元組,早期的cpu大約只有512行快取記憶體行,也就是說約16k的一級快取。而現在的cpu一般都是32k以上的一級快取。

當cpu需要讀取乙個變數時,該變數所在的以32位元組分組的記憶體資料將被一同讀入快取記憶體行,所以,對於效能要求嚴格的程式來說,充分利用快取記憶體行的優勢非常重要。一次性將訪問頻繁的32位元組資料對齊後讀入快取記憶體中,減少cpu高階快取與低階快取、記憶體的資料交換。

但是對於多cpu的計算機,情況卻又不一樣了。例如:

1、cpu1 讀取了乙個位元組,以及它和它相鄰的位元組被讀入cpu1 的快取記憶體。

2、cpu2 做了上面同樣的工作。這樣cpu1 ,cpu2 的快取記憶體擁有同樣的資料。

3、cpu1 修改了那個位元組,被修改後,那個位元組被放回cpu1 的快取記憶體行。但是該資訊並沒有被寫入ram 。

4、cpu2 訪問該位元組,但由於cpu1 並未將資料寫入ram ,導致了資料不同步。

當乙個cpu 修改快取記憶體行中的位元組時,計算機中的其它cpu會被通知,它們的快取記憶體將視為無效。於是,在上面的情況下,cpu2 發現自己的快取記憶體中資料已無效,cpu1 將立即把自己的資料寫回ram ,然後cpu2 重新讀取該資料。可以看出,快取記憶體行在多處理器上會導致一些不利。

從上面的情況可以看出,在設計資料結構的時候,應該盡量將唯讀資料與讀寫資料分開,並具盡量將同一時間訪問的資料組合在一起。這樣cpu 能一次將需要的資料讀入。 如:

struct __a

;這樣的資料結構就很不利。

在 x86 下,可以試著修改和調整它

struct __a

;32 – sizeof(int)+sizeof(name)*sizeof(name[0])%32

32 表示 x86 架構中快取中,快取記憶體行為 32位元組 大小。 __align 用於顯式對齊。

CPU快取記憶體行

cpu 為了更快的執行 於是當從記憶體中讀取資料時,並不是唯讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的 cpu,快取記憶體行大小不同。如 x86是 32bytes 而alpha 是64bytes 並且始終在第 32個位元組或第 64個位元組處對齊。這樣,當 cpu訪問相鄰的...

CPU快取記憶體行

cpu 為了更快的執行 於是當從記憶體中讀取資料時,並不是唯讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的 cpu,快取記憶體行大小不同。如 x86是 32bytes 而alpha 是64bytes 並且始終在第 32個位元組或第 64個位元組處對齊。這樣,當 cpu訪問相鄰的...

總結 CPU快取記憶體

我們都知道,程式是由一條條指令和資料組成的,cpu在執行時的工作也是周而復始的執行一條條用途各異的指令。在一開始,程式載入到主存,在程式執行的過程中,將指令一條條的從主存中取出並執行,巨集觀上來說我們把主存看做是乙個很大的一維位元組陣列,位址即可看作為陣列的下標。這樣的結構可以確保程式可以順利執行。...