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.