Parallel Computation

Komputasi paralel (Paralell Computation) adalah salah satu teknik melakukan komputasi secara bersamaan dengan memanfaatkan beberapa komputer independen secara bersamaan. Biasanya diperlukan saat kapasitas yang diperlukan sangat besar, baik karena harus mengolah data dalam jumlah besar ataupun karena tuntutan proses komputasi yang banyak. Untuk melakukan berbagai jenis komputasi paralel diperlukan infrastruktur mesin paralel yang terdiri dari banyak komputer yang dihubungkan dengan jaringan dan mampu bekerja secara paralel untuk menyelesaikan satu masalah. Adapun tujuan utama komputasi paralel adalah meningkatkan kinerja komputer dalam menyelesaikan berbagai masalah. Dengan membagi sebuah masalah besar ke dalam beberapa masalah kecil, membuat kinerja menjadi cepat.

 

Komputasi paralel membutuhkan :

  1. Algoritma
  2. Bahasa Pemrogaman
  3. Compiler

 

Masalah komputasi harus bisa :

  • dipecah menjadi potongan-potongan diskrit pekerjaan yang bisa dipecahkan secara bersamaan;
  • jalankan beberapa instruksi program setiap saat;
  • dipecahkan dalam waktu yang lebih singkat dengan beberapa sumber daya komputasi dibandingkan dengan satu sumber komputasi.

 

Sumber daya perhitungan biasanya :

  • satu komputer dengan beberapa prosesor / core
  • sejumlah komputer seperti itu sewenang-wenang yang dihubungkan oleh sebuah jaringan

 

Mengapa Menggunakan Komputasi Paralel

Dibandingkan dengan komputasi serial, komputasi paralel jauh lebih cocok untuk pemodelan, simulasi dan pemahaman fenomena dunia nyata yang kompleks, diantaranya :

  • Save Time

Secara teori, membuang lebih banyak sumber daya pada suatu tugas akan memperpendek waktu sampai selesai, dengan penghematan biaya potensial. Komputer paralel bisa dibangun dari komponen komoditas murah.

 

  • Solve Larger (Lebih Kompleks Masalah)

Banyak masalah begitu besar dan / atau rumit sehingga tidak praktis atau tidak mungkin untuk menyelesaikannya di satu komputer, terutama mengingat keterbatasan memori komputer.

 

  • Provide Concurrency (Menyediakan Konflik)

Sumber daya komputasi tunggal hanya bisa melakukan satu hal pada satu waktu. Beberapa sumber daya komputasi dapat melakukan banyak hal sekaligus.

 

Gambar 1. Proses Konsep Paralel

 

Di dalam komputasi parallel ada yang dinamakan dengan pemrograman parallel. Pemrograman paralel adalah teknik pemrograman komputer yang memungkinkan eksekusi perintah/operasi secara bersamaan (komputasi paralel), baik dalam komputer dengan satu (prosesor tunggal) ataupun banyak (prosesor ganda dengan mesin paralel) CPU. Bila komputer yang digunakan secara bersamaan tersebut dilakukan oleh komputer-komputer terpisah yang terhubung dalam suatu jaringan komputer lebih sering istilah yang digunakan adalah sistem terdistribusi (distributed computing).

 

Bahasa Pemrograman yang digunakan pada Pemrograman Parallel :

  1. MPI (Message Passing Interface)

Sebuah standard pemrograman yang memungkinkan pemrogram untuk membuat sebuah aplikasi yang dapat dijalankan secara paralel.

 

  1. PVM (Parallel Virtual Machine)

Perangkat lunak yang memungkinkan sekumpulan komputer yang heterogen terlihat seperti satu sistem komputer paralel dan dapat digunakan sebagai sebuah sumber daya komputasi yang koheren.

 

Parelel Komputasi terbagi atas 6 bagian, diantaranya :

  1. Parallelism Concept
  2. Distributed Processing
  3. Architectural Parallel Computer
  4. Pengantar Thread Programming
  5. Pengantar Massage Passing, OpenMP
  6. Pengantar Pemrograman CUDA GPU

 

  1. Parallelism Concept

 

Konsep dari Paralel Komputasional adalah bentuk dari perhitungan menggunakan computer yang dapat melakukan tugas secara banyak dan serentak dalam waktu yang bersamaan. Konsep ini digunakan untuk mempermudah untuk memecahkan masalah besar. Konsep ini dapat menyebabkan pelaksanaan komputasi dalam interval waktu yang sama, dalam waktu yang bersamaan, dan dalam rentang waktu yang saling tumpang tindih.

 

