Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Pemrograman OpenMP
Kuliah#7 TSK617 Pengolahan Paralel - TA 2011/2012
Eko Didik Widianto
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Review Kuliah
I Sebelumnya dibahas tentang: pustaka Posix Thread dan aplikasinya
I Pustaka Pthread
I API Pthread
I Mengkompile program multithread
I Mengelola Thread
I Variabel Mutex
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Review Kuliah
I Pemrograman paralel di mesin shared memory menggunakan model thread
I Implementasi:
1. menggunakanPustaka dari subrutin yang dipanggil dari
dalam source code paralel
I Posix (pthread), paralelisme eksplisit. Di awal direncanakan programnya paralel
2. menggunakan setcompiler directive yang di-embed-kan
di source code (serial atau paralel)
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Kuliah tentang OpenMP
I Akan dibahas tentangpemrograman paralel dengan OpenMP
menggunakan kompiler directive
I Arsitektur memori: shared (SMP, symmetric
multi-processor)
I Model programming: thread
I Pokok Bahasan: (kuliah #7 akan membahas item yang
ditebalkan)
1. Pengantar OpenMP
2. Membuat Thread
3. Sinkronisasi dengan critical, atomic
4. Loop dan Worksharing
5. Sinkronisasi dengan barrier, single, master, ordered
6. Environment Data
7. Menjadwalkan for dan section
8. Model memori
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Kompetensi Dasar
I Setelah mempelajari bab ini, mahasiswa akan mampu:
1. [C2] Mahasiswa memahami konsep pemrograman paralel
menggunakan OpenMP
2. [C3] Mahasiswa akan mampu membuat program paralel
dari program serial menggunakan compiler-directive dan pustaka-pustaka OpenMP
3. [C5] Mahasiswa akan mampu memprogram suatu aplikasi
komputasi matrik menggunakan OpenMP serta menghitung faktor speedupnya
I Link
I Website:http://didik.blog.undip.ac.id/2012/02/25/
kuliah-tsk-617-pengolahan-paralel-2011/
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Acknowledment
I Materi dan gambar didapat dari:
I Tim Mattson, Larry Meadows (2008): “A Hands-on
Introduction to OpenMP“
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Bahasan
Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing LisensiPemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
OpenMP: API untuk Aplikasi Multithread
I Menyediakan set kompiler directive dan rutin pustaka untuk aplikasi pemrograman paralel
I Menyederhanakan penulisan program multi-thread (MT) di bahasa C, C++ dan Fortran
I Telah digunakan sebagai standar dalam aplikasi pemrograman di prosesor SMP
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
OpenMP Stack
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Elemen OpenMP
Sumber: http://en.wikipedia.org/wiki/OpenMPPemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Sintaks Utama OpenMP
I Sebagian besar construct di OpenMP adalahcompiler directive
#pragma omp construct [clause [clause]. . . ]
I Contoh:
#pragma omp parallel num_threads(4)
I Prototip fungsi dan tipe data didefinisikan di file header
omp.h
#include <omp.h>
I Sebagian besar construct OpenMP merupakan block terstruktur
I Blok terstruktur: sebuah blok yang berisi satu atau
beberapa statemen dengan satu titik masuk di bagian atas dan satu titik keluar di bagian terbawah
I Titik masuk dengan’{’ dan titik keluar dengan ’}’
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Kompiler OpenMP
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Latihan 1: Hello World (Serial)
Pastikan environment telah siap (IDE, kompiler, linker, dan lainnya)
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Latihan 1: Hello World (Paralel)
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Bagaimana Thread Berinteraksi?
I OpenMP adalah pustaka untuk pemrograman multi-threading menggunakan model alamat shared
I Thread saling berkomunikasi menggunakan variabel shared
I Sharing data yang tidak diinginkan menyebabkan kondisi race:
I race condition: when the program’s outcome changes as
the threads are scheduled differently
I Untuk mengontrol kondisi race:
I Digunakan sinkronisasi untuk memproteksi konflik data
I Sinkronisasi akanmahal, sehingga:
I Alternatif: memodifikasi program terutama akses data
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Data Race
I Dua thread berbeda mengakses lokasi memori yang sama (shared)
I Secara asinkron
I Tanpa memegang lock eksklusif
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Kondisi Race
I Diinginkan jumlah dari nilai fungsi s =
N
P
i=0
f (xi)
I Misalnya x=[3,5], f (x ) = x2, dan s=0 (init)
I Di akhir eksekusi, nilai s seharusnya 32+52=34
I Tapi nilainya bisa 34, 9 atau 25
I Operasiatomik adalah pembacaan dan penulisan
I Tidak ada 1/2 dari satu bilangan, operasi += adalah atomik
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Model Pemrograman OpenMP
I Fork-Join Parallelisme
I Thread master membangkitkan beberapa thread (child)
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Bahasan
Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing LisensiPemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Thread Creation: Parallel Regions
I Membuat thread dengan constructparallel
I Menggunakanfungsi runtime untuk setting jumlah thread,
mendapatkan thread ID
I Contoh: menggunakan fungsiomp_set_num_threads
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Thread Creation: Parallel Regions
I Menggunakanclause untuk setting jumlah thread
I Contoh:#pragma omp parallel num_threads(4)
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Thread Creation: Parallel Regions
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Thread Creation: Parallel Regions
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Bahasan
Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing LisensiPemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Integrasi Numerik
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Serial Program PI
I File: serial/pi.cPemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Paralel Program PI
I Buat program paralel untuk problem di atas!
I Perhatikan data shared dengan data private
I Akan dibutuhkan rutin pustaka runtime:
I int omp_get_num_threads(); // mendapatkan jumlah thread
I int omp_get_thread_num(); // mendapatkan thread ID atau
rank
I double omp_get_wtime(); // mendapatkan time stamp
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Lisensi
Paralel Program PI
I File: paralel/pi_spmd_simple.cI Menggunakan construct parallel dan array data untuk menyimpan jumlah parsial
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
Sinkronisasi
I Sinkronisasi digunakan untuk menghindarkan kondisi race
I Memproteksi akses ke shared data
I Tipe: I Sinkronisasi high-level I critical I atomic I barrier I ordered I Sinkronisasi low-level I flush
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
Bahasan
Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing LisensiPemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
Sinkronisasi: Critical
I Mutual exclusion: Only one thread at a time can enter a critical region
oat res;
#pragma omp parallel {
float B; int i, id, nthrds; id = omp_get_thread_num(); nthrds = omp_get_num_threads(); for(i=id;i<niters;i+nthrds){
B = big_job(i);
#pragma omp critical // theads will wait their turns
consume (B, res); // Only one thread calls consume() at a time }
}
I Threads akan menunggu gilirannya
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
Bahasan
Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing LisensiPemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
Sinkronisasi: Atomic
I Atomic provides mutual exclusion but only applies to the update of a memory location
#pragma omp parallel {
double tmp, B; B = DOIT();
tmp = big_ugly(B); #pragma omp atomic
X += tmp; // Atomic only protects the read/update of X }
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
Bahasan
Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing LisensiPemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
Paralel Program PI: Sinkronisasi
I Program paralel/pi_spmd_simple.c menggunakan array
I performansi rendah karena false sharing
I sum[id] unik untuk tiap thread, tapi tiap nilai array bisa saja
menggunakan jalur cache yang sama sehingga menyebabkan cache trashing
I Setiap update di cache akan membuat invalid jalur shared ini I Modifikasi program tersebut untuk menghindari false
sharing!
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
Paralel Program PI: Sinkronisasi
I File: paralel/pi_spmd_final.c
I Menghindari flase sharing karena pengunaan array
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Lisensi
Creative Common Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
I Anda bebas:
I untukMembagikan — untuk menyalin, mendistribusikan,
dan menyebarkan karya, dan
I untukRemix — untuk mengadaptasikan karya
I Di bawah persyaratan berikut:
I Atribusi — Anda harus memberikan atribusi karya sesuai
dengan cara-cara yang diminta oleh pembuat karya tersebut atau pihak yang mengeluarkan lisensi.
I Pembagian Serupa — Jika Anda mengubah, menambah,
atau membuat karya lain menggunakan karya ini, Anda hanya boleh menyebarkan karya tersebut hanya dengan lisensi yang sama, serupa, atau kompatibel.
I Lihat:Creative Commons Attribution-ShareAlike 3.0 Unported License