Advertisement
Litigare

Untitled

Jun 16th, 2021
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.23 KB | None | 0 0
  1. #include "AStarMPICommunication.h"
  2. #include "AStar.h"
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. void AStarMPICommunication::DefineCoordinateTypeInMPI() {
  8.     // defining new datatype for MPI that will match Coordinate
  9.     // https://www.codingame.com/playgrounds/349/introduction-to-mpi/custom-types
  10.     MPI_Type_contiguous(2, MPI_INT, &dt_coordinate);
  11.     MPI_Type_commit(&dt_coordinate);
  12. }
  13.  
  14. //void AStarMPICommunication::DefineNodeSetTypeInMPI() {
  15. //    // defining new datatype for MPI that will match Coordinate
  16. //    // https://www.codingame.com/playgrounds/349/introduction-to-mpi/custom-types
  17. //    MPI_Type_contiguous(2, MPI_INT, &dt_nodeSet);
  18. //    MPI_Type_commit(&dt_nodeSet);
  19. //}
  20.  
  21. void AStarMPICommunication::DefineNodeTypeInMPI() {
  22.     // defining new datatype for MPI that will match Coordinate
  23.     // https://www.codingame.com/playgrounds/349/introduction-to-mpi/custom-types
  24.     MPI_Type_contiguous(5, MPI_INT, &dt_node);
  25.     MPI_Type_commit(&dt_node);
  26. }
  27.  
  28. void AStarMPICommunication::CommunicationWithCoordinateExample(int rank)
  29. {
  30.     constexpr int n_coordinates = 10;
  31.     Coordinate coordinates_data[n_coordinates];
  32.  
  33.     if (rank == 0)
  34.     {
  35.         for (auto i = 0; i < n_coordinates; ++i)
  36.         {
  37.             coordinates_data[i].x = i;
  38.             coordinates_data[i].y = i + 10;
  39.         }
  40.  
  41.         MPI_Send(coordinates_data, n_coordinates, dt_coordinate, 1, 0, MPI_COMM_WORLD);
  42.     }
  43.     else
  44.     {
  45.         MPI_Recv(coordinates_data, n_coordinates, dt_coordinate, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  46.  
  47.         for (auto i = 0; i < n_coordinates; ++i) {
  48.             std::cout << "Coordinate #" << i << " : (" << coordinates_data[i].x << "; " << coordinates_data[i].y << ")"
  49.             << std::endl;
  50.         }
  51.     }
  52. }
  53.  
  54. //void AStarMPICommunication::CommunicationWithNodeExample(int rank) {
  55. //    constexpr int n_nodes = 1;
  56. //    Node nodes_data[n_nodes];
  57. //
  58. //    if (rank == 0)
  59. //    {
  60. //        auto parent_coordinates = *new Coordinate;
  61. //        parent_coordinates.x = 4;
  62. //        parent_coordinates.y = 41;
  63. //
  64. //        auto coordinates = *new Coordinate;
  65. //        coordinates.x = 14;
  66. //        coordinates.y = 15;
  67. //
  68. //        auto parentNode = new Node(parent_coordinates);
  69. //        auto node = *new Node(coordinates, parentNode);
  70. //
  71. //        nodes_data[0] = node;
  72. //
  73. //        MPI_Send(nodes_data, n_nodes, dt_node, 1, 0, MPI_COMM_WORLD);
  74. //    }
  75. //    else
  76. //    {
  77. //        MPI_Recv(nodes_data, n_nodes, dt_node, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  78. //        cout << "Node:"
  79. //            << "\n\tX - " << nodes_data[0].coordinates.x
  80. //            << "\n\tY - " << nodes_data[0].coordinates.y
  81. //            << "\n\tPX - " << nodes_data[0].parent->coordinates.x
  82. //            << "\n\tPY - " << nodes_data[0].parent->coordinates.y;
  83. //    }
  84. //}
  85.  
  86. void AStarMPICommunication::CommunicationWithNodeExample(int rank) {
  87.     constexpr int n_nodes = 2;
  88.     Node nodes_data[n_nodes];
  89.  
  90.     if (rank == 0)
  91.     {
  92.         auto parent_coordinates = *new Coordinate;
  93.         parent_coordinates.x = 24;
  94.         parent_coordinates.y = 21;
  95.  
  96.         auto parentNode = new Node(parent_coordinates);
  97.         parentNode->G = 255;
  98.         parentNode->H = 277;
  99.  
  100.         auto coordinates = *new Coordinate;
  101.         coordinates.x = 4;
  102.         coordinates.y = 5;
  103.  
  104.         auto node = *new Node(coordinates, parentNode);
  105.         node.G = 16;
  106.         node.H = 11;
  107.  
  108.         nodes_data[0] = node;
  109.         nodes_data[1] = *parentNode;
  110.  
  111.         MPI_Send(nodes_data, n_nodes, dt_node, 1, 0, MPI_COMM_WORLD);
  112.     }
  113.     else
  114.     {
  115.         MPI_Recv(nodes_data, n_nodes, dt_node, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  116.  
  117.         cout << "Node:"
  118.             << "\n\tX - " << nodes_data[0].coordinates.x
  119.             << "\n\tY - " << nodes_data[0].coordinates.y
  120.             << "\n\tG - " << nodes_data[0].G
  121.             << "\n\tH - " << nodes_data[0].H
  122.             << "\n\tP - " << nodes_data[0].parent
  123.             << "\n\tPX - " << nodes_data[1].coordinates.x
  124.             << "\n\tPY - " << nodes_data[1].coordinates.y
  125.             << "\n\tPG - " << nodes_data[1].G
  126.             << "\n\tPH - " << nodes_data[1].H
  127.             << "\n\tPP - " << nodes_data[1].parent;
  128.     }
  129. }
  130.  
  131. void AStarMPICommunication::SendCoordinate(int rank, Coordinate coordinate) {
  132.     Coordinate coordinate_data[1];
  133.  
  134.     coordinate_data[0] = coordinate;
  135.  
  136.     MPI_Send(coordinate_data, 1, dt_coordinate, rank, 0, MPI_COMM_WORLD);
  137. }
  138.  
  139. Coordinate AStarMPICommunication::ReceiveCoordinate(int rank) {
  140.     Coordinate coordinate_data[1];
  141.  
  142.     MPI_Recv(coordinate_data, 1, dt_coordinate, rank, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  143.  
  144.     return coordinate_data[0];
  145. }
  146.  
  147.  
  148. void AStarMPICommunication::SendNode(int rank, Node node) {
  149.     Node node_data[2] {
  150.         node,
  151.         *(node.parent)
  152.     };
  153.  
  154.     MPI_Send(node_data, 2, dt_node, rank, 0, MPI_COMM_WORLD);
  155. }
  156.  
  157. Node AStarMPICommunication::ReceiveNode(int rank) {
  158.     Node node_data[2];
  159.  
  160.     MPI_Recv(node_data, 2, dt_node, rank, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  161.  
  162.     auto node = node_data[0];
  163.  
  164.     auto parent = new Node(node_data[1].coordinates);
  165.  
  166.     parent->G = node_data[1].G;
  167.     parent->H = node_data[1].H;
  168.  
  169.     node.parent = parent;
  170.  
  171.     return node;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement