Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "AStarMPICommunication.h"
- #include "AStar.h"
- #include <iostream>
- using namespace std;
- void AStarMPICommunication::DefineCoordinateTypeInMPI() {
- // defining new datatype for MPI that will match Coordinate
- // https://www.codingame.com/playgrounds/349/introduction-to-mpi/custom-types
- MPI_Type_contiguous(2, MPI_INT, &dt_coordinate);
- MPI_Type_commit(&dt_coordinate);
- }
- //void AStarMPICommunication::DefineNodeSetTypeInMPI() {
- // // defining new datatype for MPI that will match Coordinate
- // // https://www.codingame.com/playgrounds/349/introduction-to-mpi/custom-types
- // MPI_Type_contiguous(2, MPI_INT, &dt_nodeSet);
- // MPI_Type_commit(&dt_nodeSet);
- //}
- void AStarMPICommunication::DefineNodeTypeInMPI() {
- // defining new datatype for MPI that will match Coordinate
- // https://www.codingame.com/playgrounds/349/introduction-to-mpi/custom-types
- MPI_Type_contiguous(5, MPI_INT, &dt_node);
- MPI_Type_commit(&dt_node);
- }
- void AStarMPICommunication::CommunicationWithCoordinateExample(int rank)
- {
- constexpr int n_coordinates = 10;
- Coordinate coordinates_data[n_coordinates];
- if (rank == 0)
- {
- for (auto i = 0; i < n_coordinates; ++i)
- {
- coordinates_data[i].x = i;
- coordinates_data[i].y = i + 10;
- }
- MPI_Send(coordinates_data, n_coordinates, dt_coordinate, 1, 0, MPI_COMM_WORLD);
- }
- else
- {
- MPI_Recv(coordinates_data, n_coordinates, dt_coordinate, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- for (auto i = 0; i < n_coordinates; ++i) {
- std::cout << "Coordinate #" << i << " : (" << coordinates_data[i].x << "; " << coordinates_data[i].y << ")"
- << std::endl;
- }
- }
- }
- //void AStarMPICommunication::CommunicationWithNodeExample(int rank) {
- // constexpr int n_nodes = 1;
- // Node nodes_data[n_nodes];
- //
- // if (rank == 0)
- // {
- // auto parent_coordinates = *new Coordinate;
- // parent_coordinates.x = 4;
- // parent_coordinates.y = 41;
- //
- // auto coordinates = *new Coordinate;
- // coordinates.x = 14;
- // coordinates.y = 15;
- //
- // auto parentNode = new Node(parent_coordinates);
- // auto node = *new Node(coordinates, parentNode);
- //
- // nodes_data[0] = node;
- //
- // MPI_Send(nodes_data, n_nodes, dt_node, 1, 0, MPI_COMM_WORLD);
- // }
- // else
- // {
- // MPI_Recv(nodes_data, n_nodes, dt_node, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- // cout << "Node:"
- // << "\n\tX - " << nodes_data[0].coordinates.x
- // << "\n\tY - " << nodes_data[0].coordinates.y
- // << "\n\tPX - " << nodes_data[0].parent->coordinates.x
- // << "\n\tPY - " << nodes_data[0].parent->coordinates.y;
- // }
- //}
- void AStarMPICommunication::CommunicationWithNodeExample(int rank) {
- constexpr int n_nodes = 2;
- Node nodes_data[n_nodes];
- if (rank == 0)
- {
- auto parent_coordinates = *new Coordinate;
- parent_coordinates.x = 24;
- parent_coordinates.y = 21;
- auto parentNode = new Node(parent_coordinates);
- parentNode->G = 255;
- parentNode->H = 277;
- auto coordinates = *new Coordinate;
- coordinates.x = 4;
- coordinates.y = 5;
- auto node = *new Node(coordinates, parentNode);
- node.G = 16;
- node.H = 11;
- nodes_data[0] = node;
- nodes_data[1] = *parentNode;
- MPI_Send(nodes_data, n_nodes, dt_node, 1, 0, MPI_COMM_WORLD);
- }
- else
- {
- MPI_Recv(nodes_data, n_nodes, dt_node, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- cout << "Node:"
- << "\n\tX - " << nodes_data[0].coordinates.x
- << "\n\tY - " << nodes_data[0].coordinates.y
- << "\n\tG - " << nodes_data[0].G
- << "\n\tH - " << nodes_data[0].H
- << "\n\tP - " << nodes_data[0].parent
- << "\n\tPX - " << nodes_data[1].coordinates.x
- << "\n\tPY - " << nodes_data[1].coordinates.y
- << "\n\tPG - " << nodes_data[1].G
- << "\n\tPH - " << nodes_data[1].H
- << "\n\tPP - " << nodes_data[1].parent;
- }
- }
- void AStarMPICommunication::SendCoordinate(int rank, Coordinate coordinate) {
- Coordinate coordinate_data[1];
- coordinate_data[0] = coordinate;
- MPI_Send(coordinate_data, 1, dt_coordinate, rank, 0, MPI_COMM_WORLD);
- }
- Coordinate AStarMPICommunication::ReceiveCoordinate(int rank) {
- Coordinate coordinate_data[1];
- MPI_Recv(coordinate_data, 1, dt_coordinate, rank, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- return coordinate_data[0];
- }
- void AStarMPICommunication::SendNode(int rank, Node node) {
- Node node_data[2] {
- node,
- *(node.parent)
- };
- MPI_Send(node_data, 2, dt_node, rank, 0, MPI_COMM_WORLD);
- }
- Node AStarMPICommunication::ReceiveNode(int rank) {
- Node node_data[2];
- MPI_Recv(node_data, 2, dt_node, rank, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
- auto node = node_data[0];
- auto parent = new Node(node_data[1].coordinates);
- parent->G = node_data[1].G;
- parent->H = node_data[1].H;
- node.parent = parent;
- return node;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement