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.
0 Komentar