fork download
  1. #include <mpi.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. #define MATRIX_SIZE 100
  7. #define VECTOR_SIZE 100
  8.  
  9. int main(int argc, char** argv) {
  10. int rank, size;
  11. int matrix[MATRIX_SIZE][MATRIX_SIZE];
  12. int vector[VECTOR_SIZE];
  13. int local_matrix[MATRIX_SIZE / size][MATRIX_SIZE];
  14. int local_vector[VECTOR_SIZE / size];
  15. int local_result[MATRIX_SIZE / size];
  16. int result[MATRIX_SIZE];
  17.  
  18. // Initialize MPI
  19. MPI_Init(&argc, &argv);
  20. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  21. MPI_Comm_size(MPI_COMM_WORLD, &size);
  22.  
  23. // Generate matrix and vector
  24. if (rank == 0) {
  25. srand(time(NULL));
  26. for (int i = 0; i < MATRIX_SIZE; i++) {
  27. for (int j = 0; j < MATRIX_SIZE; j++) {
  28. matrix[i][j] = rand() % 100;
  29. }
  30. }
  31. for (int i = 0; i < VECTOR_SIZE; i++) {
  32. vector[i] = rand() % 100;
  33. }
  34. }
  35.  
  36. // Scatter matrix and vector
  37. MPI_Scatter(matrix, MATRIX_SIZE * MATRIX_SIZE / size, MPI_INT, local_matrix,
  38. MATRIX_SIZE * MATRIX_SIZE / size, MPI_INT, 0, MPI_COMM_WORLD);
  39. MPI_Scatter(vector, VECTOR_SIZE / size, MPI_INT, local_vector,
  40. VECTOR_SIZE / size, MPI_INT, 0, MPI_COMM_WORLD);
  41.  
  42. // Perform local matrix-vector multiplication
  43. for (int i = 0; i < MATRIX_SIZE / size; i++) {
  44. local_result[i] = 0;
  45. for (int j = 0; j < MATRIX_SIZE; j++) {
  46. local_result[i] += local_matrix[i][j] * local_vector[j];
  47. }
  48. }
  49.  
  50. // Gather local results to obtain final result
  51. MPI_Gather(local_result, MATRIX_SIZE / size, MPI_INT, result,
  52. MATRIX_SIZE / size, MPI_INT, 0, MPI_COMM_WORLD);
  53.  
  54. // Print result
  55. if (rank == 0) {
  56. printf("Matrix:\n");
  57. for (int i = 0; i < MATRIX_SIZE; i++) {
  58. for (int j = 0; j < MATRIX_SIZE; j++) {
  59. printf("%d ", matrix[i][j]);
  60. }
  61. printf("\n");
  62. }
  63. printf("Vector:\n");
  64. for (int i = 0; i < VECTOR_SIZE; i++) {
  65. printf("%d ", vector[i]);
  66. }
  67. printf("\nResult:\n");
  68. for (int i = 0; i < MATRIX_SIZE; i++) {
  69. printf("%d ", result[i]);
  70. }
  71. printf("\n");
  72. }
  73.  
  74. // Finalize MPI
  75. MPI_Finalize();
  76.  
  77. return 0;
  78. }
  79.  
  80.  
Success #stdin #stdout #stderr 0.28s 39152KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: unexpected symbol in "int main"
Execution halted