0Pricing
C++ Academy · Lezione

Layout dei dati ottimizzato per la cache

Progetti strutture of arrays e disponga i dati per favorire la località della cache

Layout dei dati ottimizzato per la cache è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

La gerarchia della memoria

Le CPU dispongono di più livelli di cache (L1, L2, L3), molto più veloci della memoria principale. Il codice ottimizzato per la cache mantiene i dati utilizzati più spesso vicino alla CPU.

Linee di cache

La memoria viene recuperata in linee di cache, in genere di 64 byte. La lettura di un byte carica l’intera linea. Sfrutti questo comportamento a Suo vantaggio.

Località dei riferimenti

Due proprietà importanti:

  • Località spaziale: utilizzo a breve di memoria vicina
  • Località temporale: riutilizzo a breve della stessa memoria

Contiguo vs collegato

I vector memorizzano i dati in modo contiguo, quindi iterarli è vantaggioso per la cache. Le liste collegate disperdono la memoria, causando un cache miss a ogni passaggio.

// Cache friendly
std::vector<int> v(1000);
for (auto& x : v) ++x;

// Cache UNfriendly
std::list<int> l(1000);
for (auto& x : l) ++x;

AoS vs SoA

Due disposizioni per gli array di record:

  • AoS (Array of Structs): naturale, ma iterare un solo campo coinvolge tutti i campi
  • SoA (Struct of Arrays): migliore quando la maggior parte dei cicli utilizza solo alcuni campi
// AoS
struct Particle { float x, y, z, vx, vy, vz; };
std::vector<Particle> particles;

// SoA
struct Particles {
    std::vector<float> x, y, z, vx, vy, vz;
};

Packing delle struct

Ordini i membri dal più grande al più piccolo per ridurre al minimo il padding. Strumenti come pahole mostrano la disposizione effettiva.

struct Bad  { char c; double d; char c2; };  // padded
struct Good { double d; char c; char c2; };  // smaller

False sharing

Quando due thread scrivono su variabili diverse che si trovano nella stessa linea di cache, invalidano le rispettive cache. L’impatto sulle prestazioni è catastrofico. Aggiunga padding fino a 64 byte.

struct alignas(64) Counter {
    std::atomic<int> value;
};

Separazione dei dati hot e cold

Separi i dati hot, a cui si accede frequentemente, dai dati cold, a cui si accede raramente, inserendoli in strutture diverse. La CPU memorizza nella cache solo la parte hot.

Preallocazione

Preallochi i vector con reserve per evitare riallocazioni ripetute. Ogni riallocazione copia tutti gli elementi: è costosa e compromette la cache.

L’accesso sequenziale è vantaggioso

Le scansioni lineari degli array sono le più veloci. Il prefetcher hardware prevede e carica automaticamente le linee di cache successive.

Eviti l’indirezione

I puntatori obbligano la CPU a seguire le dipendenze. std::vector<T*> è più lento di std::vector<T> durante l’attraversamento. Utilizzi l’indirezione solo quando è necessaria.

Esegua il profiling prima di ottimizzare

«Ottimizzato per la cache» è una linea guida, non una regola. Misuri con strumenti come perf o VTune per capire dove i cache miss hanno un impatto, quindi ottimizzi.

Verifica rapida

Perché iterare un std::vector è in genere molto più veloce che iterare un std::list della stessa dimensione?

Riepilogo

Le CPU moderne dipendono dalle cache. Preferisca i container contigui, utilizzi SoA per accedere selettivamente ai campi, impacchetti le struct, eviti il false sharing ed esegua il profiling dei cache miss con perf o VTune per individuare i punti critici.

Domande Frequenti

La lezione «Layout dei dati ottimizzato per la cache» è gratuita?

Sì — il testo completo di «Layout dei dati ottimizzato per la cache» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Layout dei dati ottimizzato per la cache»?

Progetti strutture of arrays e disponga i dati per favorire la località della cache Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Layout dei dati ottimizzato per la cache»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Layout dei dati ottimizzato per la cache
  2. Predizione dei branch e cicli hot
  3. Profilazione con perf, VTune e Sanitizer
  4. Microbenchmark con Google Benchmark
← Torna a C++ Academy