为什么不使用融合乘加运算?
Why fused multiply add operation is not used?
我正在使用 riscv-gcc 来编译这个简单的 C 程序。
int main()
{
float a, b, c, d;
a = 4.0;
b = 3;
c = 5.3;
d = a*b + c;
return 0;
}
我希望 riscv-gcc 生成浮点多次加法 (fma) 指令来计算 d。但是 gcc 生成的是浮点乘法指令和浮点加法指令。
这是 risv-gcc 生成的程序的程序集:
main:
addi sp,sp,-32
sd s0,24(sp)
addi s0,sp,32
lui a5,%hi(.LC0)
flw fa5,%lo(.LC0)(a5)
fsw fa5,-20(s0)
lui a5,%hi(.LC1)
flw fa5,%lo(.LC1)(a5)
fsw fa5,-24(s0)
lui a5,%hi(.LC2)
flw fa5,%lo(.LC2)(a5)
fsw fa5,-28(s0)
flw fa4,-20(s0)
flw fa5,-24(s0)
fmul.s fa5,fa4,fa5
flw fa4,-28(s0)
fadd.s fa5,fa4,fa5
fsw fa5,-32(s0)
li a5,0
mv a0,a5
ld s0,24(sp)
addi sp,sp,32
jr ra
.size main, .-main
.section .rodata
.align 2
.LC0:
.word 1082130432
.align 2
.LC1:
.word 1077936128
.align 2
.LC2:
.word 1084856730
.ident "GCC: (GNU) 8.2.0"
如何强制 riscv-gcc 使用 fma 指令?
您正在编译时未进行优化。
float fma(float a, float b, float c)
{
return a*b + c;
}
使用-O3:
fma(float, float, float):
fmadd.s fa0,fa0,fa1,fa2
ret
我正在使用 riscv-gcc 来编译这个简单的 C 程序。
int main()
{
float a, b, c, d;
a = 4.0;
b = 3;
c = 5.3;
d = a*b + c;
return 0;
}
我希望 riscv-gcc 生成浮点多次加法 (fma) 指令来计算 d。但是 gcc 生成的是浮点乘法指令和浮点加法指令。
这是 risv-gcc 生成的程序的程序集:
main:
addi sp,sp,-32
sd s0,24(sp)
addi s0,sp,32
lui a5,%hi(.LC0)
flw fa5,%lo(.LC0)(a5)
fsw fa5,-20(s0)
lui a5,%hi(.LC1)
flw fa5,%lo(.LC1)(a5)
fsw fa5,-24(s0)
lui a5,%hi(.LC2)
flw fa5,%lo(.LC2)(a5)
fsw fa5,-28(s0)
flw fa4,-20(s0)
flw fa5,-24(s0)
fmul.s fa5,fa4,fa5
flw fa4,-28(s0)
fadd.s fa5,fa4,fa5
fsw fa5,-32(s0)
li a5,0
mv a0,a5
ld s0,24(sp)
addi sp,sp,32
jr ra
.size main, .-main
.section .rodata
.align 2
.LC0:
.word 1082130432
.align 2
.LC1:
.word 1077936128
.align 2
.LC2:
.word 1084856730
.ident "GCC: (GNU) 8.2.0"
如何强制 riscv-gcc 使用 fma 指令?
您正在编译时未进行优化。
float fma(float a, float b, float c)
{
return a*b + c;
}
使用-O3:
fma(float, float, float):
fmadd.s fa0,fa0,fa1,fa2
ret