Makro Prediksi Cabang pada GCC dan Fungsinya
Salah satu teknik optimisasi yang sering digunakan pada kernel Linux adalah "_builtin_expect". Ketika dijalankan dengan kode kondisional (if-else statement), maka akan diketahui cabang mana yang benar dan cabang mana yang salah. Jika kompilator dapat mengetahui informasi ini pada tingkat lebih lanjut, maka hal ini dapat menghasilkan bentuk kode yang paling optimal.
Sebelum memahami lebih dalam materi tentang Makro Prediksi Cabang pada GCC dan Fungsinya, terlebih dahulu pelajari materi tentang: Makro Offset Bahasa C dan Fungsinya [klik], Makro Multibaris Bahasa C dan Fungsinya [klik], dan Variabel Panjang Argumen Untuk Makro Bahasa C [klik].
Perhatikan definisi makro dari "likely()" dan "unlikely()" dari kode kernel linux “http://lxr.linux.no/linux+v3.6.5/include/linux/compiler.h”.
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
Baca Juga:
Pada contoh berikut, kode program akan ditandai sebagai likely true:
const char *home_dir ;
home_dir = getenv("HOME");
if (likely(home_dir))
printf("home directory: %s\n", home_dir);
else
perror("getenv");
Pada contoh sebelumnya, kode program memiliki kodisional "IF" sebagai "likely()" true, sehingga kompilator akan menempatkan kode true secepatnya dan kode false setelahnya dalam instruksi cabang. Karena hal ini, maka kompilator akan mecapai nilai optimalnya. Tetapi, jangan menggunakan "likely()" dan "unlikely()" makro secara sembarangan. Jika prediksi bernilai benar, maka artinya terdapat 0 siklus dari lompatan instruksi, tetapi jika prediksi bernilai salah, maka akan mengembalikan beberapa siklus, karena preprosesor dibutuhkan untuk melewatkan alirannya, dimana kondisi terburuk yang dapat terjadi adalah kompilator tidak akan memiliki nilai yang dapat diperkirakan.
'Akses memori' adalah operasi CPU yang paling lambat jika dibandingkan dengan jenis operasi CPU lainnya. Untuk menghindari batasan tersebut CPU menggunakan "CPU caches" atau L1-chache, L2-chache, dan lain sebagainya guna meningkatkan kecepatan akses dari CPU tersebut. Ide utama dari chache adalah mengkopi beberapa bagian dari memori ke dalam CPU itu sendiri. Sehingga, dapat dilakukan akses memori lebih cepat daripada memori yang pernaj dilakukan dengan metode sebelumnya. Namun terdapat masalah, dimana "chache memory" ukurannya terbatas, dan proses kopi data tidak dapat dilakukan pada semua ukuran memori tersebut. Sehingga, CPU hanya melakukan prediksi memori mana saja yang akan digunakan pada waktu dekat dan akan melakukan load memori menjadi CPU chache dan makro yang selanjutnya akan digunakan sebagai petunjuk untuk load memori pada cache CPU.
Referensi Tambahan:
- 3 Tugas Umum Cara Kerja Preprosesor pada Bahasa C [klik]
- 4 Tipe Utama Preprosesor Direktif Bahasa C dan C++ [klik]
- Preprosesor Direktif Bahasa C dan C++ Lanjutan [klik]
- Fungsi Sederhana Library Isgraph pada Bahasa C [klik]
- 3 Contoh Sederhana Cara Membuat File Header pada Bahasa C [klik]
- Penjelasan Singkat, Fungsi Library Difftime pada Bahasa C [klik]
- Penjelasan Singkat, Fungsi Tmpnam pada Bahasa C [klik]
Artikel ini didedikasikan kepada: Ajeng Nur Fauziah, Ali Barokah, Ananda Fama Laudza Dwi Anjani, Anis Setyaningrum, dan Annas Bhakti Aditama.
Apa yang dimaksud dengan GCC?
BalasHapusGCC adalah singkatan dari GNU Compiler Collection yang merupakan kumpulan atau koleksi kompilator yang dikembangkan oleh proyek GNU. Dimana, pada awal rilisnya, GCC merupakan singkat dari GNU C Compoler karena hanya bisa melakukan kompilasi program terhadap bahasa C saja. Namun, pada Desember 1987, kompilator GCC tidak hanya bisa mendukung bahasa C tetapi juga dapat mendukung bahasa C++.
HapusApa yang dimaksud dengan GNU?
BalasHapusGNU adalah singkatan dari "GNU's No Unix". Kalimat ini diucapkan sebagai suatu suku kata dengan kata G digaungkan lebih keras. Richard Stallman membuat pengumuman awal proyek GNU pada bulan September 1983.
HapusCatatan: iya, benar, itu adalah singkatan dari GNU yang sebenarnya
Sumber:
https://www.gnu.org/gnu/pronunciation.html
Iya tujuan dari pembuatan akronim GNU memang untuk lucu-lucuan aja!!
HapusHeish, akronim konyol macam apa ini -____-
BalasHapus