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.

AoSSoA
Tek nesneye tüm alanlarla erişimİyiDağınık
Bir alan üzerinde toplu işlemCache israfıÇok verimli, SIMD dostu
Kod okunabilirliğiDoğalDaha zahmetli

Diğer cache dostu teknikler:

  • std::list veya pointer zincirleri yerine std::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.

  1. Oyun motorlarında neden custom memory allocator kullanılır? Linear (arena), pool ve stack allocator nasıl çalışır?ZorUnreal & C++Game Dev
  2. C++'ta move semantics nedir? Aşağıdaki kodda hangi constructor'lar çağrılır?ZorUnreal & C++Game Dev
  3. C++'ta virtual fonksiyonlar ve vtable nasıl çalışır? Destructor neden virtual olmalıdır?OrtaUnreal & C++Game Dev
  4. Unreal'da replication nasıl çalışır? Replicated property, RepNotify ve RPC türleri arasındaki fark nedir?ZorUnreal & C++Game Dev
  5. Unreal'ın Gameplay Framework'ünde GameMode, GameState, PlayerController, PlayerState ve Pawn'ın rolleri nelerdir?OrtaUnreal & C++Game Dev
  6. TSharedPtr, TUniquePtr, TWeakPtr ve TWeakObjectPtr arasındaki farklar nelerdir?OrtaUnreal & C++Game Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle