对这种流水线停顿的具体情况的解释

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循环条件时的条件分支
  • 在循环体之后跳回到循环开头的无条件分支

生成的程序集对代码进行了重新排序,以消除无条件分支,只需要有条件分支。

这种分支指令的消除导致了视频作者提到的加速。参考视频中的流图,看看两者的区别。

关于管道停顿和分支预测的部分与这一点无关,而是谈论另一件需要注意的事情:每个条件分支都可能导致管道停顿,因此限制条件分支的数量可能是有利的.