增加流水線段數(shù)對高相聯(lián)度緩存的影響

高相聯(lián)度緩存(8路、16路組相聯(lián))是減少沖突缺失的有效手段,但硬件復(fù)雜度過高會拖慢訪問速度。增加流水線段數(shù)能否解決這個問題?


1. 高相聯(lián)度緩存的痛點

組相聯(lián)緩存的訪問流程很簡單:先算組索引,然后并行比較組內(nèi)所有路的標(biāo)簽,命中哪路就讀哪路的數(shù)據(jù)。

路數(shù)一多,問題就來了:

1.1 標(biāo)簽比較延遲爆炸

4路組相聯(lián)需要4個比較器并行工作,16路就需要16個。比較器的延遲隨輸入位數(shù)增加而增加,16路比較器的延遲可能是4路的2倍以上。如果還要在一個時鐘周期內(nèi)完成比較+選路+讀數(shù)據(jù),時序根本收不住。

具體算筆賬:假設(shè)標(biāo)簽比較器延遲公式為 T = k \cdot log_2(N) + C,其中N是路數(shù)。4路比較延遲約200ps,16路可能到400ps。如果目標(biāo)頻率是5GHz(周期200ps),單周期完成16路比較是不可能的。

1.2 功耗壓不住

每次訪問都要激活16個比較器,動態(tài)功耗直線上升。移動端芯片尤其頭疼這個問題——緩存訪問頻繁,功耗占比能到30%以上。

以28nm工藝為例,一個6T SRAM單元讀操作功耗約0.5pJ,而一個32位比較器動態(tài)功耗約2pJ。16路比較一次就是32pJ,加上標(biāo)簽陣列和數(shù)據(jù)陣列的功耗,單次L1訪問可能超過100pJ。對于每秒十億次訪問的CPU,這就是100W的功耗,顯然 unacceptable。

1.3 面積成本

多路比較需要更多晶體管,緩存面積增大,距離核心更遠(yuǎn),線延遲又反過來拖累性能。

8路組相聯(lián)的標(biāo)簽陣列面積大約是直接映射的3倍。在7nm工藝下,32KB L1緩存,直接映射約0.04mm2,8路組相聯(lián)可能到0.12mm2。面積增大意味著信號傳輸距離增加,線延遲可能從50ps增加到150ps。


2. 流水線化怎么破局

把原本一個周期干完的活拆成多個階段,每個階段只做一部分,這是CPU設(shè)計的經(jīng)典套路。緩存訪問同樣可以流水線化。

2.1 典型的三段流水線

以8路組相聯(lián)L1緩存為例,拆成三個階段:

階段 時鐘 操作內(nèi)容 關(guān)鍵路徑延遲
Stage 1 T1 組索引計算 + 路預(yù)測 + 預(yù)取標(biāo)簽 ~80ps
Stage 2 T2 標(biāo)簽驗證(比較8路標(biāo)簽)+ 命中檢測 ~100ps
Stage 3 T3 數(shù)據(jù)陣列讀取 + 輸出對齊 ~90ps

原本1個周期完成的訪問,現(xiàn)在變成3個周期。但每個階段的工作量變少了,時鐘周期可以從350ps(2.8GHz)縮短到120ps(8.3GHz)。當(dāng)然實際不會這么激進(jìn),考慮到流水線寄存器開銷和裕量,實際可能從3GHz提升到5GHz。

2.2 路預(yù)測的容錯空間

高相聯(lián)度緩存通常配合路預(yù)測(Way Prediction)使用——先猜一個路,猜對了直接讀,猜錯了再查其他路。

單周期設(shè)計的問題在于:猜錯了沒時間去補(bǔ)救,只能 stall 流水線或者接受更高的缺失懲罰。

多段流水線的好處是:Stage 1做預(yù)測,Stage 2驗證。如果Stage 2發(fā)現(xiàn)預(yù)測失敗,可以在Stage 3啟動重試邏輯,或者直接把正確的路送入下一級流水線。這種"預(yù)測-驗證-恢復(fù)"的機(jī)制在多段流水線里更容易實現(xiàn)。

