Как решить проблему 32-байтового выравнивания для операций загрузки / сохранения AVX?

У меня проблема с выравниванием при использованииymm регистры, с некоторыми фрагментами кода, которые мне кажутся нормальными. Вот минимальный рабочий пример:

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

Конечно,sizeof(float) является4 по моей архитектуре (Intel (R) Xeon® CPU E5-2650 v2 с частотой 2,60 ГГц) и я собираю сgcc с помощью-O3 -march=native флаги. Конечно, ошибка исчезает с доступом к памяти без выравнивания, т.е._mm256_storeu_ps, У меня тоже нет этой проблемы наxmm регистры, т.е.

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

Я делаю что-нибудь глупое? какой обходной путь для этого?

Ответы на вопрос(3)

Ваш ответ на вопрос