Anda di halaman 1dari 59

Message-Passing

Interface
Message-Passing Programming
menggunakan User-level
Message-Passing Libraries
Diperlukan dua mekanisme utama:

1.Metode untuk membuat proses yang


terpisah untuk eksekusi pada komputer
yang berbeda-beda.

2.Metode untuk mengirim dan menerima


messages
Model Multiple program, multiple
data (MPMD)

Source Source
file file

Compile untuk menyesuaikan


dengan prosesor

Executable

Prosesor 0 Prosesor p-1


Model Single Program Multiple Data
(SPMD)
Berbagai proses bergabung menjadi satu program. Control
statements memilih bagian-bagian yang berbeda untuk dieksekusi
setiap prosesor. Semua executables mulai pada saat yang sama
- static process creation

Source
file
Basic MPI way
Compile untuk menyesuaikan
dengan prosesor
Executables

Prosesor 0 Prosesor p-1


Model Multiple Program Multiple Data (MPMD)
Program yang berbeda untuk setiap prosesor. Satu
prosesor mengeksekusi master process. Proses lain
dimulai dari dalam master process - dynamic process
creation.
Proses 1

Mulai eksekusi
spawn(); proses 2 Proses 2

Waktu
Basic “point-to-point”
Send and Receive Routines
Passing message antar proseses dengan
menggunakan send() and recv() library calls:

Proses 1 Proses 2
x y

Pergerakan
send(&x, 2); data
recv(&y, 1);

Generic syntax (actual formats later)


Synchronous Message Passing
Rutin yang benar-benar kembali ketika
message transfer selesai.
Synchronous send routine
• Menunggu sampai message diterima dengan
lengkap oleh proses penerima sebelum
mengirimkan message.
Synchronous receive routine
• Menunggu sampai message yang ditunggu
tiba.

Synchronous routines secara intrinsik


melakukan dua hal: transfer data dan
mensinkronisasi proses.
Synchronous send() and recv() menggunakan
3-way protocol
Proses 1 Proses 2

Waktu send(); Request to send


Proses dihentikan Acknowledgement
recv();
Kedua proses Message
berlanjut
(a) Ketika send() terjadi sebelum recv()
Proses 1 Proses 2

Waktu recv();
send();
Request to send Proses
Kedua proses Message dihentikan
berlanjut Acknowledgement

(b) Ketika recv() terjadi sebelum send()


Asynchronous Message Passing
• Rutin yang tidak menunggu sampai selesai
sebelum kembali. Biasanya membutuhkan
local storage untuk message.

• Lebih dari 1 versi bergantung pada


semantik yang sebenarnya sebelum
kembali.

• Pada umumnya, proses tidak disinkronisasi


tetapi dimungkinkan berlanjut lebih cepat.
Cara ini harus digunakan dengan hati-hati.
Definisi MPI untuk Blocking
dan Non-Blocking
• Blocking – kembali setelah local actions
selesai, walalupun message transfer mungkin
belum selesai.

• Non-blocking – segera kembali.

Mengasumsikan bahwa data storage yang


digunakan untuk transfer tidak dimodifikasi
oleh statement berikutnya. Hal ini harus
dipastikan oleh programmer.
Istilah-istilah ini bisa memiliki interpretasi
yang berbeda pada sistem lain.
Bagaimana rutin message-passing kembali
sebelum message transfer selesai
Dibutuhkan message buffer antara sumber
(source) dan tujuan (destination) untuk
menyimpan message:

Proses 1 Proses 2

Waktu Message buffer


send();
Proses recv(); Baca
dilanjutkan message buffer
Asynchronous (blocking) routines
berubah menjadi synchronous routines
• Setelah local actions selesai dan
message terkirim, proses pengirim bisa
melanjutkan pekerjaan berikutnya.

• Ukuran buffer terbatas dan bisa terjadi


keadaan ketika rutin send tertahan
karena ruang buffer penuh.

• Kemudian, rutin send akan menunggu


sampai storage tersedia kembali –
yaitu, rutin ini berlaku seperti rutin
synchronous.
Message Tag
• Digunakan untuk membedakan
antara berbagai tipe message yang
dikirim.

• Message tag dibawa di dalam


message.

• Jika tidak diperlukan type matching,


digunakan wild card message tag,
sehingga recv() akan sesuai dengan
send() yang manapun.
Contoh Message Tag
Untuk mengirim message, x, dengan
message tag 5 dari proses sumber, 1,
ke proses tujuan, 2, dan assign ke y:

