laporan parallel processing

24

Upload: txcom2003

Post on 26-Jun-2015

361 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: Laporan Parallel Processing

PARALLEL PROCESSING dengan MESSAGEPASSING INTERFACE (MPI)

7 Mei 2007

Tonny Kusdarwanto [2203 100 030]Dwi Joko Susilo [2204 100 164]

1

Page 2: Laporan Parallel Processing

Daftar Isi1 Pendahuluan 3

1.1 The Message Passing Model . . . . . . . . . . . . . . . . . . . . 31.2 Penggunaan MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.3 Fitur dasar dari program-program Message Passing . . . . . . . . 3

2 Implementasi Sistem 42.1 Kebutuhan Sistem . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 Instalasi Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3 Kon�gurasi : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.3.1 LAM/MPI . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3.2 SSH ( Secure Shell ) . . . . . . . . . . . . . . . . . . . . . 62.3.3 NFS (Netwok File System) . . . . . . . . . . . . . . . . . 7

2.4 Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3 Percobaan-percobaan 83.1 Memulai LAM/MPI . . . . . . . . . . . . . . . . . . . . . . . . . 83.2 Meng-compile dan menjalankan program parallel dengan MPI . . 10

3.2.1 Mengkompile Program parallel dengan MPI . . . . . . . . 103.2.2 Menjalankan MPI . . . . . . . . . . . . . . . . . . . . . . 10

3.3 Pemrograman Parallel dengan MPI . . . . . . . . . . . . . . . . . 113.3.1 Communicator . . . . . . . . . . . . . . . . . . . . . . . . 123.3.2 Point-to-Point Communications and Messages . . . . . . . 133.3.3 Collective Communication . . . . . . . . . . . . . . . . . . 16

3.4 Reduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.5 Gather . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.6 Scatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

2

Page 3: Laporan Parallel Processing

1 PendahuluanSalah satu metode pemrograman yang digunakan untuk komputasi paralleladalah dengan menggunakan library-library dari message passing. Library-library ini mengatur transfer data antar instan-instan program parallel yangbiasanya berjalan pada multi prosessor dalam arsitektur komputasi parallel.

1.1 The Message Passing ModelMessage Passing Interface (MPI) merupakan implementasi standar dari model"message passing" komputasi parallel.

Sebuah komputasi parallel terdiri dari sejumlah proses, dimana masing-masing bekerja pada beberapa data lokal. Setiap prsoses mempunyai variabellokal, dan tidak ada mekanisme suatu proses yang bisa mengakses secara lang-sung memori yang lain.

Sharing data antar proses-proses dilakukan dengan message passing., yaitudengan mengirim dan menerima message antar proses-proses. Alasan menggu-nakan model ini sudah sangat umum. Dan tipe komputasi parallel dapat dibuatdalam bentuk message passing. Model ini juga dapat diimplementasikan pa-da bermacam-macam platform, seperti shared-memory multiprocessors maupunsingle processor.

1.2 Penggunaan MPIMPI perlu digunakan ketika kita menginginkan :

1. Menulis kode parallel yang portable

2. Mendapatkan performa yang tinggi dalam pemrograman parallel

3. Menghadapi permasalahan yang melibatkan hubungan data irregular ataudinamis yang tidak begitu cocok dengan model data-parallel.

1.3 Fitur dasar dari program-program Message PassingProgram message passing terdiri dari multiple instan dari program serial yangberkomunikasi dengan pemanggilan library. Pemanggilan ini dapat dibagi men-jadi empat kelas :

1. Pemanggilan untuk inisialisasi, mengatur, dan memutuskan komunikasi.

2. Pemanggilan untuk mengkomunikasikan beberapa pasang prosesor.

3. Pemanggilan yang mewujudkan operasi-operasi komunikasi diantara kelompok-kelompok prosesor.

4. Pemanggilan untuk membuat tipe data acak (arbitrary)

3

Page 4: Laporan Parallel Processing

Kelas pertama dari pemanggilan terdiri dari pemanggilan-pemanggilan untukmemulai komunikasi, mengidenti�kasi jumlah prosesor yang sedang digunakan,membuat subgrup dari prosesor-prosesor dan mengidenti�kasi prosesor manayang sedang menjalankan instan khusus dari program.

Kelas kedua dari pemanggilan, dinamakan komunikasi point-to-point, terdiriatas tipe pengiriman dan penerimaan yang berbeda.

Kelas ketiga dari pemanggilan adalah operasi kolektif yang memberikansinkronisasi antar grup proses dan pemanggilan yang melakukan operasi ko-munikasi/kalkulasi.

Kelas terakhir dari pemanggilan memberikan �eksibilitas dalam berurusandengan struktur data yang rumit.

2 Implementasi Sistem2.1 Kebutuhan SistemDalam implementasi LAM/MPI yang kami lakukan di sini menggunakan 4 buahkomputer yagn terhubung dengan LAN dengan spesi�kasi sebagai berikut :

Tabel 1: Resource KomputerNode 0 (induk) Node 1 (anak) Node 2 (anak) Node 3 (anak)

IP Address 10.122.67.8 10.122.67.5 10.122.67.7 10.122.67.9Prosesor Pentium IV 2.4 GHz Pentium IV 2.4 GHz Pentium IV 2.4 GHz Pentium IV 2.4 GHzMemori 512 MB 512 MB 512 MB 512 MB

Sistem Operasi Debian Etch Debian Etch Ubuntu Edgy Debian EtchKernel 2.6.18 2.6.18 2.6.18 2.6.18

Topologi jaringan yang dipakai adalah star. Desainnya adalah sebagai berikut:

Gambar 1: Desain jaringan

4

Page 5: Laporan Parallel Processing

2.2 Instalasi PaketPaket-paket yang dibutuhkan untuk mengimplementasikan LAM/MPI ini an-tara lain :

1. Paket-paket LAM/MPI yang terdiri dari :

(a) lam4c2(b) lam-runtime(c) lam4-dev

2. Paket-paket SSH yang terdiri dari :

(a) openssh-server(b) openssh-client

3. Paket-paket NFS (Network File System) yang terdiri dari :

(a) nfs-common(b) nfs-kernel-server

2.3 Kon�gurasi :2.3.1 LAM/MPIBooting LAM

Sebelum programmpi dijalankan, LAM runtime environment harus dijalankan.Hal ini biasa disebut booting LAM. Proses booting yang sukses akan membuatinstan dari LAM runtime environment yang biasa disebut dengan LAM uni-verse.

Untuk booting LAM, pada cluster of workstation dibutuhkan remote shell,seperti rsh dan ssh, yang digunakan untuk mengeksekusi lamd (lam daemon),dan program pada workstation.

Ketika menggunakan remote shell, �le boot schema diperlukan sebagai daftardari komputer sebagai node yang akan dijalankan LAM runtime. Nama laindari bootschema adalah host �le atau machine �le. Contoh isi dari bootschemaadalah

Kode 1 Kon�gurasi �le bootschema# My Boot Schema10.122.67.810.122.67.510.122.67.710.122.67.9

File bootschema ini secara default berada di /etc/lam/bhost.def , namunapabila setiap user ingin memiliki kon�gurasi node-node yang berbeda bisamembuat �le bootschema sendiri.

5

Page 6: Laporan Parallel Processing

2.3.2 SSH ( Secure Shell )SSH (Secure Shell) merupakan sebuah program untuk untuk login ke remotemachine dan mengeksekusi perintah-perintah di remote machine. Ssh mem-berikan komunikasi terenkripsi yang aman antara dua untrusted hosts dalamsebuah jaringan yan tidak secure. SSH ditujukan sebagai pengganti rlogin, rsh,rcp dan dapat digunakan untuk memberikan kanal komunikasi yang aman untukaplikasi-aplikasi.

Dalam LAM/MPI SSH diperlukan untuk membuat node master dapat me-remote node slave tanpa menggunakan password. Node master me-remote nodeslave untu menjalankan lamd, dan menjalankan program MPI non interactively,sehingga tujuan dari portabilitas standar MPI dapat tercapai.

Sebelumnya servis SSH pada node slave harus distart terlebih dahulu:

Kode 2 Perintah menjalankan server SSH# /etc/init.d/ssh start

Kemudian membuat RSA-key pada node master, dengan cara :

Kode 3 Kon�gurasi membuat RSA-keysasuke@debian8:~$ ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file in which to save the key (/home/sasuke/.ssh/id_rsa):Enter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /home/sasuke/.ssh/id_rsa.Your public key has been saved in /home/sasuke/.ssh/id_rsa.pub.The key fingerprint is:7a:43:03:53:73:0e:a1:8e:47:66:40:4d:f5:3b:32:a6 sasuke@debian8

Untuk membuat node master dapat me-remote need slave tanpa passwordmaka passphrase pada saat pembuatan RSA-key tidak perlu diisikan sepertipada contoh diatas.

Saat pembuatan RSA-ke, dibuat pasangan dari key , yaitu public key danprivate key, yang secara defaults diletakkan pada memory pada directory .ssh.File id_rsa.pub adalah public key sedangkan id_rsa adalah private-key. Agarnode-master dapat login tanpa password, public-key yang sudah dibuat olehnode master harus dimiliki oleh node slave. OpenSSH menyediakan tools untumengkopi public key yaitu ; ssh-copy-id.

