我的小程序出现问题如下:
#include <iostream>
#include <xmmintrin.h>
using namespace std;
int Main()
{
__m128 mm_sum;
__m128 mm_buf;
float array1[4] __attribute__ ((aligned(16)));
array1[0] = 1.1;
array1[1] = 2.1;
array1[2] = 3.1;
array1[3] = 4.1;
mm_buf = _mm_load_ps(array1);
mm_sum = _mm_add_ps(mm_sum, mm_buf);
float *p1 = new float[4];
_mm_store_ps(p1,mm_sum);
float Sum = p1[0]+p1[1]+p1[2]+p1[3];
cout<<"Sum= "<<Sum<<endl;
delete[] array1;
delete[] p1;
return 0;
}
我正在使用gcc 4.8.1。似乎“属性((aligned(16)))”无法正常工作,因为当我重复编译并运行程序时,它会突然给出一个奇数值,如-1.759e + 20每四到五次正确的结果。 我检查了其他帖子,但没有找到一个好的解决方案。请帮忙〜!!非常感谢!!
答案 0 :(得分:0)
你有问题:
float *p1 = new float[4];
_mm_store_ps(p1,mm_sum);
p1
不保证16字节对齐,因此_mm_store_ps
可能会失败。确保p1
对齐16字节,或使用_mm_storeu_ps
代替_mm_store_ps
。
你还有另一个问题:
delete[] array1;
array1
未通过new []
分配,因此会导致未定义的行为。
还需要初始化mm_sum
。
以下是您的代码的完整工作版本:
#include <iostream>
#include <xmmintrin.h>
using namespace std;
int main()
{
__m128 mm_sum = _mm_setzero_ps(); // <<< mm_sum needs to be initialised
__m128 mm_buf;
float array1[4] __attribute__ ((aligned(16)));
array1[0] = 1.1;
array1[1] = 2.1;
array1[2] = 3.1;
array1[3] = 4.1;
mm_buf = _mm_load_ps(array1);
mm_sum = _mm_add_ps(mm_sum, mm_buf);
float *p1 = new float[4];
_mm_storeu_ps(p1,mm_sum); // <<< use unaligned store as p1 is not aligned
float Sum = p1[0]+p1[1]+p1[2]+p1[3];
cout<<"Sum= "<<Sum<<endl;
delete[] p1;
// <<< NB: do NOT delete [] array1 !
return 0;
}
测试它:
$ g++ -Wall -msse3 so_storeu_ps.cpp && ./a.out
Sum= 10.4
$