我发现在使用
-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
等是一些预计算的数组/常量。
加速似乎与缓存行问题无关,因为如果我使用 OpenMP 并行化外部 for 循环,我会获得相同的相对加速。
编辑:
我更正了伪代码:注意 cos
和 sin
具有相同的参数,这最终是加速的原因(请参见 gsg 的答案和评论)。
if
和for
语句的分支历史记录有没有发生变化? - Patricia Shanahanfloat
或double
(binary32和binary64操作)来说确实做到了预期。这并不意味着80位格式已被“弃用”,也不表示您说它已经弃用就是一个来源。 - Pascal Cuoq