Jump to content

MPI: Scatter: Difference between revisions

From Haidhi Wiki
Created page with "<syntaxhighlight lang=cpp> #include <mpi.h> #include <iostream> #include <vector> int main(int argc, char** argv) { 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 data_per_process = 2; std::vector<int> send_buffer = {10, 20, 30, 40, 50, 60, 70, 80}; std::vector<int> recv_buffer(data_per_process); MPI_Scatter( send_buffer.data(),..."
 
No edit summary
 
Line 4: Line 4:
#include <vector>
#include <vector>


int main(int argc, char** argv) {
extern "C" {
    void array_mul(double* arr_a, double* arr_b, int size);
}
 
 
int main() {
     MPI_Init(NULL, NULL);
     MPI_Init(NULL, NULL);


Line 11: Line 16:
     MPI_Comm_size(MPI_COMM_WORLD, &world_size);
     MPI_Comm_size(MPI_COMM_WORLD, &world_size);


     int data_per_process = 2;
    // Pastikan total data sinkron dengan jumlah proses
     std::vector<int> send_buffer = {10, 20, 30, 40, 50, 60, 70, 80};
    int total_elements = 8;
     std::vector<int> recv_buffer(data_per_process);
     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);


     MPI_Scatter(
     // Simpan copy buat log output (biar ketahuan angka aslinya)
        send_buffer.data(),
     std::vector<double> original_a = recv_buffer_a;
        data_per_process,
        MPI_INT,
        recv_buffer.data(),
        data_per_process,
        MPI_INT,
        0,
        MPI_COMM_WORLD
     );


     std::cout << "Rank " << world_rank << " dapet data: ";
     // Panggil Rust
     for (int val : recv_buffer) {
    array_mul(recv_buffer_a.data(), recv_buffer_b.data(), data_per_process);
         std::cout << val << " ";
   
     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]);
     }
     }
    std::cout << std::endl;


     MPI_Finalize();
     MPI_Finalize();

Latest revision as of 02:03, 29 March 2026

#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;
}