fork download
  1. #include <mpi.h>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. const int SIZE = 20;
  6.  
  7. // Fungsi untuk mengisi matriks dengan bilangan ganjil mulai dari 1
  8. void fillMatrixA(std::vector<std::vector<int>> &matrix) {
  9. int value = 1;
  10. for (int i = 0; i < SIZE; ++i) {
  11. for (int j = 0; j < SIZE; ++j) {
  12. matrix[i][j] = value;
  13. value += 2;
  14. }
  15. }
  16. }
  17.  
  18. // Fungsi untuk mengisi matriks dengan bilangan genap mulai dari 2
  19. void fillMatrixB(std::vector<std::vector<int>> &matrix) {
  20. int value = 2;
  21. for (int i = 0; i < SIZE; ++i) {
  22. for (int j = 0; j < SIZE; ++j) {
  23. matrix[i][j] = value;
  24. value += 2;
  25. }
  26. }
  27. }
  28.  
  29. // Fungsi utama
  30. int main(int argc, char *argv[]) {
  31. MPI_Init(&argc, &argv);
  32.  
  33. int rank, size;
  34. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  35. MPI_Comm_size(MPI_COMM_WORLD, &size);
  36.  
  37. std::vector<std::vector<int>> A(SIZE, std::vector<int>(SIZE));
  38. std::vector<std::vector<int>> B(SIZE, std::vector<int>(SIZE));
  39. std::vector<std::vector<int>> C(SIZE, std::vector<int>(SIZE, 0));
  40.  
  41. if (rank == 0) {
  42. // Proses utama mengisi matriks A dan B
  43. fillMatrixA(A);
  44. fillMatrixB(B);
  45. }
  46.  
  47. // Broadcast matriks B ke semua proses
  48. for (int i = 0; i < SIZE; ++i) {
  49. MPI_Bcast(B[i].data(), SIZE, MPI_INT, 0, MPI_COMM_WORLD);
  50. }
  51.  
  52. // Bagian dari matriks A yang akan dihitung oleh setiap proses
  53. std::vector<int> localA(SIZE * SIZE / size);
  54.  
  55. // Scatter matriks A ke semua proses
  56. MPI_Scatter(A[0].data(), SIZE * SIZE / size, MPI_INT, localA.data(), SIZE * SIZE / size, MPI_INT, 0, MPI_COMM_WORLD);
  57.  
  58. // Hasil lokal untuk bagian dari matriks C
  59. std::vector<int> localC(SIZE * SIZE / size, 0);
  60.  
  61. // Hitung hasil lokal
  62. int rowsPerProcess = SIZE / size;
  63. for (int i = 0; i < rowsPerProcess; ++i) {
  64. for (int j = 0; j < SIZE; ++j) {
  65. for (int k = 0; k < SIZE; ++k) {
  66. localC[i * SIZE + j] += localA[i * SIZE + k] * B[k][j];
  67. }
  68. }
  69. }
  70.  
  71. // Gabungkan hasil dari semua proses ke proses utama
  72. MPI_Gather(localC.data(), SIZE * SIZE / size, MPI_INT, C[0].data(), SIZE * SIZE / size, MPI_INT, 0, MPI_COMM_WORLD);
  73.  
  74. if (rank == 0) {
  75. // Cetak hasil matriks C
  76. std::cout << "Hasil perkalian matriks A dan B adalah:\n";
  77. for (int i = 0; i < SIZE; ++i) {
  78. for (int j = 0; j < SIZE; ++j) {
  79. std::cout << C[i][j] << " ";
  80. }
  81. std::cout << "\n";
  82. }
  83. }
  84.  
  85. MPI_Finalize();
  86. return 0;
  87. }
  88.  
Success #stdin #stdout #stderr 0.36s 40624KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: unexpected symbol in "const int"
Execution halted