0Pricing
C++ Academy · Pelajaran

Tata Letak Data yang Ramah Cache

Rancang array of structures dan kemas data untuk lokalitas cache

Tata Letak Data yang Ramah Cache adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.

Hierarki Memori

CPU memiliki beberapa tingkat cache (L1, L2, L3) yang jauh lebih cepat daripada memori utama. Kode yang ramah cache menjaga data yang sering digunakan tetap dekat dengan CPU.

Baris Cache

Memori diambil dalam baris cache—biasanya berukuran 64 byte. Membaca satu byte akan memuat seluruh baris. Manfaatkan hal ini.

Lokalitas Referensi

Dua sifat penting:

  • Lokalitas spasial—menggunakan memori di dekatnya dalam waktu dekat
  • Lokalitas temporal—menggunakan kembali memori yang sama dalam waktu dekat

Kontigu vs Tertaut

Vektor menyimpan data secara berurutan—melakukan iterasi pada vektor ramah cache. Daftar tertaut menyebarkan memori, sehingga cache gagal pada setiap langkah.

// 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

Dua tata letak untuk larik berisi record:

  • AoS (Larik Struktur)—alami, tetapi melakukan iterasi pada satu bidang menyentuh semua bidang
  • SoA (Struktur Larik)—lebih baik ketika sebagian besar perulangan hanya menggunakan beberapa bidang
// 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;
};

Penataan Struktur

Urutkan anggota dari yang terbesar ke yang terkecil untuk meminimalkan ruang pengisi. Alat seperti pahole menampilkan tata letak sebenarnya.

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

Berbagi Semu

Dua utas yang menulis ke variabel berbeda pada baris cache yang sama akan saling membatalkan cache. Dampaknya sangat buruk bagi kinerja. Tambahkan ruang pengisi hingga 64 byte.

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

Pemisahan Data yang Sering dan Jarang Diakses

Pisahkan data yang sering diakses dari data yang jarang diakses ke dalam struktur yang berbeda. CPU hanya menyimpan bagian yang sering diakses di cache.

Pra-Alokasi

Lakukan pra-alokasi vektor dengan reserve untuk menghindari realokasi berulang. Setiap realokasi menyalin semua elemen—mahal dan menghilangkan manfaat cache.

Akses Berurutan Lebih Cepat

Pemindaian linear pada larik adalah yang tercepat. Prapengambil perangkat keras memprediksi dan memuat baris cache berikutnya secara otomatis.

Hindari Pengalamatan Tidak Langsung

Penunjuk memaksa CPU mengikuti dependensi. std::vector<T*> lebih lambat daripada std::vector<T> saat ditelusuri. Gunakan pengalamatan tidak langsung hanya jika diperlukan.

Buat Profil Sebelum Mengoptimalkan

"Ramah cache" adalah panduan, bukan aturan. Lakukan pengukuran dengan alat seperti perf atau VTune untuk melihat bagian yang terdampak oleh kegagalan cache—lalu optimalkan.

Pemeriksaan Singkat

Mengapa melakukan iterasi pada std::vector biasanya jauh lebih cepat daripada melakukan iterasi pada std::list dengan ukuran yang sama?

Ringkasan

CPU modern bergantung pada cache. Utamakan wadah yang menyimpan data secara berurutan, gunakan SoA untuk akses bidang secara selektif, tata struktur dengan rapi, hindari berbagi semu, dan buat profil kegagalan cache dengan perf atau VTune untuk menemukan titik panas.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Tata Letak Data yang Ramah Cache” gratis?

Ya — teks lengkap “Tata Letak Data yang Ramah Cache” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Tata Letak Data yang Ramah Cache”?

Rancang array of structures dan kemas data untuk lokalitas cache Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C++ Academy?

Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Tata Letak Data yang Ramah Cache” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Tata Letak Data yang Ramah Cache
  2. Prediksi Percabangan dan Perulangan Panas
  3. Pembuatan Profil dengan perf, vtune, dan Sanitizer
  4. Tolok Ukur Mikro dengan Google Benchmark
← Kembali ke C++ Academy