Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization ARM组件中分支上的延迟结果指令会发生什么情况?_Optimization_Assembly_Arm - Fatal编程技术网

Optimization ARM组件中分支上的延迟结果指令会发生什么情况?

Optimization ARM组件中分支上的延迟结果指令会发生什么情况?,optimization,assembly,arm,Optimization,Assembly,Arm,我正在优化ARM组装中的一个算法,并需要找出放置指令的顺序,以最小化管道暂停。在这方面,位于的循环计数器非常有用,但缺乏关于函数调用/分支上发生什么的知识。我想做的基本上是(这只是一个例子): mul和mov指令之间的管道暂停非常可怕,没有什么可以阻止我在它们之间进行函数调用。但是当我做分支时,管道到底发生了什么?我知道foo将执行push{r4-r12,lr}作为第一条指令。我可以看到两种可能的结果: 分支指令需要几个周期,这使得mul指令能够在执行push之前传递其结果,从而减少管道暂停 管

我正在优化ARM组装中的一个算法,并需要找出放置指令的顺序,以最小化管道暂停。在这方面,位于的循环计数器非常有用,但缺乏关于函数调用/分支上发生什么的知识。我想做的基本上是(这只是一个例子):

mul
mov
指令之间的管道暂停非常可怕,没有什么可以阻止我在它们之间进行函数调用。但是当我做分支时,管道到底发生了什么?我知道
foo
将执行
push{r4-r12,lr}
作为第一条指令。我可以看到两种可能的结果:

  • 分支指令需要几个周期,这使得
    mul
    指令能够在执行
    push
    之前传递其结果,从而减少管道暂停
  • 管道暂停增加,因为在执行之前,
    push
    需要
    r4
    几个周期(ARMv7 IIRC之前就是这种情况,链路中的周期计数器似乎认为不需要)
  • 简而言之:

    当您执行函数调用(假定将寄存器推到堆栈上)或甚至执行正常分支时,结果延迟的指令会发生什么情况(
    mul
    是主要示例)?

    我不确定答案是什么,但我很确定,如果答案是公开的,那么它将出现在。

    如果我知道你不需要执行

    mov       r4, r4, ASR #14
    str       r4, [r5]
    
    在电话之前。 在电影开始前打电话

    bl        foo
    mov       r4, r4, ASR #14
    str       r4, [r5]
    
    这是个好主意

    mul将有更多的时间在呼叫期间完成。 STM将是一个显而易见的问题。当然,你可以在计算R4之前按下它

    如果foo是asm函数,您可以稍后在foo函数中保存R4(可能是您可以尝试不使用R4,然后不保存它)

    如果foo函数是C函数(或者如果可以更改push指令)。使用r12而不是r4作为MUL的目标寄存器


    STM指令稍后将需要R12。然后,mul可能有足够的时间在STM需要目标寄存器(R12)之前完成

    只有在尝试使用未准备好的寄存器时,才会出现管道暂停。这就是流水线的要点——即使之前的结果还没有准备好,指令仍会继续执行。是的,我知道,这就是问题的关键所在<执行
    mov r4、r4、ASR#14
    时,code>r4未准备就绪。我是否会在
    mov
    指令之前执行函数调用来减少管道暂停,即使该函数将有问题的寄存器推到堆栈上?为什么您认为mov处会有管道暂停?乘法指令应仅需要1或2个额外时钟,具体取决于ARM内核的版本。如果出于某种原因,r4需要2个以上的时钟才能准备好,BL会给它更多的时间。我想你需要给它计时。不要在上一代和下一代之间做任何假设,管道,一切都可能完全不同。汇编语言的禅宗迈克尔·阿布拉什(MichaelAbrash)用过的副本随时可用。其中一个主题是,无论你认为自己多么了解正在发生的事情,你仍然需要计时、实验和验证。另外,尝试一些疯狂的事情,也花些时间,弄清楚为什么答案应该是慢的,答案会快得多。您需要在所有缓存关闭、i缓存打开和i/d打开、mmu打开和关闭等情况下对其计时。@BitBank:
    mul
    ldr
    等指令只需要一个或两个周期,如果您不尝试在之后直接使用结果。即使指令看起来已经完成,尝试使用结果直到几个时钟周期之后将导致管道暂停(这就是为什么要交错独立的指令)。阅读参考手册中的计时或检查计算器,你就会明白我在说什么。如果以最佳方式交错指令,性能可以得到很大提高。
    bl        foo
    mov       r4, r4, ASR #14
    str       r4, [r5]