6

Page 7: Laporan Parallel Processing

Kode 4 Perintah mengkopi public-key ke node slavesasuke@debian8:~$ ssh-copy-id -i .ssh/id_rsa.pub [email protected]@10.122.67.5's password:Now try logging into the machine, with "ssh '[email protected]'", andcheck in:.ssh/authorized_keysto make sure we haven't added extra keys that you weren't expecting.

Setelah mengkopi public key ke node slave, koneksi melalui ssh perlu ditestuntuk remote ke OpenSSH server yang telah menerima public-key dari nodemaster, dengan cara:

Kode 5 Mengetes koneksi SSHsasuke@debian8:~$ ssh 10.122.67.5Linux debian5 2.6.18-4-686 #1 SMP Mon Mar 26 17:17:36 UTC 2007 i686The programs included with the Debian GNU/Linux system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright.Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extentpermitted by applicable law.Last login: Fri May 4 18:26:59 2007 from 10.122.67.8

Test berhasil apabila node master dapat me-remote node slave tanpa adapermintaan password.

2.3.3 NFS (Netwok File System)Setelah berhasil menginstall dari paket nfs-kernel-server, perlu dilakukan kon�g-urasi dari /etc/exports, untuk menentukan computer mana saja yang menjadiNFS client.

Kode 6 Kon�gurasi /etc/exports pada node master/home/sasuke/parallel210.122.67.5(rw,insecure,no_root_squash,sync,no_subtree_check)10.122.67.7(rw,insecure,no_root_squash,sync,no_subtree_check)10.122.67.9(rw,insecure,no_root_squash,sync,no_subtree_check)

kon�gurasi diatas artinya hosts yang tercantum pada /etc/exports diatasdiberi hak baca tulis, synchronous I/O , dan hak root pada NFS server danclient sama pada saat nfs client melakukan mounting .

setelah dilakukan kon�gurasi NFS server dapat dijalankan dengan perintah:

Kode 7 Perintah Menjalankan NFS server# /etc/init.d/nfs-kernel-server start

7

Page 8: Laporan Parallel Processing

Kon�gurasi Pada ClientUntuk menggunakan servis NFS yang disediakan oleh server, maka client

hanya membutuhkan utility mount yang biasanya sudah terpasang dengan wak-tu instalasi system Linux. Pada aplikasi ini shared storage diletakkan pada pathyang sama pada semua node dengan tujuan untuk memudahkan dalam men-jalankan program MPI yang menggunakan model SPMD ( Single Program Mul-tiple Data ). Direktori yang di-share akan dimount pada path /home/sasuke/parallel2.Sehingga perlu dibuatkan direktori /home/sasuke/parallel2 apabila belum ada.

Untuk melakukan mounting secara otomatis setiap kali sistem direstart maka�le /etc/fstab perlu diedit sebagaimana berikut :

Kode 8 Kon�gurasi �le /etc/fstab untuk mounting NFS10.122.67.8:/home/sasuke/parallel2 /home/sasuke/parallel2 nfs defaults 00

selanjutnya untuk melakukan mounting nfs dari kon�gurasi yang ada di �le/etc/fstab digunakan perintah sbb :

Kode 9 Perintah mounting NFSmount /home/sasuke/parallel2

Contoh diatas adalah perintah untuk melakukan mount volume /home/sasuke/parallel2pada nfs-server 10.122..67.8 dan dimount pada directory target /home/sasuke/parallel2.Dengan cara diatas berarti isi direktori /home/sasuke/parallel2 pada client akansama persis dengan direktori /home/sasuke/parallel2 pada nfs-server. Sebelummelakukan mounting NFS harus dibuat terlebih dulu direktori /home/sasuke/parallel2.

2.4 PermissionsPermissions disini menyangkut soal hak akses terhadap �le resource yang digu-nakan. Sebelum memulai LAM/MPI harus dipastikan bahwa user yang inginmengakses �le resource mempunyai hak akses atas �le/program resource yangingin diproses secara parallel, yaitu �le/program yang dishare dengan NFS. Pa-da percobaan yang kami lakukan, kami menyamakan uid dan gid dari user yangbersangkutan. Kalau hanya untuk menjalankan program yang diparallel tidakperlu mengubah uid dan gid, cukup dengan chmod saja dengan menambahkanoption executable untuk other user.

3 Percobaan-percobaan3.1 Memulai LAM/MPI

1. Perintah booting untuk LAM adalah dengan mengetikan lamboot padashell. Contohnya:

8

