馮諾依曼瓶頸和 CPU 緩存
為什麼速度快的CPU要等待記憶體?
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
無論CPU運算的速度有多快,如果要計算的指令和資料沒有到達,它就什麼也做不了。 CPU和記憶體之間的傳輸速度限制整體效能的現象稱為馮諾依曼瓶頸。
CPU等待記憶體
在馮諾依曼架構中,指令和資料使用相同的記憶體和匯流排。
CPU請求指令
↓
從記憶體檢索指令
↓
CPU請求所需數據
↓
從記憶體中獲取數據
↓
CPU運算
與CPU的運算速度相比,主存存取速度較慢。 此外,如果命令和資料透過單一通道一起移動,則可能會出現彼此等待的情況。
緩存減少了這種等待
現代 CPU 將常用指令和資料預先載入到 CPU 附近的快取中。 L1快取很小但速度很快,當它走向L2和L3時,它逐漸變慢而不是變大。
CPU → L1 Cache → L2 Cache → L3 Cache → Main Memory
又快又小又慢又大
快取使用局部性,這意味著程式重複使用附近的資料。
- 時間局部性:您剛剛使用的值很可能很快就會再次使用。
- 空間局部性:如果您使用一個位址,那麼附近的地址很可能也會被使用。
從前面順序讀取數組的程式碼比跳轉讀取數組的程式碼對快取更有利,這是因為空間局部性。
//由於連續的記憶體是按順序讀取的,所以快取很容易利用。
for (int i = 0; i < count; ++i)
{
sum += values[i];
}
指令緩存和資料緩存
現代CPU將指令和資料一起保存在主記憶體中,但在L1快取中將指令快取和資料快取分開。 因此,取得下一指令和存取目前資料可以稍微同時執行。
這就是為什麼它被稱為改良哈佛結構。 它在必要的層中混合了哈佛結構和馮諾依曼結構的優點。
最終,電腦效能不僅由 CPU 執行的計算數量決定。 您還應該查看資料放置的連續程度、快取命中率是多少以及 CPU 等待記憶體的時間。