2
这里有一个是给我的悲痛测试程序:SSE不匹配序列浮此外
#include <xmmintrin.h>
#include <stdio.h>
inline float
_mm_hadd_ps(const __m128 v)
{
const __m128
x = _mm_add_ps(v, _mm_movehl_ps(v, v)),
xx = _mm_add_ss(x, _mm_shuffle_ps(x, x, 1));
float __attribute__((aligned(16))) s;
_mm_store_ss(&s, xx);
return s;
}
int
main(void)
{
const float __attribute__((aligned(16))) d[] = {
4.0763611794e+00, 1.1881252751e-02, 4.9195003510e+00, 0.0000000000e+00
};
const float x = _mm_hadd_ps(_mm_load_ps(d));
const float y = d[0] + d[1] + d[2] + d[3];
printf("diff: %.10f\n", x - y);
return 0;
}
我与它编译如下:
gcc -Wall -msse2 -mfpmath=sse -O0 -g -ggdb sse.c
,我得到的输出从:
diff: -0.0000009537
我知道扩展精度算术的问题,因此mfpmath=sse
。查看汇编代码,串行添加确实通过addss
完成,最后用subss
进行减法。
在这一点上,我很难解释这种差异来自哪里。如果有人能够说明这种情况,我会非常感激。
如果它有什么区别,我使用的是GCC 4.3.4。 (编辑:在AMD Opteron 2218 + Gentoo Linux上)
看起来你是对的。将总和改为'(d [0] + d [2])+(d [1] + d [3])'将差值减小到零。 – 2011-05-02 17:05:55