Advertisement
Guest User

Untitled

a guest
Feb 14th, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. /*
  2. * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
  3. * University Research and Technology
  4. * Corporation. All rights reserved.
  5. * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
  6. *
  7. * Simple ring test program in C.
  8. */
  9.  
  10. #include <stdio.h>
  11. #include "mpi.h"
  12.  
  13. int main(int argc, char *argv[])
  14. {
  15. int rank, size, next, prev, message, tag = 201;
  16.  
  17. /* Start up MPI */
  18.  
  19. MPI_Init(&argc, &argv);
  20. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  21. MPI_Comm_size(MPI_COMM_WORLD, &size);
  22.  
  23. /* Calculate the rank of the next process in the ring. Use the
  24. modulus operator so that the last process "wraps around" to
  25. rank zero. */
  26.  
  27. next = (rank + 1) % size;
  28. prev = (rank + size - 1) % size;
  29.  
  30. /* If we are the "master" process (i.e., MPI_COMM_WORLD rank 0),
  31. put the number of times to go around the ring in the
  32. message. */
  33.  
  34. if (0 == rank) {
  35. message = 10;
  36.  
  37. printf("Process 0 sending %d to %d, tag %d (%d processes in ring)\n",
  38. message, next, tag, size);
  39. MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
  40. printf("Process 0 sent to %d\n", next);
  41. }
  42.  
  43. /* Pass the message around the ring. The exit mechanism works as
  44. follows: the message (a positive integer) is passed around the
  45. ring. Each time it passes rank 0, it is decremented. When
  46. each processes receives a message containing a 0 value, it
  47. passes the message on to the next process and then quits. By
  48. passing the 0 message first, every process gets the 0 message
  49. and can quit normally. */
  50.  
  51. while (1) {
  52. MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD,
  53. MPI_STATUS_IGNORE);
  54.  
  55. if (1){
  56. --message;
  57. printf("Process %d decremented value: %d\n", rank, message);
  58. }
  59.  
  60. MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
  61.  
  62. if (0 == message) {
  63. printf("Process %d exiting\n", rank);
  64. break;
  65. }
  66.  
  67. }
  68.  
  69. /* The last process does one extra send to process 0, which needs
  70. to be received before the program can exit */
  71.  
  72. if (0 == rank) {
  73. MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD,
  74. MPI_STATUS_IGNORE);
  75. }
  76.  
  77. /* All done */
  78.  
  79. MPI_Finalize();
  80. return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement