Back to IF3130 Sistem Paralel dan Terdistribusi

Topic

Questions/Cues

  • Apa itu Sistem Memori Terdistribusi?

  • Apa saja komponen dasar program MPI?

  • Bagaimana proses diidentifikasi?

  • Apa itu model SPMD?

  • Apa itu Communicator?

  • Bagaimana cara mengirim data?

  • Bagaimana cara menerima data?

  • Apa itu Pencocokan Pesan (Message Matching)?

  • Apa itu Komunikasi Blocking?

Reference Points

  • Slides 1-25

Sistem Memori Terdistribusi vs. Terpusat

Dalam komputasi paralel, ada dua model memori utama:

  1. Shared Memory (Memori Terpusat): Beberapa CPU terhubung ke satu blok memori yang sama melalui sebuah interkoneksi. Semua CPU bisa mengakses data di memori tersebut secara langsung. Analoginya seperti beberapa penulis yang mengerjakan satu dokumen di papan tulis yang sama.

  2. Distributed Memory (Memori Terdistribusi): Setiap CPU memiliki blok memorinya sendiri yang bersifat privat dan tidak dapat diakses langsung oleh CPU lain. Komunikasi dan pertukaran data antar CPU harus dilakukan secara eksplisit melalui jaringan interkoneksi. Analoginya seperti beberapa penulis yang masing-masing memiliki buku catatan pribadi dan harus saling mengirim pesan untuk berbagi informasi. MPI (Message Passing Interface) adalah standar untuk model ini.

Komponen Dasar Program MPI

Program MPI adalah program C/C++ standar yang menyertakan beberapa elemen kunci untuk fungsionalitas paralel:

  • Header File: Wajib menyertakan #include <mpi.h>.

  • Inisialisasi Lingkungan: MPI_Init(NULL, NULL) harus dipanggil di awal sebelum fungsi MPI lainnya. Fungsi ini menyiapkan semua yang dibutuhkan oleh MPI.

  • Finalisasi Lingkungan: MPI_Finalize() harus dipanggil di akhir program untuk membersihkan semua sumber daya yang dialokasikan oleh MPI. Tidak boleh ada pemanggilan fungsi MPI setelah ini.

  • Konvensi Penamaan: Semua fungsi dan tipe data yang didefinisikan oleh MPI diawali dengan MPI_ untuk menghindari konflik nama.

Identifikasi Proses: Rank & Size

Dalam MPI, sekelompok proses yang berjalan bersama diidentifikasi dengan rank integer non-negatif, mulai dari 0 hingga p-1, di mana p adalah jumlah total proses.

  • MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);: Fungsi ini digunakan untuk mengetahui berapa total proses (comm_sz) yang sedang berjalan dalam sebuah komunikator.

  • MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);: Fungsi ini digunakan oleh setiap proses untuk mengetahui ID unik atau “rank” (my_rank) miliknya sendiri.

Model Pemrograman SPMD (Single Program, Multiple Data)

SPMD adalah pendekatan di mana kita menulis satu kode program saja, yang kemudian dieksekusi oleh semua proses. Namun, setiap proses dapat melakukan tugas yang berbeda berdasarkan rank-nya. Ini biasanya diimplementasikan dengan struktur kontrol if-else.

Contoh Praktis: Dalam program “Hello World” MPI, proses dengan rank == 0 bertugas menerima pesan dari proses lain dan mencetaknya, sementara proses dengan rank != 0 bertugas mengirim pesan. Ini membuat satu program dapat melakukan dua peran yang berbeda.

Communicator

Communicator adalah sebuah grup yang berisi kumpulan proses yang dapat saling mengirim pesan. Saat program MPI dimulai, MPI_Init secara otomatis membuat sebuah komunikator global bernama MPI_COMM_WORLD yang mencakup semua proses yang diluncurkan.

Pengiriman Data: MPI_Send

Fungsi ini digunakan untuk mengirim pesan dari satu proses ke proses lain.