Proses 1 Proses 2
x y

Perpindahan
send(&x,2,5;) data
recv(&y,1,5)

Menunggu message dari proses 1 dengan tag 5


“Group” message passing routines
Rutin yang mengirim message ke
sekelompok proses atau menerima
message dari satu kelompok proses.

Memiliki efisiensi yang lebih tinggi


dari rutin point-to-point yang terpisah,
walaupun tidak benar-benar penting.
Broadcast
Mengirim message yang sama ke semua proses yang
berhubungan dengan masalah yang sedang diselesaikan.
Multicast – mengirim message yang sama ke sekelompok
proses tertentu.
Proses 0 Proses 1 Proses p-1
data data data

Action
buf

bcast(); bcast(); bcast();


Code

MPI form
Scatter
Mengirim setiap elemen arry di proses
root ke proses yang terpisah. Isi lokasi
ke-i dikirim ke proses ke-i.

Proses 0 Proses 1 Proses p-1


data data data

Action
buf

scatter(); scatter(); scatter();


Code

MPI form
Gather

Satu proses mengumpulkan nilai-nilai


individu dari satu kelompok proses.
Proses 0 Proses 1 Proses p-1
data data data

Action
buf

gather(); gather(); gather();


Code

MPI form
Reduce
Operasi Gather dikombinasikan dengan
operasi aritmetik/logika.

Contoh: Nilai-nilai dapat dikumpulkan dan


kemudian dijumlahkan oleh root:
Proses 0 Proses 1 Proses p-1
data data data

Action
buf
+

reduce(); reduce(); reduce();


Code

MPI form
PVM
(Parallel Virtual Machine)
Mungkin merupakan usaha pertama yang diadopsi secara luas
dalam menggunakan workstation cluster sebagai multicomputer
platform, dikembangkan oleh Oak Ridge National Laboratories.
Tersedia gratis.

Programmer membagi program menjadi program-program


terpisah (biasanya master dan sekelompok program slave yang
identik).

Program di-compile untuk dieksekusi oleh jenis komputer tertentu.

Kelompok komputer yang digunakan untuk menyelesaikan


masalah harus didefinisikan dahulu sebelum mengeksekusi
program (dalam suatu hostfile).
Message routing antar komputer yang dilakukan oleh PVM daemon processes
yang diinstal oleh PVM pda komputer yang membentuk virtual machine.

Wor kstation

PVM
Bisa lebih dari satu proses daemon
berjalan pada tiap komputer . Program
aplikasi
r
(ex ecutab le)
Messages
sent through
Wor kstation network

Wor kstation
PVM
daemon
Program
aplikasi PVM
(executab le) daemon

Program
aplikasi
r
(ex ecutab le)
Implementasi MPI yang digunakan hampir sama .
MPI
(Message Passing Interface)

• Message passing library standard dikembangkan


oleh sekelompok akademisi dan partner industri
untuk menyesuaikan dengan penggunaan yang
lebih luas dan portabilitas.

• Mendefinisikan rutin, bukan implementasi.

• Tersedia beberapa implementasi gratis.


MPI
Process Creation and Execution
• Sengaja tidak didefinisikan – akan bergantung pada
implementasi.

• Hanya static process creation yang didukung oleh MPI version


1. Semua proses harus didefinisikan sebelum eksekusi dan
dimulai bersama-sama.

• Awalnya merupakan model komputasi SPMD.

• MPMD juga bisa dengan static creation – setiap program yang


akan dimulai bersama harus dispesifikasi.
Communicator

• Mendefinisikan cakupan operasi komunikasi.

• Proses memiliki peringkat yang berhubungan dengan


communicator.

• Pada awalnya, semua proses terdaftar dalam “universe”


yang disebut MPI_COMM_WORLD, dan setiap proses
diberi peringkat yang unik, berupa angka dari 0 sampai p - 1,
dengan p proses.

• Communicator lain dapat ditentukan untuk kelompok proses.


Menggunakan Model Komputasi SPMD
main (int argc, char *argv[])
{
MPI_Init(&argc, &argv);
.
.
MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /*find process rank */

if (myrank == 0)
master();
else
slave();
.
.
MPI_Finalize();
}

di mana master() akan dieksekusi oleh proses master dan