Page 9: Laporan Parallel Processing

Kode 10 Perintah mencoba booting LAMsasuke@debian8:~$ lamboot -v bootschemaLAM 7.1.2/MPI 2 C++/ROMIO - Indiana Universityn-1<14131> ssi:boot:base:linear: booting n0 (10.122.67.8)n-1<14131> ssi:boot:base:linear: booting n1 (10.122.67.5)n-1<14131> ssi:boot:base:linear: booting n2 (10.122.67.7)n-1<14131> ssi:boot:base:linear: booting n3 (10.122.67.9)n-1<14131> ssi:boot:base:linear: finished

2. Untuk mengetahui berapa banyak node dan CPU pada LAM universeadalah menggunakan perintah lamnodes pada shell

Kode 11 Perintah lamnodessasuke@debian8:~$ lamnodesn0 debian8:1:origin,this_noden1 10.122.67.5:1:n2 10.122.67.7:1:n3 10.122.67.9:1:

3. Perintah lamcleanPerintah lamclean secara komplit menghilangka semua proses sari programyang berjalan pada LAM universe. Lamclean berguna jika program par-alel mengalami crash/leave state pada LAM runtime environment. peng-gunaan lamclean biasanya digunakan tanpa argumen:

Kode 12 Perintah lamcleansasuke@debian8:~$ lamclean

Penggunaan lamclean biasanya dibutuhkan saat melakukan developing/debuggingdari aplikasi MPI. Sebgai contoh program yang hang, message yang ter-sisa, dan lain-lain.

4. Shutdown LAM UniverseSetelah selesai, tidak meggunakan LAM universe lagi maka LAM universeperlu untuk di-shutdown menggunakan perintah lamhalt.

Kode 13 Perintah lamhaltsasuke@debian8:~$ lamhalt

5. Ada saat keadan tertentu, lamhalt gagal, sebagai contoh salah satu nodemengalami kegagalan komunikasi sehinga terjadi crash, apabila lamhaltdipanggil maka akan terjadi timeout sehingga tidak semua node haltingLAM Universe. Pada kasus seperti ini dibutuhkan perintah lamwipe untukmemastikan bahwa semua node halting LAM universe.

9

Page 10: Laporan Parallel Processing

Kode 14 Perintah lamwipesasuke@debian8:~$ lamwipe -v bootschema

Dimana bootschema adalah bootschema yang sama ketika dilakukan lam-booting.

3.2 Meng-compile dan menjalankan program parallel den-gan MPI

3.2.1 Mengkompile Program parallel dengan MPISebagai catatan untuk mengkompile program MPI tidak perlu melakukan boot-ing LAM. Sebenarnya untuk mengkopile program MPI bisa menjdi pekerjaanyang kompleks, LAM/MPI menyediakan wrapper untuk membuat pekejaanmengkopile ataupun linking menjadi mudah. Wrapper ini secara otomatis menam-bahkan �ags cmpiler/linker yang dibutuhkan hubungannya dengan fungsi-fungsidalam MPI.

Kompiler wrapper tersebut dinamkan sebagai mpicc ( untuk program bahasaC ) mpiCC, mpic++ ( untuk program dengan bahasa c++ ) dan mpif77 ( untukprogram dengan bahasa fortran ). Contohnya:

Kode 15 Perintah mengkompile dengan mpiccsasuke@debian8:~$ mpicc -o outputfile inputfile.c

3.2.2 Menjalankan MPISetelah sukses booting LAM, mengkompile program MPI, maka program terse-but dapat dijalankan secara paralel.

1. Perintah mpirunPerintah mpirun mempunyai banyak options untuk menjalankan programMPI. kegunaan utama dari mpirun adalah menjalankan progran denganmode SPMD( Single Program Multiple Data). Contoh yang paling seder-hana dalam menjalankan program SPMD adalah :

Kode 16 Perintah menjalankan program secara parallel dengan mpisasuke@debian8:~$ mpirun N filename

Yang berarti menjalankan program �lename pada semua node yang ter-cantum pada boot schema sebanyak satu kopi untuk semua node sesuaidengan jumlah CPU yang dide�nisikan pada boot schema.

2. Perintah mpiexecMPI-2 merekomendasikan penggunaan mpiexec untuk proses startup pro-gram yang portable. Ada beberapa options yang dimiliki mpiexec tidak

10

Page 11: Laporan Parallel Processing

similiki oleh mpirun demikian juga sebaliknya. Penggunaan mpiexec di-lakukan bila :

(a) Menjalankan program mode MPMD ( multiple program multiple da-ta )

(b) Menjalankan program yang heterogen(c) Menljalankan program secara one-shot yang arinya booting LAM,

