AoS ve SoA - AoS and SoA
Olarak işlem , Yapılar (AOS) dizisi , dizileri (SoA) 'deki Yapı ve Dizileri (AoSoA) Yapılarının dizi bir sırasını değiştirmek için yollar zıt bakınız kayıtları içinde hafıza ile ilgili olarak, serpiştirme , ve ilgi SIMD ve SIMT programlama.
Dizilerin Yapısı
Dizilerin yapısı ( SoA ), bir kaydın (veya C programlama dilinde 'struct') öğelerini alan başına bir paralel diziye ayıran bir düzendir . Motivasyon, tek bir SIMD kaydı , muhtemelen geniş bir dahili veri yolu (örn. 128-bit ) tarafından aktarılan homojen verileri yükleyebildiğinden , çoğu komut seti mimarisinde paketlenmiş SIMD talimatlarıyla daha kolay manipülasyondur . Kaydın yalnızca belirli bir bölümüne ihtiyaç duyulursa, tek bir önbellek satırına daha fazla veri sığdırmak için yalnızca bu bölümlerin yinelenmesi gerekir. Dezavantajı, veriler arasında geçiş yaparken daha fazla önbellek yolu gerektirmesi ve verimsiz dizinlenmiş adreslemedir .
Örneğin, bir Dizi Yapısı kullanarak N noktayı 3B alanda depolamak için:
struct pointlist3D {
float x[N];
float y[N];
float z[N];
};
struct pointlist3D points;
float get_point_x(int i) { return points.x[i]; }
Yapı Dizisi
Yapı dizisi ( AoS ), farklı alanlar için verilerin serpiştirildiği zıt (ve daha geleneksel) düzendir. Bu genellikle daha sezgiseldir ve çoğu programlama dili tarafından doğrudan desteklenir .
Örneğin, bir Yapı Dizisi kullanarak N noktayı 3B alanda depolamak için:
struct point3D {
float x;
float y;
float z;
};
struct point3D points[N];
float get_point_x(int i) { return points[i].x; }
Dizi Yapıları Dizisi
Dizi Yapıları Dizisi ( AoSoA ) veya Döşemeli Yapı Dizisi , önceki düzenler arasında, farklı alanlara ilişkin verilerin, SIMD vektör boyutuna eşit boyutta karolar veya bloklar kullanılarak serpiştirildiği hibrit bir yaklaşımdır. Bu genellikle daha az sezgiseldir, ancak modern işlemcilerin önbellek konumu ve yükleme bağlantı noktası mimarilerine daha dost olurken, SoA yaklaşımının bellek verimini sağlayabilir.
Örneğin, SIMD kayıt genişliği 8 float (veya 8×32 = 256 bit) olan bir Dizi Yapıları Dizisi kullanarak N noktayı 3B alanda depolamak için:
struct point3Dx8 {
float x[8];
float y[8];
float z[8];
};
struct point3Dx8 points[(N+7)/8];
float get_point_x(int i) { return points[i/8].x[i%8]; }
Gerçek SIMD kayıt genişliğine bağlı olarak farklı bir genişlik gerekebilir. İç diziler, bu float32x8tür desteğe sahip diller gibi SIMD türleri ile değiştirilebilir .
alternatifler
Bir yapının bazı alt kümelerini (her bir alan yerine) paralel bir diziye bölmek mümkündür - ve bu , programda farklı zamanlarda farklı alan parçaları kullanılıyorsa, referansın yerini gerçekten iyileştirebilir (bkz. veri yönelimli tasarım ).
Bazı SIMD mimarileri , SoA formatından homojen verileri yüklemek için adım adım yükleme/depolama talimatları sağlar. Bazı Hücre kitaplıklarında kullanılan başka bir seçenek de, kaynakları kayıtlara yüklerken AoS formatındaki verileri serpiştirmek ve sonuçları yazarken serpiştirmektir ( permutes'ın süperskalar sayısı tarafından kolaylaştırılır ). Bazı vektör matematik kitaplıkları , dört şeritten daha geniş SIMD birimlerine ölçeklenmese de, ilgili veri yolunu ve talimatları kullanmak için kayan nokta 4D vektörlerini SIMD kaydı ile hizalar ve yine de programcıya kolaylık sağlar.
4B vektörler
AoS ve SoA, dört şeritli SIMD donanımına sahip makinelerde 3D veya 4D vektör verileri düşünüldüğünde bir seçenek sunar. SIMD ISA'lar genellikle homojen veriler için tasarlanmıştır, ancak bazıları nokta çarpım talimatı ve ek izinler sağlayarak AoS vakasının ele alınmasını kolaylaştırır.
Çoğu GPU donanımı, 4D komutlarından skaler SIMT boru hatlarına geçmiş olsa da, AoS yerine SoA kullanan modern hesaplama çekirdekleri , bellek birleştirme nedeniyle hala daha iyi performans sağlayabilir.
Yazılım desteği
Çoğu dil, kayıtları ve çeşitli dizi soyut veri türlerini birleştirerek AoS biçimini daha doğal bir şekilde destekler .
SoA çoğunlukla, veri odaklı bir tasarımı desteklemek için kullanılan dillerde, kitaplıklarda veya metaprogramlama araçlarında bulunur . Örnekler şunları içerir:
- Deneysel Jai programlama dilinin SIMD odaklı özellikleri, dil düzeyinde SoA desteği sağlamaya yönelik yeni bir girişimdir.
- "Data çerçeveleri" R ve Python'un numpy ve Pandas, Julia 'nın
StructsOfArrays.jlAOS gibi erişim SOA için arayüzleri örnekleridir; - Datadraw ve X Macro tekniği dahil olmak üzere C dili için kod üreteçleri .
AoSoA'nın otomatik olarak oluşturulması daha karmaşıktır. Metaprogramlama içinde AoSoA bir örneği bulunan LANL C ++ ile yazılmış sitesindeki Cabana kütüphane; varsayılan olarak 16 şeritli bir vektör genişliğini varsayar.