hasil uji coba parallel programming openmp
DESCRIPTION
Report Experiment Parallel Programming untuk matriks multiplication, dengan menggunakan openMP, lanjutan dari POSIX yang sebelumnyaTRANSCRIPT
Laporan Hasil Eksperimen Komputasi Perkalian 2 Matrik
Menggunakan OPENMP
Nama : Hendri KarismaNIM : 23512060
Komputer : Satelite L510 (notebook)Processor : Intel Centrino. Core 2 Duo T6500 @ 2.1 GHzJumlah Core : 2Cache Size : 2048 KBMemori : 2.8 GB
Proses perhitungan perkalian matriks dari mulai ordo matriks 16, 32, 64, 100,
200, 400, 800, 1600 pertama melakukan perkalian matriks untuk masing-masing
matriks dengan cara sequential sebanyak 2 kali, dan dilakukan perkalian matriks untuk
masing-masing matriks dengan menggunakan library openMP sebanyak 2 kali untuk
masing-masing ordo dan jumlah thread.
Untuk perkalian matriks secara parallel dilakukan dengan menggunakan 2
kondisi jumlah thread, dengan 2 thread dan dengan 4 thread. Ketika proses berlasung,
jumlah kolom akan dibagi kedalam jumlah thread (N-Thread atau 2 atau 4 thread)
secara merata untuk setiap masing-masing thread. Lalu akan dihasilkan output printf
banyak pembagian kolom untuk di proses untuk setiap threadnya dan informasi urutan
thread mana yang dieksekusi terlebih dahulu dan mana yang diselesaikan lebih dahulu.
Lalu hasil akhir dikeluarkan waktu yang dibutuhkan untuk menyelesaikan komputasi
perkalian matriks tersebut.
Perbedaan yang ada pada program multiplikasi matriks kali ini (program kali ini
dengan menggunakan openMP dan yang sebelumnya adalah posix) adalah, eksekusi
perhitungan parallel untuk setiap ordo dilakukan dalam 1 kali jalan program. Artinya
sudah disediakan konstanta array yang berisikan ordo yang akan dilakukan ujicoba,
sehingga cukup melakukan looping untuk setiap proses parallel yang ingin diuji
cobakan untuk setiap ordonya. Namun untuk perubahan thread masih dieksekusi pada
berbeda sesi sehingga eksekusi program dengan 1 thread, 2 thread dan 3 thread
dilakukan pada waktu yang tidak bersamaan dan berarti minimal ada 3 kali eksekusi
program untuk satu kali proses uji coba pada setiap kasus jumlah thread.
Dalam directive pragma openMP terdapat beberapa cara untuk memberikan
beberapa status terhadap beberapa variable misalkan private atau shared atau last private
dan lain-lain. Pada program ini digunakan private untuk setiap variable yang
dimanfaatkan sebagai iterator dalam looping for, dan juga untuk variable yang bersifat
temporary (seperti variable sum dalam codes program). Diberikan status shared untuk
variable yang menampung matriks pertama dan kedua yang nantinya akan dikenakan
operasi multiplikasi, dan juga hal yang sama berlaku untuk variable yang menampung
hasil perkalian matriks tersebut.
Pengukuran waktu dimulai ketika sebelum threads tersebut dimulai dan akan
dicatat waktu ketika threads akan dimulai, lalau saat seluruh threads tersebut selesai
dieksekusi maka akan diambil waktu ketika threads itu diselesaikan dan akan diambil
selisih antara waktu threads diselesaikan dengan waktu ketika sebelum threads tersebut
mulai dieksekusi secara bersamaan.
Pengukuran waktu menggunakan method clock_gettime() karena lebih
menghasilkan waktu mendekati real. Fungsi clock_gettime digunakan untuk mengambil
nilai waktu dengan presisi clock_id, dan dapat mengimplementasikan system-wide
realtime clock, dengan menggunakan clock_realtime, atau pun menggunakan clock dari
CPU id, yaitu menggunakan clock atau waktu dari CPU (baik i386 ataupun itanium).
Berikut adalah hasil eksperimen untuk percobaan tanpa parallel, dan dengan parallel
dengan 2 thread dan 4 thread.
1. Berikut percobaan tanpa menggunakan parallel :
Tabel 1 Hasil Eksperimen 1 untuk menghitung perkalian matriks dengan 1thread
Ordo Matriks time (second)16 0.00143932 0.00030464 0.002203100 0.008153200 0.081311400 0.597384800 6.0141181600 49.13704
2. Berikut hasil percobaan menggunakan 2 thread :
Tabel 2 Hasil Eksperimen 2 untuk menghitung perkalian matriks dengan 2 thread
Ordo Matriks time (second)16 0.01112532 0.00388764 0.009236100 0.013775200 0.056386400 0.555578800 3.0947841600 25.583069
Tabel 3 Hasil Eksperimen 3 untuk menghitung perkalian matriks dengan 2 thread yang
kedua
Ordo Matriks time (second)16 0.0011332 0.00020164 0.001304100 0.004046200 0.041205400 0.356788800 3.2088921600 27.149887
Dan berikut adalah hasil eksperimen percobaan untuk perkalian matriks dari ordo 16
hingga 1600 dengan menggunakan 4 thread :
Tabel 4 Hasil Eksperimen 4 untuk menghitung perkalian matriks dengan 4 thread yang
pertama
Ordo Matriks time (second)16 0.00456732 0.00416364 0.007048100 0.00403200 0.0047377400 0.473662800 3.7036341600 28.055313
Tabel 5 Hasil Eksperimen 4 untuk menghitung perkalian matriks dengan 4 thread yang
kedua
Ordo Matriks time (second)16 0.00776132 0.00472664 0.007065100 0.01203200 0.068568400 0.439324800 3.589421600 27.580048
Graphic 1 Grafik perbandingan hasil experiment untuk 1 thread, 2 thread dan 4 thread
dengan menggunakan openMP
Graphic 2 Grafik batang perbandingan hasil percobaan antara 1 thread, 2 threads dan
4 threads menggunakan openMP
Figure 1 Kondisi Program ketika sedang di eksekusi dan grafik monitor CPU komputer
pada Ubuntu
Uraian Analisis Hasil Eksperimen
Dari hasil eksperimen yang didapat terdapat perbedaan yang cukup besar antara
kecepatan proses ketika suatu proses (dalam kasus ini adalah perkalian 2 matriks)
menggunakan prallel atau posix atau menggunakan lebih dari satu thread dibandingkan
dengan yang hanya menggunakan 1 thread. Terlihat dalam grafik 1 dan 2, dalam proses
perhitungan matriks pun banyak ordo yang dimiliki matriks, semakin besar ordo
matriks, semakin besar pula waktu yang dibutuhkan untuk menyelesaikan perkalian
matriks tersebut. Dalam Figure 1 pun yang merupakan screen shot ketika CPU 1 dan
CPU 2 sedang dalam proses pengerjaan perhitungan matriks dari ordo 16 hingga ordo
1600 dengan 2 threads, resource dari CPU 1 dan CPU 2 terlihat hampir 100%
digunakan untuk menyelesaikan perkalian matriks, artinya setiap CPU menangani 1
threads untuk menyelesaikan perkalian matriks. Code yang dibuat dalam program ini
memanfaatkan pragma dengan melakukan shared untuk variable yang menampung
nilai-nilai matriks baik matrik A dan B yang merupakan 2 matrik yang akan dikenakan
operasi multiplikasi dan juga matriks C yang merupakan variable penampung matriks
hasil perkalian matriks A dan B. Dan untuk variable yang berfungsi hanya sebagai
iterator dan variable temporary dijadikan private karena untuk menghindari
kemungkinan race condition terhadap setiap variable tersebut, karena variable tersebut
saling independent ketika thread dibagi menjadi lebih dari satu sehingga tidak ada
ketergantungan antara 1 variable iterator atau temporary dengan variable lainnya.
Figure 2 Sample Code (Pragma block)
Perbandingan OpenMP dan Posix dari hasil Uji Cobas Sebelumnya
Berikut adalah grafik garis yang di ambil dari hasil percobaan parallel programming
untuk perkarian matriks yang sama dengan menggunakan POSIX :
Figure 3 Grafik Prallel Programming dengan 1 thread, 2 thread, dan 4 thread dengan
menggunakan POSIX
Setelah dilakukan perbandingan hasil uji coba antara penggunaan library
openMP dan POSIX terlihat hasil performasi dari masing-masing library ketika
diimplementasikan pada kasus operasi perkalian 2 matriks secara parallel. Cara POSIX
menghasilkan performasi yang lebih baik, hasilnya jika diambil rata-rata hasil uji coba
makan dapat dilihat bahwa POSIX menyelesaikan operasi tersebut lebih cepat
dibandingkan dengan OpenMP, perkiraan yang terjadi adalah, bahwa ketika
menggunakan POSIX, programmer dapat membentuk algoritma tertentu untuk
mempercepat proses perhitungan salah satunya adalah jumlah matriks yang akan
dihitung dan dibebankan pada setiap thread itu dapat dihitung ataupun strategi
perhitungan matriks yang dapat di atur secara manual. Dan mungkin openMP dapat
berjalan sama cepatnya dengan POSIX namun perlu explorasi lebih dalam mengenai
berbagai fitur dari openMP itu sendiri sehingga dapat memanfaatkan fitur yang tersedia
secara efisien dan efektif.