menjalankan program kemudian halt LAM

Bentuk umum dari mpiexec adalah :

Kode 17 Perintah umum mpiexecShell$ mpiexec <options> <perintah1> : <perintah2> : .......

3. Perintah mpitaskMpitask dapat dianalogikan seperti perintah ps pada sistem Unix base, di-mana menunjukkan status dari mpi program yang berjalan pada LAM uni-verse dan menunjukkan primitive informasi mengenai fungsi-fungsi MPIyang dieksekusi jika ada. Mpitask dapat dijalankan pada semua nodespada LAM unverse.

3.3 Pemrograman Parallel dengan MPIDalam percobaan ini bahasa pemrograman yang dipakai adalah bahasa C. Pro-gram parallel dengan MPI mempunyai struktur sebagai berikut :

Kode 18 Struktur dasar program parallelinclude MPI header filevariable declarationsinitialize the MPI environment...do computation and MPI communication calls...close MPI communications

Contoh program :

Kode 19 Program Hello World#include <stdio.h>#include <mpi.h>void main (int argc, char *argv[]) {int err;err = MPI_Init(&argc, &argv);printf("Hello world!\n");err = MPI_Finalize();}

11

Page 12: Laporan Parallel Processing

keterangan :MPI_Init(&argc, &argv)merupakan rutin unutk inisialisasi programMPI yakni

membangun lingkungan MPI.MPI_Finalize() merupakan rutin untuk mengakhiri program MPI, yakni mem-

bersihkan semua struktur data MPI, membatalkan oeprasi-operasi yang tidak selesai,dll.

Output program :

Hello world!Hello world!Hello world!Hello world!

Gambar 2: Output kode 19

Pada output program di atas terlihat bahwa program dijalankan oleh 4 pros-essor, sehingga menghasilkan pesan �Hello world!� sebanyak empat kali.

3.3.1 CommunicatorCommnunicator adalah handle yang merepresentasikan sebuah grup dari prosesor-prosesor yang dapat berkomunikasi satu dengan yang lain. Prosesor-prosesor da-pat berkomunikasi hanya jika mereka dalam communicator yang sama. dengancommunicator, prosesor-prosesor diberi nomor secara berurutan dimulai dari 0.nomor identi�kasi tersebut disebut sebagai rank prosesor dalam communicator-nya. Jika sebuah prosesor ternasuk ke dalam lebih dari satu communicator,rank-nya bisa saja berbeda untuk tiap-tiap communicator.

MPI secara otomatis memberikan sebuah communicator dasar yaitu MPI_COMM_WORLD.Ini merupakan communicator yang terdiri dari semua prosesor. Dengan meng-gunakannya setiap prosesor dapat berkomunikasi dengan prosesor yang lain.

Contoh program parallel yang memanfaatkan communicator sebagai berikut:

Kode 20 Program melihat rank dan size communicator#include <stdio.h>#include<mpi.h>void main (int argc, char *argv[]) {int myrank, size;MPI_Init(&argc, &argv); /* Initialize MPI */MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /* Get my rank */MPI_Comm_size(MPI_COMM_WORLD, &size); /* Get the total number ofprocessors */printf("Processor %d of %d: Hello World!\n", myrank, size);MPI_Finalize(); /* Terminate MPI */}

Keterangan :

12

Page 13: Laporan Parallel Processing

MPI_Comm_rank - digunakan untuk mengetahui rank dari prosesor dalam com-municatornya

MPI_Comm_size - digunakan untuk mengetahui banyaknya prosesor yang adadalam communicator.

Output program :

Processor 0 of 4 : Hello World!Processor 1 of 4 : Hello World!Processor 2 of 4 : Hello World!Processor 3 of 4 : Hello World!

Gambar 3: Output kode 20

3.3.2 Point-to-Point Communications and Messages1. Blocking Communication

Operasi komunikasi yang mendasar dalam MPI adalah komunikasi "point-to-point", yang merupakan komunikasi langsung antara dua prosesor, satudiantaranya mengirim dan satu diantaranya menerima. dalam mengirimdan menerima, message terdiri dari envelope yang berisi source dan des-tination processor, dan body yang berisi data sebenarnya yang dikirim.MPI menggunakan tiga informasi pada message body nya secara �eksibel,yaitu :

(a) Bu�er - lokasi awal dalam memori dimana data yang akan dikirimditemukan atau tempat dimana data yang akan diterima disimpan.

(b) Datatype - tipe data yang akan dikirim(c) Count - jumlah item data yang akan dikirim

