#include <iostream> #include <cstdio> #include <cstddef> #include <vector> #include <mpi.h> using namespace std; class Car { public: int shifts; int topSpeed; double pos[3]; }; int main(int argc, char* argv[]) { const int tag = 13; int size, rank; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); if (size < 2) { fprintf(stderr,"Requires at least two processes.\n"); } /* create a type for struct car */ const int nitems = 3; int blocklengths[3] = {1, 1, 3}; MPI_Datatype types[3] = {MPI_INT, MPI_INT, MPI_DOUBLE}; MPI_Datatype mpi_car_type; MPI_Aint offsets[3]; offsets[0] = offsetof(Car, shifts); offsets[1] = offsetof(Car, topSpeed); offsets[2] = offsetof(Car, pos); MPI_Type_create_struct(nitems, blocklengths, offsets, types, &mpi_car_type); MPI_Type_commit(&mpi_car_type); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) { vector<Car> send; send.push_back(Car()); send.push_back(Car()); send[0].shifts = 4; send[0].topSpeed = 100; send[0].pos[0] = 0.5; send[0].pos[1] = 0.6; send[0].pos[2] = 0.7; send[1].shifts = 5; send[1].topSpeed = 200; send[1].pos[0] = 1.5; send[1].pos[1] = 1.6; send[1].pos[2] = 1.7; const int dest = 1; MPI_Send(&send[0], 2, mpi_car_type, dest, tag, MPI_COMM_WORLD); printf("Rank %d: sent structure car\n", rank); } if (rank == 1) { MPI_Status status; const int src=0; vector<Car> recv; recv.reserve(2); MPI_Recv(&recv[0], 2, mpi_car_type, src, tag, MPI_COMM_WORLD, &status); printf("Rank %d: Received: shifts = %d topSpeed = %d | %f | %f | %f\n", rank, recv[0].shifts, recv[0].topSpeed, recv[0].pos[0], recv[0].pos[1], recv[0].pos[2]); printf("Rank %d: Received: shifts = %d topSpeed = %d | %f | %f | %f\n", rank, recv[1].shifts, recv[1].topSpeed, recv[1].pos[0], recv[1].pos[1], recv[1].pos[2]); } MPI_Type_free(&mpi_car_type); MPI_Finalize(); return 0; }