MPI: Scatter: Difference between revisions
Appearance
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( | 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 = | // Pastikan total data sinkron dengan jumlah proses | ||
std::vector< | int total_elements = 8; | ||
std::vector< | 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 | |||
for (int | 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(); | 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;
}