diff --git a/lab11/game_of_life/game_of_life.cpp b/lab11/game_of_life/game_of_life.cpp index 672f843..7eb73a6 100644 --- a/lab11/game_of_life/game_of_life.cpp +++ b/lab11/game_of_life/game_of_life.cpp @@ -7,7 +7,7 @@ void GameOfLife::step() { SuperGrid next = SuperGrid::zeros(grid_.rows(), grid_.cols(), grid_.get_communicator()); const int rows = grid_.rows(); const int cols = grid_.cols(); - grid_.update(); + //grid_.update(); for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { const int numLiveNeighbors = countLiveNeighbors(i, j); diff --git a/lab11/game_of_life/super_grid.cpp b/lab11/game_of_life/super_grid.cpp index ae0d006..a025cea 100644 --- a/lab11/game_of_life/super_grid.cpp +++ b/lab11/game_of_life/super_grid.cpp @@ -4,11 +4,11 @@ std::vector SuperGrid::receive_halos(HaloLayers halo_layers) { std::vector recv_requests(8); - std::cout << halo_layers.top_row.size() << std::endl; - MPI_Irecv(halo_layers.top_row.data(), halo_layers.top_row.size(), MPI_DOUBLE, neighbors_.top, neighbors_.top, comm_, &recv_requests[0]); - MPI_Irecv(halo_layers.right_row.data(), halo_layers.right_row.size(), MPI_DOUBLE, neighbors_.right, neighbors_.right, comm_, &recv_requests[1]); - MPI_Irecv(halo_layers.bottom_row.data(), halo_layers.bottom_row.size(), MPI_DOUBLE, neighbors_.bottom, neighbors_.bottom, comm_, &recv_requests[2]); - MPI_Irecv(halo_layers.left_row.data(), halo_layers.left_row.size(), MPI_DOUBLE, neighbors_.left, neighbors_.left, comm_, &recv_requests[3]); + std::cout << halo_layers.top_halo.size() << std::endl; + MPI_Irecv(halo_layers.top_halo.data(), halo_layers.top_halo.size(), MPI_DOUBLE, neighbors_.top, neighbors_.top, comm_, &recv_requests[0]); + MPI_Irecv(halo_layers.right_halo.data(), halo_layers.right_halo.size(), MPI_DOUBLE, neighbors_.right, neighbors_.right, comm_, &recv_requests[1]); + MPI_Irecv(halo_layers.bottom_halo.data(), halo_layers.bottom_halo.size(), MPI_DOUBLE, neighbors_.bottom, neighbors_.bottom, comm_, &recv_requests[2]); + MPI_Irecv(halo_layers.left_halo.data(), halo_layers.left_halo.size(), MPI_DOUBLE, neighbors_.left, neighbors_.left, comm_, &recv_requests[3]); MPI_Irecv(&halo_layers.top_right_corner, 1, MPI_DOUBLE, neighbors_.top_right, neighbors_.top_right, comm_, &recv_requests[4]); MPI_Irecv(&halo_layers.bottom_right_corner, 1, MPI_DOUBLE, neighbors_.bottom_right, neighbors_.bottom_right, comm_, &recv_requests[5]); @@ -18,7 +18,7 @@ std::vector SuperGrid::receive_halos(HaloLayers halo_layers) return recv_requests; } -std::vector SuperGrid::get_top_row() +std::vector SuperGrid::get_inner_top_row() { std::vector row(cols()); for (int j = 0; j < cols(); ++j) @@ -26,7 +26,7 @@ std::vector SuperGrid::get_top_row() return row; } -std::vector SuperGrid::get_bottom_row() +std::vector SuperGrid::get_inner_bottom_row() { std::vector row(cols()); for (int j = 0; j < cols(); ++j) @@ -34,7 +34,7 @@ std::vector SuperGrid::get_bottom_row() return row; } -std::vector SuperGrid::get_left_row() +std::vector SuperGrid::get_inner_left_column() { std::vector col(rows()); for (int i = 0; i < rows(); ++i) @@ -42,7 +42,7 @@ std::vector SuperGrid::get_left_row() return col; } -std::vector SuperGrid::get_right_row() +std::vector SuperGrid::get_inner_right_column() { std::vector col(rows()); for (int i = 0; i < rows(); ++i) @@ -50,37 +50,37 @@ std::vector SuperGrid::get_right_row() return col; } -double SuperGrid::get_top_left_corner() +double SuperGrid::get_inner_top_left_corner() { return (*this)(0, 0); } -double SuperGrid::get_top_right_corner() +double SuperGrid::get_inner_top_right_corner() { return (*this)(cols() - 1, 0); } -double SuperGrid::get_bottom_left_corner() +double SuperGrid::get_inner_bottom_left_corner() { return (*this)(0, rows() - 1); } -double SuperGrid::get_bottom_right_corner() +double SuperGrid::get_inner_bottom_right_corner() { return (*this)(cols() - 1, rows() - 1); } std::vector SuperGrid::inform_neighbors() { - std::vector top_row = get_top_row(); - std::vector right_row = get_right_row(); - std::vector bottom_row = get_bottom_row(); - std::vector left_row = get_left_row(); + std::vector inner_top_row = get_inner_top_row(); + std::vector inner_right_column = get_inner_right_column(); + std::vector inner_bottom_row = get_inner_bottom_row(); + std::vector inner_left_column = get_inner_left_column(); - double top_right_corner = get_top_right_corner(); - double bottom_right_corner = get_bottom_right_corner(); - double top_left_corner = get_top_left_corner(); - double bottom_left_corner = get_bottom_left_corner(); + double inner_top_right_corner = get_inner_top_right_corner(); + double inner_bottom_right_corner = get_inner_bottom_right_corner(); + double inner_top_left_corner = get_inner_top_left_corner(); + double inner_bottom_left_corner = get_inner_bottom_left_corner(); if (rank_ == 0) { @@ -96,16 +96,16 @@ std::vector SuperGrid::inform_neighbors() } std::vector send_requests(8); - std::cout << top_row.size() << "inform_neighbors" << std::endl; - MPI_Isend(top_row.data(), top_row.size(), MPI_DOUBLE, neighbors_.top, rank_, comm_, &send_requests[0]); - MPI_Isend(right_row.data(), right_row.size(), MPI_DOUBLE, neighbors_.right, rank_, comm_, &send_requests[1]); - MPI_Isend(bottom_row.data(), bottom_row.size(), MPI_DOUBLE, neighbors_.bottom, rank_, comm_, &send_requests[2]); - MPI_Isend(left_row.data(), left_row.size(), MPI_DOUBLE, neighbors_.left, rank_, comm_, &send_requests[3]); + std::cout << inner_top_row.size() << "inform_neighbors" << std::endl; + MPI_Isend(inner_top_row.data(), inner_top_row.size(), MPI_DOUBLE, neighbors_.top, rank_, comm_, &send_requests[0]); + MPI_Isend(inner_right_column.data(), inner_right_column.size(), MPI_DOUBLE, neighbors_.right, rank_, comm_, &send_requests[1]); + MPI_Isend(inner_bottom_row.data(), inner_bottom_row.size(), MPI_DOUBLE, neighbors_.bottom, rank_, comm_, &send_requests[2]); + MPI_Isend(inner_left_column.data(), inner_left_column.size(), MPI_DOUBLE, neighbors_.left, rank_, comm_, &send_requests[3]); - MPI_Isend(&top_right_corner, 1, MPI_DOUBLE, neighbors_.top_right, rank_, comm_, &send_requests[4]); - MPI_Isend(&bottom_right_corner, 1, MPI_DOUBLE, neighbors_.bottom_right, rank_, comm_, &send_requests[5]); - MPI_Isend(&top_left_corner, 1, MPI_DOUBLE, neighbors_.top_left, rank_, comm_, &send_requests[6]); - MPI_Isend(&bottom_left_corner, 1, MPI_DOUBLE, neighbors_.bottom_left, rank_, comm_, &send_requests[7]); + MPI_Isend(&inner_top_right_corner, 1, MPI_DOUBLE, neighbors_.top_right, rank_, comm_, &send_requests[4]); + MPI_Isend(&inner_bottom_right_corner, 1, MPI_DOUBLE, neighbors_.bottom_right, rank_, comm_, &send_requests[5]); + MPI_Isend(&inner_top_left_corner, 1, MPI_DOUBLE, neighbors_.top_left, rank_, comm_, &send_requests[6]); + MPI_Isend(&inner_bottom_left_corner, 1, MPI_DOUBLE, neighbors_.bottom_left, rank_, comm_, &send_requests[7]); return send_requests; } @@ -128,28 +128,28 @@ void SuperGrid::update() void SuperGrid::merge_halos(HaloLayers halo_layers) { grid_(0, 0) = halo_layers.top_left_corner; - grid_(grid_.cols(), 0) = halo_layers.top_right_corner; - grid_(0, grid_.rows()) = halo_layers.bottom_left_corner; - grid_(grid_.cols(), grid_.rows()) = halo_layers.bottom_right_corner; + grid_(grid_.cols() - 1, 0) = halo_layers.top_right_corner; + grid_(0, grid_.rows() - 1) = halo_layers.bottom_left_corner; + grid_(grid_.cols() - 1, grid_.rows() - 1) = halo_layers.bottom_right_corner; for (int col = 1; col < grid_.cols() - 1; col++) { - grid_(col, 0) = halo_layers.top_row[col - 1]; + grid_(col, 0) = halo_layers.top_halo[col - 1]; } for (int col = 1; col < grid_.cols() - 1; col++) { - grid_(col, grid_.rows() - 1) = halo_layers.bottom_row[col - 1]; + grid_(col, grid_.rows() - 1) = halo_layers.bottom_halo[col - 1]; } for (int row = 1; row < grid_.rows() - 1; row++) { - grid_(0, row) = halo_layers.left_row[row - 1]; + grid_(0, row) = halo_layers.left_halo[row - 1]; } for (int row = 1; row < grid_.rows() - 1; row++) { - grid_(grid_.cols() - 1, row) = halo_layers.right_row[row - 1]; + grid_(grid_.cols() - 1, row) = halo_layers.right_halo[row - 1]; } } diff --git a/lab11/game_of_life/super_grid.h b/lab11/game_of_life/super_grid.h index 83859f9..de0601c 100644 --- a/lab11/game_of_life/super_grid.h +++ b/lab11/game_of_life/super_grid.h @@ -8,10 +8,10 @@ class HaloLayers { public: - std::vector top_row; - std::vector right_row; - std::vector bottom_row; - std::vector left_row; + std::vector top_halo; + std::vector right_halo; + std::vector bottom_halo; + std::vector left_halo; double top_right_corner; double bottom_right_corner; @@ -19,10 +19,10 @@ public: double bottom_left_corner; HaloLayers(int row_size = 0, int col_size = 0) - : top_row(col_size), - right_row(row_size), - bottom_row(col_size), - left_row(row_size), + : top_halo(col_size), + right_halo(row_size), + bottom_halo(col_size), + left_halo(row_size), top_right_corner(0.0), bottom_right_corner(0.0), top_left_corner(0.0), @@ -82,23 +82,23 @@ public: std::vector receive_halos(HaloLayers halo_layers); std::vector inform_neighbors(); + std::vector get_inner_top_row(); + std::vector get_inner_right_column(); + std::vector get_inner_bottom_row(); + std::vector get_inner_left_column(); + + double get_inner_top_right_corner(); + double get_inner_bottom_right_corner(); + double get_inner_top_left_corner(); + double get_inner_bottom_left_corner(); + + void merge_halos(HaloLayers halo_layers); + private: Matrix grid_; MPI_Comm comm_; Neighbors neighbors_; int rank_; - - std::vector get_top_row(); - std::vector get_right_row(); - std::vector get_bottom_row(); - std::vector get_left_row(); - - double get_top_right_corner(); - double get_bottom_right_corner(); - double get_top_left_corner(); - double get_bottom_left_corner(); - - void merge_halos(HaloLayers halo_layers); }; inline SuperGrid::SuperGrid(const Matrix &other) diff --git a/lab11/game_of_life/test.cpp b/lab11/game_of_life/test.cpp index 27ef00d..a6b3b2e 100644 --- a/lab11/game_of_life/test.cpp +++ b/lab11/game_of_life/test.cpp @@ -13,6 +13,20 @@ Matrix init_step(SuperGrid start) return gol.getGrid(); } +SuperGrid init(int dim) +{ + MPI_Comm comm_; + int num_procs = 16; + MPIGridSize mpiProcs = {4, 4}; + MPI_Dims_create(num_procs, 2, mpiProcs.data()); + + std::array periods = {1, 1}; + MPI_Cart_create(MPI_COMM_WORLD, 2, mpiProcs.data(), periods.data(), true, + &comm_); + + return SuperGrid::zeros(dim, dim, comm_); +} + SuperGrid init() { MPI_Comm comm_; @@ -123,7 +137,6 @@ TEST(test_find_neighbors) expected.bottom_right = 5; check(neighbors == expected, true); } - MPI_Finalize(); } TEST(communication) @@ -145,8 +158,119 @@ TEST(communication) } } -TEST(get_halo_layers) +TEST(get_inner_top_row) { + SuperGrid su_grid = init(5); + su_grid(0, 0) = 1; + su_grid(1, 0) = 2; + su_grid(2, 0) = 3; + su_grid(3, 0) = 4; + su_grid(4, 0) = 5; + std::vector expected = {1,2,3,4,5}; + + check(su_grid.get_inner_top_row() == expected, true); +} + +TEST(get_inner_bottom_row) +{ + SuperGrid su_grid = init(5); + su_grid(0, 4) = 1; + su_grid(1, 4) = 2; + su_grid(2, 4) = 3; + su_grid(3, 4) = 4; + su_grid(4, 4) = 5; + std::vector expected = {1,2,3,4,5}; + + check(su_grid.get_inner_bottom_row() == expected, true); +} + +TEST(get_inner_left_column) +{ + SuperGrid su_grid = init(5); + su_grid(0, 0) = 1; + su_grid(0, 1) = 2; + su_grid(0, 2) = 3; + su_grid(0, 3) = 4; + su_grid(0, 4) = 5; + std::vector expected = {1,2,3,4,5}; + + check(su_grid.get_inner_left_column() == expected, true); +} + +TEST(get_inner_right_column) +{ + SuperGrid su_grid = init(5); + su_grid(4, 0) = 1; + su_grid(4, 1) = 2; + su_grid(4, 2) = 3; + su_grid(4, 3) = 4; + su_grid(4, 4) = 5; + std::vector expected = {1,2,3,4,5}; + + check(su_grid.get_inner_right_column() == expected, true); +} + +TEST(get_inner_top_left_corner) +{ + SuperGrid su_grid = init(5); + su_grid(0, 0) = 42.0; + + check(su_grid.get_inner_top_left_corner() == 42.0, true); +} + +TEST(get_inner_top_right_corner) +{ + SuperGrid su_grid = init(5); + su_grid(4, 0) = 17.0; + + check(su_grid.get_inner_top_right_corner() == 17.0, true); +} + +TEST(get_inner_bottom_left_corner) +{ + SuperGrid su_grid = init(5); + su_grid(0, 4) = 3.14; + + check(su_grid.get_inner_bottom_left_corner() == 3.14, true); +} + +TEST(get_inner_bottom_right_corner) +{ + SuperGrid su_grid = init(5); + su_grid(4, 4) = -1.5; + + check(su_grid.get_inner_bottom_right_corner() == -1.5, true); +} + +TEST(merge_halos) +{ + SuperGrid su_grid = init(5); + + HaloLayers halo_layers; + halo_layers.top_halo = {1, 2, 3, 4, 1}; + halo_layers.bottom_halo = {1, 2, 3, 4, 1}; + halo_layers.left_halo = {1, 2, 3, 4, 1}; + halo_layers.right_halo = {1, 2, 3, 4, 1}; + + halo_layers.top_left_corner = 0; + halo_layers.top_right_corner = 0; + halo_layers.bottom_left_corner = 0; + halo_layers.bottom_right_corner = 0; + + su_grid.merge_halos(halo_layers); + + int rank; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == 0) { + print(su_grid.get_grid()); + } +} + +TEST(finalize) +{ + MPI_Finalize(); + check(true, true); } int main(int argc, char *argv[]) {