Senin, 29 Juni 2020

Konsep Dasar Parallel Computation, Distributed Processing, Architectural Parallel Computer, Thread Programming, Massage Passing, Open MP dan Pemrograman CUDA GPU

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;
  • Dijalankan 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.

Distributed Processing

Yang dimaksud Distributed 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.

Tahun 1970 setelah beban pekerjaan bertambah banyak dan harga perangkat komputer besar mulai terasa sangat mahal, maka mulailah digunakan konsep proses distribusi (Distributed Processing). Dalam proses ini beberapa host komputer mengerjakan sebuah pekerjaan besar secara paralel untuk melayani beberapa terminal yang tersambung secara seri disetiap host komputer. Dalam proses distribusi sudah mutlak diperlukan perpaduan yang mendalam antara teknologi komputer dan telekomunikasi, karena selain proses yang harus didistribusikan, semua host komputer wajib melayani terminal - terminalnya dalam satu perintah dari komputer pusat.

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.


Architectural Parallel Computer
Arsitektur komputer paralel ada beberapa versi pengertian. Di sini saya akan menjelaskan sedikit tentang arsitektur komputer menurut Flynn. Sesuai taksonomi Flynn, seorang Designer Processor, Organisasi Prosesor dibagi menjadi 4 :
  1. SISD, Single Instruction – Single Data. Komputer ini memiliki hanya satu prosesor dan satu instruksi yang dieksekusi secara serial. Komputer ini adalah tipe komputer konvensional. Beberapa contoh komputer yang menggunakan model SISD adalah UNIVAC1, IBM 360, CDC 7600, Cray 1 dan PDP 1.
  2. SIMD, Single Instruction – Multiple Data. Komputer ini memiliki lebih dari satu prosesor, tetapi hanya mengeksekusi satu instruksi secara paralel pada data yang berbeda pada level lock-step. Komputer vektor adalah salah satu komputer paralel yang menggunakan arsitektur ini. 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).
  3. MISD, Multiple Instructions – Single Data. Teorinya komputer ini memiliki satu prosesor dan mengeksekusi beberapa instruksi secara paralel. Sampai saat ini belum ada komputer yang menggunakan model MISD karena sistemnya tidak mudah.
  4. MIMD, Multiple Instructions – Multiple Data. Komputer ini memiliki lebih dari satu prosesor dan mengeksekusi lebih dari satu instruksi secara paralel. Tipe komputer ini yang paling banyak digunakan untuk membangun komputer paralel, bahkan banyak supercomputer yang menerapkan arsitektur ini. Beberapa komputer yang menggunakan model MIMD adalah IBM POWER5, HP/Compaq AlphaServer, Intel IA32, AMD Opteron, Cray XT3 dan IBM BG/L.

Sistem komputer paralel dibedakan dari cara kerja memorinya menjadi shared memory dan distributed memory. Shared memory berarti memori tunggal diakses oleh satu atau lebih prosesor untuk menjalankan instruksi sedangkan distributed memory berarti setiap prosesor memiliki memori sendiri untuk menjalankan instruksi. Komponen - komponen utama dari arsitektur komputer paralel cluster PC antara lain:
  • Prosesor (CPU). Bagian paling penting dalam sistem, untuk multicore terdapat lebih dari satu core yang mengakses sebuah memori (shared memory).
  • Memori. Bagian ini dapat diperinci lagi menjadi beberapa bagian penyusunnya seperti RAM, cache memory dan memori eksternal.
  • Sistem Operasi. Software dasar untuk menjalankan sistem komputer.
  • Cluster Middleware. Antarmuka antara hardware dan software.
  • Programming Environment dan Software Tools. Software yang digunakan untuk pemrograman paralel termasuk software pendukungnya.
  • User Interface. Software yang menjadi perantara hardware dengan user.
  • Aplikasi. Software berisi program permasalahan yang akan diselesaikan.
  • Jaringan. Penghubung satu PC (prosesor) dengan PC yang lain sehingga memungkinkan pemanfaatan sumberdaya secara simultan.


Thread Programming

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 Multi threading yang berguna untuk Multi processor dan Single processor. Kegunaan untuk system Multi processor, adalah :
  • Sebagai unit pararel atau tingkat granularitas pararelisme.
  • Peningkatan kinerja disbanding berbasis proses.


Kegunaan Multithreading pada single processor, 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.

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++.


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.

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.

Teknologi CUDA 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.




DAFTAR PUSTAKA
http://rachmatwidyan.blogspot.com/2018/03/parallel-computation.html
https://pandanwulan.wordpress.com/2015/06/28/konsep-distribusi-processing-arsitektur-komputer-paralel-thread-programming-message-passing-atau-openmp-dan-pemrograman-cuda-pada-gpu/
https://id.wikipedia.org/wiki/Jaringan_komputer
https://andri102.wordpress.com/game/soft-skill/konsep-komputasi-parallel-processing/#:~:text=Amdahl%20berpendapat%2C%20%E2%80%9CPeningkatan%20kecepatan%20secara,diperlukan%20untuk%20menyelesaikan%20sebuah%20masalah.%E2%80%9D
https://fikrinm93.wordpress.com/2016/06/17/242/