Cache-friendly veri yapısı ne demektir? Array of Structs (AoS) ile Struct of Arrays (SoA) farkı nedir?
Cevap
CPU bellekten veriyi cache line (genelde 64 byte) birimleriyle çeker. RAM erişimi L1 cache'ten yüzlerce kat yavaş olabildiği için, sık işlenen verinin bellekte ardışık ve sadece gereken alanlardan oluşması büyük performans farkı yaratır.
AoS vs SoA
// AoS: her parçacık tüm alanlarıyla yan yana
struct Particle { Vec3 pos; Vec3 vel; Color color; float life; char name[32]; };
std::vector<Particle> particles;
// SoA: her alan kendi dizisinde
struct Particles {
std::vector<Vec3> pos;
std::vector<Vec3> vel;
std::vector<float> life;
};
void Integrate(Particles& p, float dt) {
for (size_t i = 0; i < p.pos.size(); ++i)
p.pos[i] += p.vel[i] * dt; // sadece pos ve vel cache'e gelir
}AoS'ta pozisyon güncellerken color ve name de cache'e taşınır ve bant genişliği israf edilir. SoA'da her cache line tamamen işe yarar veriyle doludur ve SIMD vektörleştirmesi kolaylaşır.
| AoS | SoA | |
|---|---|---|
| Tek nesneye tüm alanlarla erişim | İyi | Dağınık |
| Bir alan üzerinde toplu işlem | Cache israfı | Çok verimli, SIMD dostu |
| Kod okunabilirliği | Doğal | Daha zahmetli |
Diğer cache dostu teknikler:
std::listveya pointer zincirleri yerinestd::vector/TArray(pointer chasing'den kaçınmak).- Hot/cold splitting: sık kullanılan alanları ayrı struct'a almak.
- Silmede swap-and-pop ile diziyi sıkı tutmak.
- Struct alanlarını padding'i azaltacak şekilde sıralamak.
- Multi-thread'de false sharing'den kaçınmak (farklı thread'lerin yazdığı veriler aynı cache line'da olmamalı).
Unity DOTS/ECS ve Unreal Mass Entity bu prensip üzerine kuruludur. Kanıt için mutlaka profiler (VTune, Superluminal, Unreal Insights) ile ölçün.
İlgili Unreal & C++ soruları
- Oyun motorlarında neden custom memory allocator kullanılır? Linear (arena), pool ve stack allocator nasıl çalışır?
- C++'ta move semantics nedir? Aşağıdaki kodda hangi constructor'lar çağrılır?
- C++'ta virtual fonksiyonlar ve vtable nasıl çalışır? Destructor neden virtual olmalıdır?
- Unreal'da replication nasıl çalışır? Replicated property, RepNotify ve RPC türleri arasındaki fark nedir?
- Unreal'ın Gameplay Framework'ünde GameMode, GameState, PlayerController, PlayerState ve Pawn'ın rolleri nelerdir?
- TSharedPtr, TUniquePtr, TWeakPtr ve TWeakObjectPtr arasındaki farklar nelerdir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.