@@ -212,3 +212,220 @@ Useful first configurations include:
2122125 . conservative filtering on vs off for conditional / indirect / return cases
213213
214214These settings should give a good first view of the latency/accuracy tradeoff introduced by the two-block framework.
215+
216+ ---
217+
218+ ## 中文版本
219+
220+ ### 概述
221+
222+ 2-Taken 框架对 ` DecoupledBPUWithBTB ` 做了扩展,使一次预测机会可以产出:
223+
224+ - ` block0 ` :当前取指块的正常最终预测结果
225+ - ` block1 ` :基于 ` block0 ` 推测后状态导出的一个可选后继取指块
226+
227+ 取指侧接口保持不变。fetch 仍然逐个消费普通的单块 ` FetchTarget ` 。这个框架做的事情,是让预测侧能够更早地顺序入队两个连续的 target。
228+
229+ ### 设计目标
230+
231+ 这个框架主要面向实验,而不是一个完全泛化的 N-block 预测框架。当前实现重点是:
232+
233+ - 保持 ` FetchTarget ` 仍然是 fetch、squash 和 recovery 的外部基本单位
234+ - 一次预测最多只生成两个块
235+ - 允许每个 predictor 独立决定自己是否主动参与 ` block1 `
236+ - 当 ` block1 ` 遇到不受支持的分支类型时,可以保守地将其过滤掉
237+
238+ ### 整体架构
239+
240+ #### 1. 对外仍然保持单块模型
241+
242+ 下面这些结构对外仍然是单块语义:
243+
244+ - ` FetchTarget `
245+ - ` FetchTargetQueue `
246+ - ` src/cpu/o3/fetch.cc ` 中的 fetch 消费逻辑
247+
248+ 本框架并没有让 fetch 在一个周期里同时消费两个 target,只是允许预测侧按顺序更早地把两个 target 放入队列。
249+
250+ #### 2. 内部使用 bundle 模型
251+
252+ ` DecoupledBPUWithBTB ` 内部新增了 bundle 路径:
253+
254+ - ` SpecState `
255+ - ` pc `
256+ - ` history `
257+ - ` phistory `
258+ - ` bwhistory `
259+ - ` lhistory `
260+ - ` PredictionBundle `
261+ - ` pred0 `
262+ - 可选 ` pred1 `
263+ - ` stateAfter0 `
264+ - ` stateAfterFinal `
265+ - ` pred1DropReason `
266+
267+ 其中 ` pred1 ` 的生成输入来自 ` stateAfter0 ` ,而不是原始线程状态。
268+
269+ #### 3. 预测流程
270+
271+ 整体流程如下:
272+
273+ 1 . 生成 ` block0 ` 的正常最终预测
274+ 2 . 计算 ` block0 ` 之后的推测状态
275+ 3 . 检查 ` block1 ` 的顶层 gate
276+ 4 . 如果允许,则基于 ` stateAfter0 ` 运行各 predictor 的 ` block1 ` hook
277+ 5 . 形成最终 ` pred1 `
278+ 6 . 入队 ` target0 `
279+ 7 . 如果 ` pred1 ` 有效,则再入队 ` target1 `
280+ 8 . 用 ` stateAfterFinal ` 一次性提交线程推测状态
281+
282+ ### Predictor 参与模型
283+
284+ 每个 ` TimedBaseBTBPredictor ` 都新增了 ` block1Participate ` 控制位。
285+
286+ 支持两种模式:
287+
288+ - ` active `
289+ - predictor 主动执行自己的 ` putPCHistoryForBlock1(...) `
290+ - ` pass-through `
291+ - predictor 不主动预测 ` block1 `
292+ - 而是从 ` lowerPred ` 中保留低层已经得到的信息
293+
294+ #### 当前已经实现的行为
295+
296+ - ` UBTB `
297+ - 已实现真正的 ` block1 ` active 预测路径
298+ - ` TAGE `
299+ - active 模式走正常预测路径
300+ - passive 模式复制 ` lowerPred ` 中的 ` condTakens ` 和 ` tageInfoForMgscs `
301+ - ` ITTAGE `
302+ - passive 模式复制 ` lowerPred ` 中的 ` indirectTargets `
303+ - ` RAS `
304+ - passive 模式复制 ` lowerPred ` 中的 ` returnTarget `
305+ - ` MBTB `
306+ - passive 模式复制 ` lowerPred ` 中的 ` btbEntries `
307+
308+ ### 顶层 Block1 Gate
309+
310+ 在接受 ` block1 ` 之前,bundle 逻辑会检查:
311+
312+ - ` enableTwoTaken `
313+ - ` dropBlock1OnBlock0Override `
314+ - ` dropBlock1WhenFTQHasOnlyOneSlot `
315+ - ` block0 ` 之后的 next PC 是否有效
316+ - ` block0 ` 是否存在初始 uBTB hit
317+
318+ 之后还会根据 ` pred1 ` 的最终内容,过滤不受支持的分支类型:
319+
320+ - 没有方向支持的条件分支
321+ - 没有间接目标支持的 indirect 分支
322+ - 没有返回地址支持的 return
323+
324+ 这里的“支持”既可以来自:
325+
326+ - predictor 主动参与 ` block1 `
327+ - 也可以来自从 ` lowerPred ` 中复制保留下来的 support
328+
329+ ### 配置项
330+
331+ ` DecoupledBPUWithBTB ` 顶层新增了如下控制项:
332+
333+ - ` enableTwoTaken `
334+ - 是否启用 two-block bundle 路径
335+ - ` dropBlock1OnBlock0Override `
336+ - 如果 ` block0 ` 被更高阶段 override,是否丢弃 ` block1 `
337+ - ` dropBlock1WhenFTQHasOnlyOneSlot `
338+ - 当 FTQ 剩余空间不足两个条目时,是否丢弃 ` block1 `
339+ - ` dropBlock1OnCondWithoutTage `
340+ - 当 ` block1 ` 中存在没有有效方向支持的条件分支时,是否丢弃
341+ - ` dropBlock1OnIndirectWithoutIttage `
342+ - 当 ` block1 ` 中存在没有有效间接目标支持的 indirect 分支时,是否丢弃
343+ - ` dropBlock1OnReturnWithoutRas `
344+ - 当 ` block1 ` 中存在没有有效 return target 的 return 时,是否丢弃
345+
346+ 每个 predictor 还继承了:
347+
348+ - ` block1Participate `
349+ - 决定该 predictor 是否主动参与 ` block1 ` 预测
350+
351+ ### 涉及的主要文件
352+
353+ 核心逻辑:
354+
355+ - ` src/cpu/pred/btb/decoupled_bpred.hh `
356+ - ` src/cpu/pred/btb/decoupled_bpred.cc `
357+ - ` src/cpu/pred/btb/common.hh `
358+ - ` src/cpu/pred/btb/timed_base_pred.hh `
359+ - ` src/cpu/pred/btb/timed_base_pred.cc `
360+
361+ 配置定义:
362+
363+ - ` src/cpu/pred/BranchPredictor.py `
364+
365+ Predictor hook:
366+
367+ - ` src/cpu/pred/btb/btb_ubtb.hh `
368+ - ` src/cpu/pred/btb/btb_ubtb.cc `
369+ - ` src/cpu/pred/btb/btb_tage.hh `
370+ - ` src/cpu/pred/btb/btb_ittage.hh `
371+ - ` src/cpu/pred/btb/ras.hh `
372+ - ` src/cpu/pred/btb/mbtb.hh `
373+
374+ 队列相关:
375+
376+ - ` src/cpu/pred/btb/ftq.hh `
377+ - ` src/cpu/pred/btb/ftq.cc `
378+
379+ ### 统计项
380+
381+ ` DBPBTBStats ` 中新增了第一版 block1 统计项:
382+
383+ - ` block1Attempted `
384+ - ` block1Accepted `
385+ - ` block1DroppedByBlock0Override `
386+ - ` block1DroppedByCond `
387+ - ` block1DroppedByIndirect `
388+ - ` block1DroppedByReturn `
389+ - ` block1DroppedByFTQFull `
390+ - ` block1DroppedOther `
391+
392+ 这些统计项主要用于实验归因,帮助分析性能变化来自哪里。
393+
394+ ### 已有测试覆盖
395+
396+ 当前已有的聚焦测试包括:
397+
398+ - ` src/cpu/pred/btb/test/btb.test.cc `
399+ - block1 drop-reason helper
400+ - copied-support 接受路径
401+ - ` UBTB ` 的 block1 预测行为
402+ - ` MBTB ` 的 block1 pass-through 行为
403+ - ` src/cpu/pred/btb/test/btb_tage.test.cc `
404+ - ` TAGE ` 的 block1 active 路径
405+ - ` TAGE ` 的 block1 passive copy 路径
406+ - ` src/cpu/pred/btb/test/fetch_target_queue.test.cc `
407+ - 双 target squash 语义
408+ - two-target 准入时 FTQ 剩余空间的计数
409+
410+ ### 当前范围与限制
411+
412+ 当前实现有意没有进一步扩展到:
413+
414+ - fetch 在一个周期里同时消费两个 target
415+ - 超过两个块的 N-block 泛化
416+ - 每个 predictor 的完整 block1 特化实现
417+ - 所有历史源的端到端恢复验证
418+
419+ 因此,这个框架的定位是:已经可以支撑当前 2-Taken 实验,但仍然保留后续细化空间。
420+
421+ ### 建议的实验起点
422+
423+ 建议优先尝试以下配置组合:
424+
425+ 1 . 仅 ` UBTB ` active,其余 predictor passive
426+ 2 . ` UBTB + TAGE ` active,` ITTAGE/RAS ` passive
427+ 3 . ` UBTB + TAGE + ITTAGE + RAS ` active
428+ 4 . 对比 ` dropBlock1OnBlock0Override = true ` 与 ` false `
429+ 5 . 对比条件分支 / indirect / return 的保守过滤开关开闭
430+
431+ 这些配置有助于比较 two-block 框架带来的延迟收益和准确率损失之间的权衡。
0 commit comments