Lahirnya konsep Paralel Komputasional dikarenakan komputer tetap akan mengalami keterbatasan dalam hal kecepatan pemrosesannya, walaupun teknologi processor saat ini berkembang sangat pesat. Beberapa contoh tugas yang membutuhkan kecepatan pemrosesan yang tinggi diantaranya prakiraan cuaca, simulasi reaksi kimia, perhitugan aerodinamika, dan sebagainya.

 

Konsep Paralel Komputasional dapat ditinjau dari aspek desain mesin parallel, perkembangan bahasa pemrograman parallel dan dari aspek analisis algoritma parallel. Algoritma konsep itu sendiri memang difokuskan khusus kepada alhoritma yang berfungsi untuk menyelesaikan masalah numeric, sebab masalah numeric merupakan masalah yang memerlukan kecepatan komputasi yang sangat tinggi.

  1. Distributed Processing

 

Distribusi Processing adalah mengerjakan semua proses pengolahan data secara bersama antara komputer pusat dengan beberapa komputer yang lebih kecil dan saling dihubungkan melalui jalur komunikasi. Setiap komputer tersebut memiliki prosesor mandiri sehingga mampu mengolah sebagian data secara terpisah, kemudian hasil pengolahan tadi digabungkan menjadi satu penyelesaian total. Jika salah satu prosesor mengalami kegagalan atau masalah yang lain akan mengambil alih tugasnya.

 

Tujuan lain yang ingin dicapai dalam komputasi terdistribusi adalah transparansi. Kenyataan bahwa sumber daya yang dipakai oleh pengguna sistem terdistribusi berada pada lokasi fisik yang terpisah, tidak perlu diketahui oleh pengguna tersebut. Transparansi ini memungkinkan pengguna sistem terdistribusi untuk melihat sumber daya yang terpisah tersebut seolah-olah sebagai satu sistem komputer tunggal, seperti yang biasa digunakannya. Dalam prosesnya setiap komputer berinteraksi satu sama lain untuk mencapai tujuan bersama.

 

Contoh dari Distributed Data Processing System adalah:

  • ATM, komputer yang dirancang untuk tugas-tugas melaksanakan proyek, analisis finansial, penjadwalan waktu dan akuntansi.
  • Pengolahan data pada server yahoo yang tersebar hampir di seluruh dunia secara distribusi, setiap wilayah mempunyai server masing-masing. Seperti di indonesia mempunyai server tersendiri sehingga pengolahan data tidak di pusat melainkan di wilayah masing-masing, dll.
  1. Architectural Parallel Computer

 

Komputasi paralel adalah salah satu teknik melakukan komputasi secara bersamaan dengan memanfaatkan beberapa komputer secara bersamaan. Biasanya diperlukan saat kapasitas yang diperlukan sangat besar, baik karena harus mengolah data dalam jumlah besar ataupun karena tuntutan proses komputasi yang banyak. Untuk melakukan aneka jenis komputasi paralel ini diperlukan infrastruktur mesin paralel yang terdiri dari banyak komputer yang dihubungkan dengan jaringan dan mampu bekerja secara paralel untuk menyelesaikan satu masalah.

 

Arsitektur paralel komputer menurut Klasifikasi Flynn’s :

  1. SISD

Merupakan singkatan dari Single Instruction, Single Data adalah satu-satunya yang menggunakan arsitektur Von Neumann. Ini dikarenakan pada model ini hanya digunakan 1 processor saja. Oleh karena itu model ini bisa dikatakan sebagai model untuk komputasi tunggal. Sedangkan ketiga model lainnya merupakan komputasi paralel yang menggunakan beberapa processor. Beberapa contoh komputer yang menggunakan model SISD adalah UNIVAC1, IBM 360, CDC 7600, Cray 1 dan PDP 1.

Gambar 2. Arsitektur / Komputer Von Neumann

 

  1. SIMD

Merupakan singkatan dari Single Instruction, Multiple Data. SIMD menggunakan banyak processor dengan instruksi yang sama, namun setiap processor mengolah data yang berbeda. Sebagai contoh kita ingin mencari angka 27 pada deretan angka yang terdiri dari 100 angka, dan kita menggunakan 5 processor. Pada setiap processor kita menggunakan algoritma atau perintah yang sama, namun data yang diproses berbeda. Misalnya processor 1 mengolah data dari deretan / urutan pertama hingga urutan ke 20, processor 2 mengolah data dari urutan 21 sampai urutan 40, begitu pun untuk processor-processor yang lain. Beberapa contoh komputer yang menggunakan model SIMD adalah ILLIAC IV, MasPar, Cray X-MP, Cray Y-MP, Thingking Machine CM-2 dan Cell Processor (GPU).

 

  1. MISD

