Skip to content

Commit 669eca4

Browse files
committed
cpu-o3: Refine reverse-tick stall attribution
Change-Id: I4dff1631acaf7a07f663f05c878d7bd40cc9740a
1 parent 4079192 commit 669eca4

File tree

6 files changed

+69
-19
lines changed

6 files changed

+69
-19
lines changed

docs/tools/topdown/reverseTickRootCauseTopdown.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,31 @@ reverse tick 下,`StallSignals` 已经承担同拍背压的传播职责。
179179

180180
---
181181

182-
## 8. 最后总结
182+
## 8. 新增的结构性背压原因
183+
184+
在这次 reverse tick 统计修复之后,原本容易被吞到 `OtherStall` 里的两类结构性背压,被显式拆成了独立原因:
185+
186+
### `RegFull`
187+
188+
- 含义:rename 本级因为物理寄存器资源不足,无法继续向前推进
189+
- 位置:根因首先发生在 rename
190+
- 传播:如果这个原因继续向前反压,则 `rename/decode/fetch StallReason` 都可以看到 `RegFull`
191+
192+
它不属于“未知 stall”,而是明确的 rename 资源瓶颈。
193+
194+
### `ROBFull`
195+
196+
- 含义:commit 侧因为 ROB 剩余空间不足,无法继续吸收来自 rename 的输入
197+
- 位置:根因首先体现为 commit 对上游的容量背压
198+
- 传播:如果这个原因沿着背压链向前扩散,则 `rename/decode/fetch StallReason` 都可以看到 `ROBFull`
199+
200+
这里的 `ROBFull` 更接近“ROB 容量背压”,而不是“ROB head 对应指令的执行根因”。
201+
202+
因此,这两个 reason 的引入,主要是为了把原本模糊的 `OtherStall` 拆解成更有解释力的结构性原因,而不是改变一级 topdown 行为。
203+
204+
---
205+
206+
## 9. 最后总结
183207

184208
推荐的理解方式是:
185209

src/cpu/o3/comm.hh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ enum StallReason {
101101
ScalarReadyButNotIssued, // B
102102
ResumeUnblock, // B
103103
CommitSquash, // BS
104+
ROBFull, // B
105+
RegFull, // B
104106
OtherStall, // B
105107
NumStallReasons
106108
};

src/cpu/o3/commit.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1863,7 +1863,7 @@ Commit::moveInstsToBuffer()
18631863
} else if (block) {
18641864
block_reason = robInfoFromIEW->iewInfo[i].robHeadStallReason;
18651865
if (block_reason == StallReason::NoStall) {
1866-
block_reason = StallReason::OtherStall;
1866+
block_reason = StallReason::ROBFull;
18671867
}
18681868
}
18691869
DPRINTF(Commit, "Thread %i: block %i robblock %i active %i\n", i, block, robblock, active);

src/cpu/o3/fetch.cc

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,6 +1221,7 @@ Fetch::initializeTickState()
12211221
bool status_change = false;
12221222

12231223
wroteToTimeBuffer = false;
1224+
setAllFetchStalls(StallReason::NoStall);
12241225

