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; }; // smallerFalse 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
- Layout dei dati ottimizzato per la cache
- Predizione dei branch e cicli hot
- Profilazione con perf, VTune e Sanitizer
- Microbenchmark con Google Benchmark