Beberapa contoh fungsi dalam point-to-point communication adalah pros-es mengirim (send) dan proses menerima (receive). Keduua fungsi terse-but menghalangi (blocking) proses pemanggilan hingga operasi komunikasitersebut selesai. Blocking bisa menjadi sebab terjadinya deadlock. Dead-lock terjadi ketika 2 atau lebih proses di-block dan tiap proses menung-gu proses yang lain untuk membuat progress. bentuk umum dari prosesmengirim dan menerima (keduanya merupakan proses blocking) sebagaiberikut :

(a) Fungsi mengirim (send) message :

Kode 21 Fungsi mengirim (send)int MPI_Send(void *buf, int count, MPI_Datatype dtype, int dest, int tag,MPI_Comm comm);

13

Page 14: Laporan Parallel Processing

(b) Fungsi menerima (receive) message :

Kode 22 Fungsi menerima (receive)int MPI_Recv(void *buf, int count, MPI_Datatype dtype, int source, inttag, MPI_Comm comm, MPI_Status *status);

Contoh program point-to-point communication sebagai berikut :

Kode 23 Program point-to-point communication/* simple send and receive */#include <stdio.h>#include <mpi.h>void main (int argc, char **argv) {int myrank; MPI_Status status; double a[100];MPI_Init(&argc, &argv); /* Initialize MPI */MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /* Get rank */if( myrank == 0 ) /* Send a message */MPI_Send( a, 100, MPI_DOUBLE, 1, 17, MPI_COMM_WORLD );else if( myrank == 1 ) /* Receive a message */MPI_Recv( a, 100, MPI_DOUBLE, 0, 17, MPI_COMM_WORLD, &status );MPI_Finalize(); /* Terminate MPI */}

Keterangan :Dalam program ini proses 0 mengirim sebuah message ke proses 1, danproses 1 menerimanya.Program di bawah ini merupakan contoh terjadinya kasus deadlock . Tidakada messages yang dikirim maupun messages yang diterima.

14

Page 15: Laporan Parallel Processing

Kode 24 Program deadlock/* simple deadlock */#include <stdio.h>#include <mpi.h>void main (int argc, char **argv) {int myrank;MPI_Status status;double a[100], b[100];MPI_Init(&argc, &argv); /* Initialize MPI */MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /* Get rank */if( myrank == 0 ) { /* Receive, then send a message */MPI_Recv( b, 100, MPI_DOUBLE, 1, 19, MPI_COMM_WORLD, &status );MPI_Send( a, 100, MPI_DOUBLE, 1, 17, MPI_COMM_WORLD ); }else if( myrank == 1 ) {/* Receive, then send a message */MPI_Recv( b, 100, MPI_DOUBLE, 0, 17, MPI_COMM_WORLD, &status );MPI_Send( a, 100, MPI_DOUBLE, 0, 19, MPI_COMM_WORLD ); }MPI_Finalize(); /* Terminate MPI */}

2. NonBlocking CommunicationMPI menyediakan cara lain untuk operasi pengiriman dan penerimaanmessage. Dalam hal ini memungkinkan untuk memisahkan inisialisasipengiriman atau penerimaan dari proses penyelesaiannya. Pemanggilanpertama adalah untuk inisialisasi dan pemanggilan kedua adalah menye-lesaikannya. Pemakaian yang selektif dari rutin nonblocking memudahkanpemrogram untuk menghindari deadlock.Contoh program di bawah ini merupakan berpaikan dari contoh programdi atas yang memanfaatkan nonblocking communication.

15

Page 16: Laporan Parallel Processing

Kode 25 Program non-blocking communication/* deadlock avoided */#include <stdio.h>#include <mpi.h>void main (int argc, char **argv) {int myrank;MPI_Request request;MPI_Status status;double a[100], b[100];MPI_Init(&argc, &argv); /* Initialize MPI */MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /* Get rank */if( myrank == 0 ) {/* Post a receive, send a message, then wait */MPI_Irecv( b, 100, MPI_DOUBLE, 1, 19, MPI_COMM_WORLD, &request );MPI_Send( a, 100, MPI_DOUBLE, 1, 17, MPI_COMM_WORLD );MPI_Wait( &request, &status );}else if( myrank == 1 ) {/* Post a receive, send a message, then wait */MPI_Irecv( b, 100, MPI_DOUBLE, 0, 17, MPI_COMM_WORLD, &request);MPI_Send( a, 100, MPI_DOUBLE, 0, 19, MPI_COMM_WORLD );MPI_Wait( &request, &status );}MPI_Finalize(); /* Terminate MPI */}

Keterangan :Proses 0 mencoba untuk melakukan pertukaran message dengan proses 1.Setiap proses dimulai dengan mem-posting proses penerimaan message keproses yang lain. Kemudian setiap proses mengirim blocking message danmengunggu proses penerimaan yang sebelumnya di-posting hingga selesai.