Merupakan singkatan dari Multiple Instruction, Single Data. MISD menggunakan banyak processor dengan setiap processor menggunakan instruksi yang berbeda namun mengolah data yang sama. Hal ini merupakan kebalikan dari model SIMD. Untuk contoh, kita bisa menggunakan kasus yang sama pada contoh model SIMD namun cara penyelesaian yang berbeda. Pada MISD jika pada komputer pertama, kedua, ketiga, keempat dan kelima sama-sama mengolah data dari urutan 1-100, namun algoritma yang digunakan untuk teknik pencariannya berbeda di setiap processor. Sampai saat ini belum ada komputer yang menggunakan model MISD.

 

  1. MIMD

Merupakan singkatan dari Multiple Instruction, Multiple Data. MIMD menggunakan banyak processor dengan setiap processor memiliki instruksi yang berbeda dan mengolah data yang berbeda. Namun banyak komputer yang menggunakan model MIMD juga memasukkan komponen untuk model SIMD. Beberapa komputer yang menggunakan model MIMD adalah IBM POWER5, HP/Compaq AlphaServer, Intel IA32, AMD Opteron, Cray XT3 dan IBM BG/L.

Pengantar Thread Programming

 

Gambar 3. Alur Threading

 

Threading / Thread adalah sebuah alur kontrol dari sebuah proses layanan informasi yang diminta oleh user. Konsep threading adalah menjalankan 2 proses yang sama atau proses yang berbeda dalam satu waktu. Banyak sistem operasi modern telah memiliki konsep yang memungkinkan sebuah proses untuk memiliki eksekusi multi-threads. Keuntungan dari multithreaded meliputi peningkatan respon dari pengguna, pembagian sumber daya proses, ekonomis, dan kemampuan untuk mengambil keuntungan dari arsitektur multiprosesor.

 

Multithreaded Process

Benefits / manfaat

  • Kemampuan reaksi
  • Sumber daya berbagi
  • Ekonomi
  • Scalabilas

 

Thread bermanfaat untuk Multithreading yang berguna untuk Multiprocessor dan Singleprocessor. Kegunaan untuk system Multiprocessor, adalah :

  • Sebagai unit pararel atau tingkat granularitas pararelisme.
  • Peningkatan kinerja disbanding berbasis proses.

 

Kegunaan Multithreading pada singleprocessor, adalah :

  • Kerja foreground dan background sekaligus di satu aplikasi.
  • Penanganan asynchronous processing menjadi lebih baik.
  • Mempercepat eksekusi program.
  • Pengorganisasian program menjadi lebih baik.

 

Multicore Programming

Multicore systems mendesak/memaksa para programmer untuk melewati tantangan yang meliputi :

  • Pembagian aktivitas
  • Saldo/Timbangan
  • Data yang telah hancur
  • Ketergantungan Data
  • Pengujian dan Debugging

 

Kegunaan Thread

Multithreading berguna untuk multiprocessor dan singleprocessor. Kegunaan untuk system multiprocessor adalah :

  • Sebagai unit pararel atau tingkat granularitas pararelisme.
  • Peningkatan kinerja disbanding berbasis proses.

 

Kegunaan multithreading pada singleprocessor, adalah :

  • Kerja foreground dan background sekaligus di satu aplikasi.
  • Penanganan asynchronous proseccing menjadi baik.
  • Mempercepat eksekusi program.
  • Pengorganisasian program menjadi lebih baik.

 

Manfaat utama banyak thread di satu proses adalah memaksimumkan derajat kongkurensi antara operasi-operasi yang terkait erat. Aplikasi jauh lebih efisien dikerjakan sebagai sekumpulan thread disbanding sekumpulan proses.

Threading dibagi menjadi 2 diantaranya :

 

  • Static Threading

