【发布时间】:2017-06-19 09:37:30
【问题描述】:
考虑这个简单的代码:
#include <complex.h>
complex double f(complex double x, complex double y) {
return x/y;
}
在带有 -O3 -march=core-avx2 -ffast-math 的 gcc 7.1 中,您会得到:
f:
vmulsd xmm4, xmm1, xmm3
vmovapd xmm6, xmm0
vmulsd xmm5, xmm3, xmm3
vmulsd xmm6, xmm6, xmm3
vfmadd231sd xmm4, xmm0, xmm2
vfmadd231sd xmm5, xmm2, xmm2
vfmsub132sd xmm1, xmm6, xmm2
vdivsd xmm0, xmm4, xmm5
vdivsd xmm1, xmm1, xmm5
ret
这是有道理的,而且很容易理解。然而,英特尔 C 编译器提供:
f:
fld1 #3.12
vmovsd QWORD PTR [-24+rsp], xmm2 #3.12
fld QWORD PTR [-24+rsp] #3.12
vmovsd QWORD PTR [-24+rsp], xmm3 #3.12
fld st(0) #3.12
fmul st, st(1) #3.12
fld QWORD PTR [-24+rsp] #3.12
fld st(0) #3.12
fmul st, st(1) #3.12
vmovsd QWORD PTR [-24+rsp], xmm0 #3.12
faddp st(2), st #3.12
fxch st(1) #3.12
fdivp st(3), st #3.12
fld QWORD PTR [-24+rsp] #3.12
vmovsd QWORD PTR [-24+rsp], xmm1 #3.12
fld st(0) #3.12
fmul st, st(3) #3.12
fxch st(1) #3.12
fmul st, st(2) #3.12
fld QWORD PTR [-24+rsp] #3.12
fld st(0) #3.12
fmulp st(4), st #3.12
fxch st(3) #3.12
faddp st(2), st #3.12
fxch st(1) #3.12
fmul st, st(4) #3.12
fstp QWORD PTR [-16+rsp] #3.12
fxch st(2) #3.12
fmulp st(1), st #3.12
vmovsd xmm0, QWORD PTR [-16+rsp] #3.12
fsubrp st(1), st #3.12
fmulp st(1), st #3.12
fstp QWORD PTR [-16+rsp] #3.12
vmovsd xmm1, QWORD PTR [-16+rsp] #3.12
ret
谁能解释它在做什么以及它是否是真的 比 gcc 的方法快吗?
我无法自己对代码进行基准测试,因为我没有 ICC。 ICC 程序集是使用https://godbolt.org/g/ZXZGy2 创建的。
【问题讨论】:
-
你不能自己做一个基准测试吗?调用函数一百万次,使用高精度计时器测量每个调用,然后取平均值。
-
为什么不问问编译器供应商?英特尔很乐意改进他们的编译器。
-
@Olaf 您的意思是联系他们要求他们执行基准测试以报告他们的组装是否比 gcc 快?我不确定他们会回答这个问题。
-
有趣的是,英特尔的代码中只有一个 fdivp,这可能是有益的,因为分割成本很高。
-
@felipa 完成,请参考我的回答。 ;-)
标签: gcc optimization icc