Pemrograman Paralel dengan OpenMP
OpenMP (Open Multi Processing) adalah antarmuka pemrograman aplikasi (API) yang mendukung pemrograman multi processing shared memory di c++, c, dan Fortran di berbagai arsitektur, termasuk platform Unix dan Windows. OpenMP terdiri dari satu kumpulan perintah kompilasi, pustaka rutin, dan variable lingkungan yang mempengaruhi performa aplikasi. Banyak aplikasi dibangun dengan model pemrograman parallel hybrid dapat dijalankan pada computer cluster dengan menggunakan OpenMP dan MPI (Message Passing Interface), atau lebih transparan dengan menggunakan ekstensi OpenMP non-shared memory systems.
            OpenMP mengimplementasikan multithreading. Bagina kode yang akan dijalankan secara parallel ditandai sesuai dengan pre-processor direktif sehingga akan membuat thread-thread sebelum dijalankan. Setiap thread memiliki id yang dibuat menggunakan fungsi (fungsi omp_get_thread_num() pada C/C++ dan fungsi OMP_GET_THREAD_NUM() pada Fortran). Secara default, setiap thread mengeksekusi kode secara parallel dan independen. “work-sharing construct” dapat digunakan untuk membagi tugas antar thread sehinggan setiap thread menjalankan sesuai bagian alokasi kodenya. Fungsi OpenMP berada pada file header yang berlabel “omp.h” di C/C++.

Bagian OpenMP

            Unsur inti OpenMP adalah pembuatan kosntruksi thread, distribusi beban kerja (pembagian kerja), pengelolaan lingkungan data, sinkronisasi thread, bagian user-level runtime dna variable environtment. Sebuah direktif compiler C/C++ ini disebut #pragma (pragmatis informasi). Kompilasi mengarahkan spesifikasi untuk OpenMP dalam C/C++ yang ditulis dalam kode #pragma omp.

Pembuatan Thread
Pembuatan thread oleh omp parallel. Hal ini digunakan membagi task secara parallel. Proses utama akan ditanyakan sebagai master Thread dengan thread ID 0.
Contoh untuk menampilkan hello world menggunakan beberapa thread.


Work-Sharing Constucts
Digunakan untuk menentukan kerja secara independen untuk menetapkan satu atau semua thread.
·         Omp for atau omp do -> digunakan untuk memisahkan perulangan iterasi antara thread, sering             disebut loop constructs.
·         Sections -> menugaskan secara berturut-turut blok kode independen kepada thread lain.
·         Single -> menetapkan sebuah blok kode yang dijalankan oleh hanya satu thread
·         Master -> mirip dengan single tetapi blok kode akan dieksekusi hanya oleh thread master.

Contoh inisialisasi niai array yang besar secara parallel, menggunakan setiap thread untuk melakukan sebagian pekerjaan.

Klausa OpenMP
          OpenMP adalah model pemrograman memori bersama, sebagian besar variable dalam kodo OpenMP terlihat oleh semua thread secara default. Tetapi kadang-kadang variable private diperlukan untuk menghindari race conditions dan ada kebutuhan untuk melewatkan nilai-nilai antara part dan region parallel berurutan (blok kode dijalankan secara parallel), sehigga diperlukan data pengelolaan dikenal sebagai sharing attribute clauses dengan menambahkan clauses OpenMP direktif. Berbagai jenis-jenis klausa”
·         Shared -> data di dalam wilayah paralel digunakan bersama-sama, yang berarti terlihat dan dapat diakses oleh semua thread secara bersamaan. Secara default, semua variabel dalam wilayah work sharing region adalah shared kecuali loop iteration counter.
·         Private -> data di dalam wilayah paralel adalah untuk pribadi masing-masing thread, yang berarti masing-masing thread akan memiliki salinan lokal dan menggunakannya sebagai variabel sementara. Variabel private tidak diinisialisasi dan nilai tidak dipertahankan untuk digunakan di luar wilayah paralel. Secara default, iterasi loop counter pada loop OpenMP adlah private.
·         Default -> memungkinkan para programmer untuk menyatakan bahwa data default scope sehingga parallel region akan saling shared, atau none untuk C / C + +, atau shared, firstprivate, private, atau none untuk Fortran. Pilihan none memaksa programmer untuk mendeklarasikan setiap variabel di wilayah paralel menggunakan data sharing attribute clauses.
·         Firstprivate -> seperti private kecuali untuk melakukan inisialisasi nilai aslinya.
·         Lastprivate -> seperti private kecuali nilai asli diperbarui setelah dibuat.
·         Reduction -> cara yang aman menggabungkan kerja dari semua thread setelah dibuat.

