fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <mpi.h>
  4.  
  5. #define N 16 // Tamanho do vetor
  6.  
  7. int main(int argc, char **argv)
  8. {
  9. int rank, size;
  10. double X[N], Y[N], Z_local[N], Z[N], a = 2.0;
  11.  
  12. MPI_Init(&argc, &argv);
  13. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  14. MPI_Comm_size(MPI_COMM_WORLD, &size);
  15.  
  16. if (N % size != 0)
  17. {
  18. if (rank == 0)
  19. {
  20. printf("N deve ser divisível pelo número de processos.\n");
  21. }
  22. MPI_Finalize();
  23. return 1;
  24. }
  25.  
  26. if (rank == 0)
  27. {
  28. // Inicializa vetores X e Y
  29. for (int i = 0; i < N; i++)
  30. {
  31. X[i] = ((double) rand() / RAND_MAX); // Valores aleatórios entre 0 e 1
  32. Y[i] = ((double) rand() / RAND_MAX);
  33. }
  34. }
  35.  
  36. // Distribui X, Y e a para todos os processos
  37. MPI_Bcast(X, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  38. MPI_Bcast(Y, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  39. MPI_Bcast(&a, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  40.  
  41. // Calcula Z_local = a <X, Y> para aumentar o tempo serial
  42. for (int k = 0; k < 100000; k++)
  43. {
  44. for (int i = rank * (N / size); i < (rank + 1) * (N / size); i++)
  45. {
  46. Z_local[i] = a * X[i] * Y[i];
  47. }
  48. }
  49.  
  50. // Reduz os resultados locais para o processo 0
  51. MPI_Reduce(Z_local, Z, N, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
  52.  
  53. if (rank == 0)
  54. {
  55. printf("Resultados para %d processadores:\n", size);
  56. for (int i = 0; i < N; i++)
  57. {
  58. printf("%f ", Z[i]);
  59. }
  60. printf("\n");
  61. }
  62.  
  63. MPI_Finalize();
  64. return 0;
  65. }
  66.  
  67.  
Success #stdin #stdout #stderr 0.3s 40304KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: unexpected symbol in "int main"
Execution halted