La seguente domanda è collegata, tuttavia le risposte sono vecchie e il commento dell'utente Marc Glisse suggerisce che ci sono nuovi approcci dal C ++ 17 a questo problema che potrebbero non essere adeguatamente discussi.
Sto cercando di far funzionare correttamente la memoria allineata per SIMD, pur avendo accesso a tutti i dati.
Su Intel, se creo un vettore float di tipo __m256
e riduco le mie dimensioni di un fattore 8, mi dà memoria allineata.
Per esempio std::vector<__m256> mvec_a((N*M)/8);
In un modo un po 'confuso, posso lanciare puntatori su elementi vettoriali da float, il che mi consente di accedere a singoli valori float.
Preferirei invece avere un std::vector<float>
allineato correttamente, e quindi può essere caricato in __m256
e altri tipi SIMD senza segfaulting.
Ho esaminato align_alloc .
Questo può darmi un array in stile C che è correttamente allineato:
auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
Tuttavia, non sono sicuro di come farlo std::vector<float>
. Dare la std::vector<float>
proprietà di marr_a
non sembra essere possibile .
Ho visto alcuni suggerimenti che dovrei scrivere un allocatore personalizzato , ma questo sembra un sacco di lavoro, e forse con il C ++ moderno c'è un modo migliore?
_mm256_loadu_ps(&vec[i])
. (Anche se nota che, con opzioni di ottimizzazione di default, GCC divide non-garantito-allineata a 256 bit carichi / negozi in vmovups XMM / vinsertf128. Quindi non v'è un vantaggio di utilizzare_mm256_load
più diloadu
se si importa di come le compilazioni di codice su GCC se dimentica qualcuno a uso-mtune=...
o-march=
opzioni.)