这种管道失速的特殊情况的解释

时间:2015-09-01 11:55:08

标签: c optimization branch pipeline microprocessors

我是嵌入式系统的新手。我正尽力学习和提高。我陷入了困境,可能只是忽略并继续前进。但是,我忍不住让它发痒。我觉得我必须明白这一点。

在我的路上,我能找到的最好的资源之一是Quantum Leaps,LLC的YouTube播放列表:Embedded Systems Programming Course

在6.12之后的Lesson 2中,Samek先生解释了一些关于管道失速的问题。乍一看,我听不懂它的一句话。然后我做了一些关于管道,气泡,树枝等的研究和阅读,以熟悉概念并理解它们背后的基本机制。然后我再次观看了视频,但我仍然不明白第二种情况如何更快。

编辑以使问题尽可能自包含:

在视频中,代码编写如下:

    ...
    ++counter; // Let's call this line "Line X"
    while (counter < 20) {
        // Assembly instructions to go back to Line X
    }
    ...

编译代码获得此结构后:

var items = XDocument.Parse(xml)
                .Descendants("item")
                .Select(i => new
                {
                    Title = (string)i.Element("title"),
                    Description = (string)i.Element("description"),
                    Link = (string)i.Element("link"),
                    Encoded = (string)i.Element("{http://purl.org/dc/elements/1.0/modules/content/}encoded"), //<-- ***

                })
                .ToList();

如果我没有弄错的话,Samek先生说第二个代码更快,因为它避免了分支。但我不明白怎么做。

提前感谢任何帮助(以及学习和改进的建议)!

1 个答案:

答案 0 :(得分:1)

用C编写的代码有两个分支:

  • 测试while循环条件时的条件分支
  • 无条件分支,在循环体
  • 之后跳回循环的开头

生成的程序集重新排序代码,以便消除无条件分支,并且只需要条件分支。

这种分支指令的消除导致视频作者提到的加速。请参阅视频中显示的流图像,以查看两者之间的差异。

关于管道停滞和分支预测的部分与此无关,而是讨论另一件需要注意的事情:每个条件分支都可能导致流水线停滞,因此限制条件分支的数量可能是有利的。 / p>