Implementasi Parallel Progamming dengan OpenMP Pada Matriks Multiplication

Assalammu’alaikum

Kali ini saya akan sharing mengenai bagaimana implementasi multithreading programming menggunakan teknologi bahasa C/C++ dan memanfaatkan fitus OpenMP pada gcc. Berbeda dengan artikel sebelumnya uji coba yang saya lakukan menggunakan pthread (posix), kali ini saya akan memanfaatkan library OpenMP , yang akan mempermudah kita dalam membuat program yang bersifat multithreading.

Berikut spesifikasi teknologi yang saya gunakan :

  1. Ubuntu 12.04
  2. eclipse juno
  3. CDT (C/C++ Development Toolkit) for juno
  4. C/C++
  5. OpenMP
  6. GCC 4.6

Untuk kasus yang dicoba masih sama seperti artikel sebelumnya matriks multiplication atau perkalian matriks. Ordo matriks yang digunakan adalah 4×4, 8×8, 16×16, 32×32, 64×64, 100×100, 200×200, 400×400, 800×800,1600×1600. Perbedaanya, ketika kita menggunakan posix, kita sangat memperhatikan pembagian task pada setiap thread secara eksplisit, berbeda dengan openMP , openmp akan meng-handle segala bentuk parallelism progress yang kita butuhkan, kita cukup menentukan looping mana atau task mana atau proses mana yang ingin diselesaikan secara parallel, dalam uji coba kali ini dicoba kedalam 3 jenis thread yaitu single thread, 2 thread, dan 4 thread.

Dalam OpenMP pun kita bisa dengan mudah menentukan varieble-variable mana yang harus dibuat dengan mode shared, atau dengan mode private. Tentunya dalam penentuan variable shared dan private ini diserahkan sepenuhnya pada programmer, programmer yang bertanggung jawab untuk menentukan resource yang ada apakah digunakna secara bersama-sama (oleh lebih dari satu task atau proses atau operasi) atau setiap task itu memiliki resource yang sama tetapi dengan referensi yang berbeda, artinya variable itu merupakan objek yang berbeda untuk setiap tasknya, sehingga memperkecil kemungikinan terjadi data depedensi antara proses yang berjalan secara bersama-sama. Pengaturan oleh programmer dalam script code pun dapat membantu untuk memaksimalkan load ballencing yang terjadi dan granuality yang akan maksimalkan rasio komputasi dibandingkan rasio komunikasi antar task atau process yang mungkin terjadi saat program di eksekusi.

Pada saat program di eksekusi untuk kasus matriks multipilcation ini kita/programmer tidak mengetahui bagaimana pembagian task untuk setiap matriks apakah dia dibagi berdasarkan kolom-kolom atau bagaiman strategi yang terjadi pada proses matriks multiplication secara eksplisit programmer tidak dapat memonitor task tersebut. Artinya directive (karena openMP menggunkan directive sendiri sebagai penanda process atau bagian yang dikenakan parallelism) yang akan menghandle code parallel yang pada posix itu terlihat cukup rumit, menjadi lebih sederhana, dengan efeknya adalah programmer menjadi kehilangan informasi yang terjadi dalam pembagian task pada matriks multiplication.

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 urutanthread mana yang dieksekusi terlebih dahulu dan mana yang diselesaikan lebih dahulu. Lalu hasil akhir dikeluarkan waktu yang dibutuhkan untuk menyelesaikan komputasi perkalian matriks tersebut.

Resource report hasil uji coba bisa dilihat pada url scribd berikut : http://www.scribd.com/doc/113621393/Hasil-Uji-Coba-Parallel-Programming-OpenMP

Sedangkan resource source code dapat dilihat pada url akun github berikut : https://github.com/situkangsayur/MatrixMxNOpenMP

Uraian Hasil Uji Coba

Dari hasil eksperimen yang didapat terdapat perbedaan yang cukup besar antarakecepatan proses ketika suatu proses (dalam kasus ini adalah perkalian 2 matriks)menggunakan prallel atau posix atau menggunakan lebih dari satu thread dibandingkandengan yang hanya menggunakan 1 thread.

Terlihat dalam grafik 1 dan 2, dalam proses perhitungan matriks pun banyak ordo yang dimiliki matriks, semakin besar ordomatriks, semakin besar pula waktu yang dibutuhkan untuk menyelesaikan perkalianmatriks tersebut. Dalam Figure 1 pun yang merupakan screen shot ketika CPU 1 danCPU 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 1threads untuk menyelesaikan perkalian matriks. Code yang dibuat dalam program inimemanfaatkan pragma dengan melakukan shared untuk variable yang menampungnilai-nilai matriks baik matrik A dan B yang merupakan 2 matrik yang akan dikenakanoperasi multiplikasi dan juga matriks C yang merupakan variable penampung matrikshasil perkalian matriks A dan B. Dan untuk variable yang berfungsi hanya sebagai iterator dan variable temporary dijadikan private karena untuk menghindarikemungkinan race condition terhadap setiap variable tersebut, karena variable tersebutsaling independent ketika thread dibagi menjadi lebih dari satu sehingga tidak adaketergantungan antara 1 variable iterator atau temporary dengan variable lainnya.

Setelah dilakukan perbandingan hasil uji coba antara penggunaan library openMP dan POSIX, terlihat hasil performasi dari masing-masing library ketika di implementasikan pada kasus operasi perkalian 2 matriks secara parallel. Cara POSIX menghasilkan performasi yang lebih baik, hasilnya jika diambil rata-rata hasil uji coba maka dapat dilihat bahwa POSIX menyelesaikan operasi tersebut lebih cepat dibandingkan dengan OpenMP, perkiraan yang terjadi adalah, bahwa ketika menggunkan POSIX, programmer dapat membentuk algoritma tertentu untk 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 diatur secara manual. Dan mungkin openMP dapat berjalan sama cepatnya dengan POSIX namun perlu explorasi lebih dalam mengenai bebagai fitur dai openMP itu sendiri sehingga dapat emmanfaatkan fitur yang tersedia secara efisien dan efektif.

semoga bermanfaat 😀
wassalam…
Advertisements

One thought on “Implementasi Parallel Progamming dengan OpenMP Pada Matriks Multiplication

  1. Nick November 16, 2016 / 11:18 am

    ada yang buat mencari determinan matrik ga? tolong dong 🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s