Sabtu, Juni 27, 2020

Cabang prediksi makro pada GCC

Salah satu teknik optimisasi yang sering digunakan pada kernel Linux adalah "_builtin_expect". Ketika dijalankan dengan kode kondisional (if-else statement), kita akan sering mengetahui cabang mana yang benar dan yang tidak. Jika kompilator dapat mengetahui informasi ini pada tingkat advance, maka hal ini akan menghasilkan bentuk kode yang paling optimal.

Mari perhatikan definisi makro dari "likely()" dan "unlikely()" dari kode kernel linux “http://lxr.linux.no/linux+v3.6.5/include/linux/compiler.h” [baris no 146 dan 147].

#define likely(x) __builtin_expect(!!(x), 1) 
#define unlikely(x) __builtin_expect(!!(x), 0) 

pada contoh berikut, kode program 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 setelah akan, dan kode false dalam instruksi akar. Dalam hal ini 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 hal terburuknya akan tidak memiliki nilai prediksi.

Akses memori adalah operasi CPU terlambat jika dibandingkan dengan jenis operasi CPU lainnya. Untuk menghindari batasan tersebut CPU menggunakan "CPU caches" atau L1-chache, L2-chache, dan lain sebagainya. Ide utama dari chache adalah mengkopi beberapa bagian dari memori ke dalam CPU itu sendiri. Dimana dapat dilakukan akses memori lebih cepat daripada memori lainnya. Tetapi terdapat masalah, dimana "chache memory" ukurannya terbatas, dimana proses kopi data tidak dapat dilakukan pada semua ukuran memori. Sehingga, CPU hanya memprediksi memori mana yang akan digunakan pada waktu dekat dan akan melakukan load memori menjadi CPU chache dan makro selanjutnya akan digunakan sebagai petunjuk untuk load memori pada cache CPU.





Related Posts

Cabang prediksi makro pada GCC
Oleh

"semoga yang memberikan komentar diberikan berkah kebaikan dari Allah, dijauhkan dari kejahatan, dan diberikan pahala ilmu dan amal jariyah dari sepenggal kata yang ia tinggalkan amiin :) "