fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <mpi.h>
  4.  
  5. int main(int argc, char *argv[]) {
  6. int n; // розмірність вектора та матриці
  7. int p; // кількість процесів
  8. int rank; // номер поточного процесу
  9.  
  10. MPI_Init(&argc, &argv);
  11. MPI_Comm_size(MPI_COMM_WORLD, &p);
  12. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  13.  
  14. if (rank == 0) {
  15. // Ініціалізація матриці та вектора на процесі 0
  16. n = 4; // Змініть на власне значення
  17. int matrix[n][n];
  18. int vector[n];
  19. int result[n * p];
  20.  
  21. // Заповнення матриці та вектора даними (для прикладу використовуються випадкові значення)
  22. for (int i = 0; i < n; i++) {
  23. for (int j = 0; j < n; j++) {
  24. matrix[i][j] = rand() % 10;
  25. }
  26. vector[i] = rand() % 10;
  27. }
  28.  
  29. // Розсилка матриці та вектора на інші процеси
  30. for (int dest = 1; dest < p; dest++) {
  31. MPI_Send(&n, 1, MPI_INT, dest, 0, MPI_COMM_WORLD);
  32. MPI_Send(matrix, n * n, MPI_INT, dest, 0, MPI_COMM_WORLD);
  33. MPI_Send(vector, n, MPI_INT, dest, 0, MPI_COMM_WORLD);
  34. }
  35.  
  36. // Обчислення частини результату на процесі 0
  37. for (int i = 0; i < n; i++) {
  38. result[i] = 0;
  39. for (int j = 0; j < n; j++) {
  40. result[i] += matrix[i][j] * vector[j];
  41. }
  42. }
  43.  
  44. // Збір результатів з інших процесів
  45. for (int source = 1; source < p; source++) {
  46. MPI_Recv(result + source * n, n, MPI_INT, source, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  47. }
  48.  
  49. // Виведення результату
  50. printf("Result:\n");
  51. for (int i = 0; i < n * p; i++) {
  52. printf("%d ", result[i]);
  53. }
  54. printf("\n");
  55. } else {
  56. // Отримання розмірності вектора та матриці
  57. MPI_Recv(&n, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  58.  
  59. // Ініціалізація та отримання матриці та вектора на інших процесах
  60. int matrix[n][n];
  61. int vector[n];
  62. MPI_Recv(matrix, n * n, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  63. MPI_Recv(vector, n, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  64.  
  65. // Обчислення частини результату на інших процесах
  66. int result[n];
  67. for (int i = 0; i < n; i++) {
  68. result[i] = 0;
  69. for (int j = 0; j < n; j++) {
  70. result[i] += matrix[i][j] * vector[j];
  71. }
  72. }
  73.  
  74. // Відправка результату на процес 0
  75. MPI_Send(result, n, MPI_INT, 0, 0, MPI_COMM_WORLD);
  76. }
  77.  
  78. MPI_Finalize
  79.  
Success #stdin #stdout #stderr 0.26s 40712KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: unexpected symbol in "int main"
Execution halted