Skip to content

Commit be726a6

Browse files
committed
cpu: add Chinese two-taken framework doc
Change-Id: Ic8281eda32625e72fa8a11b77da2a33d8f9beca2
1 parent 6f4cc38 commit be726a6

1 file changed

Lines changed: 217 additions & 0 deletions

File tree

src/cpu/pred/btb/docs/two_taken_framework.md

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,220 @@ Useful first configurations include:
212212
5. conservative filtering on vs off for conditional / indirect / return cases
213213

214214
These 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

Comments
 (0)