gpt4 book ai didi

performance - 哪个指令序列对于将一个或另一个寄存器归零具有更好的性能?

转载 作者:行者123 更新时间:2023-12-05 02:38:54 26 4
gpt4 key购买 nike

教授给我布置了一项作业,其中一部分引发了一场关于无分支编程的对话。目标是将此 C 代码转换为 MIPS 汇编(假设 ab 位于寄存器 $s0$s1,分别)使用 slt 指令。

if (a <= b)
a = 0;
else
b = 0;

预期的响应是:

        slt $t0,$s1,$s0    ; Set on less-than (if $s1 < $s0 then set $t0 to 1, else 0).
bne $t0,$0,else ; Branch on not-equal (jump to `else` if $t0 != $0)
add $s0,$0,$0 ; $s0 = $0 + $0, aka $s0 = $0 * 2
j done ; Unconditional jump to `done`
else: sub $s1,$0,$0 ; $s1 = $0 - $0, aka `$s1 = 0`
done:

然而,我提交了以下无分支方案(据我了解,无分支编程在性能方面是首选):

        slt  $t0,$s1,$s0    ; Set on less-than (if $s1 < $s0 then set $t0 to 1, else 0).
mul $s0,$s0,$t0 ; $s0 = $s0 * $t0 (truncated to 32 bits)
xori $t0,$t0,0x1 ; $t0 = XOR( $t0, 1 )
mul $s1,$s1,$t0 ; $s1 = $s1 * $t0 (truncated to 32 bits)

我知道这是一个小案例,其中任何性能提升都可以忽略不计,但我想知道我使用的思路是否正确。

我的教授指出 mul 指令很复杂(阅读:硬件密集型),因此(如果在硬件中实现)通过使用较少的指令获得的任何性能提升最终都会由于这种复杂性而丢失.这是真的吗?

最佳答案

这不可能说,因为您没有指定 MIPS 实现,多年来已经有很多。

但是,乘法可能更昂贵,尤其是在较早的 MIPS 处理器上,其中每个乘法可能需要两个(或三个)周期。

无条件控制流的另一种方法是从 slt 中减去一个并使用 and 而不是 mul,之后 xor 与 -1。这将比 mul 版本多花费一条指令,所以不清楚哪个更快,但确实涉及“更简单”的指令。

    slt  $t0,$s1,$s0    ; Set on less-than (if $s1 < $s0 then set $t0 to 1, else 0).
subi $t0, $t0, 1 ; 1/true->0, 0/false->-1
and $s1,$s1,$t0 ; $s1 &= $t0-1 mask is either 0 or -1
xori $t0,$t0,-1 ; $t0 = ~ $t0
and $s0,$s0,$t0 ; $s1 &= ~ (t0-1) mask is either -1 or 0

这是否比条件逻辑更快取决于处理器、和数据集,假设这是在循环中(如果在某个级别不在循环中,那么问题是 lessor重要性)。

数据集将决定分支预测是否有效。每次分支预测错误,都会花费几个周期(当然取决于处理器实现)。如果分支预测 100% 有效,那么条件逻辑可能是最好的。但是,如果数据集违背分支预测,则每次执行可能会产生几个周期的开销,因此无条件逻辑可能是最好的。

如果处理器有一些额外的操作码,这样就不需要减 1,那么 else 部分也可以取反,那就太好了。在这种假设情况下,我们将:

slt $t0, $s1, $s0
sameIfTrueOrZero $s0, $s0, $t0 # $s0 = ($t0 ? $s0 : 0)
sameIfFalseOrZero $s1, $s1, $t0 # $s1 = ($t0 ? 0 : $s1)

这些将是硬件实现的简单指令——它们不会对 ALU 或指令和操作数编码造成负担。


一些更高级的处理器可能能够在上述某些方面融合操作或双重问题,从而降低执行成本。

关于performance - 哪个指令序列对于将一个或另一个寄存器归零具有更好的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69384991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com