DilyaraL

Untitled

Oct 26th, 2021 (edited)
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include "mpi.h";
  4. #include <ctime>
  5.  
  6. using namespace std;
  7.  
  8. void msg_show(int* msg, int dim) {
  9. int rank;
  10. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  11. cout << "rank: " << rank << ", msg = ";
  12. for (int i = 0; i < dim; i++) {
  13. cout << msg[i] << ' ';
  14. }
  15. cout << endl;
  16. }
  17. // создаем сообщение
  18. int* create_msg(int dim) {
  19. int* msg;
  20. int rank;
  21. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  22.  
  23. if (rank == 0) {
  24. msg = (int*)malloc(dim * sizeof(int));
  25. for (int i = 0; i < dim; i++) {
  26. msg[i] = 1;
  27. }
  28. return msg;
  29. }
  30.  
  31. if (rank == 1) {
  32. msg = (int*)malloc(dim * sizeof(int));
  33. for (int i = 0; i < dim; i++) {
  34. msg[i] = 5;
  35. }
  36. return msg;
  37. }
  38. }
  39.  
  40.  
  41. int main(int* argc, char** argv) {
  42. int rank, size, n = 4 * 8;
  43. int dim_msg = n / 4;
  44. int* msg;
  45. int msg_tag_from_zero = 27;
  46. int msg_tag_from_first = 20;
  47. int rank_zero_proc = 0;
  48. int rank_first_proc = 1;
  49. int buf_elems;
  50. double time_start_1, time_start_0, time_stop_1, time_stop_0;
  51.  
  52. MPI_Request request_from_0_to_1, request_from_1_to_0;
  53. MPI_Status status_from_0_to_1, status_from_1_to_0;
  54.  
  55. MPI_Init(argc, &argv);
  56.  
  57. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  58. MPI_Comm_size(MPI_COMM_WORLD, &size);
  59.  
  60. if (rank == 0) {
  61. msg = create_msg(dim_msg);
  62. msg_show(msg, dim_msg);
  63.  
  64. time_start_0 = MPI_Wtime();
  65. //отправляем сообщение
  66. MPI_Isend(msg, dim_msg, MPI_INT, rank_first_proc, msg_tag_from_zero, MPI_COMM_WORLD, &request_from_0_to_1);
  67. //выделяем память сообщению
  68. int* msg_recv;
  69. msg_recv = (int*)malloc(dim_msg * sizeof(int));
  70. //принимаем сообщение
  71. MPI_Irecv(msg_recv, dim_msg, MPI_INT, rank_first_proc, msg_tag_from_first, MPI_COMM_WORLD, &request_from_1_to_0);
  72. //ждем, пока не примем сообщение до конца
  73. MPI_Wait(&request_from_1_to_0, &status_from_1_to_0);
  74. time_stop_1 = MPI_Wtime();
  75. msg_show(msg_recv, dim_msg);
  76.  
  77.  
  78. MPI_Status status;
  79. MPI_Send(&time_stop_1, 1, MPI_DOUBLE, 1, 200, MPI_COMM_WORLD);
  80. MPI_Recv(&time_stop_0, 1, MPI_DOUBLE, 1, 100, MPI_COMM_WORLD, &status);
  81. cout << "time_0 = " << time_stop_0 - time_start_0 << endl;
  82. }
  83. if (rank == 1) {
  84. msg = create_msg(dim_msg);
  85. msg_show(msg, dim_msg);
  86.  
  87. time_start_1 = MPI_Wtime();
  88. // отправляем сообщение
  89. MPI_Isend(msg, dim_msg, MPI_INT, rank_zero_proc, msg_tag_from_first, MPI_COMM_WORLD, &request_from_1_to_0);
  90.  
  91. int* msg_recv;
  92. msg_recv = (int*)malloc(dim_msg * sizeof(int));
  93. //принимаем его
  94. MPI_Irecv(msg_recv, dim_msg, MPI_INT, rank_zero_proc, msg_tag_from_zero, MPI_COMM_WORLD, &request_from_0_to_1);
  95. MPI_Wait(&request_from_0_to_1, &status_from_0_to_1);
  96. time_stop_0 = MPI_Wtime();
  97. msg_show(msg_recv, dim_msg);
  98.  
  99. MPI_Status status;
  100. MPI_Send(&time_stop_0, 1, MPI_DOUBLE, 0, 100, MPI_COMM_WORLD);
  101. MPI_Recv(&time_stop_1, 1, MPI_DOUBLE, 0, 200, MPI_COMM_WORLD, &status);
  102. cout << "time_1 = " << time_stop_1 - time_start_1 << endl;
  103. }
  104. MPI_Finalize();
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment