A pergunta a seguir está relacionada, no entanto, as respostas são antigas e os comentários do usuário Marc Glisse sugerem que existem novas abordagens desde o C ++ 17 para esse problema que talvez não sejam discutidas adequadamente.
Estou tentando fazer com que a memória alinhada funcione corretamente para o SIMD, enquanto ainda tenho acesso a todos os dados.
Na Intel, se eu criar um vetor flutuante do tipo __m256
e reduzir meu tamanho em um fator de 8, isso me dará uma memória alinhada.
Por exemplo std::vector<__m256> mvec_a((N*M)/8);
De uma maneira um pouco invasiva, posso converter ponteiros em elementos vetoriais para flutuar, o que me permite acessar valores de flutuação individuais.
Em vez disso, eu preferiria ter um std::vector<float>
que esteja alinhado corretamente e, portanto, possa ser carregado em __m256
e outros tipos de SIMD sem segfaulting.
Eu estive procurando em align_alloc .
Isso pode me dar uma matriz de estilo C que está alinhada corretamente:
auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
No entanto, não tenho certeza de como fazer isso std::vector<float>
. Dar a std::vector<float>
propriedade de marr_a
não parece ser possível .
Eu já vi algumas sugestões de que eu deveria escrever um alocador personalizado , mas isso parece dar muito trabalho, e talvez com o C ++ moderno haja uma maneira melhor?
_mm256_loadu_ps(&vec[i])
. (Embora nota que, com opções de ajuste padrão, GCC divide não-garantida alinhado 256 bits cargas / lojas em vmovups XMM / vinsertf128. Portanto, não é uma vantagem de usar_mm256_load
maisloadu
se você se preocupa sobre como seus compila o código no GCC se alguém se esquece de uso-mtune=...
ou-march=
opções.)