资讯详情

如何选择合适的DRAM调度策略?Ramulator 2.1 FRFCFS与Row Policy完整对比

📅 2026/11/2 1:22:01 | 华诺云谱 👁 阅读
如何选择合适的DRAM调度策略?Ramulator 2.1 FRFCFS与Row Policy完整对比
【免费下载链接】ramulator2Ramulator 2.0 is a modern, modular, extensible, and fast cycle-accurate DRAM simulator. It provides support for agile implementation and evaluation of new memory system designs (e.g., new DRAM standards, emerging RowHammer mitigation techniques). Described in our IEEE CAL 2023 paper: https://arxiv.org/pdf/2308.11030.项目地址https://gitcode.com/gh_mirrors/ram/ramulator2点击查看免费下载Ramulator 2.1 是一款模块化、可扩展、周期精确cycle-accurate的 DRAM 模拟器用于快速实现与评估新的内存系统设计。在它的内存控制器中DRAM 调度策略由两个正交部件决定请求调度器scheduler决定下一个发哪条请求行策略row_policy决定何时关闭打开的行。选对两者的组合直接影响模拟出的延迟、带宽与 RowHit 命中率。本文带你完整对比 FRFCFS、FRFCFS-RowHit 调度器与 Open、ClosedCAP 行策略帮你在几分钟内为实验做出正确选择。为什么调度策略会决定 DRAM 性能DRAM 的访问遵循先开行ACT再读列RD的协议。当连续访问落在同一行时命中行缓冲RowHit延迟最低若访问另一个行则必须关行再开行RowConflict代价最高。调度器和行策略本质上就是在让正确的行保持打开这件事上做权衡现象含义对性能的影响RowHit访问已在打开的行最低延迟省 ACTRowMiss访问未打开的行需 ACT中等代价RowConflict打开行后又要访问别的行需 PREACT代价最高理解了这个背景再看两种调度器就顺理成章了。Ramulator 2.1 的两大请求调度器调度器接口 i_scheduler.h 只有一个核心方法get_best_request()从待处理队列里挑出下一条最值得发出的请求。它优先选时序就绪的请求就绪相同时按到达顺序先到先得打破平局。FRFCFS先到先得优先就绪最基础的调度器实现见 frfcfs.cppPython 包装为 frfcfs.py。它只做一件事在队列里扫描一遍挑出时序已就绪的请求若多个就绪则取到达最早的那个。简单、无额外状态适合绝大多数基准场景不做行维度的前瞻可能让一条未就绪的旧请求占着坑是 Ramulator 官方示例的默认选择见 example_config.pyFRFCFS-RowHit为行命中让路在 FRFCFS 基础上增加了行感知实现见 frfcfs_rowhit.cppPython 包装为 frfcfs_row_hit.py。它分两轮扫描第一轮标记出队列里所有行命中请求并记录每个 bank 最早的命中到达时刻第二轮执行 FRFCFS但跳过那些会抢占已有行命中的关行请求would_preempt_rowhit。直觉当 nRTP nCCD_L 时一旦行被打开继续访问同行比抢先关行去访问另一行更划算。FRFCFS-RowHit 就是防止后者打乱前者。对比项FRFCFSFRFCFS-RowHit核心逻辑就绪优先 到达顺序就绪优先 保护行命中额外状态无每 bank 的命中标志与到达时刻适用场景通用基准、基线高局部性负载、想最大化 RowHit复杂度低略高两轮扫描Row PolicyOpen 与 ClosedCAP 怎么选行策略接口 i_row_policy.h 定义了 4 个钩子pre_schedule()调度前可注入关行命令、try_upgrade_command()选定时可把命令升级为自动预充电版、on_issue()命令发出后、post_schedule()本 tick 收尾。Open 行策略最宽松的策略访问后不主动关行让行一直开着。实现极简见 open.cpp 与 open.py所有钩子均为空操作。局部性好的负载 → RowHit 高、延迟低访问模式跳跃 → 打开行长期占用可能引发不必要的 RowConflict 与能耗ClosedCAP 行策略访问 N 列后自动关行带列访问计数上限的关闭策略见 closed_cap.cpp 与 closed_cap.py。它给每个 bank 记一个列访问计数器达到上限cap默认 4后主动关行优先尝试命令升级把RD→RDA、WR→WRA自动预充电读/写同时关行这是最省时序的方式若标准不支持 AP 命令或时序未就绪则回退到注入显式PREpb关行一旦发出关行命令该 bank 的计数器立即清零重新计数。对比项OpenClosedCAP关行时机从不主动关列访问达到cap后关关行手段—优先 AP 升级回退 PREpb参数无cap默认 4适用场景高局部性、求低延迟跳跃访问、平衡能耗与延迟调度策略与行策略如何协同在 generic_ddr_controller.cpp 的tick()中两者的协作流程清晰可见推进时钟、刷新队列统计、排空已完成读请求刷新管理器与行策略pre_schedule()先行ClosedCAP 可能在此注入PREpb按active priority read/write的优先级调用调度器挑出最佳候选行策略try_upgrade_command()可能把候选升级为自动预充电命令向 DRAM 发出命令行策略与插件on_issue()记录请求退休retire或升级为 active行策略post_schedule()收尾。也就是说调度器选发谁行策略在选前、选中后、发出后三个时刻介入共同决定最终命令序列。改其中任一方都可能改变 RowHit/Conflict 的统计。三步上手在示例中切换调度策略仓库自带的 examples/example_config.py 是最快的起点。它用SimpleO3前端 DDR4 GenericDDR 控制器默认就是FRFCFSOpenctrl ramulator.controller.GenericDDR( dramddr4, schedulerramulator.scheduler.FRFCFS(), # 可换成 FRFCFSRowHit() refresh_managerramulator.refresh_manager.AllBank(), row_policyramulator.row_policy.Open(), # 可换成 ClosedCAP(cap4) addr_mapperramulator.addr_mapper.RoBaRaCoCh(), )三步即可对比换调度器把FRFCFS()改为FRFCFSRowHit()换行策略把Open()改为ClosedCAP(cap4)cap可调跑并看指标执行python3 examples/example_config.py从sim.stats里读row_hits/row_misses/row_conflicts/avg_read_latency。小技巧同一负载分别用 4 种组合2 调度器 × 2 行策略各跑一遍对比row_conflicts与avg_read_latency往往就能看出哪个组合更贴合你的访问模式。如何验证你的选择关键指标与测试sim.stats中memory_system → controller下有几个最直接的计数器指标含义row_hits/row_misses/row_conflicts三类行访问的总数avg_read_latency平均读延迟控制器周期read_queue_len_avg/write_queue_len_avg读/写队列平均占用想从命令序列层面确认行为是否符合预期仓库的controller_scheduling测试套件就是范本见 test_controller_genericddr.pytest_frfcfs_prefers_ready_request_over_older_blocked_request验证 FRFCFS 优先发就绪请求test_frfcfs_rowhit_keeps_same_bank_row_hits_before_conflict_close验证 FRFCFS-RowHit 在关行前保住同行命中test_closedcap_upgrades_second_access_to_rda验证 ClosedCAP 在cap1时把第二次访问升级为RDA。运行方式PYTHONPATHpython pytest tests/controller_scheduling -q选型速查清单追求基线、通用评估→FRFCFSOpen官方示例默认最简单。高局部性、想压 RowHit 延迟→FRFCFS-RowHitOpen。访问跳跃、想控制能耗与 RowConflict→FRFCFS-RowHitClosedCAP(cap4)并可按负载调小/调大cap。想确认行为正确→ 用controller_scheduling套件断言命令序列与gap。小结在 Ramulator 2.1 里DRAM 调度策略 调度器行策略的组合。FRFCFS简单稳健FRFCFS-RowHit在行局部性上更聪明Open释放行命中之利ClosedCAP用列计数上限在延迟与能耗间找平衡。读懂 generic_ddr_controller.cpp 的 tick 流程与上述几个计数器你就能为自己的工作负载挑出最合适的组合并用controller_scheduling测试快速验证它确实按预期工作。赞分享【免费下载链接】ramulator2Ramulator 2.0 is a modern, modular, extensible, and fast cycle-accurate DRAM simulator. It provides support for agile implementation and evaluation of new memory system designs (e.g., new DRAM standards, emerging RowHammer mitigation techniques). Described in our IEEE CAL 2023 paper: https://arxiv.org/pdf/2308.11030.项目地址https://gitcode.com/gh_mirrors/ram/ramulator2点击查看免费下载相关推荐Linux内核实时调度如何选择最适合你的调度策略Linux内核实时调度如何选择最适合你的调度策略 在嵌入式开发、工业自动化等高实时性要求的场景中你是否经常遇到任务响应延迟、系统卡顿的问题Linux文档教程操作系统知识库Xilem与Masonry深度对比如何选择适合你的UI框架Xilem与Masonry深度对比如何选择适合你的UI框架 Xilem和Masonry是Rust生态中两个重要的UI框架它们共同构成了一个完整的GUI解决方前端桌面应用跨平台Rhino与Nashorn对比如何选择适合的JavaScript引擎Rhino与Nashorn对比如何选择适合的JavaScript引擎 在Java生态系统中选择正确的JavaScript引擎对于项目成功至关重要。Rhino语言运行时编程语言解释器上一篇终极指南Karakeep移动端开发如何利用React Native与Expo打造全平台书签应用下一篇SVGR性能监控设置跟踪转换效率的方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