fork download
  1. #include <mpi.h>
  2. #include <stdio.h>
  3.  
  4. int main(int argc, char* argv[]) {
  5. int rank, size, n, x, parent, slot;
  6. int array[n + 1];
  7.  
  8. MPI_Init(&argc, &argv);
  9. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  10. MPI_Comm_size(MPI_COMM_WORLD, &size);
  11.  
  12. // Initialize variables
  13. n = 5; // Number of child nodes
  14. x = 0;
  15. for (int i = 0; i <= n; ++i) {
  16. array[i] = 0;
  17. }
  18.  
  19. // Phase 2: Barrier loop
  20. while (1) {
  21. x++;
  22.  
  23. // Initialize flags
  24. for (int j = 0; j <= n; ++j) {
  25. if (rank >= (rank / n) + 1 + j) {
  26. array[j] = 0;
  27. } else {
  28. array[j] = 1;
  29. }
  30. }
  31. array[n] = 0;
  32.  
  33. // Repeat until barrier is reached
  34. do {
  35. parent = (rank - 1) / n;
  36. slot = (rank - 1) % n;
  37.  
  38. if (array[0] + array[1] + array[2] + array[3] + array[4] == 4) {
  39. if (rank == 0) {
  40. array[n] = 1;
  41. } else {
  42. MPI_Send(&array[slot], 1, MPI_INT, parent, 0, MPI_COMM_WORLD);
  43. }
  44. }
  45. } while (array[n] != 1);
  46.  
  47. // Phase 3: Broadcast barrier reached flag
  48. if (rank == 0) {
  49. for (int i = 1; i < size; ++i) {
  50. MPI_Send(&array[n], 1, MPI_INT, i, 0, MPI_COMM_WORLD);
  51. }
  52. } else {
  53. MPI_Recv(&array[n], 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  54. }
  55. }
  56.  
  57. MPI_Finalize();
  58. return 0;
  59. }
Success #stdin #stdout #stderr 0.26s 40752KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: unexpected symbol in "int main"
Execution halted