#include #include #include #include #include "Serialize_Deserialize_Vector.h" #define MCW MPI_COMM_WORLD using namespace std; using sdv = Serialize_Deserialize_Vector; //Problem size int N; //global variables std::vector > A = std::vector >(0, std::vector(0)); std::vector > B = std::vector >(0, std::vector(0)); std::vector > AB = std::vector >(0, std::vector(0)); std::vector > AB_serial = std::vector >(0, std::vector(0)); void print_matrix(std::vector > mat); void serial_version(); void compute_interval(int start, int interval); void multiplyMatrix(int rank, int size); void read_in_matrices(); int main(int argc, char** argv){ int rank, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MCW, &rank); MPI_Comm_size(MCW, &size); multiplyMatrix(rank, size); MPI_Finalize(); } void read_in_matrices() { ifstream f("Matrix.txt"); f >> N; // Allocate memory A.resize(N); for (int i = 0; i < N; ++i) A[i].resize(N); B.resize(N); for (int i = 0; i < N; ++i) B[i].resize(N); AB.resize(N); for (int i = 0; i < N; ++i) AB[i].resize(N); AB_serial.resize(N); for (int i = 0; i < N; ++i) AB_serial[i].resize(N); // Fill Matricies for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) f >> A[i][j]; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) f >> B[i][j]; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) AB[i][j] = 0; } //Function to print matrix void print_matrix(std::vector >mat) { for (int i = 0; i < N; i++){ for (int j = 0; j tmpB = std::vector(N*N); tmpB = Serialize_Deserialize_Vector::Serialize(B); MPI_Bcast(&tmpB[0],N*N,MPI_DOUBLE,0,MCW); if(rank) B=Serialize_Deserialize_Vector::Deserialize(tmpB); //print_matrix(B); std::vector tmpA = std::vector(N*N); tmpA = Serialize_Deserialize_Vector::Serialize(A); MPI_Bcast(&tmpA[0], N*N, MPI_DOUBLE, 0, MCW); // MPI_Scatter(&tmpA[0], interval * N, MPI_DOUBLE, &tmpA[rank * interval], interval * N, // MPI_DOUBLE, 0, MCW); if(rank) A=Serialize_Deserialize_Vector::Deserialize(tmpA); //print_matrix(A); //Each processor cumputes the interval they are responsible for compute_interval(rank*interval,interval); //Gather results auto tmp_AB = Serialize_Deserialize_Vector::Serialize(AB); // cout << "RANK: " << rank << " INTERVAL: "<< interval << " rank*N " << rank*N << " tmp_AB.size() "< tmp(interval*N); // for(int i = (rank * interval*N),j=0; i < (rank * interval*N)+N; i++, j++){ // tmp[j]=tmp_AB[i]; // cout << tmp[j]<<" "; // } // cout << endl; // std::vector test(N*N); MPI_Gather(&tmp_AB[rank * interval*N], interval * N, MPI_DOUBLE, &tmp_AB[rank*interval*N], interval * N, MPI_DOUBLE, 0, MCW); AB=Serialize_Deserialize_Vector::Deserialize(tmp_AB); if(!rank) print_matrix(AB); //Record parallel finish time MPI_Barrier(MCW); time2 = MPI_Wtime(); if (!rank){ cout << "made it here!!" <