12251226
// get the distribution of fetch status
12261227
fetchStats.fetchStatusDist[fetchStatus[0]]++;
@@ -1304,8 +1305,21 @@ Fetch::sendInstructionsToDecode()
13041305
}
13051306
if (!any_thread_active) {
13061307
// All threads are blocked, no instructions to send
1308+
ThreadID blocked_tid = InvalidThreadID;
1309+
for (int i = 0; i < numThreads; i++) {
1310+
if (stallSig->blockFetch[i]) {
1311+
blocked_tid = i;
1312+
break;
1313+
}
1314+
}
1315+
1316+
if (blocked_tid != InvalidThreadID) {
1317+
setAllFetchStalls(stallSig->fetchBlockReason[blocked_tid]);
1318+
}
1319+
1320+
toDecode->fetchStallReason = stallReason;
1321+
13071322
for (int i = 0; i < numThreads; i++) {
1308-
updateStallReasons(0, i);
13091323
measureFrontendBubbles(0, i);
13101324
}
13111325
return;
@@ -1350,7 +1364,9 @@ Fetch::sendInstructionsToDecode()
13501364
void
13511365
Fetch::updateStallReasons(unsigned insts_to_decode, ThreadID tid)
13521366
{
1353-
if (insts_to_decode == 0) {
1367+
if (stallSig->blockFetch[tid]) {
1368+
setAllFetchStalls(stallSig->fetchBlockReason[tid]);
1369+
} else if (insts_to_decode == 0) {
13541370
// fetch stalled
13551371
if (stallReason[0] != StallReason::NoStall) {
13561372
// previously set stall reason

src/cpu/o3/iew.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,8 @@ IEW::IEWStats::IEWStats(CPU *cpu)
303303
{StallReason::Atomic,"Atomic"},
304304
{StallReason::ResumeUnblock, "ResumeUnblock"},
305305
{StallReason::CommitSquash, "CommitSquash"},
306+
{StallReason::ROBFull, "ROBFull"},
307+
{StallReason::RegFull, "RegFull"},
306308
{StallReason::OtherStall, "OtherStall"},
307309
{StallReason::OtherFetchStall, "OtherFetchStall"},
308310
{StallReason::FTQBubble, "FTQBubble"},

src/cpu/o3/rename.cc

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,9 @@ Rename::tick()
354354
} else if (!can_rename) {
355355
block_reason = checkRenameStallFromIEW(i);
356356
if (block_reason == StallReason::NoStall) {
357-
block_reason = StallReason::OtherStall;
357+
block_reason = StallReason::RegFull;
358+
++stats.fullRegistersEvents;
359+
stats.stallEvents[RegFull]++;
358360
}
359361
}
360362
DPRINTF(Rename, "[tid:%i] blockRename: %i, canRename: %i, block: %i, active: %i\n",
@@ -562,7 +564,9 @@ Rename::renameInsts(ThreadID tid)
562564
if (breakRename == StallReason::NoStall) {
563565
breakRename = checkRenameStallFromIEW(tid);
564566
if (breakRename == StallReason::NoStall) {
565-
breakRename = StallReason::OtherStall;
567+
breakRename = StallReason::RegFull;
568+
++stats.fullRegistersEvents;
569+
stats.stallEvents[RegFull]++;
566570
}
567571
}
568572
blockReason = breakRename;
@@ -993,19 +997,21 @@ StallReason
993997
Rename::checkRenameStallFromIEW(ThreadID tid)
994998
{
995999
StallReason robHeadStallReason = fromIEW->iewInfo[tid].robHeadStallReason;
996-
return robHeadStallReason;
997-
998-
// if (robHeadStallReason == StallReason::NoStall) {
999-
// if (calcFreeLQEntries(tid) <= 0) {
1000-
// return fromIEW->iewInfo[tid].lqHeadStallReason;
1001-
// } else if (calcFreeSQEntries(tid) <= 0) {
1002-
// return fromIEW->iewInfo[tid].sqHeadStallReason;
1003-
// } else {
1004-
// return robHeadStallReason;
1005-
// }
1006-
// } else {
1007-
// return robHeadStallReason;
1008-
// }
1000+
if (robHeadStallReason != StallReason::NoStall) {
1001+
return robHeadStallReason;
1002+
}
1003+
1004+
StallReason lqHeadStallReason = fromIEW->iewInfo[tid].lqHeadStallReason;
1005+
if (lqHeadStallReason != StallReason::NoStall) {
1006+
return lqHeadStallReason;
1007+
}
1008+
1009+
StallReason sqHeadStallReason = fromIEW->iewInfo[tid].sqHeadStallReason;
1010+
if (sqHeadStallReason != StallReason::NoStall) {
1011+
return sqHeadStallReason;
1012+
}
1013+
1014+
return StallReason::NoStall;
10091015
}
10101016

10111017
} // namespace o3

0 commit comments

Comments
 (0)