Como resolver o problema de alinhamento de 32 bytes nas operações de carregamento / armazenamento do AVX?

Estou tendo problemas de alinhamento ao usarymm registra, com alguns trechos de código que me parecem bons. Aqui está um exemplo de trabalho mínimo:

#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;
}

Certamente,sizeof(float) é4 na minha arquitetura (CPU Intel (R) Xeon (E5) E5-2650 v2 a 2.60GHz) e eu estou compilando comgcc usando-O3 -march=native bandeiras. Obviamente, o erro desaparece com o acesso desalinhado à memória, ou seja, especificando_mm256_storeu_ps. Eu também não tenho esse problema emxmm registros, ou seja,

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

Estou fazendo algo tolo? qual é a solução alternativa para isso?

questionAnswers(3)

yourAnswerToTheQuestion