MPI: gather
Appearance
Kebalikan dari scatter
#include <mpi.h>
#include <iostream>
#include <vector>
extern "C" {
void array_mul(double* arr_a, double* arr_b, int size);
}
int main() {
MPI_Init(NULL, NULL);
int world_rank, world_size;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int total_elements = 8;
int data_per_process = total_elements / world_size;
std::vector<double> send_buffer_a;
std::vector<double> send_buffer_b;
std::vector<double> final_result;
if (world_rank == 0) {
send_buffer_a = {10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0};
send_buffer_b = {2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
final_result.resize(total_elements); // siapin tempat
}
std::vector<double> recv_buffer_a(data_per_process);
std::vector<double> recv_buffer_b(data_per_process);
MPI_Scatter(send_buffer_a.data(), data_per_process, MPI_DOUBLE,
recv_buffer_a.data(), data_per_process, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Scatter(send_buffer_b.data(), data_per_process, MPI_DOUBLE,
recv_buffer_b.data(), data_per_process, MPI_DOUBLE, 0, MPI_COMM_WORLD);
std::vector<double> original_a = recv_buffer_a;
array_mul(recv_buffer_a.data(), recv_buffer_b.data(), data_per_process);
// GATHER: Kumpulkan semua hasil dari recv_buffer_a ke final_result di Rank 0
MPI_Gather(
recv_buffer_a.data(), data_per_process, MPI_DOUBLE,
final_result.data(), data_per_process, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// OUTPUT: Cek hasilnya di Rank 0
if (world_rank == 0) {
printf("\n=== HASIL AKHIR DI RANK 0 ===\n");
for(int i = 0; i < total_elements; i++) {
printf("Elemen ke-%d: %.1f\n", i, final_result[i]);
}
printf("=============================\n");
}
MPI_Finalize();
return 0;
}