制詳解:緩存缺失處理的全生命周期)
ChampSim 緩存模型與 MSHR 機(jī)制詳解緩存缺失處理的全生命周期【免費(fèi)下載鏈接】ChampSimChampSim is an open-source trace based simulator maintained at Texas AM University and through the support of the computer architecture community.項(xiàng)目地址: https://gitcode.com/gh_mirrors/ch/ChampSimChampSim 是由德州農(nóng)工大學(xué)Texas AM University維護(hù)的開源 trace 驅(qū)動(dòng)模擬器也是計(jì)算機(jī)體系結(jié)構(gòu)社區(qū)中最常用的緩存研究平臺(tái)之一。本文以「ChampSim 緩存模型」為主線深入剖析其核心的「MSHR 機(jī)制」帶你完整走一遍從緩存缺失Cache Miss發(fā)生到數(shù)據(jù)回填Fill的全生命周期。無論你是剛接觸模擬器的新手還是想理解緩存流水線的研究者這篇文章都能幫你快速建立完整認(rèn)知。認(rèn)識(shí) ChampSim一款開源 Trace 驅(qū)動(dòng)的緩存模擬器ChampSim 不執(zhí)行真實(shí)指令而是讀取預(yù)先采集的指令 trace逐周期cycle-accurate模擬超標(biāo)量處理器核心、多級(jí)緩存、預(yù)取器與內(nèi)存控制器。它的兩大優(yōu)勢(shì)在于模塊化設(shè)計(jì)分支預(yù)測器、預(yù)取器、替換策略均可獨(dú)立替換便于做對(duì)比實(shí)驗(yàn)結(jié)果可復(fù)現(xiàn)相同的 trace 與配置必然得到相同的結(jié)果非常適合學(xué)術(shù)研究其緩存模型的核心代碼集中在 inc/cache.h 與 src/cache.cc 兩個(gè)文件中我們接下來的分析都圍繞它們展開。緩存模型的核心數(shù)據(jù)結(jié)構(gòu)從 Cache Block 到 MSHRChampSim 的每個(gè)緩存層次L1I、L1D、L2C、LLC 等都是一個(gè)CACHE對(duì)象內(nèi)部主要包含三塊核心數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)定義位置作用BLOCK緩存行inc/block.h存儲(chǔ)每一行的 valid / dirty / prefetch 標(biāo)志、地址與數(shù)據(jù)MSHR缺失狀態(tài)寄存器inc/cache.h 第 88-113 行記錄正在處理的缺失請(qǐng)求等待數(shù)據(jù)返回inflight_tag_checksrc/cache.cc 第 149 行正在執(zhí)行 Tag 檢查未決命中判定的請(qǐng)求隊(duì)列每個(gè)mshr_type記錄請(qǐng)求的地址、指令 ID、訪問類型、進(jìn)入隊(duì)列的時(shí)間戳以及兩個(gè)關(guān)鍵字段data_promise數(shù)據(jù)就緒的承諾用于觸發(fā)回填和to_return數(shù)據(jù)返回后要通知哪些上層隊(duì)列。這就是 MSHR 能同時(shí)服務(wù)多個(gè)等待者的基礎(chǔ)。緩存缺失處理全生命周期從 Tag Check 到 Fill 的完整流程一個(gè)請(qǐng)求從到達(dá)緩存到最終返回會(huì)經(jīng)歷四個(gè)階段。每個(gè)周期operate()函數(shù)src/cache.cc 第 415 行都會(huì)依次驅(qū)動(dòng)這些階段第一步發(fā)起 Tag 檢查命中與缺失分流請(qǐng)求先進(jìn)入inflight_tag_check等待HIT_LATENCY個(gè)周期后執(zhí)行try_hit()。Tag 檢查會(huì)遍歷目標(biāo) set 的所有 way命中HIT直接讀取數(shù)據(jù)返回給上層并通知預(yù)取器與替換策略更新狀態(tài)缺失MISS進(jìn)入handle_miss()或handle_write()開始缺失處理流程第二步MSHR 分配與請(qǐng)求下放handle_miss()src/cache.cc 第 320 行是缺失處理的核心邏輯非常清晰檢查 MSHR 是否已有相同地址的請(qǐng)求——如果有執(zhí)行合并下文詳述檢查 MSHR 是否已滿——滿了則返回失敗請(qǐng)求留在隊(duì)列等待將請(qǐng)求下放到下一級(jí)緩存普通請(qǐng)求進(jìn) RQ預(yù)取請(qǐng)求進(jìn) PQ分配一個(gè)新的 MSHR 條目記錄這個(gè)缺失正在路上如果是寫回writeback請(qǐng)求則走h(yuǎn)andle_write()分支直接進(jìn)入inflight_writes隊(duì)列等待FILL_LATENCY后完成無需下放到下一級(jí)。第三步數(shù)據(jù)返回與 Fill 回填當(dāng)下一級(jí)緩存的數(shù)據(jù)返回時(shí)finish_packet()src/cache.cc 第 610 行會(huì)在 MSHR 中找到匹配的條目將數(shù)據(jù)寫入data_promise并設(shè)置就緒時(shí)間為當(dāng)前時(shí)間 FILL_LATENCY把該條目排序到已返回區(qū)段保證按返回順序完成回填隨后handle_fill()執(zhí)行真正的回填尋找 victim臟行需先寫回下一級(jí)、調(diào)用替換策略與預(yù)取器回調(diào)、把新數(shù)據(jù)寫入緩存行最后把響應(yīng)推送給所有等待它的上層隊(duì)列。MSHR 機(jī)制詳解合并、排序與帶寬控制MSHR 合并機(jī)制一次缺失服務(wù)多個(gè)請(qǐng)求這是 MSHR 最巧妙的設(shè)計(jì)。當(dāng)多個(gè)請(qǐng)求訪問同一個(gè)缺失的緩存行時(shí)mshr_type::merge()src/cache.cc 第 107 行會(huì)將它們合并為一條 MSHR 條目指令依賴列表instr_depend_on_me與返回隊(duì)列to_return取并集請(qǐng)求類型升級(jí)prefetch預(yù)取請(qǐng)求合并進(jìn) demand需求請(qǐng)求時(shí)以后者為準(zhǔn)同時(shí)把預(yù)取標(biāo)記為有用合并后數(shù)據(jù)只需要從下一級(jí)取一次卻能同時(shí)喚醒所有等待的指令 這就是為什么 MSHR 能大幅提升緩存效率一次 DRAM 訪問服務(wù)多個(gè)等待者避免了對(duì)同一地址的重復(fù)請(qǐng)求。帶寬控制與死鎖檢測ChampSim 對(duì)緩存處理能力做了精確的帶寬建模這是它與簡單模擬器最大的區(qū)別帶寬參數(shù)作用MAX_TAG每個(gè)周期最多發(fā)起的 Tag 檢查數(shù)量MAX_FILL每個(gè)周期最多完成的回填數(shù)量MSHR_SIZE同時(shí)追蹤的缺失請(qǐng)求上限例如配置文件中 L2C 的max_tag_check: 1表示 L2 每周期只能處理 1 個(gè) Tag 檢查這會(huì)真實(shí)地影響性能模擬結(jié)果。當(dāng) MSHR 長期無法取得進(jìn)展時(shí)ChampSim 會(huì)通過print_deadlock()報(bào)告死鎖幫助研究者定位配置問題。如何調(diào)整緩存配置MSHR 大小的設(shè)置方法在 champsim_config.json 中每個(gè)緩存層次都可以獨(dú)立配置mshr_sizeL1D: { sets: 64, ways: 12, mshr_size: 16, latency: 5, max_tag_check: 2, max_fill: 2 }默認(rèn)配置中 L1I 為 8、L1D 為 16、L2C 為 32。修改后模擬器會(huì)動(dòng)態(tài)分配 MSHR 容量你可以通過get_mshr_occupancy()等接口inc/cache.h 第 193-195 行在預(yù)取器或替換策略中實(shí)時(shí)查詢 MSHR 占用率從而設(shè)計(jì)自適應(yīng)算法。常用的調(diào)試技巧與統(tǒng)計(jì)指標(biāo)最后分享兩個(gè)實(shí)用技巧開啟調(diào)試打印champsim::debug_print為真時(shí)src/cache.cc 會(huì)輸出每次 Tag 檢查、缺失、回填的詳細(xì)日志是理解緩存流水線的最佳方式關(guān)注關(guān)鍵統(tǒng)計(jì)mshr_return、mshr_merge、pf_useful、pf_useless等統(tǒng)計(jì)項(xiàng)src/cache.cc 中的sim_stats分別對(duì)應(yīng) MSHR 返回次數(shù)、合并次數(shù)、預(yù)取有用/無用次數(shù)是評(píng)估預(yù)取器效果的核心指標(biāo)結(jié)語通過本文的剖析可以看到ChampSim 的緩存模型雖然代碼精煉卻完整涵蓋了真實(shí)緩存流水線的所有關(guān)鍵機(jī)制Tag 檢查、MSHR 分配與合并、帶寬建模、回填與寫回。理解這套「緩存缺失處理全生命周期」之后無論你是要修改預(yù)取器、設(shè)計(jì)新的替換策略還是分析內(nèi)存性能瓶頸都能快速定位到對(duì)應(yīng)的源碼位置真正讀懂每一次 Miss 背后的完整旅程?!久赓M(fèi)下載鏈接】ChampSimChampSim is an open-source trace based simulator maintained at Texas AM University and through the support of the computer architecture community.項(xiàng)目地址: https://gitcode.com/gh_mirrors/ch/ChampSim創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考