路預(yù)測算法通?;赑C(程序計數(shù)器)的低位哈希。比如用PC[6:2]索引一個32項的預(yù)測表,記錄最近訪問的路。對于循環(huán)訪問模式,準(zhǔn)確率可以到90%以上。但對于隨機(jī)訪問,準(zhǔn)確率可能只有60%。


3. 實際芯片怎么做的

3.1 Intel Skylake的L1D

Skylake的L1數(shù)據(jù)緩存是8路組相聯(lián),32KB容量,64字節(jié)行大小。Intel沒有公開詳細(xì)的流水線劃分,但從延遲數(shù)據(jù)可以推斷:

  • L1命中延遲:4個周期(從請求到數(shù)據(jù)可用)
  • 地址計算占1周期,標(biāo)簽比較占1-2周期,數(shù)據(jù)讀取占1-2周期

這種劃分允許Skylake在5GHz+的頻率下穩(wěn)定運行。如果是單周期設(shè)計,8路比較在5GHz下幾乎不可能完成——8個6輸入NOR門構(gòu)成的比較器,在14nm工藝下延遲約150ps,加上線延遲和建立時間,一個周期200ps根本不夠。

Skylake還采用了"銀行化"(Banking)技術(shù),把32KB分成8個4KB的bank,每個bank獨立訪問。這樣雖然增加了復(fù)雜度,但可以把數(shù)據(jù)讀取延遲隱藏到標(biāo)簽比較之后。

3.2 ARM Cortex-A77

A77的L1數(shù)據(jù)緩存是4路組相聯(lián),但采用了更激進(jìn)的三段流水線:

Cycle 1: 路預(yù)測 + 標(biāo)簽預(yù)取
Cycle 2: 標(biāo)簽比較 + 命中判斷  
Cycle 3: 數(shù)據(jù)讀取

路預(yù)測準(zhǔn)確率約85%,預(yù)測失敗時增加1周期懲罰。由于流水線深度適中,預(yù)測失敗的恢復(fù)代價可控。

A77的一個巧妙設(shè)計是"投機(jī)性數(shù)據(jù)讀取"(Speculative Data Fetch)。Stage 1根據(jù)路預(yù)測結(jié)果,提前啟動對應(yīng)路的數(shù)據(jù)陣列讀取。如果Stage 2驗證預(yù)測正確,Stage 3直接輸出數(shù)據(jù);如果預(yù)測錯誤,取消這次讀取,重新讀取正確的路。這樣預(yù)測成功時延遲不變,預(yù)測失敗時懲罰增加1周期。

3.3 AMD Zen 2的做法

Zen 2的L1數(shù)據(jù)緩存是8路組相聯(lián),32KB。AMD采用了2段流水線設(shè)計:

  • Stage 1: 標(biāo)簽比較 + 路選擇
  • Stage 2: 數(shù)據(jù)讀取

這種設(shè)計相對保守,但Zen 2的頻率依然能到4.7GHz。AMD的權(quán)衡是:用更少的流水線段數(shù)換取更低的預(yù)測失敗懲罰,同時通過優(yōu)化物理設(shè)計(如使用更快的SRAM單元)來滿足時序。


4. 流水線的代價

4.1 預(yù)測失敗的懲罰

流水線越深,預(yù)測失敗時清空的階段越多。三段流水線預(yù)測失敗可能要浪費2-3個周期,單周期設(shè)計只需要1個周期。

這就要求路預(yù)測算法必須足夠準(zhǔn)。簡單的靜態(tài)預(yù)測(比如總是預(yù)測Way 0)在高相聯(lián)度下準(zhǔn)確率可能低于50%,完全不行。實際芯片會用動態(tài)預(yù)測:記錄最近訪問的路,或者基于PC(程序計數(shù)器)做相關(guān)性預(yù)測。

更高級的預(yù)測器會用到"way-halting"技術(shù):先比較部分標(biāo)簽位(如8位),快速排除不可能的路,減少比較器數(shù)量。例如16路緩存,先用8位標(biāo)簽預(yù)篩選,平均只需要比較4路,延遲和功耗都降低。

4.2 面積與功耗

流水線寄存器本身要占面積。Stage 1到Stage 2之間需要寄存器保存標(biāo)簽比較的結(jié)果,Stage 2到Stage 3需要寄存器保存命中信息。三段流水線比單周期設(shè)計多出10-15%的面積開銷。

