对齐我的sse程序无法正常工作

时间:2014-02-03 17:03:40

标签: alignment sse

我的小程序出现问题如下:

#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每四到五次正确的结果。 我检查了其他帖子,但没有找到一个好的解决方案。请帮忙〜!!非常感谢!!

1 个答案:

答案 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
$