Back to IF3130 Sistem Paralel dan Terdistribusi

Tabel Direktif dan Fungsi Penting OpenMP

Direktif / FungsiKeteranganKapan DigunakanKlausa / Parameter Penting
Paralelisasi Dasar
#pragma omp parallelMembuat 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 forDirektif 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 forMembagi 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 sectionsMembagi 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 singleMenandakan 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 criticalMelindungi 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 atomicVersi 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 barrierTitik 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 taskMendefinisikan 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 taskwaitThread 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.