Teknik ini biasa digunakan untuk komputer dengan chip multiprocessors. Teknik ini memungkinkan thread berbagi memori yang tersedia, menggunakan program counter dan mengeksekusi program secara independen. Sistem operasi menempatkan satu thread pada prosesor dan menukarnya dengan thread lain yang hendak menggunakan prosesor itu. Mekanisme ini disebut static karena lambat. Teknik ini juga tidak mudah diterapkan dan beresiko mengalami kesalahan. Alasannya, pembagian pekerjaan yang dinamis di antara thread-thread menyebabkan load balancing-nya cukup rumit. Programmer harus menggunakan protocol komunikasi yang kompleks untuk menerapkan scheduler load balancing. Kondisi ini mendorong pemunculan concurrency platforms yang menyediakan layer untuk mengkoordinasi, menjadwalkan, dan mengelola sumberdaya komputasi paralel. Sebagian platform dibangun sebagai runtime libraries atau sebuah bahasa pemrograman paralel lengkap dengan compiler dan pendukung runtime-nya.

 

  • Dynamic Multithreading

Concurrency platform ini menyediakan scheduler yang melakukan load balacing secara otomatis. Platformnya masih dalam pengembangan namun sudah mendukung dua fitur, yaitu nested parallelism dan parallel loops. Nested parallelism memungkinkan sebuah subroutine dimunculkan dalam jumlah banyak sehingga program utama tetap berjalan sementara subroutine menghitung hasilnya. Sedangkan parallel loops seperti halnya fungsi for namun memungkinkan iterasi loop dilakukan secara bersamaan.

  1. Pengantar Massage Passing, OpenMP

 

OpenMP (Open Multi-Processing) adalah sebuah antarmuka pemrograman aplikasi (API) yang mendukung multi processing shared memory pemrograman di C, C++ dan Fortran pada berbagai arsitektur, termasuk UNix dan Microsoft Windows platform. OpenMP Terdiri dari satu set perintah kompiler, perpustakaan rutinitas, dan variabel lingkungan yang mempengaruhi run-time. Banyak Aplikasi dibangun dengan model hibrida pemrograman paralel  dapat dijalankan pada komputer cluster dengan menggunakan OpenMP dan Message Passing Interface (MPI), atau lebih transparan dengan menggunakan ekstensi OpenMP non-shared memory systems. OpenMP merupakan model portabel dan skalabel yang memberikan interface sederhana dan fleksibel bagi programer shared memory dalam membangun aplikasi paralel. Program multithread dapat ditulis dalam berbagai cara. Beberapa diantaranya memungkinkan untuk melakukan interaksi yang kompleks antar thread. OpenMP mencoba untuk memberikan kemudahan pemrograman serta membantu dalam menghindari kesalahan program, melalui pendekatan terstruktur. Pendekatan ini dikenal sebagai model pemrograman fork-join.

 

Sejarah OpenMP dimulai dari diterbitkannya API pertama untuk Fotran 1.0 pada Oktober 1997 oleh OpenMP Architecture Review Board (ARB). Oktober tahun berikutnya OpenMP Architecture Review Board (ARB) merilis standart C / C++. Pada tahun 2000 mengeluarkan versi 2.0 untuk fotran dan poda tahun 2002 dirilis versi 2.0 untuk C / C++. Pada tahun 2005 dirilis versi 2.5 yang merupakan pengabungan fotran, C, dan C++/ pada mei 2008 versi 3.0 yang terdapat didalmnya konsept tasks dan task construct.

 

Kegunaan dari Message Passing ialah :

  1. Menyediakan fungsi-fungsi untuk menukar pesan.
  2. Menulis kode paralel secara portable.
  3. Mendapatkan performa yang tinggi dalam pemrograman paralel.
  4. Menghadapi permasalahan yang melibatkan hubungan data irregular atau dinamis yang tidak begitu cocok dengan model data paralel.

 

OpenMP mengimplementasi multithreading. Bagian kode yang akan dijalankan secara parallel ditandai sesuai dengan Preprocessor directif sehingga akan membuat thread-thread sebelum dijalnkan. Setiap thread memiliki id yang di buat menggunakan fungsi (omp_get_thread_num() pada C/C++ dan OMP_GET_THREAD_NUM() pada Fortran). Secara default, setiap thread mengeksekusi kode secara parallel dan independent. “Work-sharing constructs” dapat dapat digunakan untuk membagi tugas antar thread sehingga setiap thread menjalankan sesuai bagian alokasi kodenya. Fungsi OpenMP berada pada file header yang berlabel “omp.h” di C / C++.

Gambar 4. OpenMP Language Exntensions

 

OpenMP bekerja berdasarkan model shared memory, maka secara default data dibagi diantara thread-thread dan dapat terlihat dari setiap thread. Terkadang program akan membutuhkan variabel dengan nilai thread spesifik. Jika setiap thread memiliki variabel duplikat akan sangat berpotensi memiliki nilai yang berbeda-beda pada setiap variabel duplikat tersebut.

 

