【发布时间】:2013-12-16 02:38:34
【问题描述】:
在我使用-funsafe-math-optimizations 进行计算时,我始终发现使用long double 数据类型的速度大约是使用double 的两倍。我想对此有所了解,因为长期以来不推荐使用 80 位格式,或者我可能正在使用 double 数据类型做一些非常愚蠢的事情。编译器是 g++ 4.8.2,目标是 x86_64(所以如果我不使用 long double,gcc 会更喜欢 SSE2)。
我的代码或多或少是这样的(伪代码):
//x is an array of floating point numbers
for i -> x.size
accumulator = 0
for k -> kmax
accumulator += A[k]*(B[k]*cos(C*k*x[i]) - D[k]*sin(C*k*x[i]));
x[i] += F*accumulator;
if(x[i] >= 1/2) x[i] -= integer(x[i]+1/2);
else if(x[i] < -1/2) x[i] -= integer(x[i]-1/2);
A、B、.. 是一些预先计算的数组/常量。
加速似乎与缓存线问题无关,因为如果我将外部 for 循环与 OpenMP 并行化,我将获得相同的相对加速。
编辑:
我更正了伪代码:请注意 cos 和 sin 具有相同的参数,这最终是加速的原因(参见 gsg 的答案和 cmets)。
【问题讨论】:
-
if和for语句的分支历史是否有任何变化? -
这两个版本的汇编输出是什么?
-
当使用
long double时,你是使用cosl()还是cos()? -
“80 位格式已被弃用很久”的来源是什么?
-
@PatriciaShanahan 我不确定我理解你的意思。我不使用任何基于配置文件的优化,并且 if/elseif 的平均使用次数不会改变。
标签: c gcc floating-point compiler-optimization