Back to IF3130 Sistem Paralel dan Terdistribusi
Tabel Direktif dan Fungsi Penting OpenMP
| Direktif / Fungsi | Keterangan | Kapan Digunakan | Klausa / Parameter Penting |
|---|---|---|---|
| Paralelisasi Dasar | |||
#pragma omp parallel | Membuat sebuah region paralel (Fork-Join). Blok kode berikutnya akan dieksekusi oleh setiap thread dalam sebuah team. | Untuk mengeksekusi blok kode yang sama oleh banyak thread, atau sebagai pembungkus untuk direktif pembagian kerja lainnya. | num_threads(count): Menentukan jumlah thread yang akan dibuat. |
#pragma omp parallel for | Direktif gabungan. Membuat team thread DAN langsung membagi iterasi for loop berikutnya di antara mereka. | Cara paling umum dan praktis untuk memparalelkan for loop yang iterasinya independen. | Sama seperti parallel, ditambah klausa untuk for seperti reduction dan schedule. |
| Pembagian Kerja (Work-sharing) | |||
#pragma omp for | Membagi iterasi for loop di antara thread dalam sebuah team yang sudah ada. | Digunakan di dalam blok #pragma omp parallel untuk membagi pekerjaan sebuah loop. | - |
#pragma omp sections | Membagi blok kode menjadi beberapa #pragma omp section yang independen. Setiap section dikerjakan oleh satu thread. | Untuk task parallelism, di mana thread yang berbeda mengerjakan fungsi atau tugas yang berbeda secara bersamaan. | - |
#pragma omp single | Menandakan bahwa blok kode berikutnya hanya akan dieksekusi oleh satu thread saja (yang pertama tiba). | Untuk tugas inisialisasi atau finalisasi di dalam region paralel yang hanya perlu dilakukan sekali. | - |
| Manajemen Data (Klausa) | |||
private(list) | Setiap thread mendapatkan salinan (kopi) privat dari variabel dalam list. Perubahan tidak terlihat oleh thread lain. | Untuk variabel sementara di dalam loop atau variabel yang nilainya tidak boleh saling mengganggu antar thread. | list: Daftar variabel yang dipisahkan koma (misal: private(i, temp)). |
shared(list) | Semua thread berbagi dan mengakses satu variabel yang sama di memori. | Untuk data input yang hanya dibaca atau data output yang aksesnya sudah dilindungi oleh sinkronisasi. | list: Daftar variabel yang akan di-share. |
reduction(op:list) | Cara paling aman dan efisien untuk melakukan operasi agregasi (penjumlahan, perkalian, dll.). | Wajib digunakan saat banyak thread perlu mengupdate satu variabel global secara bersamaan (misal, menjumlahkan hasil parsial). | op: Operator reduksi (+, *, min, max). list: Variabel yang akan direduksi. |
schedule(type, size) | Mengatur cara iterasi loop didistribusikan ke thread. | Untuk mengatasi load imbalance, yaitu ketika beban kerja setiap iterasi tidak sama agar thread tidak menganggur. | type: static (overhead rendah), dynamic (adaptif), guided (kompromi). size: Ukuran chunk (opsional). |
default(none) | Memaksa programmer untuk secara eksplisit menentukan scope (private, shared, reduction) dari setiap variabel yang digunakan. | Praktik terbaik. Sangat disarankan untuk digunakan di setiap region paralel untuk menghindari bug terkait scope variabel. | - |
| Sinkronisasi | |||
#pragma omp critical | Melindungi Critical Section. Hanya satu thread yang bisa masuk ke blok kode ini pada satu waktu. | Untuk melindungi operasi pada data bersama yang kompleks dan tidak bisa ditangani oleh atomic atau reduction. | (name): Memberi nama pada critical section (opsional). |
#pragma omp atomic | Versi critical yang sangat ringan dan cepat, namun terbatas hanya untuk satu statement assignment sederhana. | Gunakan ini jika memungkinkan untuk operasi seperti x++, x--, x += val. Jauh lebih efisien daripada critical. | - |
#pragma omp barrier | Titik sinkronisasi. Tidak ada thread yang bisa lewat sampai semua thread dalam team telah mencapainya. | Untuk memastikan satu fase komputasi selesai sebelum fase berikutnya dimulai di dalam satu region paralel. | - |
| Paralelisme Lanjutan (Tasking) | |||
#pragma omp task | Mendefinisikan blok kode sebagai sebuah “tugas” independen yang dimasukkan ke dalam antrian. | Untuk masalah dengan paralelisme dinamis atau tidak teratur, seperti pada algoritma rekursif atau saat memproses linked list. | - |
#pragma omp taskwait | Thread yang membuat task akan berhenti di sini sampai semua child task yang ia buat secara langsung selesai. | Untuk memastikan hasil dari sub-tugas sudah tersedia sebelum tugas utama melanjutkannya. | - |
| Fungsi Runtime | |||
omp_get_thread_num() | Mendapatkan ID unik (rank) dari thread yang sedang berjalan. | Untuk membedakan pekerjaan atau mencetak informasi debugging dari setiap thread. | - |
omp_get_num_threads() | Mendapatkan total jumlah thread yang ada dalam team saat ini. | Untuk mengetahui berapa banyak thread yang sedang aktif. | - |
Catatan Kompilasi: Jangan lupa untuk menambahkan flag -fopenmp saat mengompilasi. Contoh: gcc -fopenmp program.c -o program.