Jump to content

MPI: Scatter

From Haidhi Wiki
Revision as of 02:03, 29 March 2026 by SanzSkuy (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
#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;
}