功耗方面,雖然動態(tài)功耗因為頻率提升而增加,但門控時鐘(Clock Gating)可以優(yōu)化——如果某路在Stage 1的預(yù)測中被排除,Stage 2可以直接關(guān)閉該路的比較電路。

具體實現(xiàn)上,可以用"與門"控制比較器的使能信號:

// 偽代碼示意
wire [7:0] way_enable;  // 來自路預(yù)測器
wire [7:0] way_match;

genvar i;
generate
    for (i = 0; i < 8; i = i + 1) begin : comparator
        assign way_match[i] = way_enable[i] & (tag_array[i] == input_tag);
    end
endgenerate

當(dāng)way_enable[i]為0時,對應(yīng)的比較器不翻轉(zhuǎn),動態(tài)功耗大幅降低。

4.3 負(fù)載延遲敏感場景

有些場景對延遲極度敏感,比如指針追逐(Linked List遍歷):

typedef struct Node {
    int data;
    struct Node* next;
} Node;

int sum_list(Node* head) {
    int sum = 0;
    while (head) {
        sum += head->data;  // 每次訪問依賴上一次結(jié)果
        head = head->next;
    }
    return sum;
}

這種代碼串行執(zhí)行,無法利用亂序執(zhí)行掩蓋延遲。L1延遲從1周期變3周期,性能直接下降3倍。這時候多段流水線反而壞事。

類似的問題也出現(xiàn)在二叉樹遍歷、哈希表鏈?zhǔn)經(jīng)_突解決等場景。對于這些workload,設(shè)計師可能會提供"低延遲模式"——繞過某些流水線階段,犧牲頻率換取單周期訪問。


5. 高級優(yōu)化技術(shù)

5.1 非阻塞緩存(Non-blocking Cache)

多段流水線天然適合實現(xiàn)非阻塞緩存。當(dāng)L1缺失時,不stall流水線,而是發(fā)送請求到L2,繼續(xù)處理后續(xù)獨立的訪問。這要求流水線有足夠深的buffer來保存未完成的請求。

Skylake的L1D可以支持多達(dá)12個未完成的load請求,這依賴于其多段流水線設(shè)計提供的buffer深度。

5.2 預(yù)?。≒refetching)

多段流水線為預(yù)取提供了時間窗口。Stage 1識別出預(yù)取模式(如順序訪問),Stage 2-3并行執(zhí)行預(yù)取操作,不影響正常訪問的時序。

5.3 多端口設(shè)計

現(xiàn)代CPU的L1通常需要支持多個并發(fā)訪問(如2個load + 1個store)。多段流水線可以把不同端口映射到不同階段,減少端口沖突。例如:

  • Port 1: Stage 1使用Bank 0-3
  • Port 2: Stage 1使用Bank 4-7

這樣兩個load可以同時進(jìn)入Stage 1,只要訪問不同bank就不會沖突。


6. 設(shè)計權(quán)衡總結(jié)

場景 推薦方案 理由
服務(wù)器CPU(高吞吐) L1緩存訪問3-4段流水線 + 8-16路 頻率優(yōu)先,預(yù)測準(zhǔn)確率可接受,吞吐量最大化
桌面CPU(均衡) L1緩存訪問2-3段流水線 + 4-8路 平衡延遲和頻率,兼顧游戲和生產(chǎn)力
移動端CPU(低功耗) L1緩存訪問1-2段流水線 + 4路 減少動態(tài)功耗,避免預(yù)測失敗懲罰
實時系統(tǒng)(確定性) 單周期L1緩存訪問 + 2-4路 延遲可預(yù)測,無預(yù)測失敗風(fēng)險
GPU(高吞吐+延遲容忍) L1緩存訪問4-5段流水線 + 高相聯(lián)度 延遲被warp調(diào)度掩蓋,追求極致頻率

7. 一句話總結(jié)

增加流水線段數(shù)讓高相聯(lián)度緩存能跑在更高頻率,但代價是訪問延遲增加和預(yù)測失敗風(fēng)險。路預(yù)測準(zhǔn)確率是決定成敗的關(guān)鍵——預(yù)測不準(zhǔn),流水線越深死得越慘。實際設(shè)計中需要在頻率、延遲、功耗、面積之間找到平衡點。


參考鏈接


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容