Pengenalan MPI Scatter dan Gather

Pengenalan MPI Scatter dan Gather

Dalam pengembangan aplikasi parallel dan distributed, data distribution dan collecting menjadi salah satu tantangan yang perlu dihadapi. Salah satu cara untuk mengatasi masalah ini adalah dengan menggunakan fungsi-fungsi MPI (Message Passing Interface) seperti Scatter dan Gather.

Scatter

Fungsi MPI Scatter digunakan untuk membagi array besar menjadi bagian-bagian kecil yang sesuai dengan jumlah proses dan mengirimkan setiap proses (termasuk proses sumber) bagian dari array dalam urutan rank.

Contoh penggunaan MPI Scatter:

const int recvsize = 50;
int *sendbuf, recvbuf[recvsize];
int sendsize = nb_proc*recvsize;
sendbuf = new int[sendsize];
if (proc_id == 0)
 Generate_data(sendbuf, sendsize);
MPI_Scatter(sendbuf, recvsize, MPI_INT, recvbuf, recvsize, MPI_INT, 0, MPI_COMM_WORLD);
for (i=0; i<nb_proc; i++)
 Print_data(recvbuf, recvsize);

Gather

Fungsi MPI Gather digunakan untuk menerima data yang disimpan dalam array kecil dari semua proses (termasuk proses sumber) dan menggabungkannya menjadi array tunggal dalam urutan rank.

Contoh penggunaan MPI Gather:

const int sendsize = 50;
int sendbuf[sendsize], *recvbuf;
int recvsize = nb_proc*sendsize; 
if (proc_id == 0)
 recvbuf = new int[recvsize];
for (i=0; i<nb_proc; i++)
 Generate_data(sendbuf, sendsize);
MPI_Gather(sendbuf, sendsize, MPI_INT, recvbuf, sendsize, MPI_INT, 0, MPI_COMM_WORLD);
if (proc_id == 0)
 Print_data(recvbuf, recvsize);

Kelebihan dan Kekurangan

Scatter dan Gather dapat membantu dalam mengelola data distribution dan collecting dengan lebih mudah. Namun, perlu diingat bahwa fungsi-fungsi ini memiliki kelemahan seperti overhead komunikasi yang besar dan penggunaan sumber daya proses.

Contoh Code

Berikut adalah contoh code untuk menggunakan MPI Scatter dan Gather:

#include <mpi.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
 int i;
 int proc_id, size;

 // Inisialisasi MPI
 MPI_Init(&argc, &argv);
 MPI_Comm_size(MPI_COMM_WORLD, &size);
 MPI_Comm_rank(MPI_COMM_WORLD, &proc_id);

 // Variabel local untuk menyimpan data
 int localdata;

 // Proses 0 mengirimkan data ke semua proses
 if (proc_id == 0) {
 for (i=0; i<size; i++)
 localdata = i;
 MPI_Scatter(&localdata, 1, MPI_INT, &localdata, 1, MPI_INT, 0, MPI_COMM_WORLD);
 }

 // Proses lain menerima data dari proses 0
 if (proc_id != 0) {
 int globaldata;

 MPI_Gather(&localdata, 1, MPI_INT, &globaldata, 1, MPI_INT, 0, MPI_COMM_WORLD);

 printf("4. Processor %d has data: %d\n", proc_id, globaldata);
 }

 // Finalize MPI
 MPI_Finalize();
 return 0;
}

Dalam contoh code di atas, proses 0 mengirimkan data ke semua proses menggunakan MPI Scatter, sedangkan proses lain menerima data dari proses 0 menggunakan MPI Gather.

Konklusi

MPI Scatter dan Gather dapat membantu dalam mengelola data distribution dan collecting dengan lebih mudah. Namun, perlu diingat bahwa fungsi-fungsi ini memiliki kelemahan seperti overhead komunikasi yang besar dan penggunaan sumber daya proses.

Leave a comment