Langsung ke konten utama

Iklan





Makro Prediksi Cabang pada GCC

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.

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) 

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.


Iklan

Komentar

  1. Apa yang dimaksud dengan GCC?

    BalasHapus
    Balasan
    1. GCC 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++.

      Hapus
  2. Apa yang dimaksud dengan GNU?

    BalasHapus
    Balasan
    1. GNU 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.


      Catatan: iya, benar, itu adalah singkatan dari GNU yang sebenarnya

      Sumber:
      https://www.gnu.org/gnu/pronunciation.html

      Hapus
    2. Iya tujuan dari pembuatan akronim GNU memang untuk lucu-lucuan aja!!

      Hapus
  3. Heish, akronim konyol macam apa ini -____-

    BalasHapus

Posting Komentar

Respon komentar 7 x 24 jam, so please be patient :D