Back to IF3130 Sistem Paralel dan Terdistribusi

Topic

Questions/Cues

  • Apa itu OpenMP?

  • Apa itu “Pragma”?

  • Bagaimana cara kerja #pragma omp parallel?

  • Bagaimana alur eksekusi OpenMP?

  • Apa itu team, master, & slave?

  • Bagaimana kompilasi & eksekusi program OpenMP?

  • Cara membuat kode portabel?

Reference Points

  • Slide “paralel programming model: shared memory - OpenMP” (Hal. 3-14)

Apa itu OpenMP?

OpenMP (Open Multi-Processing) adalah sebuah API (Application Programming Interface) yang dirancang untuk menyederhanakan pemrograman paralel pada sistem shared-memory. Berbeda dengan Pthreads yang bersifat low-level dan manual, OpenMP bekerja pada level yang lebih tinggi, sering kali hanya dengan menambahkan instruksi khusus ke kode serial yang sudah ada. Tujuannya adalah membuat paralelisasi menjadi lebih mudah dan portabel.

Konsep Inti: Pragmas

OpenMP sebagian besar diimplementasikan menggunakan Pragmas.

  • Definisi: Pragma (#pragma) adalah sebuah direktif atau instruksi khusus untuk compiler. Ini bukan bagian dari standar bahasa C, melainkan ekstensi.

  • Sifat Elegan: Jika sebuah compiler tidak mengenali atau tidak mendukung OpenMP, ia akan mengabaikan pragma tersebut. Artinya, kode Anda akan tetap bisa dikompilasi dan berjalan sebagai program serial biasa. Ini membuat kode OpenMP sangat portabel.

Direktif Dasar: #pragma omp parallel

Ini adalah direktif paling fundamental di OpenMP. Saat compiler menemukannya, ia akan melakukan hal berikut:

  1. Menandai blok kode terstruktur yang mengikutinya (misalnya, blok {...}).

  2. Membuat sekelompok thread baru (disebut team).

  3. Setiap thread dalam team tersebut akan mengeksekusi blok kode yang sama secara bersamaan.

Alur Eksekusi: Model Fork-Join

Program OpenMP mengikuti model fork-join:

  1. Mulai Serial: Program dimulai dengan satu thread utama, yang disebut master thread.

  2. Fork (Membelah): Saat bertemu #pragma omp parallel, master thread akan “membelah diri” dan membuat beberapa slave threads.

  3. Eksekusi Paralel: Master thread bersama dengan para slave threads membentuk sebuah team dan mengeksekusi blok paralel secara bersamaan.

  4. Join (Bergabung): Di akhir blok paralel, terdapat barrier implisit. Semua thread akan menunggu di sini. Setelah semua thread selesai, para slave threads akan “dihancurkan”, dan hanya master thread yang melanjutkan eksekusi bagian serial berikutnya.

Kompilasi dan Eksekusi

Untuk mengaktifkan OpenMP, kita perlu memberitahu compiler menggunakan flag khusus.

  • Kompilasi (GCC): gcc -g -Wall -fopenmp -o nama_program program.c

    • Flag -fopenmp sangat penting; tanpanya, pragma akan diabaikan.
  • Eksekusi: ./nama_program <jumlah_thread>

    • Jumlah thread bisa ditentukan melalui klausa num_threads() pada pragma atau melalui environment variable OMP_NUM_THREADS.

Menjaga Kode Tetap Portabel

OpenMP mendefinisikan sebuah makro _OPENMP. Kita bisa menggunakannya untuk menulis kode yang bisa beradaptasi, misalnya untuk memanggil fungsi OpenMP hanya jika OpenMP diaktifkan.

#ifdef _OPENMP
  // Kode ini hanya akan dikompilasi jika -fopenmp digunakan
  #include <omp.h>
  int my_rank = omp_get_thread_num();
#else
  // Fallback untuk kompiler non-OpenMP
  int my_rank = 0;
#endif

Summary

OpenMP adalah API tingkat tinggi yang menyederhanakan pemrograman paralel pada shared memory dengan menggunakan pragmas, di mana direktif inti #pragma omp parallel mengimplementasikan model fork-join untuk mengeksekusi blok kode secara konkuren oleh sebuah team thread. Kode OpenMP bersifat portabel karena compiler non-OpenMP akan mengabaikan pragmas, dan kompilasinya diaktifkan melalui flag -fopenmp.