3.3.3 Collective CommunicationRutin collective communication mentransmisikan data diantara senua prosesyang ada dalam sebuah grup (communicator). Hal pernting yang perlu dicatatbahwa komunikasi ini tidak menggunakan mekanisme tag dari proses pemang-gilan pengiriman/penerimaan. Maka dari itu user harus memastikan semuaprosesor mengeksekusi pemanggilam collective communication yang sama danmengeksekusinya dalam order yang sama.

1. Barrier SynchronizationAda beberapa kasus dimana beberapa prosesor tidak dapat memprosesinstruksi selanjutnya sebelum prosesor yang lain selesai menjalankan in-struksinya saat itu. Rutin MPI_Barrier mem-blok proses pemanggilan

16

Page 17: Laporan Parallel Processing

hingga semua proses yang ada dalam grup telah memanggil rutin terse-but. syntax umum MPI_Barrier adalah sebagai berikut :

Kode 26 Fungsi Barrierint MPI_Barrier ( MPI_Comm comm )

2. Broadcast

Rutin MPI_Bcast memungkinkan programmer untuk mengkopi data dari mem-ori prosesor induk ke lokasi memori yang sama pada prosesor yang lain dalamcommunicator.

Gambar 4: Contoh sederhana dari Broadcast

syntax:

Kode 27 Fungsi MPI_BcastMPI_Bcast ( send_buffer, send_count, send_type, rank, comm )

Argumen-argumen dari rutin ini adalah :send_bu�er in/out alamat awal dari bu�er pengirimansend_count in jumlah elemen-elemen dalam bu�er pegirimansend_type in tipe data dari elemen-elemen dalam bu�er pengirimanrank in rank dari proses indukcomm in mpi communicator

Kode 28 Fungsi MPI_Bcastint MPI_Bcast ( void* buffer, int count,MPI_Datatype datatype, int rank,MPI_Comm comm )

Contoh program :

17

Page 18: Laporan Parallel Processing

Kode 29 Program contoh MPI_Bcast#include <mpi.h>void main(int argc, char *argv[]) {int rank;double param;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);if(rank==0) param=23.0;MPI_Bcast(&param,1,MPI_DOUBLE,0,MPI_COMM_WORLD);printf("P:%d after broadcast parameter is %f \n",rank,param);MPI_Finalize();}

Output program:

P: 0 after broadcast param is 23.P: 2 after broadcast param is 23.P: 3 after broadcast param is 23.P: 1 after broadcast param is 23.

Gambar 5: Output kode 29

3.4 ReductionDengan MPI_Reduce memungkinkan programmer untuk :

1. mengumpulkan data dari tiap-tiap prosesor

2. mereduksi data-data tersebut ke sebuah nilai tunggal

3. dan menyimpan hasil reduksi tersebut ke prosesor induk

18

Page 19: Laporan Parallel Processing

Gambar 6: A Simple Reduction Example

syntax :

Kode 30 Fungsi reductionMPI_Reduce( send_buffer, recv_buffer, count, data_type,reduction_operation, rank_of_receiving_process, communicator )

The arguments for this routine are:send_buffer in alamat dari bu�er pengirimanrecv_buffer out alamat dari bu�er penerimaancount in banyaknya elemen-elemen dari bu�er pengirimandata_type in tipe data dari elemen-elemen dalam bu�er pengirimanreduction_operation in operasi reduksi yang dilakukanrank_of_receiving_process in rank dari proses indukcomm in mpi communicatorMPI_Reduce mengkombinasikan yang ada dalam bu�er pengiriman, dan

melakukan operasi spesi�k ( seperti : sum, min, max) dan mengembalikan hasil-nya ke bu�er pernerimaan pada prosesor induk.

Beberapa operasi yang tersedia dalam MPI_Reduce antara lain :

19

Page 20: Laporan Parallel Processing

Tabel 2: Operasi-operasi yang tersedia dalam MPI_ReduceOperation DescriptionMPI_MAX maximumMPI_MIN minimumMPI_SUM sumMPI_PROD productMPI_LAND logical andMPI_BAND bit-wise andMPI_LOR logical orMPI_BOR bit-wise orMPI_LXOR logical xorMPI_BXOR bitwise xor

Contoh program :

Kode 31 Program MPI_Reduce#include <stdio.h>#include <mpi.h>void main(int argc, char *argv[]){int rank;int source,result,root;/* run on 4 processors */MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);root=0;source=rank+1;MPI_Barrier(MPI_COMM_WORLD);MPI_Reduce(&source,&result,1,MPI_INT,MPI_SUM,root,MPI_COMM_WORLD);if(rank==root) printf("PE:%d MPI_PROD result is %d\n",rank,result);MPI_Finalize();}