Sinkronisasi (pengkoordinasian) aksi dari thread adalah sesuatu yang sangat penting untuk menjamin data yang harus dibagi dan untuk mencegah terjadinya data race condition. Secara default OpenMP telah menyediakan mekanisme untuk menunggu thread dalam suatu tim thread sehingga semua thread menyelesaikan tugasnya dalam region, kemudian dapat melanjutkan ke proses selanjutnya. Mekanisme ini dikenal sebagai barrier.

  1. Pengantar Pemrograman CUDA GPU

 

CUDA (Compute Unified Device Architecture) merupakan platform komputasi paralel dan model pemrograman yang membuat penggunaan GPU untuk komputasi tujuan umum sederhana dan elegan. Pengembang masih memprogram di C, C ++, Fortran yang familiar, atau daftar bahasa pendukung yang terus berkembang, dan menggabungkan ekstensi bahasa ini dalam bentuk beberapa kata kunci dasar.Kata kunci ini membiarkan pengembang mengekspresikan sejumlah besar paralelisme dan mengarahkan kompilator ke bagian aplikasi yang memetakan ke GPU.

 

GPU ( Graphical Processing Unit ) awalnya adalah sebuah prosesor yang berfungsi khusus untuk melakukan rendering pada kartu grafik saja, tetapi seiring dengan semakin meningkatnya kebutuhan rendering, terutama untuk mendekati waktu proses yang realtime, maka meningkat pula kemampuan prosesor grafik tersebut. akselerasi peningkatan teknologi GPU ini lebih cepat daripada peningkatan teknologi prosesor sesungguhnya ( CPU ), dan pada akhirnya GPU menjadi General Purpose, yang artinya tidak lagi hanya untuk melakukan rendering saja melainkan bisa untuk proses komputasi secara umum.

 

Penggunaan Multi GPU dapat mempercepat waktu proses dalam mengeksekusi program karena arsitekturnya yang natively parallel. Selain itu Peningkatan performa yang terjadi tidak hanya berdasarkan kecepatan hardware GPU saja, tetapi faktor yang lebih penting adalah cara membuat kode program yang benarbenar bisa efektif berjalan pada Multi GPU.

 

CUDA merupakan teknologi anyar dari produsen kartu grafis Nvidia, dan mungkin belum banyak digunakan orang secara umum. Kartu grafis lebih banyak digunakan untuk menjalankan aplikasi game, namun dengan teknologi CUDA ini kartu grafis dapat digunakan lebih optimal ketika menjalankan sebuah software aplikasi. Fungsi kartu grafis Nvidia digunakan untuk membantu Processor (CPU) dalam melakukan kalkulasi dalam proses data.

 

CUDA merupakan singkatan dari Compute Unified Device Architecture, didefinisikan sebagai sebuah arsitektur komputer parallel, dikembangkan oleh Nvidia. Teknologi ini dapat digunakan untuk menjalankan proses pengolahan gambar, video, rendering 3D, dan lain sebagainya. VGA – VGA dari Nvidia yang sudah menggunakan teknologi CUDA antara lain : Nvidia GeForce GTX 280, GTX 260,9800 GX2, 9800 GTX+,9800 GTX,9800 GT,9600 GSO, 9600 GT,9500 GT,9400 GT,9400 mGPU,9300 mGPU,8800 Ultra,8800 GTX,8800 GTS,8800 GT,8800 GS,8600 GTS,8600 GT,8500 GT,8400 GS, 8300 mGPU, 8200 mGPU, 8100 mGPU, dan seri sejenis untuk kelas mobile ( VGA notebook ).

 

Singkatnya, CUDA dapat memberikan proses dengan pendekatan bahasa C, sehingga programmer atau pengembang software dapat lebih cepat menyelesaikan perhitungan yang komplek. Bukan hanya aplikasi seperti teknologi ilmu pengetahuan yang spesifik. CUDA sekarang bisa dimanfaatkan untuk aplikasi multimedia. Misalnya meng-edit film dan melakukan filter gambar. Sebagai contoh dengan aplikasi multimedia, sudah mengunakan teknologi CUDA. Software TMPGenc 4.0 misalnya membuat aplikasi editing dengan mengambil sebagian proces dari GPU dan CPU. VGA yang dapat memanfaatkan CUDA hanya versi 8000 atau lebih tinggi.