2016-11-21 41 views
-1

我在這樣爲什麼要實現數據高速緩存和指令高速緩存來減少遺漏?

在存儲層次爲什麼實現數據緩存和 指令緩存的背景下,問題不敗?

我回答說,減少衝突未命中次數和空間不足未用空間是有用的。但是數據緩存和指令緩存的大小可以根據數據和指令的數量來確定?因爲我認爲數據的數量高於指令的數量(很多時候我們需要2個數據才能執行1條指令),並且數據高速緩存和指令高速緩存根據這個數字來確定大小。是真的還是完全錯誤的?在這種情況下,爲什麼要實現數據高速緩存和指令高速緩存來減少遺漏?

+0

無法從措辭的方式理解問題的含義。爲什麼要有每種類型的緩存?他們爲什麼要分裂?你應該回到要求澄清的人。 – Leeor

+0

可能的重複[在大多數處理器中爲什麼L1緩存的大小小於L2緩存的大小?](http://stackoverflow.com/questions/4666728/why-is-the-size-of-l1 -cache-the-the-the-2-cache-in-the-the-the-pro) –

+1

請參閱[我對另一個緩存問題的回答](http://stackoverflow.com/questions/4666728/爲什麼是大小的l1緩存小於-12-高速緩存大部分的pro/38549736#38549736)在哪裏我指出,一大緩存如果有足夠的讀/寫端口用於指令和數據,則會消耗更多的電力,和/或不可能像拆分L1緩存一樣快。數據和說明通常不會重疊,因此拆分緩存幾乎是純粹的獲勝。 –

回答

1

緩存的想法是在1個週期內傳遞緩存數據,以保持CPU以最大速度運行。

現在,今天所有的CPU都是流水線式的。這意味着他們有獨立的模塊,例如取指令,對其解碼,取操作數,執行指令並寫回結果。對於不同的指令,所有這些流水線階段都會盡可能同時執行。
對於最大速度,取指令必須與之前解碼的先前指令的操作數提取同時完成。如果有一個指令緩存和一個數據緩存,則兩者只能在1個週期內同時完成(在最佳情況下)。

+0

您可以使用兩個讀取端口構建高速緩存。事實上,現代x86設計爲他們的L1D緩存(Intel自從SnB,自K8以來的AMD)這樣做。 Haswell甚至可以在每個時鐘內執行兩次32B加載和一次32B存儲,並且可能同時將數據傳輸到L2,或者同時向L2傳輸數據,所以這是很多端口。因此,從同一個緩存中並行讀取指令和數據並不是不可能的,這只是浪費了晶體管/功耗,就像我對這個問題進行了評論。儘管如此,還是足夠接近以糾正過於簡單的解釋。 –

+1

@ Peter Cordes我剛剛閱讀了您在上述評論中提到的其他問題的出色答案。非常感謝這個詳細的說明! –

0

有兩個緩存(指令和數據)的另一個可能的原因是Thrashing。想象一下你的指令和數據駐留在索引位相同的兩個存儲單元中的情況。假設有一個直接映射的緩存,(我知道,臉頰),它是這樣的。

  1. 從內存中獲取指令,計算索引並將其存儲在那裏。
  2. 解碼指令並獲取數據的地址。
  3. 現在從內存中獲取數據,計算存儲數據的索引。
  4. 該位置有一些數據非常糟糕,將其刷新到下一級緩存並存儲新提取的數據。
  5. 執行指令。
  6. 當我們爲我們的數據交換緩存條目時,它將解碼下一條指令的時間,以及緩存未命中時間。現在再去取一次。
  7. 當我們獲取它時,我們必須重新替換我們的數據,因爲它具有相同的索引。

因此,我們將不斷地將數據和指令交換到相同的緩存行,即抖動。