MPI: Scatter
Appearance
#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);
// Pastikan total data sinkron dengan jumlah proses
int total_elements = 8;
int data_per_process = total_elements / world_size;
std::vector<double> send_buffer_a;
std::vector<double> send_buffer_b;
// Cuma Rank 0 yang perlu punya data mentah
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};
}
std::vector<double> recv_buffer_a(data_per_process);
std::vector<double> recv_buffer_b(data_per_process);
// Sebarkan data!
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);
// Simpan copy buat log output (biar ketahuan angka aslinya)
std::vector<double> original_a = recv_buffer_a;
// Panggil Rust
array_mul(recv_buffer_a.data(), recv_buffer_b.data(), data_per_process);
for(int i = 0; i < data_per_process; i++) {
printf("Rank %d: %.1f x %.1f = %.1f\n",
world_rank, original_a[i], recv_buffer_b[i], recv_buffer_a[i]);
}
MPI_Finalize();
return 0;
}