0Pricing
C++ Academy · Pelajaran

Prediksi Percabangan dan Perulangan Panas

Bantu CPU memprediksi percabangan dan tulis perulangan yang dapat dioptimalkan kompiler

Prediksi Percabangan dan Perulangan Panas adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.

Prediktor Percabangan

CPU modern memprediksi instruksi berikutnya sebelum instruksi sebelumnya selesai. Jika prediksinya salah, jalur pemrosesan terhenti—biayanya 10–20 siklus.

Percabangan yang Dapat Diprediksi

Percabangan yang hampir selalu mengambil satu arah (atau mengikuti pola yang jelas) dapat diprediksi dengan baik. Percabangan acak sangat buruk bagi kinerja.

Data Terurut Membantu

Melakukan iterasi pada data terurut dengan kondisi sering kali lebih cepat daripada pada data tak terurut karena prediktor mempelajari polanya.

// Often much faster on sorted data
std::sort(v.begin(), v.end());
int sum = 0;
for (int x : v) {
    if (x > 128) sum += x;
}

Kode Tanpa Percabangan

Ganti percabangan dengan operasi aritmetika jika memungkinkan. CPU mengevaluasi kedua jalur lalu memilih salah satunya tanpa percabangan.

// Branchy
int max(int a, int b) { return (a > b) ? a : b; }

// Branchless (often equivalent in machine code)
int max(int a, int b) { return a + (b - a) * (b > a); }

std::max sebagai Pilihan yang Lebih Baik

Kompilator modern sering menghasilkan kode tanpa percabangan secara otomatis. Tulis kode yang jelas dan biarkan pengoptimal bekerja—tetapi periksa hasil pembongkaran pada jalur yang sering dijalankan.

Petunjuk Kemungkinan dan Ketidakmungkinan

C++20 menambahkan [[likely]] dan [[unlikely]] untuk memberikan petunjuk kepada kompilator.

if (error_condition) [[unlikely]] {
    handle_error();
}

Pembukaan Gulungan Perulangan

Melakukan lebih banyak pekerjaan dalam setiap iterasi mengurangi frekuensi percabangan. Kompilator modern dapat melakukan pembukaan gulungan sendiri; gunakan #pragma unroll hanya jika pengukuran menunjukkan bahwa hal itu membantu.

Hindari Beban Kerja Campuran dalam Perulangan

Perulangan dengan dua kasus yang bergantian secara acak akan menggagalkan prediksi. Pisahkan menjadi dua perulangan (satu untuk setiap kasus) jika memungkinkan.

// Slow: random switching
for (auto& x : v) {
    if (x.type == A) process_A(x);
    else            process_B(x);
}

// Faster: partition first
std::partition(v.begin(), v.end(), [](auto& x) { return x.type == A; });
for (size_t i = 0; i < boundary; ++i) process_A(v[i]);
for (size_t i = boundary; i < v.size(); ++i) process_B(v[i]);

Inline pada Fungsi yang Sering Dipanggil

Overhead pemanggilan fungsi dapat menyamai isi fungsi dalam perulangan yang sering dijalankan. Petunjuk inline membantu; __attribute__((always_inline)) (GCC/Clang) lebih ketat.

Jangan Memercayai Intuisi

Kompilator dan CPU sangat cerdas. Lakukan pengukuran sebelum mengoptimalkan. Versi tanpa percabangan yang "jelas" mungkin lebih lambat daripada versi dengan percabangan setelah prediktor terlatih.

SIMD untuk Perulangan Lebar

Vektorisasi otomatis mengubah perulangan menjadi instruksi SIMD jika memungkinkan. Gunakan kode yang bersih, tipe sederhana, dan hindari dependensi data antariterasi.

Optimasi Berpanduan Profil (PGO)

Kompilasi, jalankan, kumpulkan data profil, lalu kompilasi ulang dengan petunjuk. Kompilator menggunakan data tersebut untuk membuat prediksi yang lebih baik tentang percabangan yang sering dijalankan.

Pemeriksaan Singkat

Mengapa mengurutkan data sebelum perulangan penyaringan terkadang dapat mempercepat eksekusi?

Ringkasan

Percabangan yang salah diprediksi menghabiskan siklus. Pertahankan percabangan agar mudah diprediksi (data terurut membantu), gunakan petunjuk kemungkinan dan ketidakmungkinan, bagi beban kerja agar perulangan tetap seragam, dan percayakan optimasi kepada kompilator kecuali pembuatan profil menunjukkan sebaliknya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Prediksi Percabangan dan Perulangan Panas” gratis?

Ya — teks lengkap “Prediksi Percabangan dan Perulangan Panas” 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 “Prediksi Percabangan dan Perulangan Panas”?

Bantu CPU memprediksi percabangan dan tulis perulangan yang dapat dioptimalkan kompiler 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 2 dari 4.

Berapa lama pelajaran “Prediksi Percabangan dan Perulangan Panas” 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