Aşağıdaki soru cevaplar eski ancak, ilgili ve kullanıcı gelen açıklama edilir Marc Glisse yeterince ele olabilir bu soruna 17 C ++ yana yeni yaklaşımlar olduğunu öne sürüldü.
Hala tüm verilere erişirken, SIMD için düzgün çalışan hizalanmış bellek almaya çalışıyorum.
Intel'de, kayan bir tür vektörü oluşturur ve boyutumu __m256
8 kat azaltırsam, bana hizalanmış bellek verir.
Örneğin std::vector<__m256> mvec_a((N*M)/8);
Biraz hacky bir şekilde, vektör öğeleri için yüzer işaretçiler belirtebilir, bu da bireysel şamandıra değerlerine erişmeme izin verir.
Bunun yerine, std::vector<float>
doğru hizalanmış ve böylece __m256
segfaulting olmadan diğer SIMD tiplerine yüklenebilir ve tercih ederim .
Align_alloc içine bakıyordum .
Bu bana doğru hizalanmış bir C stili dizi verebilir:
auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
Ancak bunun için nasıl yapılacağından emin değilim std::vector<float>
. std::vector<float>
Sahipliğini vermek marr_a
mümkün görünmüyor .
Özel bir ayırıcı yazmam gerektiğine dair bazı öneriler gördüm , ancak bu çok fazla iş gibi görünüyor ve belki de modern C ++ ile daha iyi bir yol var mı?
_mm256_loadu_ps(&vec[i])
. Varsayılan ayar seçenekleri ile, GCC notu o rağmen ( böler 256 bit yükler / mağaza-garanti hizalanmış vmovups xmm / vinsertf128 içine. Yani olup kullanmanın bir avantaj_mm256_load
üzerindeloadu
önemsediğiniz eğer nasıl GCC üzerinde kod derlenir birisi unutuyor eğer kullanmak-mtune=...
veya-march=
seçenekleri).