对这种流水线停顿的具体情况的解释
Explanation for this specific case of pipeline stall
我是嵌入式系统的新手。我正在尽我所能地学习和提高。我被困在一个点上,忽略并继续前进可能没问题。然而,我忍不住让它让我心痒痒。我觉得我必须明白这一点。
在路上,我找到的最好的资源之一是 Quantum Leaps, LLC 的这个 YouTube 播放列表:Embedded Systems Programming Course
在 6.12 之后的 Lesson 2 中,Samek 先生解释了一些有关管道停顿的内容。乍一看,我一个字也听不懂。然后我做了一些关于管道、气泡、分支等的研究和阅读,以熟悉概念并理解它们背后的基本机制。然后我又看了一遍视频,但我仍然不明白第二种情况如何更快。
编辑以使问题尽可能独立:
视频中,代码是这样写的:
int main() {
int counter = 0;
while (counter < 20) {
++counter;
}
return 0;
}
编译代码得到这个结构后:
...
++counter; // Let's call this line "Line X"
while (counter < 20) {
// Assembly instructions to go back to Line X
}
...
如果我没记错的话,Samek 先生说第二个代码更快,因为它避免了分支。但是我不明白。
感谢任何帮助(以及学习和改进的建议),在此先感谢!
用C写的代码有两个分支:
- 测试
while
循环条件时的条件分支
- 在循环体之后跳回到循环开头的无条件分支
生成的程序集对代码进行了重新排序,以消除无条件分支,只需要有条件分支。
这种分支指令的消除导致了视频作者提到的加速。参考视频中的流图,看看两者的区别。
关于管道停顿和分支预测的部分与这一点无关,而是谈论另一件需要注意的事情:每个条件分支都可能导致管道停顿,因此限制条件分支的数量可能是有利的.
我是嵌入式系统的新手。我正在尽我所能地学习和提高。我被困在一个点上,忽略并继续前进可能没问题。然而,我忍不住让它让我心痒痒。我觉得我必须明白这一点。
在路上,我找到的最好的资源之一是 Quantum Leaps, LLC 的这个 YouTube 播放列表:Embedded Systems Programming Course
在 6.12 之后的 Lesson 2 中,Samek 先生解释了一些有关管道停顿的内容。乍一看,我一个字也听不懂。然后我做了一些关于管道、气泡、分支等的研究和阅读,以熟悉概念并理解它们背后的基本机制。然后我又看了一遍视频,但我仍然不明白第二种情况如何更快。
编辑以使问题尽可能独立:
视频中,代码是这样写的:
int main() {
int counter = 0;
while (counter < 20) {
++counter;
}
return 0;
}
编译代码得到这个结构后:
...
++counter; // Let's call this line "Line X"
while (counter < 20) {
// Assembly instructions to go back to Line X
}
...
如果我没记错的话,Samek 先生说第二个代码更快,因为它避免了分支。但是我不明白。
感谢任何帮助(以及学习和改进的建议),在此先感谢!
用C写的代码有两个分支:
- 测试
while
循环条件时的条件分支 - 在循环体之后跳回到循环开头的无条件分支
生成的程序集对代码进行了重新排序,以消除无条件分支,只需要有条件分支。
这种分支指令的消除导致了视频作者提到的加速。参考视频中的流图,看看两者的区别。
关于管道停顿和分支预测的部分与这一点无关,而是谈论另一件需要注意的事情:每个条件分支都可能导致管道停顿,因此限制条件分支的数量可能是有利的.