Skip to content

Latest commit

 

History

History
82 lines (73 loc) · 6.75 KB

File metadata and controls

82 lines (73 loc) · 6.75 KB

预取专用Cache分区计划

目标

为 Cache 增加一个只存放预取行的分区。预取的插入/替换/查询仅在该分区内进行,普通需求行不得占用。需求命中应能正常读取,是否迁移需定义。

现有关键位置

待确认设计点

  1. 分区形态:每组预留若干路 vs 独立标签存储,倾向每组预留路以便接入现有索引。
  2. 需求命中是否迁移到主分区,或仅标记“已需求访问”并留在预取分区。
  3. 替换策略:预取分区独立策略实例,或复用同一策略但作用于子集路。
  4. 容量参数:按路数/字节/比例暴露,支持 0 关闭。
  5. 预取分区驱逐与主分区在一致性/写回语义上是否完全相同。

工作步骤

  1. 参数面:新增 Cache 参数(开关与分区大小),配置层与 SCons 暴露。
  2. 块元数据:扩展 CacheBlk 标记分区驻留与是否被需求提升,覆盖序列化/重置。
  3. 标签/组相联分区:在 BaseSetAssoc(或派生)维护主/预取两套替换池;查找覆盖两分区;按分区选牺牲块。
  4. 查找路径BaseCache::access 同查两分区;命中预取分区时的处理与统计拆分。
  5. 填充/分配路由handleFill/allocateBlock 将预取响应路由至预取分区,禁止非预取分配进入;分区满时仅内部驱逐。
  6. 提升策略:需求命中预取分区时决定“迁移到主分区”或“原地标记需求”,并更新替换元数据。
  7. 驱逐/写回路径evictBlockdoWritebacks、CleanEvict 保持分区隔离但语义一致,统计独立。
  8. 预取队列:确保 MSHR 分配对预取请求打标,便于填充分路由识别;必要时增加断言/计数。
  9. 统计/探针:预取分区占用、命中、填充、驱逐、提升、DOA 等计数,必要时调整暖身处理。
  10. 配置与文档:更新 Cache.py/PrefetcherConfig.py 等配置,补充用户文档与调优说明。
  11. 测试:微基准覆盖仅预取、混合需求+预取、启用分区的 checkpoint/恢复、一致性与失效场景。

风险/关注点

  • 替换策略需支持双池。
  • 分区化可能影响延迟建模(tag/data 端口计数)。
  • 序列化需保留分区与替换状态。
  • 默认关闭以确保兼容性。

讨论更新(方案锁定后续步骤)

基于已确认的设计选项:

  1. 分区形态:每组预留若干路。
  2. 需求命中仅标记“已需求访问”并留在预取分区,不迁移。
  3. 替换策略:复用同一替换策略实例,但作用于分区内子集路。
  4. 容量参数:按比例暴露,支持 0 关闭。
  5. 驱逐语义:预取分区与主分区在一致性/写回语义上完全相同。

下一步工作规划

  1. 参数落地:新增比例型分区参数与开关;Python 配置与 SCons 接口同步;默认 0 关闭。

  2. 块元数据:为 CacheBlk 增加分区驻留标记与“已需求访问”标志;补齐序列化/重置逻辑。

  3. 分区化标签/替换:在 BaseSetAssoc(或派生)实现按组预留路的双分区池,复用同一替换策略实例但限制候选路集;提供按分区选 victim 的接口。

  4. 访问路径BaseCache::access 查两分区;命中预取分区时仅标记“已需求访问”,不迁移;统计分拆。

  5. 填充/分配路由handleFill/allocateBlock 将预取响应放入预取分区;普通需求不得占用;分区满时仅内部驱逐,语义与主分区一致。

  6. 驱逐与写回:复用现有写回/一致性流程,但保持分区隔离与统计独立;确保 CleanEvict/Writeback 行为一致。

  7. 预取标记链路:确保 MSHR/请求链路对预取打标,便于填充分区路由;缺标时记录计数/告警。

  8. 统计:新增占用、命中、填充、驱逐、已需求访问计数(含 DOA),按分区拆分;若使用比例参数,记录实际预留路数。

  9. 测试计划

    • 仅预取流:验证预取分区被使用且需求不会进入。
    • 混合流:需求命中预取分区仅标记不迁移;容量隔离有效。
    • 恢复/一致性:checkpoint/restore,CleanEvict/Writeback 语义一致性。
    • 关闭模式:参数为 0 时行为与原先一致。

    讨论更新(追加)

    新的设计点修正:

    1. 分区形态:每组预留若干路,按比例参数计算预留路数;向下取整;若不足 1 路则该组预留 0(等价于禁用)。
    2. 需求命中:仅标记“已需求访问”,不迁移出预取分区。
    3. 替换策略:预取分区使用独立的替换策略实例(与主分区解耦)。
    4. 容量参数:按比例暴露,支持 0 关闭;组数若非幂次则报错(仅在参数为幂次组数时工作)。
    5. 驱逐语义:预取分区与主分区在一致性/写回上完全一致。

    下一步工作规划(根据新设计点)

    1. 参数实现:比例型分区参数,向下截断到整路;不足 1 路取 0;若组数非幂次直接报错;默认 0 关闭。配置层与 SCons 同步。
    2. 块元数据CacheBlk 增加分区驻留与“已需求访问”标志,含序列化/重置。
    3. 分区化标签/替换:BaseSetAssoc(或派生)维护主/预取双池,预取池使用独立替换策略实例;按组预留路数由比例计算;victim 选择限定在各自池内。
    4. 访问路径BaseCache::access 查两分区;命中预取分区仅标记已需求访问,不迁移;统计分拆。
    5. 填充/分配路由handleFill/allocateBlock 将预取响应放入预取分区,普通需求不得占用;预取分区满时仅内部驱逐,语义与主分区一致。
    6. 驱逐与写回:复用现有流程,保持分区隔离与统计独立,保证 CleanEvict/Writeback 语义一致。
    7. 预取标记链路:MSHR/请求需带预取标记,缺标计数/告警,确保填充分路由正确。
    8. 统计:分区占用、命中、填充、驱逐、已需求访问、DOA;记录比例参数实际转换的预留路数。
    9. 测试
      • 仅预取流:验证预取分区启用与容量隔离。
      • 混合流:需求命中不迁移,统计正确。
      • 非幂次组数:应触发报错覆盖。
      • 关闭模式:参数为 0 时回归旧行为。