590 likes | 875 Views
Chapter 2. Message-Passing Computing. 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.
E N D
Chapter 2 Message-Passing Computing
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 fi le fi le Compile untuk menyesuaikan Dengan prosesor Executable Prosesor 0 p - 1 Prosesor
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 started together - static process creation Source fi le Basic MPI w a y Compile untuk menyesuaikan dengan prosesor Ex ecutab les 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 proses 2 spawn(); 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 data send(&x, 2); 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 Request to send send(); Proses dihentikan Ac kno wledgment recv(); Kedua proses Message berlanjut (a) Ketika terjadi sebelum send() recv() Proses 1 Proses 2 Waktu recv(); Proses Request to send dihentikan send(); Message Kedua proses berlanjut Ac kno wledgment (b) Ketika terjadi sebelum recv() 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 Message b uff er Waktu send(); Proses recv(); Baca dilanjutkan message b uff er
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 f or m
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 f or m
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 f or m
Reduce Operasi Gather dikombinasikan dengan operasi aritmetik/logika. Contoh: Nilai-nilan dapat dikumpulkan dan kemudian dijumlahkan oleh root: Proses 0 Proses 1 Proses p 1 - data data data Action buf + reduce(); reduce(); reduce(); Code MPI f or m
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. W or kstation PVM daemon Bisa lebih dari satu proses . berjalan pada tiap komputer Program aplikasi r (e x ecutab le) Messages sent through W or kstation netw or k W or kstation PVM daemon Program PVM aplikasi daemon (e x ecutab le) Program aplikasi r (e x 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.
MPIProcess 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,…); send(…,1,…); lib() Sumber recv(…,0,…); lib() (a) Yang diinginkan recv(…,0,…); Proses 0 Proses 1 send(…,1,…); send(…,1,…); lib() (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 CommunicatorMPI_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.
Contoh program MPI #include “mpi.h” #include <stdio.h> #include <math.h> #define MAXSIZE 1000 void main(int argc, char *argv) { 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(); }
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. Many factors, including network structure and network contention. 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.