ben şöyle bir yapıya sahiptir:En hızlı Olası Struct-of-Diziler Dizi-of-the Yapılar Dönüşüm
struct SoA
{
int arr1[COUNT];
int arr2[COUNT];
};
Ve böyle bakmak istiyorum:
struct AoS
{
int arr1_data;
int arr2_data;
};
std::vector<AoS> points;
olarak olabildiğince çabuk. Sipariş korunmalıdır.
tek tek her AoS
nesneyi oluşturup bunu yapmanın en hızlı şekilde geri iterek veya daha hızlı bir seçenek yoktur mı?
SoA before;
std::vector<AoS> after;
for (int i = 0; i < COUNT; i++)
points.push_back(AoS(after.arr1[i], after.arr2[i]));
StackOverflow'daki soruları ile ilgili SoA/AoS vardır, ama en hızlı olası dönüşüm biri ilgili bulamadı. Yapısal paketleme farklılıkları nedeniyle, verileri bir formattan diğerine kopyalamaktan kaçınmanın bir yolunu göremiyorum, ancak birisinin bana sadece verileri farklı şekilde referans göstermenin ve bir kopyadan kaçınmanın bir yolu olduğunu söyleyebilmeyi umuyorum. çözümlerde Kapalı
özellikle teşvik etti.
Bellekte farklı bir düzenlemeye sahip olduğundan, "verileri farklı şekilde referans" edebileceğinizi sanmıyorum. – immibis
Ve yine de onları eklemeniz/zorlamanız gerekecektir, aksi takdirde 'vektör'ünüz geçerli durumda olmaz. okuma veya doğrusal bellek yazma ve bu örnek modelin bozabilir çözümleyecek bir sürü yaparken farklı verilere başvurulması aslında bir kopyasını yaparak daha hızlı olmayabilir –
Not olduğunu ... RAM önbelleğe fazla cache sürü neden onların en etkili altındadır ve bu nedenle daha yavaş yürütme. (ya da belki de değil, ama önemli olan şey her iki yolu ölçmek ve sezgileriniz gerçekle eşleşmediğinde şaşırmaya hazır olmaktır) –