寄存器 15 中的程序计数器如何暴露流水线?

How does the program counter in register 15 expose the pipeline?

我有一个分配给我的问题是:

"The ARM puts the program counter in register r15, making it visible to the programmer. Someone writing about the ARM stated that this exposed the ARM's pipeline. What did he mean, and why?"

我们还没有在 class 中讨论管道,所以我不知道那是什么,而且我很难在线理解 material。有人可以帮助我回答问题或帮助我理解,以便我形成自己的答案吗?

谢谢!

不是真的;他们可能在谈论的是程序计数器比正在执行的指令提前两条指令。但这并不意味着它是一个两三层深的管道,如果它曾经是的话。此时它不暴露任何内容,就像 MIPS 中的分支影子不暴露任何内容一样。有教科书MIPS就有现实

管道并没有什么神奇的地方;它是装配线的计算机版本。您可以就地建造汽车,然后将发动机、车门、车轮等安装到汽车上。或者,您可以通过装配线移动汽车,并设置一个车门站、一个车轮站等。您同时建造了很多汽车,并且每隔几分钟就有一辆汽车从建筑物中出来,但这并不意味着一辆新车需要几分钟才能建造。这只是意味着最慢的一步需要几分钟,从前到后大约需要相同的时间。

一条指令有几个应该是显而易见的步骤,一条加法要求您获取指令、解码它、收集操作数并将它们提供给加法器 (alu) 并获取结果并存储结果。其他说明具有相似的步骤和相似的数量。

您的教科书将使用获取、解码、执行等术语。因此,如果您在 0x1000 处获取一条指令,然后在 0x1004 处获取一条指令,然后在 0x1008 处获取一条指令,希望代码是 运行ning 线性且没有分支,那么当 0x1004 被获取时,0x1000 正在被解码,而 0x1008 是正在获取,然后正在解码 0x1004,而 0x1000 可能要执行,这取决于。所以当 0x1000 被执行时,人们可能会认为程序计数器正在获取 0x1008 以便告诉我管道是如何工作的。好吧,我不能有一个 10000 深的流水线,并让指令看到的程序计数器是我喜欢的相对于该指令地址的任何地址,我可以为 0x1000 处的指令设置 0x1000,并有一个 12345 深的流水线.它只是一个定义,它可能在历史的某个时刻因为真实的设计和真实的管道而被放置到位,或者它可能一直都是这样定义的。

重要的是指令集声明并支持定义,如果他们说 pc 是指令加上一些偏移量,那么它需要始终是那个或者需要记录异常,并匹配这些定义。完毕。程序员可以然后程序员编译器可以写等等

关于管道的一个教科书问题(并不是说它不是真实的)是说我们 运行 没有 v8 引擎,我们有 12 辆卡车在装配线上,我们在这条线上为一些卡车制造卡车一段时间后,我们用 v6 制造汽车。一旦他们完成制造,引擎就会通过慢船来,但我们现在已经准备好了汽车零件,所以让我们把卡车从生产线上移下来,重新开始生产线,在装配线上的 N 个步骤中,没有汽车从另一端出来在建筑物的内部,一旦第一辆车到达尽头,每隔几分钟就会有一辆新车。我们不得不冲洗装配线。当你运行宁指令 0x1000、0x1004、0x1008 等时。如果你可以保持管道移动它会更有效但是 0x1004 是到 0x1100 的分支,我们可能在管道中有 0x1008 的指令和 0x100c 的指令,所以我们必须刷新从 0x1100 开始获取的管道,并且在我们再次完成指令之前需要一些时钟周期,然后理想情况下我们在此之后每个时钟完成一个直到另一个分支。因此,如果您阅读有关使用 mips 或教育前辈的主题的经典教科书,他们有分支影子或其他类似术语的概念,总是执行分支后的指令。

因此,您可以刷新 N-1 条指令,而不是将 N 条指令从管道中清除出去,并且您会获得一个额外的时钟来获取分支进入管道后的下一条指令。这就是 mips 默认情况下的工作方式,但是当您购买真正的内核时,您可以将其关闭,让它不执行分支后的指令。这是一个很棒的教科书插图,可能是真实的,并且对于计算机工程中的“让我们构建一个 mips”类 来说可能是真实的。但是今天使用的管道不会等那么久才能看到管道将变空并且可以提前开始获取并且有时可以获得一个以上的时钟而不是刷新整个管道。如果有的话,它目前并没有给 MIPS 带来任何优于其他设计的优势,也没有让我们接触到他们的流水线。

exposed pipeline 意味着程序员需要考虑管道,我不同意 r15 值偏移不是编码常量。

通过使 PC 对程序员可见,是的,早期实现细节的一些片段已经 'exposed' 作为一种架构怪癖,需要由未来的实现来维护。

如果设计到体系结构中的偏移量为零,这将不值得评论 - 简单的 3 级管道将无法进行优化,并且每个人都不会更明智。

管道中没有任何东西 'exported',不是跟踪或调试允许您窥探代码时的计时行为的方式 运行 - 此功能只是错觉的一部分处理器硬件呈现给程序员(类似于按程序顺序执行的每条指令)。

像这样的新颖技巧的一个问题是人们喜欢写关于它们的问题,而这些问题很容易措辞不当。他们还忽略了这样一个事实,即即使流水线是 3 级,也只需要一个 'special case' 来要求门进行偏移计算(即使这些门在典型操作中不消耗功率)。

PC相关指令比较普遍。对offest的计算方式进行优化编码也很常见——例如IBM 650

Retrocomputing.SE 是一个有趣的地方,可以了解一些与现代计算机发展相关的事情。