fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <mpi.h>
  4.  
  5. void matrixvectorproduct(double* A, double* x, double* y, int N, int M) {
  6. for (int i = 0; i < N; i++) {
  7. y[i] = 0.0; // Initialiser le résultat local
  8. for (int j = 0; j < M; j++) {
  9. y[i] += A[i * N + j] * x[j]; // Calculer le produit
  10. }
  11. }
  12. }
  13.  
  14. void randomfill(double* buff, int size, double min, double max) {
  15.  
  16. const double range = (max - min);
  17. const double div = RAND_MAX / range;
  18. for (int i = 0; i < size; i++) {
  19. buff[i] = min + (rand() / div);
  20. }
  21. }
  22. int main(int argc, char* argv[]) {
  23. int rank, size, Nloc;
  24. const int N = 100, const M = 120;
  25. double* A, * Aloc, * x, * y, * yloc, ts, te;
  26.  
  27. MPI_Init(&argc, &argv);
  28. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  29. MPI_Comm_size(MPI_COMM_WORLD, &size);
  30.  
  31. MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
  32.  
  33. if (N % size) {
  34. if (rank == 0) {
  35. printf("Impossible");
  36.  
  37. }
  38. MPI_Abort(MPI_COMM_WORLS);
  39. }
  40.  
  41. Nloc = N / size;
  42. x = (double*)malloc(M * sizeof(double));
  43. if (rank == 0) {
  44. A = (double*)malloc(M * N * sizeof(double));
  45. y = (double*)malloc(N * sizeof(double));
  46. randomfill(A, N * M, 0.0, 1.0);
  47. randomfill(x, M, 0.0, 1.0);
  48. Aloc = (double*)malloc(M * Nloc * sizeof(double));
  49. yloc = (double*)malloc(Nloc * sizeof(double));
  50. MPI_Bcast(x, M, MPI_Double, 0, MPI_COMM_WORLD);
  51. MPI_Scatter(A, Nloc * M, MPI_Double, Aloc, M * Nloc, MPI_Double, 0, MPI_COMM_WORLD);
  52. matrixvectorproduct(Aloc, x, yloc, Nloc, M);
  53. MPI_Gather(yloc, Nloc, MPI_Double, y, Nloc, MPI_Double, 0, MPI_COMM_WORLD);
  54. }
  55. retrun 0;
  56. }
Success #stdin #stdout #stderr 0.23s 40672KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: unexpected symbol in "void matrixvectorproduct"
Execution halted