C++ Academy · Pelajaran

Susun Atur Data Mesra Cache

Reka struktur tatasusunan dan padatkan data untuk setempat cache.

Pelajaran 1 daripada 414 langkah

Susun Atur Data Mesra Cache ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Hierarki Memori

CPU mempunyai berbilang aras cache (L1, L2, L3) yang jauh lebih pantas daripada memori utama. Kod yang mesra cache memastikan data yang kerap digunakan dekat dengan CPU.

Baris Cache

Memori diambil dalam baris cache — biasanya 64 bait. Membaca satu bait akan memuatkan seluruh baris. Gunakan sifat ini untuk kelebihan anda.

Kekalian Rujukan

Dua sifat penting:

  • Kekalian ruang — menggunakan memori berdekatan tidak lama kemudian
  • Kekalian masa — menggunakan semula memori yang sama tidak lama kemudian

Berjiran Berbanding Terpaut

Vektor menyimpan data secara berjiran — melaluinya secara lelaran adalah mesra cache. Senarai terpaut menyelerakkan memori, lalu mengosongkan cache 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 Berbanding SoA

Dua susun atur untuk tatasusunan rekod:

  • AoS (Tatasusunan Struktur) — semula jadi, tetapi mengiterasi satu medan menyentuh semua medan
  • SoA (Struktur Tatasusunan) — lebih baik apabila kebanyakan gelung hanya menggunakan sesetengah medan
// 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;
};

Pembungkusan Struktur

Susun ahli daripada yang terbesar kepada yang terkecil untuk meminimumkan pelapik. Alat seperti pahole menunjukkan susun atur sebenar.

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

Perkongsian Palsu

Dua bebenang yang menulis pada variabel berbeza dalam baris cache yang sama akan membatalkan cache satu sama lain. Hal ini membawa kesan buruk terhadap prestasi. Tambahkan pelapik sehingga 64 bait.

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

Pemisahan Data Panas dan Sejuk

Asingkan data panas (kerap diakses) daripada data sejuk (jarang diakses) ke dalam struktur yang berbeza. CPU hanya menyimpan bahagian panas dalam cache.

Peruntukan Awal

Peruntukkan vektor terlebih dahulu dengan reserve untuk mengelakkan peruntukan semula berulang. Setiap peruntukan semula menyalin semua elemen — mahal dan menyebabkan cache terjejas.

Akses Berjujukan Lebih Pantas

Imbasan linear melalui tatasusunan adalah yang terpantas. Prapengambil perkakasan meramal dan memuatkan baris cache seterusnya secara automatik.

Elakkan Pengalamatan Tidak Langsung

Penuding memaksa CPU menjejaki kebergantungan. std::vector<T*> lebih perlahan daripada std::vector<T> untuk traversal. Gunakan pengalamatan tidak langsung hanya apabila perlu.

Buat Pemprofilan Sebelum Mengoptimumkan

"Mesra cache" ialah panduan, bukan peraturan. Ukur dengan alat seperti perf atau VTune untuk melihat bahagian yang terjejas akibat cache terlepas — kemudian optimumkan.

Semakan Pantas

Mengapakah mengiterasi std::vector biasanya jauh lebih pantas daripada mengiterasi std::list yang mempunyai saiz sama?

Imbas Kembali

CPU moden bergantung pada cache. Utamakan bekas berjiran, gunakan SoA untuk akses medan terpilih, padatkan struktur, elakkan perkongsian palsu, dan buat pemprofilan terhadap cache terlepas dengan perf atau VTune untuk mencari titik panas.

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Susun Atur Data Mesra Cache” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Susun Atur Data Mesra Cache”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Susun Atur Data Mesra Cache”?

Reka struktur tatasusunan dan padatkan data untuk setempat cache. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Susun Atur Data Mesra Cache” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Susun Atur Data Mesra Cache
  2. Ramalan Percabangan dan Gelung Panas
  3. Pemprofilan dengan perf, vtune dan Sanitizers
  4. Penanda Aras Mikro dengan Google Benchmark
← Kembali ke C++ Academy