要弄清楚這個問題,得先明白快取是幹啥的以及為啥會有多級快取。
快取是用來儲存資料的,目的是為了緩解記憶體讀寫速度和CPU處理速度之間的巨大差距帶來的效能損失。
舉個簡單的例子,假設沒有快取,CPU處理一條資料需要一個時鐘週期,然後將結果寫回到記憶體需要100個時鐘週期,將下一條指令以及指令需要的資料載入到有需要100個時鐘週期,那麼總耗時是201個時鐘週期,其中對於CPU來講,我只用了1個時鐘週期,等了兩百個,時鐘週期利用率不足0.5%,即使讀寫可以同步,總耗時也是101個時鐘週期,這樣的效能損失無疑是巨大的。
如果加入快取,CPU處理1個,寫回快取2個,讀取2個,那總共也就花費5個時鐘週期,如果讀寫同步就花費3個,效率大幅度提升。
那肯定有人在想,為啥不把快取做得大一點呢?現在記憶體8G都偏小,16G標配,而快取呢,三級快取加起來數十兆,這個太小了啊!
其實這也是沒法,快取做不大主要有兩個主要原因:
1)快取是和CPU做到一起的,CPU內部可謂寸土寸金,不可能留出很大的空間給快取,而快取為了實現超高的讀寫速度,其架構決定了同等面積的快取容量比記憶體等其他儲存介質小很多很多。舉個不太準確的例子,假設你又一個盒子裝東西,為了拿取都快,不可能做成多層的,多層的話還得一層一層的找,就會慢很多,只有做成單層的,這樣拿取都會很快,但同等佔地面積下,單層的盒子卻放不了太多東西。
2)快取,準確的說是一級快取L1不是越大越好,L1主要的作用就是讀寫速度能夠匹配CPU的速度,而當快取過大時,讀寫速度,整頁替換速度都會受到影響,這些速度的影響放在例如記憶體上來說,影響微乎其微,放在L1上就是毀滅性的。還是用盒子舉例,當盒子佔地面積太多是,你再想在盒子中拿取東西,那就比原來小的時候要慢很多,這是不能接受的。
看到這人,我猜有人又會想,這麼小的快取怎麼夠用,不夠用了對效能的影響不是更大嘛?這就引入了快取的替換演算法和多級快取。
首先,其實CPU在一段時間呢其實處理的資料量並不大,因為一個CPU只能同時按順序幹一件事,只是它做事非常快而已,所以只要能夠在當前快取中的資料被CPU處理完之前,將新的將會被CPU使用的資料提前放入到快取中,快取小一點也就小一點了,影響不大。這就是快取替換演算法,CPU透過硬體邏輯和軟體(作業系統的核心排程演算法)結合,更具各種演算法預測CPU將會使用資料,提前將其載入快取,提高快取命中率從(CPU想要從快取讀取資料時,該資料在快取中,即為命中)。
但是不論怎樣預測,總會有快取未命中的情況,一旦發生這樣的情況,就得浪費大量時間等待資料從記憶體讀入,所以有引入了多級快取,增加容量大得多,速度相對較慢但是有遠比記憶體快的多級快取,將更多的資料提前放入到後面的快取中,如果L1沒有命中,就去L2找,L2沒有命中,去L3找,L3沒有命中才去記憶體找,這樣把直接去記憶體找資料的可能性再一次大幅減少,使效能損失進一步降低。
那現在主流的快取機制是怎樣的呢,首先L1,每個邏輯核心(如果沒有超執行緒技術,邏輯核心就是物理核心,如果有超執行緒技術,通常超執行緒是將一個物理核心配套兩套快取等其他硬體,在軟體層面虛擬成兩個核心,所以一個物理核心對應兩套快取)對應自己的L1,在保證速度不會下降的情況下儘量大(幾十K就差不多了),然後是L2,如果L2不是最後一級快取,通常還是每個邏輯核心對應自己的L2,在降低一定的速度要求,在兼顧空間的基礎上儘量大。然後是L3,目前L3通常是最後一級快取,是三級快取裡面速度要求最低的,也是容量最大的,因為其大的容量帶了了大的空間消耗,所以通常L3是所有物理核心公用同一個L3,不再是每個核心用於自己的L3。但是就這樣多級快取的格局,總體快取也不會很大。
以實際例子來說,i7 9700K 8核8執行緒,沒有超執行緒技術,共享的L3為12M(沒有找到各個分級快取的大小準確資料,提供一個自己找的非官方的,L1總共512K,每個L1是64K,L2總共2M,單個核心L2大小為256K);而i9 9900k,同樣的8核,因超執行緒技術可以達到16執行緒,L3快取也只增加到了16M(L1,L2同上),再者如AMD的 Ryzen 3900X, 12核,24執行緒,L1加起來也不過768K,如果虛擬快取有自己的L1,那每個核心L1只有32K,如果虛擬核心沒有L1,那每個核心也只有64K的L1,但是二級快取總共就達到了6M,而共享的L3,更是達到了恐怖的64M!這就是因為龐大的核心數和執行緒數。
最後,來回答你的這個問題,三級快取結構肯定優於二級快取結構,首先二級快取對速度的要求沒那麼低,所以不可能太大,不夠大就更容易不命中,那就更大的機率會有從記憶體載入資料導致的效能損失。但是單次不命中的效能損失低於三級快取的,首先因為二級快取速度優於三級換,且查詢次數只有L1不命中,查詢L2,L2不命中直接讀取。而三級快取還要再查詢一次L3,但是一旦不命中主要的效能短板是記憶體太慢,這一點提升影響不大,所以我的結論就是三級快取結構好於二級快取
要弄清楚這個問題,得先明白快取是幹啥的以及為啥會有多級快取。
快取是用來儲存資料的,目的是為了緩解記憶體讀寫速度和CPU處理速度之間的巨大差距帶來的效能損失。
舉個簡單的例子,假設沒有快取,CPU處理一條資料需要一個時鐘週期,然後將結果寫回到記憶體需要100個時鐘週期,將下一條指令以及指令需要的資料載入到有需要100個時鐘週期,那麼總耗時是201個時鐘週期,其中對於CPU來講,我只用了1個時鐘週期,等了兩百個,時鐘週期利用率不足0.5%,即使讀寫可以同步,總耗時也是101個時鐘週期,這樣的效能損失無疑是巨大的。
如果加入快取,CPU處理1個,寫回快取2個,讀取2個,那總共也就花費5個時鐘週期,如果讀寫同步就花費3個,效率大幅度提升。
那肯定有人在想,為啥不把快取做得大一點呢?現在記憶體8G都偏小,16G標配,而快取呢,三級快取加起來數十兆,這個太小了啊!
其實這也是沒法,快取做不大主要有兩個主要原因:
1)快取是和CPU做到一起的,CPU內部可謂寸土寸金,不可能留出很大的空間給快取,而快取為了實現超高的讀寫速度,其架構決定了同等面積的快取容量比記憶體等其他儲存介質小很多很多。舉個不太準確的例子,假設你又一個盒子裝東西,為了拿取都快,不可能做成多層的,多層的話還得一層一層的找,就會慢很多,只有做成單層的,這樣拿取都會很快,但同等佔地面積下,單層的盒子卻放不了太多東西。
2)快取,準確的說是一級快取L1不是越大越好,L1主要的作用就是讀寫速度能夠匹配CPU的速度,而當快取過大時,讀寫速度,整頁替換速度都會受到影響,這些速度的影響放在例如記憶體上來說,影響微乎其微,放在L1上就是毀滅性的。還是用盒子舉例,當盒子佔地面積太多是,你再想在盒子中拿取東西,那就比原來小的時候要慢很多,這是不能接受的。
看到這人,我猜有人又會想,這麼小的快取怎麼夠用,不夠用了對效能的影響不是更大嘛?這就引入了快取的替換演算法和多級快取。
首先,其實CPU在一段時間呢其實處理的資料量並不大,因為一個CPU只能同時按順序幹一件事,只是它做事非常快而已,所以只要能夠在當前快取中的資料被CPU處理完之前,將新的將會被CPU使用的資料提前放入到快取中,快取小一點也就小一點了,影響不大。這就是快取替換演算法,CPU透過硬體邏輯和軟體(作業系統的核心排程演算法)結合,更具各種演算法預測CPU將會使用資料,提前將其載入快取,提高快取命中率從(CPU想要從快取讀取資料時,該資料在快取中,即為命中)。
但是不論怎樣預測,總會有快取未命中的情況,一旦發生這樣的情況,就得浪費大量時間等待資料從記憶體讀入,所以有引入了多級快取,增加容量大得多,速度相對較慢但是有遠比記憶體快的多級快取,將更多的資料提前放入到後面的快取中,如果L1沒有命中,就去L2找,L2沒有命中,去L3找,L3沒有命中才去記憶體找,這樣把直接去記憶體找資料的可能性再一次大幅減少,使效能損失進一步降低。
那現在主流的快取機制是怎樣的呢,首先L1,每個邏輯核心(如果沒有超執行緒技術,邏輯核心就是物理核心,如果有超執行緒技術,通常超執行緒是將一個物理核心配套兩套快取等其他硬體,在軟體層面虛擬成兩個核心,所以一個物理核心對應兩套快取)對應自己的L1,在保證速度不會下降的情況下儘量大(幾十K就差不多了),然後是L2,如果L2不是最後一級快取,通常還是每個邏輯核心對應自己的L2,在降低一定的速度要求,在兼顧空間的基礎上儘量大。然後是L3,目前L3通常是最後一級快取,是三級快取裡面速度要求最低的,也是容量最大的,因為其大的容量帶了了大的空間消耗,所以通常L3是所有物理核心公用同一個L3,不再是每個核心用於自己的L3。但是就這樣多級快取的格局,總體快取也不會很大。
以實際例子來說,i7 9700K 8核8執行緒,沒有超執行緒技術,共享的L3為12M(沒有找到各個分級快取的大小準確資料,提供一個自己找的非官方的,L1總共512K,每個L1是64K,L2總共2M,單個核心L2大小為256K);而i9 9900k,同樣的8核,因超執行緒技術可以達到16執行緒,L3快取也只增加到了16M(L1,L2同上),再者如AMD的 Ryzen 3900X, 12核,24執行緒,L1加起來也不過768K,如果虛擬快取有自己的L1,那每個核心L1只有32K,如果虛擬核心沒有L1,那每個核心也只有64K的L1,但是二級快取總共就達到了6M,而共享的L3,更是達到了恐怖的64M!這就是因為龐大的核心數和執行緒數。
最後,來回答你的這個問題,三級快取結構肯定優於二級快取結構,首先二級快取對速度的要求沒那麼低,所以不可能太大,不夠大就更容易不命中,那就更大的機率會有從記憶體載入資料導致的效能損失。但是單次不命中的效能損失低於三級快取的,首先因為二級快取速度優於三級換,且查詢次數只有L1不命中,查詢L2,L2不命中直接讀取。而三級快取還要再查詢一次L3,但是一旦不命中主要的效能短板是記憶體太慢,這一點提升影響不大,所以我的結論就是三級快取結構好於二級快取