【问题标题】:How does the program counter in register 15 expose the pipeline?寄存器 15 中的程序计数器如何暴露流水线?
【发布时间】:2019-02-08 01:04:11
【问题描述】:

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

“ARM 将程序计数器放在寄存器 r15 中,使其对程序员可见。有人写过关于 ARM 的文章说这暴露了 ARM 的管道。他的意思是什么,为什么?”

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

谢谢!

【问题讨论】:

    标签: arm microprocessors


    【解决方案1】:

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

    通过使 PC 对程序员可见,是的,早期实现细节的某些片段已被“暴露”为需要由未来实现维护的架构怪异。

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

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

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

    拥有 PC 相关指令是相当普遍的。对如何计算偏移量进行实现优化的编码也很常见 - 例如IBM 650

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

    【讨论】:

      【解决方案2】:

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

      管道没有什么神奇之处,它是装配线的计算机版本。您可以在适当的位置建造汽车,并将发动机、车门、车轮等带到汽车上。或者你可以让汽车通过装配线,并有一个门站,一个车轮站等等。您一次要制造许多汽车,而从建筑物中出来的汽车数量是每隔几分钟,但这并不意味着制造一辆新车需要几分钟。这只是意味着最慢的一步需要几分钟,从前到后大约需要相同的时间。

      一条指令有几个应该很明显的步骤,加法要求您获取指令,对其进行解码,收集操作数并将它们提供给加法器(alu)并获取结果并存储结果。其他说明有类似的步骤和类似的编号。

      您的教科书将使用获取、解码、执行等术语。因此,如果您在 0x1000 处获取一条指令,然后在 0x1004 处获取一条指令,然后在 0x1008 处获取一条指令,希望代码在没有分支的情况下线性运行,那么当获取 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 指令,而是刷新 N-1 指令,并且在分支进入管道之后,您可以获得额外的时钟来获取下一条指令。这就是 mips 默认的工作方式,但是当您购买真正的核心时,您可以将其关闭并让它在分支后不执行指令。它是一个很棒的教科书插图,可能是真实的,并且可能是真实的,让我们在计算机工程中构建 mips 类。但是今天使用的管道不用等那么久就可以看到管道将变空并且可以提前开始获取并且有时会获得多个时钟而不是刷新整个管道。如果有的话,它目前并没有给 MIPS 带来任何优于其他设计的优势,也没有让我们接触到他们的管道。

      【讨论】:

      • 非常感谢!这非常有帮助:)
      • 在最初的 ARM26 实现中,这是流水线的产物——实际上是 CPU 从中获取下一条指令的地方。它节省了门 - 原始内核非常小,没有缓存。低数万门。管道是 3 阶段的。由于 PC 相对寻址使用 r15 作为操作数,任何具有较长管道的 CPU(英特尔的 StrongARM 就是一个例子 - IIRC 是一个 5 级管道)必须保持这种关系,但实际上是在 PC+offset 处获取指令。
      • 当 A 代表 Acorn 时,当然 armv4 对那些 arm1/2/3 (armv1/v2) 芯片具有很多兼容性。人们会假设前面的两个“暴露了 armv1/v2 的管道”。但即使使用 armv4/arm7(A 代表 Advanced)(它们现在是 ip 内核而不是芯片),人们仍会认为它只是一种遗留兼容性的东西,没有暴露任何深度或设计细节。
      猜你喜欢
      • 2021-10-09
      • 2021-08-22
      • 2019-03-08
      • 2013-03-22
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多