fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <mpi.h>
  4.  
  5. #define MATRIX_SIZE 8
  6. #define VECTOR_SIZE 8
  7.  
  8. int main(int argc, char** argv) {
  9. int rank, size;
  10. int i, j, k;
  11.  
  12. MPI_Init(&argc, &argv);
  13. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  14. MPI_Comm_size(MPI_COMM_WORLD, &size);
  15.  
  16. // Vérifier si le nombre de processeurs est compatible avec la taille de la matrice
  17. if (MATRIX_SIZE % size != 0) {
  18. if (rank == 0) {
  19. printf("Le nombre de processeurs n'est pas compatible avec la taille de la matrice.\n");
  20. }
  21. MPI_Finalize();
  22. return 0;
  23. }
  24.  
  25. // Calculer la taille de chaque bloc de lignes
  26. int block_size = MATRIX_SIZE / size;
  27.  
  28. // Allocation de mémoire pour les blocs locaux de la matrice A et le vecteur X
  29. double* local_A = (double*)malloc(sizeof(double) * block_size * MATRIX_SIZE);
  30. double* local_X = (double*)malloc(sizeof(double) * VECTOR_SIZE);
  31. double* local_Y = (double*)malloc(sizeof(double) * block_size);
  32.  
  33. // Initialisation des valeurs dans les blocs locaux de la matrice A et le vecteur X
  34. for (i = 0; i < block_size; i++) {
  35. for (j = 0; j < MATRIX_SIZE; j++) {
  36. local_A[i * MATRIX_SIZE + j] = rank * block_size + i + j;
  37. }
  38. }
  39.  
  40. for (i = 0; i < VECTOR_SIZE; i++) {
  41. local_X[i] = rank * VECTOR_SIZE + i;
  42. }
  43.  
  44. // Effectuer la multiplication locale des blocs de lignes et du vecteur
  45. for (i = 0; i < block_size; i++) {
  46. local_Y[i] = 0.0;
  47. for (j = 0; j < MATRIX_SIZE; j++) {
  48. local_Y[i] += local_A[i * MATRIX_SIZE + j] * local_X[j];
  49. }
  50. }
  51.  
  52. // Rassembler les résultats de chaque processeur
  53. double* global_Y = NULL;
  54. if (rank == 0) {
  55. global_Y = (double*)malloc(sizeof(double) * MATRIX_SIZE);
  56. }
  57.  
  58. MPI_Gather(local_Y, block_size, MPI_DOUBLE, global_Y, block_size, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  59.  
  60. // Afficher les résultats
  61. if (rank == 0) {
  62. printf("Résultat de la multiplication matrice-vecteur:\n");
  63. for (i = 0; i < MATRIX_SIZE; i++) {
  64. printf("%f ", global_Y[i]);
  65. }
  66. printf("\n");
  67. free(global_Y);
  68. }
  69.  
  70. free(local_A);
  71. free(local_X);
  72. free(local_Y);
  73.  
  74. MPI_Finalize();
  75. return 0;
  76. }
  77.  
Success #stdin #stdout #stderr 0.33s 39364KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: unexpected symbol in "int main"
Execution halted