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?