天真地,条件执行的指令对我来说似乎是一个好主意。
当我阅读更多关于ARM(和类似ARM)的指令集(Thumb2,Unicore,AArch64)时,我发现它们都缺少条件执行的位。
为什么每个都缺少条件执行?
当时条件执行是错误的,还是后续更改使得它成为指令位的昂贵浪费?
答案 0 :(得分:21)
一般声称现代系统具有更好的分支预测器,编译器更先进,因此它们在指令编码空间上的成本是不合理的。
这是ARMv8 Instruction Set Overview
A64指令集不包括谓词或谓词的概念 条件执行。 标杆显示现代分支 预测器工作得很好,可以预测执行指令 没有足够的好处来证明其大量使用的合理性 操作码空间,其实现成本在先进 实现强>
它继续
一组非常小的“条件数据处理”指令 提供。这些指令是无条件执行但使用 条件标志作为指令的额外输入。这套有 在条件分支的情况下被证明是有益的 预测不好,或者效率低下。
另一篇题为Trading Conditional Execution for More Registers on ARM Processors的论文声称:
...条件执行占用宝贵的指令空间 条件被编码到每个的4位条件代码选择器中 32位ARM指令。此外,只有很小的百分比 指令实际上是用现代嵌入式条件化的 应用程序和条件执行可能甚至不会导致 现代嵌入式处理器的性能提升。
答案 1 :(得分:9)
其中一个原因是因为编码。
在 thumb 中,你不能将更多4位压缩到紧密的16位空间,而对于寄存器的3位高位来说甚至没有足够的空间,它们必须缩减为子集只有8个寄存器。请注意,在 thumb2 中,您有IT(E)的单独selecting the conditions for the next 4 instructions指令。但是,由于上述原因,您无法将条件存储在同一条指令中。
对于 AArch64 ,与32位ARM相比,寄存器的数量增加了一倍,但同样,对于寄存器的新3位高位,您没有任何剩余位。如果要使用旧编码,则必须从窄12位立即或4位条件“借用”。与其他RISC架构(如MIPS)相比,12位太小,并且减少了它使一切变得更糟,因此删除条件是更好的选择。因为分支预测变得越来越先进,所以它不会成为问题
答案 2 :(得分:5)
条件执行是实现许多辅助或位错误例程的不错选择,例如排序,列表或树操作,数字到字符串转换,sqrt或long除法。我们可以添加UART驱动程序并在路由器中提取位字段。它们具有较高的分支与非分支比率,同时具有较高的不可预测性。
但是,一旦超出最低级别的服务(或通过使用更高级别的语言来提高抽象级别),代码看起来就完全不同了:不同条件分支中的代码块包含更多移动数据和调用子代码例程。这些额外的4位的好处迅速消失。它不仅是个人发展,而且是文化:文化编程从非结构化(基础,Fortran,汇编)发展到结构。在不同的指令集架构中,也可以更好地支持不同的编程范例。
技术上的妥协可能是将五位“cond.S”字段压缩为四种或三种最常用的组合。
答案 3 :(得分:4)
说ARMv8中不存在条件执行有点误导。 问题是要理解为什么你不想执行某些指令。 也许在早期的ARM时代,实际的非执行指令很重要(无论是权力还是其他),但今天这个功能的重要性在于它允许你避免小笨跳的分支,例如像 a =(b>0≤1:2)。这种事情比你想象的更常见 - 概念上它是MAX / MIN或ABS之类的东西(虽然对于某些CPU来说可能有指令来完成这些特定的任务)。
在ARMv8中,虽然没有一般条件执行的指令,但是有一些指令可以执行我所描述的特定任务,即允许你避免分支进行短暂的哑跳; CSEL是最明显的例子,尽管还有其他情况(例如条件设置条件)来处理其他常见模式(在这种情况下是C短路表达式评估的模式)。
恕我直言,ARM在这里所做的是最有意义的。他们已经提取了条件执行的功能,这些功能在现代CPU(避免许多分支)上仍然很有价值,同时改变了实现的细节以匹配现代CPU的微架构。答案 4 :(得分:2)
在旧的ARM v4上,条件指令只会节省时间,如果很可能它们最终会被执行,或者概率是大约50%,那么如果它们中只有2到4个行。如果它们没有被执行,那么浪费周期就必须通过它们,而不是使用分支来过去它们的开销。如果它们被执行,则将获取分支但不执行。
一个小麻烦是,在调试时,在条件指令上放置一个中断总是会导致该指令中断,无论条件如何(除非我的公司没有一些非常智能的调试器)。
答案 5 :(得分:1)
"为什么有条件执行的指令不存在......" "条件执行当时是错误的,还是后续更改使得它成为指令位的昂贵浪费?"
[有偏见的回复,与该想法相关的作者(及其支持者)]
设计选择。添加功能,您可以扩展您的可能性;删除它们,你可以实现变通方法,或者不用。
成本,TDP和专利,甚至开发竞争产品所需的技术技能水平都会发挥作用。
桌子上有数十亿,当你滚动那些你不想推翻整个业务的时候,所以他们选择不这样做。
在我看来,在服务器处理器中省略elison能力被固定到Fabric是错误的,但我有偏见。
这不是一个错误(拥有它,实施得很好),它是昂贵的,它不是浪费(这些都是聪明的并且关注自己的事业)。
就像任何CPU扩展,或添加GPU;如果你能巧妙地使用你的工具,那么你的好处就是去,否则轻装上阵。
Wikipedia Quote:"根据不同的基准测试,TSX可以在特定工作负载中提供大约40%的应用程序执行速度,以及每秒数据交易量(TPS)提高4-5倍。"。
它的成本很高' (对于某些情况)但对于当前的编程风格很重要,或者更悲观的是在综合基准测试中获得更高分数的方法。
有一天它会像乐高一样容易,你可以问它'它'集合自己,做你的投标;在那之前,处理器必须支持程序员(和编译器编写者)懒惰 - 因此可以在GPU上运行的程序很少(但我们已经到了那里)。
因此,删除那些被认为不受欢迎或未以具有成本效益和竞争力的方式实施的(伟大)功能。
因此,TSX目前的规则;但ARM CPU也需要花哨的线程用于Fabric。
网址引用:
AMD:https://en.wikipedia.org/wiki/Advanced_Synchronization_Facility英特尔:https://en.wikipedia.org/wiki/Transactional_Synchronization_Extensions
答案 6 :(得分:0)
就像,mips中的延迟槽是一个技巧(当时),手臂中的条件执行是一个技巧(当时),因为pc是前面的两条指令。现在,他们有多大的影响力? ARM分支预测器实际上会产生那么大的差异,还是真正的答案,他们需要在32位指令字中需要更多位,而像拇指一样,第一个也是最容易摆脱的是条件位。
进行一些性能测试并不难看出分支预测器的确有多好或多么好,我在arm11上用无条件分支进行了尝试,认为这是现在的旧架构,但仍然广泛使用。最好是让分支预测显示出任何改进,而且形状或形式决不会与条件执行竞争。我没有在皮质 - 家庭中的任何事情上重复这些经验。