Output:

PE:0 MPI_SUM result is 10

Gambar 7: Output program 31

3.5 GatherRutin MPI_Gather merupakan satu bentuk all-to-one communication. Keti-ka MPI_Gather dipanggil, setiap proses (termasuk proses induk) mengirimkan

20

Page 21: Laporan Parallel Processing

bu�er pengirimannya ke proses induk. Proses induk kemudian menerimanyadan menyimpannya.

Gambar 8: A Simple Gather Example

Dalam proses berikut, nilai data A pada tiap prosesor di gather dan dipin-dahkan ke prosesor 0 dalam locasi memori yang bersebelahan.

Syntax:

Kode 32 Fungsi MPI_GatherMPI_Gather ( send_buffer, send_count, send_type, recv_buffer,recv_count, recv_type,recv_rank, comm )

Argumen-argumen dari rutin ini adalah :send_buffer in alamat awal dari bu�er pengirimansend_count in jumlah elemen-elemen dari bu�er pengirimansend_type in tipe data dari elemen-elemen bu�er pengirimanrecv_buffer out alamat awal dari bu�er penerimaanrecv_count in jumlah elemen-elemen dari bu�er pengirimanrecv_type in tipe data dari elemen-elemen bu�er penerimaanrecv_rank in rank dari proses penerimaancomm in mpi communicator

21

Page 22: Laporan Parallel Processing

Kode 33 Program MPI_Gather#include <stdio.h>#include <mpi.h>void main(int argc, char *argv[]){int rank,size;double param[16],mine;int sndcnt,rcvcnt;int i;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&size);sndcnt=1;mine=23.0+rank;if(rank==0) rcvcnt=1;MPI_Gather(&mine,sndcnt,MPI_DOUBLE,param,rcvcnt,MPI_DOUBLE,0,MPI_COMM_WORLD);if(rank==0)for(i=0;i<size;++i) printf("PE:%d param[%d] is %f\n",rank,i,param[i]);MPI_Finalize();}

Output program :

PE:0 param[0] is 23.000000PE:0 param[1] is 24.000000PE:0 param[2] is 25.000000PE:0 param[3] is 26.000000

Gambar 9: Output Kode 33

3.6 ScatterRutin MPI_Scatter merupakan bentuk one-to-all communication. Data yangberbeda dari proses induk dikirimkan ke setiap proses. Ketika MPI_Scatterdipanggil, proses induk memecah satu set dari lokasi memori yang bersebela-han menjadi potongan yang sama dan mengirimkan satu potongan ke setiapprosesor.

22

Page 23: Laporan Parallel Processing

Gambar 10: Contoh sederhana dari Scatter

Syntax:

Kode 34 Fungsi MPI_Scatterint MPI_Scatter ( void* send_buffer, int send_count, MPI_datatypesend_type,void* recv_buffer, int recv_count, MPI_Datatype recv_type,int rank, MPI_Comm comm )

Argumen-argumen dari rutin ini adalah :send_bu�er in alamat awal dari bu�er pengirimansend_count in jumlah elemen-elemen dalam bu�er pengiriman yang akan

dikirim ke setiap proses (bukan jumlah total yanng akan dikirim)send_type in tipe data dari elemen-eemen dalam bu�er pengirimanrecv_bu�er out alamat awal dari bu�er penerimaanrecv_count in jumlah elemen-elemen dari bu�er penerimaanrecv_type in tipe data dari elemen-elemen dari bu�er penerimaanrank in rank dari proses pengirimancomm in mpi communicatorKode program :

23

Page 24: Laporan Parallel Processing

Kode 35 Program MPI_Scatter#include <stdio.h>#include <mpi.h>void main(int argc, char *argv[]) {int rank,size,i;double param[8],mine;int sndcnt,rcvcnt;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&size);rcvcnt=1;if(rank==0) {for(i=0;i<4;++i) param[i]=23.0+i;sndcnt=1;}MPI_Scatter(param,sndcnt,MPI_DOUBLE,&mine,rcvcnt,MPI_DOUBLE,0,MPI_COMM_WORLD);for(i=0;i<size;++i) {if(rank==i) printf("P:%d mine is %f \n",rank,mine);fflush(stdout);MPI_Barrier(MPI_COMM_WORLD);}MPI_Finalize();}

Output program:

P:0 mine is 23.000000P:1 mine is 24.000000P:2 mine is 25.000000P:3 mine is 26.000000

Gambar 11: Output kode 35

24