Sinkronisasi Klausa
·         Critical section: blok kode yang tertutup akan dilaksanakan oleh satu thread pada satu waktu, dan tidak secara simultan dilaksanakan oleh beberapa thread. Hal ini sering digunakan untuk melindungi data dari berbagi race conditions.
·         Atomic: mirip dengan critical section, tetapi memberitahu compiler untuk menggunakan instruksi perangkat keras khusus untuk performa yang lebih baik. Compiler dapat memilih untuk mengabaikan pengguna dan menggunakan critical section saja.
·         Ordered: blok yang terstruktur dilaksanakan dalam urutan iterasi akan dieksekusi dalam loop berurutan
·         Barrier: setiap thread menunggu sampai semua thread lainnya dari sebuah tim telah mencapai titik ini. Sebuah work-sharing construct memiliki implicit barrier synchronization di akhir.
·         Nowait: menetapkan bahwa thread menyelesaikan pekerjaan yang ditugaskan dapat dilanjutkan tanpa menunggu semua thread dalam tim untuk menyelesaikan. Dengan tidak adanya clausa ini, thread menghadapi masalah sinkronisasi pada akhir work sharing construct.

Scheduling Clauses
·         Schedule(type, chunk): Ini berguna jika work sharing construct melakukan do-loop atau for-loop. interasi dalam work sharing construct.ditugaskan untuk thread sesuai dengan metode scheduling yang ditetapkan oleh ketentuan ini. Tiga jenis penjadwalan adalah:
1.      Statis: Di sini, semua thread mealokasikan interasi sebelum mereka menjalankan iterasi loop. iterasi dibagi di antara thread yang sama secara default. Namun, integer untuk menentukan parameter " chunk " akan mengalokasikan " chunk " sesuai jumlah pengulangan susunan thread tertentu.
2.      Dinamis: Di sini, beberapa iterasi dialokasikan untuk sejumlah kecil thread. Setelah selesai thread tertentu maka dialokasikan iterasinya, ini berguna untuk mendapatkan satu dari iterasi yang tersisa. Parameter "chunk" mendefinisikan jumlah pengulangan susunan yang dialokasikan kepada thread pada suatu waktu.
3.      Guided: Sebuah potongan susunan iterasi dialokasikan untuk setiap thread secara dinamis. Ukuran sepotong berkurang secara eksponensial dengan alokasi untuk masing-masing berturut-turut ukuran minimum yang ditentukan dalam parameter "bongkahan"

Kontrol Jika
·         If -> Hal ini akan menyebabkan thread melakuakan tugas hanya jika kondisi terpenuhi. Kalau tidak menjalankan blok kode seterusnya..

Inisialisasi
·         firstprivate: data private untuk masing-masing thread, tapi diinisialisasi dengan menggunakan nilai dari variabel dengan menggunakan nama yang sama dari master thread.
·         lastprivate: data private untuk setiap thread. Nilai dari data pribadi ini akan disalin ke variabel global dengan menggunakan nama yang sama di luar region paralel jika iterasi saat ini adalah yang terakhir dalam iteration loop. Sebuah variabel dapat firstprivate dan lastprivate.
·         threadprivate: Data adalah data global, tetapi pribadi paralel di masing-masing daerah selama runtime. Perbedaan antara threadprivate dan private adalah ruang lingkup global yang terkait dengan threadprivate dan nilai yang disimpan paralel di suatu region daerah.

Data Copying
·         Copying: mirip dengan variabel firstprivate untuk private, threadprivate variabel yang belum diinisialisasi, kecuali menggunakan copying untuk melewatkan nilai dari variabel global yang sesuai. Tidak melakuakn copyout diperlukan karena nilai suatu variabel threadprivate dipelihara selama pelaksanaan seluruh program.
·         Copyprivate: digunakan dengan sendiri untuk mendukung penyalinan data nilai dari object private di satu thread (thread tunggal) untuk object yang sesuai pada thread lain dalam tim.

Reduction
·         Reduction (operator | instrinstic: list): variabel memiliki salinan lokal di setiap thread, tetapi nilai-nilai dari salinan lokal akan diringkas (dikurangi) ke dalam variabel global. Hal ini sangat berguna jika operasi tertentu (ditentukan dalam "operator" clausa khusus ini) pada datatype yang berjalan dengan interaktif sehingga nilai pada iterasi tertentu tergantung pada nilai pada iterasi sebelumnya. Pada dasarnya, langkah-langkah yang mengarah ke kenaikan operasional adalah paralisme, tetapi thraed mengumpulkan dan menunggu sebelum memperbarui datatype, lalu akan menambahkan datatype dalam rangka untuk menghindari race condition. Ini akan diperlukan dalam parallel fungdi Integrasi Numerik dan Persamaan Diferensial, sebagai contoh umum.