slave() dieksekusi oleh proses slave process.
Unsafe message passing - Contoh
Proses 0 Proses 1
Tujuan
send(…,1,…);

lib() send(…,1,…); Sumber


recv(…,0,…); lib()
(a) Yang diinginkan
recv(…,0,…);

Proses 0 Proses 1

send(…,1,…);

lib() send(…,1,…);
(b) Yang bisa terjadi recv(…,0,…); lib()

recv(…,0,…);
Solusi MPI
“Communicator”
• Mendefinisikan domain komunikasi – satu set
proses yang boleh berkomunikasi antar mereka
sendiri.

• Domain komunikasi library dapat dipisahkan dari


domain komunikasi program user.

• Digunakan dalam point-to-point dan komunikasi


MPI message-passing kolektif.
Default Communicator
MPI_COMM_WORLD

• Merupakan communicator pertama untuk semua


proses pada aplikasi.

• Tersedia satu set rutin MPI untuk membentuk


communicator.

• Proses memiliki “peringkat (rank)” pada


communicator.
Komunikasi MPI Point-to-Point

• Menggunakan rutin send dan receive


dengan message tags (dan communicator).

• Tersedia wild card message tag.


MPI Blocking Routines

• Kembali (return) ketika “locally complete” - ketika


lokasi yang digunakan untuk menyimpan message
dapat dipakai kembali atau diubah tanpa
mempengaruhi message yang dikirim.

• Blocking send akan mengirim message dan kembali


– tidak berarti bahwa message telah diterima, hanya
bahwa proses tersebut bebas untuk lanjut tanpa
mempengaruhi message.
Parameter blocking send

MPI_Send(buf, count, datatype, dest, tag, comm)


Alamat Tipe data Message tag
send buffer setiap item
Jumlah item Peringkat proses Comm unicator
Yang akan dikirim tujuan
Parameter blocking receive

MPI_Recv(buf, count, datatype, src, tag, comm, status)


Status
Alamat Tipe data Message tag setelah operasi
receive buffer Setiap item
Jumlah maksimum Peringkat proses Comm unicator
Item yang akan diterima sumber
Contoh

Untuk mengirim integer x dari proses 0 ke proses 1,

MPI_Comm_rank(MPI_COMM_WORLD,&myrank); /* find rank */

if (myrank == 0) {
int x;
MPI_Send(&x, 1, MPI_INT, 1, msgtag, MPI_COMM_WORLD);
} else if (myrank == 1) {
int x;
MPI_Recv(&x, 1, MPI_INT, 0,msgtag,MPI_COMM_WORLD,status);
}
MPI Nonblocking Routines

• Nonblocking send - MPI_Isend() - akan “langsung”


kembali bahkan sebelum lokasi sumber aman
untuk diubah.

• Nonblocking receive - MPI_Irecv() - akan kembali


bahkan jika tidak ada message yang akan
diterima.
Format Nonblocking Routine

MPI_Isend(buf,count,datatype,dest,tag,comm,request)

MPI_Irecv(buf,count,datatype,source,tag,comm, request)

Kondisi selesai dideteksi oleh MPI_Wait() dan MPI_Test().

MPI_Wait() menunggu setelah operasi selesai dan kemudian kembali.


MPI_Test() kembali dengan flag yang sudah 'set', menunjukkan apakah
operasi telah selesai pada saat itu.

Perlu mengetahui apakah suatu operasi tertentu telah selesai.


Ditentukan dengan mengakses parameter request.
Contoh
Untuk mengirim integer x dari proses 0 ke proses 1 dan
memungkinkan proses 0 berlanjut,
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);/* find rank */
if (myrank == 0) {
int x;
MPI_Isend(&x,1,MPI_INT, 1, msgtag, MPI_COMM_WORLD, req1);
compute();
MPI_Wait(req1, status);
} else if (myrank == 1) {
int x;
MPI_Recv(&x,1,MPI_INT,0,msgtag, MPI_COMM_WORLD, status);
}
Mode Komunikasi Send

• Standard Mode Send - Tidak mengasumsikan bahwa rutin receive yang


menjadi pasangannya telah mulai. Jumlah buffer tidak didefinisikan oleh
MPI. Jika disediakan buffering, send dapat selesai sebelum receive
dicapai.
• Buffered Mode - Send bisa mulai dan kembalisebelum receive yang
menjadi pasangannya. Perlu dispesifikasi ruang buffer melalui rutin
MPI_Buffer_attach().
• Synchronous Mode - Send dan receive bisa mulai sebelum pasangannya
tetapi hanya bisa selesai jika pasangannya sudah ada.
• Ready Mode - Send hanya bisa mulai jika receive yang menjadi
pasangannya telah dicapai, jika tidak, akan terjadi kondisi error. Gunakan
dengan hati-hati.
• Keempat mode tersebut dapat diterapkan pada
rutin send blocking maupun nonblocking.

• Hanya tersedia standard mode untuk rutin receive


blocking dan nonblocking.

• Semua tipe rutin send dapat digunakan dengan


rutin receive yang manapun.
Komunikasi Kolektif

Melibatkan satu set proses, didefinisikan oleh intra-communicator.


Tidak ada message tag. Operasi kolektif yang penting:
• MPI_Bcast() - Broadcast dari root ke semua proses lain
• MPI_Gather() - Mengumpulkan nilai sekelompok proses
• MPI_Scatter() - Membagi bagian buffer ke sekelompok proses
• MPI_Alltoall() - Mengirim data dari semua proses ke semua proses
• MPI_Reduce() - Menggabungkan nilai dari semua proses menjadi satu
nilai
• MPI_Reduce_scatter() - Menggabungkan nilai dan menyebarkan
hasilnya
• MPI_Scan() - Menghitung reduksi prefiks data pada proses
Contoh
Mengumpulkan item dari kelompok proses ke dalam
proses 0, dengan menggunakan dynamically allocated
memory dalam proses root:

int data[10]; /*data yang akan dikumpulkan dari proses-proses*/


MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /* find rank */
if (myrank == 0) {
MPI_Comm_size(MPI_COMM_WORLD, &grp_size); /*find group size*/
buf = (int *)malloc(grp_size*10*sizeof (int)); /*allocate memory*/
}
MPI_Gather(data,10,MPI_INT,buf,grp_size*10,MPI_INT,0,MPI_COMM_WORLD) ;

MPI_Gather() mengumpulkan dari semua proses, termasuk root.


Barrier routine

• Suatu cara sinkronisasi proses dengan


menghentikan masing-masingnya hingga
mencapai “barrier” call yang spesifik.
#include “mpi.h”
#include <stdio.h>
#include <math.h>
#define MAXSIZE 1000
void main(int argc, char *argv)
{
Contoh program MPI
int myid, numprocs;
int data[MAXSIZE], i, x, low, high, myresult, result;
char fn[255];
char *fp;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
if (myid == 0) { /* Open input file and initialize data */
strcpy(fn,getenv(“HOME”));
strcat(fn,”/MPI/rand_data.txt”);
if ((fp = fopen(fn,”r”)) == NULL) {
printf(“Can’t open the input file: %s\n\n”, fn);
exit(1);
}
for(i = 0; i < MAXSIZE; i++) fscanf(fp,”%d”, &data[i]);
}
MPI_Bcast(data, MAXSIZE, MPI_INT, 0, MPI_COMM_WORLD); /* broadcast data */
x = n/nproc; /* Add my portion Of data */
low = myid * x;
high = low + x;
for(i = low; i < high; i++)
myresult += data[i];
printf(“I got %d from %d\n”, myresult, myid); /* Compute global sum */
MPI_Reduce(&myresult, &result, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
if (myid == 0) printf(“The sum is %d.\n”, result);
MPI_Finalize();
}
Evaluasi Program Paralel
Waktu eksekusi sekuensial, ts: di-estimasi dengan
menghitung langkah komputasi dari algoritma
sekuensial yang terbaik.

Waktu eksekusi paralel, tp: Selain jumlah langkah


komputasi, tcomp, perlu diestimasi communication
overhead, tcomm:

tp = tcomp + tcomm
Waktu Komputasi
Hitung jumlah langkah komputasi.
Jika ada lebih dari satu proses yang dieksekusi secara simultan,
hitung jumlah langkah komputasi proses yang paling kompleks.
Umumnya, merupakan fungsi dari n dan p, yaitu

tcomp = f (n, p)

Waktu komputasi seringkali harus dibagi, sehingga


tcomp = tcomp1 + tcomp2 + tcomp3 + …

Analisis biasanya dilakukan dengan mengasumsikan bahwa semua


prosesor sama dan beroperasi dengan kecepatan yang sama.
Waktu Komunikasi

Ditentukan oleh banyak faktor, termasuk struktur


jaringan dan aturan jaringan. Sebagai aproksimasi
pertama, gunakan
tcomm = tstartup + ntdata

tstartup adalah waktu startup, yaitu waktu mengirim


message tanpa data. Diasumsikan konstan.
tdata merupakan waktu transmisi satu word data, juga
diasumsikan konstan, dan ada n word data.
Waktu Komunikasi yang Ideal

Waktu Startup

Jumlah item data(n)


Waktu komunikasi final, tcomm
Merupakan jumlah waktu komunikasi semua message
sekuensial dari suatu proses, yaitu
tcomm = tcomm1 + tcomm2 + tcomm3 + …

Pola komunikasi semua proses diasumsikan sama dan


berlangsung pada saat yang sama sehingga hanya
satu proses yang perlu diperhitungkan.

tstartup dan tdata diukur dalam satuan satu langkah


komputasi, sehingga tcomp and tcomm bisa dijumlahkan
untuk mendapat waktu eksekusi paralel, tp.
Faktor Benchmark
Dengan ts, tcomp, and tcomm, dapat ditentukan faktor
speedup dan rasio komputasi/komunikasi ratio untuk
suatu algoritma/implementasi tertentu:

Keduanya merupakan fungsi jumlah prosesor, p, dan


jumlah elemen data, n.
Faktor memberikan indikasi skalabilitas solusi paralel
dengan bertambahnya jumlah prosesor dan ukuran
masalah.

Rasio komputasi/komunikasi akan akan memberi


gambaran efek komunikasi dengan bertambahnya
ukuran masalah dan ukuran sistem.
Debug/Evaluasi Program Paralel Secara
Empiris
Visualization Tools
Program dapat diawasi sementara dieksekusi dengan
diagram ruang-waktu (atau diagram proses-waktu):

Proses 1

Proses 2

Proses 3

Computing Waktu
W aiting
Message-passing system routine
Message
Implementasi visualization tools tersedia untuk MPI.

Satu contoh adalah sistem visualisasi program


Upshot.
Evaluasi Programs secara Empiris
Mengukur Waktu Eksekusi
Untuk mengukur waktu eksekusi antara point L1 dan point L2 pada
code, bisa dipakai konstruksi seperti:
.
L1: time(&t1); /* start timer */
.
.
L2: time(&t2); /* stop timer */
.
elapsed_time = difftime(t2, t1); /* elapsed_time = t2 - t1 */
printf(“Elapsed time = %5.2f seconds”, elapsed_time);

MPI menyediakan rutin MPI_Wtime() untuk memebri informasi


waktu (dalam detik).
Parallel Programming Home Page

http://www.cs.uncc.edu/par_prog

Memberikan instruksi step-by-step untuk compile


dan eksekusi, dan informasi lain.
Kompilasi/Eksekusi Program MPI
Pendahuluan

• Set up paths
• Buat struktur direktori yang dibutuhkan
• Buat file (hostfile) listing machines untuk
digunakan (required)

Rincian dijelaskan pada home page.


Hostfile
Sebelum memulai MPI untuk pertama kali, perlu
dibuat hostfile

Contoh hostfile
ws404
#is-sm1 //Currently not executing, commented
pvm1 //Active processors, UNCC sun cluster called pvm1 - pvm8
pvm2
pvm3
pvm4
pvm5
pvm6
pvm7
pvm8
Kompilasi/eksekusi program MPI (SPMD)
Untuk LAM MPI versi 6.5.2. Pada command line:

Untuk memulai MPI:


Pertama kali: lamboot -v hostfile
Berikutnya: lamboot
Untuk compile program MPI:
mpicc -o file file.c
atau mpiCC -o file file.cpp
Untuk eksekusi program MPI:
mpirun -v -np no_processors file
Untuk remove proses untuk reboot
lamclean -v
Terminate LAM
lamhalt
Jika gagal
wipe -v lamhost
Kompilasi/Eksekusi Multiple MPI Programs

Buat file untuk spesifiikasi program:

Contoh
1 master dan 2 slave, “appfile” berisi
n0 master
n0-1 slave

Untuk eksekusi:
mpirun -v appfile
Sample output
3292 master running on n0 (o)
3296 slave running on n0 (o)
412 slave running on n1

Anda mungkin juga menyukai