Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi
Pemrograman OpenMP Kuliah#7 TSK617 Pengolahan Paralel - TA 2011/2012
Eko Didik Widianto Teknik Sistem Komputer - Universitas Diponegoro
Lisensi
Review Kuliah
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
I
Sebelumnya dibahas tentang: pustaka Posix Thread dan aplikasinya I I I I I I
Pustaka Pthread API Pthread Mengkompile program multithread Mengelola Thread Variabel Mutex Variabel Kondisional
Review Kuliah I I
Pemrograman paralel di mesin shared memory menggunakan model thread Implementasi: 1. menggunakan Pustaka dari subrutin yang dipanggil dari dalam source code paralel I
Posix (pthread), paralelisme eksplisit. Di awal direncanakan programnya paralel
2. menggunakan set compiler directive yang di-embed-kan di source code (serial atau paralel) I
OpenMP, dapat menggunakan kode serial
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Kuliah tentang OpenMP
Pemrograman OpenMP @2012,Eko Didik Widianto
I
Akan dibahas tentang pemrograman paralel dengan OpenMP menggunakan kompiler directive I
I
I
Arsitektur memori: shared (SMP, symmetric multi-processor) Model programming: thread
Pokok Bahasan: (kuliah #7 akan membahas item yang ditebalkan) 1. 2. 3. 4. 5. 6. 7. 8. 9.
Pengantar OpenMP Membuat Thread Sinkronisasi dengan critical, atomic Loop dan Worksharing Sinkronisasi dengan barrier, single, master, ordered Environment Data Menjadwalkan for dan section Model memori OpenMP 3.0
Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Kompetensi Dasar
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread
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/
I
Email:
[email protected]
Sinkronisasi Lisensi
Acknowledment
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
I
Materi dan gambar didapat dari: I
I
Tim Mattson, Larry Meadows (2008): “A Hands-on Introduction to OpenMP“ Website: http://openmp.org/wp/resources/
Bahasan
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread
Tentang OpenMP
Sinkronisasi Lisensi
Membuat Thread Membuat Thread Aplikasi Numerik
Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing
Lisensi
OpenMP: API untuk Aplikasi Multithread
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
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
OpenMP Stack
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Pemrograman OpenMP
Elemen OpenMP
@2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
Sumber: http://en.wikipedia.org/wiki/OpenMP
Sintaks Utama OpenMP
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP
I
Sebagian besar construct di OpenMP adalah compiler directive #pragma omp construct [clause [clause]. . . ] I
I
I
Contoh: #pragma omp parallel num_threads(4)
Prototip fungsi dan tipe data didefinisikan di file header omp.h #include
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
I
Titik masuk dengan ’{’ dan titik keluar dengan ’}’
Dalam blok terstruktur tersebut bisa memanggil exit()
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?
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP
I
OpenMP adalah pustaka untuk pemrograman multi-threading menggunakan model alamat shared I
I
Sharing data yang tidak diinginkan menyebabkan kondisi race: I
I
race condition: when the program’s outcome changes as the threads are scheduled differently
Untuk mengontrol kondisi race: I
I
Thread saling berkomunikasi menggunakan variabel shared
Digunakan sinkronisasi untuk memproteksi konflik data
Sinkronisasi akan mahal, sehingga: I
Alternatif: memodifikasi program terutama akses data shared untuk meminimalkan kebutuhan sinkronisasi
Membuat Thread Sinkronisasi Lisensi
Data Race
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread
I
Dua thread berbeda mengakses lokasi memori yang sama (shared) I I I
Secara asinkron Tanpa memegang lock eksklusif Setidaknya terdapat satu akses penulisan (write/store)
Sinkronisasi Lisensi
Pemrograman OpenMP
Kondisi Race
@2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Lisensi
I
Diinginkan jumlah dari nilai fungsi s =
N P
f (xi )
i=0 I I
Misalnya x=[3,5], f (x) = x 2 , dan s=0 (init) Di akhir eksekusi, nilai s seharusnya 32 + 52 = 34 I
I
Tapi nilainya bisa 34, 9 atau 25
Operasi atomik adalah pembacaan dan penulisan I I
Tidak ada 1/2 dari satu bilangan, operasi += adalah atomik Semua komputasi terjadi di register private
Model Pemrograman OpenMP
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread
I
Fork-Join Parallelisme I
Thread master membangkitkan beberapa thread (child) yang dibutuhkan
Membuat Thread Aplikasi Numerik
Sinkronisasi Lisensi
Bahasan
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP
Tentang OpenMP
Membuat Thread Membuat Thread Aplikasi Numerik
Sinkronisasi
Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
Lisensi
Thread Creation: Parallel Regions
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP
I
Membuat thread dengan construct parallel I
Menggunakan fungsi runtime untuk setting jumlah thread, mendapatkan thread ID
Membuat Thread Membuat Thread Aplikasi Numerik
Sinkronisasi Lisensi
I
Contoh: menggunakan fungsi omp_set_num_threads
I
Tiap thread memanggil pooh(ID,A) untuk ID=0-3
Thread Creation: Parallel Regions
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread
I
Menggunakan clause untuk setting jumlah thread I
Contoh: #pragma omp parallel num_threads(4)
Membuat Thread Aplikasi Numerik
Sinkronisasi Lisensi
I
Tiap thread memanggil pooh(ID,A) untuk ID=0-3
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
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP
Tentang OpenMP
Membuat Thread Membuat Thread Aplikasi Numerik
Sinkronisasi
Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
Lisensi
Integrasi Numerik
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik
Sinkronisasi Lisensi
Serial Program PI
Pemrograman OpenMP @2012,Eko Didik Widianto
I
File: serial/pi.c
Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik
Sinkronisasi Lisensi
Paralel Program PI
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik
Sinkronisasi
I
Buat program paralel untuk problem di atas! I I
Perhatikan data shared dengan data private Akan dibutuhkan rutin pustaka runtime: I I
I
int omp_get_num_threads(); // mendapatkan jumlah thread int omp_get_thread_num(); // mendapatkan thread ID atau rank double omp_get_wtime(); // mendapatkan time stamp dalam detik sejak titik tertentu
Lisensi
Paralel Program PI I File: paralel/pi_spmd_simple.c I Menggunakan construct parallel dan array data untuk menyimpan jumlah
parsial I
Algoritma SPMD (Single Process/Program Multiple Data)
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Membuat Thread Aplikasi Numerik
Sinkronisasi Lisensi
Sinkronisasi
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread
I
Sinkronisasi digunakan untuk menghindarkan kondisi race
Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic
I
I
Memproteksi akses ke shared data
Tipe: I
Sinkronisasi high-level I I I I
I
False Sharing
Lisensi
critical atomic barrier ordered
Sinkronisasi low-level I I
flush locks (simple, nested)
Bahasan
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP
Tentang OpenMP
Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic
Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
False Sharing
Lisensi
Sinkronisasi: Critical
Pemrograman OpenMP @2012,Eko Didik Widianto
I
Mutual exclusion: Only one thread at a time can enter a critical region
Tentang OpenMP Membuat Thread Sinkronisasi
oat res; #pragma omp parallel {
Sinkronisasi Critical Sinkronisasi Atomic False Sharing
Lisensi
float B; int i, id, nthrds; id = omp_get_thread_num(); nthrds = omp_get_num_threads(); for(i=id;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 I
Hanya satu thread yang dapat memanggil consume()
Bahasan
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP
Tentang OpenMP
Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic
Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
False Sharing
Lisensi
Sinkronisasi: Atomic
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread
I
Atomic provides mutual exclusion but only applies to the update of a memory location
Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing
#pragma omp parallel {
Lisensi
double tmp, B; B = DOIT(); tmp = big_ugly(B); #pragma omp atomic X += tmp; // Atomic only protects the read/update of X }
Bahasan
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP
Tentang OpenMP
Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic
Membuat Thread Membuat Thread Aplikasi Numerik Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing Lisensi
False Sharing
Lisensi
Paralel Program PI: Sinkronisasi
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Sinkronisasi Critical
I
Program paralel/pi_spmd_simple.c menggunakan array I I
performansi rendah karena false sharing sum[id] unik untuk tiap thread, tapi tiap nilai array bisa saja menggunakan jalur cache yang sama sehingga menyebabkan cache trashing I
I
Setiap update di cache akan membuat invalid jalur shared ini
Modifikasi program tersebut untuk menghindari false sharing! I
Gunakan sinkronisasi
Sinkronisasi Atomic False Sharing
Lisensi
Paralel Program PI: Sinkronisasi I
File: paralel/pi_spmd_final.c I
Menghindari flase sharing karena pengunaan array penjumlahan
Pemrograman OpenMP @2012,Eko Didik Widianto Tentang OpenMP Membuat Thread Sinkronisasi Sinkronisasi Critical Sinkronisasi Atomic False Sharing
Lisensi
Pemrograman OpenMP
Lisensi
@2012,Eko Didik Widianto
Creative Common Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) I
Anda bebas: I
I
I
Di bawah persyaratan berikut: I
I
I
untuk Membagikan — untuk menyalin, mendistribusikan, dan menyebarkan karya, dan untuk Remix — untuk mengadaptasikan karya
Atribusi — Anda harus memberikan atribusi karya sesuai dengan cara-cara yang diminta oleh pembuat karya tersebut atau pihak yang mengeluarkan lisensi. 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.
Lihat: Creative Commons Attribution-ShareAlike 3.0 Unported License
Tentang OpenMP Membuat Thread Sinkronisasi Lisensi