int MPI_Send(
	void* msg_buf_p, 
	int msg_size, 
	MPI_Datatype msg_type, 
	int dest, 
	int tag, 
	MPI_Comm communicator);
  • msg_buf_p: Pointer ke data yang akan dikirim.

  • msg_size: Jumlah elemen data yang dikirim.

  • msg_type: Tipe data dari setiap elemen (misal: MPI_CHAR, MPI_INT, MPI_DOUBLE).

  • dest: Rank dari proses tujuan.

  • tag: Sebuah integer “label” untuk pesan, digunakan untuk membedakan jenis pesan.

  • communicator: Komunikator tempat proses pengirim dan penerima berada (misal: MPI_COMM_WORLD).

Penerimaan Data: MPI_Recv

Fungsi ini digunakan untuk menerima pesan dari proses lain.

int MPI_Recv(
	void* msg_buf_p, 
	int buf_size, 
	MPI_Datatype buf_type, 
	int source, 
	int tag, 
	MPI_Comm communicator, 
	MPI_Status* status_p);
  • msg_buf_p: Pointer ke buffer untuk menyimpan data yang diterima.

  • buf_size: Ukuran maksimum buffer (jumlah elemen yang bisa ditampung).

  • buf_type: Tipe data dari elemen yang diharapkan.

  • source: Rank dari proses pengirim. Bisa diisi MPI_ANY_SOURCE jika ingin menerima dari siapa saja.

  • tag: Tag yang diharapkan dari pesan. Bisa diisi MPI_ANY_TAG.

  • communicator: Komunikator yang digunakan.

  • status_p: Pointer ke struktur MPI_Status yang akan diisi dengan informasi tentang pesan yang diterima (misal: pengirim aktualnya siapa jika source adalah MPI_ANY_SOURCE). Bisa diabaikan dengan MPI_STATUS_IGNORE.

Tipe data MPI

Pencocokan Pesan (Message Matching)

Agar komunikasi berhasil, sebuah panggilan MPI_Send pada proses q harus cocok dengan panggilan MPI_Recv pada proses r. Syaratnya adalah:

  1. Keduanya berada di communicator yang sama.

  2. tag pesan pada MPI_Send sama dengan tag pada MPI_Recv.

  3. dest pada MPI_Send (yaitu r) cocok dengan rank proses penerima.

  4. source pada MPI_Recv (yaitu q) cocok dengan rank proses pengirim.

Komunikasi Blocking

Perilaku Send dan Recv dapat menyebabkan sebuah proses berhenti (block) atau menunggu.

  • MPI_Recv selalu blocking: Proses yang memanggil MPI_Recv akan berhenti dan menunggu sampai pesan yang cocok tiba.

  • MPI_Send bisa blocking atau non-blocking: Perilakunya tergantung implementasi MPI.

    • Buffering: Jika pesan kecil, MPI_Send mungkin hanya menyalin pesan ke buffer internal MPI dan langsung melanjutkan eksekusi (non-blocking).

    • Blocking: Jika pesan besar atau buffer penuh, MPI_Send akan menunggu sampai proses penerima siap menerima pesan tersebut.

Jika semua proses melakukan MPI_Send blocking secara bersamaan sebelum ada yang melakukan MPI_Recv, dapat terjadi deadlock, di mana semua proses saling menunggu tanpa ada yang bisa maju.

Summary

Pemrograman dengan MPI pada sistem memori terdistribusi mengharuskan setiap proses, yang diidentifikasi oleh ‘rank’ unik dalam sebuah ‘communicator’ (seperti MPI_COMM_WORLD), untuk secara eksplisit mengirim dan menerima pesan menggunakan fungsi point-to-point seperti MPI_Send dan MPI_Recv. Model yang umum digunakan adalah SPMD, di mana satu program dieksekusi oleh semua proses, namun perilaku setiap proses dikendalikan oleh ‘rank’-nya, dan keberhasilan komunikasi bergantung pada ‘pencocokan pesan’ yang tepat antara pengirim dan penerima untuk menghindari kondisi ‘blocking’ dan deadlock.