Wie löse ich das 32-Byte-Alignment-Problem für AVX-Lade- / Speichervorgänge?

Ich habe ein Ausrichtungsproblem bei der Verwendung vonymm registriert, mit ein paar Codefragmenten, die mir in Ordnung erscheinen. Hier ist ein minimales Arbeitsbeispiel:

#include <iostream> 
#include <immintrin.h>

inline void ones(float *a)
{
     __m256 out_aligned = _mm256_set1_ps(1.0f);
     _mm256_store_ps(a,out_aligned);
}

int main()
{
     size_t ss = 8;
     float *a = new float[ss];
     ones(a);

     delete [] a;

     std::cout << "All Good!" << std::endl;
     return 0;
}

Bestimmt,sizeof(float) ist4 auf meiner Architektur Intel (R) Xeon (R) CPU E5-2650 v2 @ 2.60GHz) und ich kompiliere mitgcc using-O3 -march=native Flaggen. Natürlich verschwindet der Fehler mit einem nicht ausgerichteten Speicherzugriff, d. H. Durch Angabe von _mm256_storeu_ps. Ich habe dieses Problem auch nicht aufxmm -Register, d. h.

inline void ones_sse(float *a)
{
     __m128 out_aligned = _mm_set1_ps(1.0f);
     _mm_store_ps(a,out_aligned);
}

Mache ich irgendetwas Dummes? Was ist die Umgehung dafür?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage