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
- Tata Letak Data yang Ramah Cache
- Prediksi Percabangan dan Perulangan Panas
- Pembuatan Profil dengan perf, vtune, dan Sanitizer
- Tolok Ukur Mikro dengan Google Benchmark