diff options
-rw-r--r-- | tabulator-mpi/constants.hpp | 4 | ||||
-rw-r--r-- | tabulator-mpi/head.cpp | 43 | ||||
-rw-r--r-- | tabulator-mpi/main.cpp | 5 |
3 files changed, 43 insertions, 9 deletions
diff --git a/tabulator-mpi/constants.hpp b/tabulator-mpi/constants.hpp index c8f18e2..3f80bff 100644 --- a/tabulator-mpi/constants.hpp +++ b/tabulator-mpi/constants.hpp @@ -1,3 +1,3 @@ #define STEPS_TO_TIE 1000000 -#define ROUNDS_PER_CHUNK 100 -#define CHUNKS_PER_PAIR 10 +#define ROUNDS_PER_CHUNK 500 +#define CHUNKS_PER_PAIR 5 diff --git a/tabulator-mpi/head.cpp b/tabulator-mpi/head.cpp index bd270af..c425865 100644 --- a/tabulator-mpi/head.cpp +++ b/tabulator-mpi/head.cpp @@ -1,4 +1,5 @@ #include <lib94/lib94.hpp> +#include <csignal> #include <cstdio> #include <mpi.h> @@ -25,26 +26,54 @@ void head_main(int comm_size, int warrior_count, const lib94::warrior *const *wa score_results[i][j] = 0; } + int chunks = warrior_count * (warrior_count - 1) / 2 * CHUNKS_PER_PAIR; + int on_chunk = 0; + + int right_name_width = 0; for (int i = 0; i < warrior_count; ++i) - for (int j = i + 1; j < warrior_count; ++j) { - fprintf(stderr, "%s vs %s\n", warriors[i]->name.c_str(), warriors[j]->name.c_str()); + if ((int)warriors[i]->name.size() > right_name_width) + right_name_width = warriors[i]->name.size(); + + int rank_width = std::max(std::string("rank").size(), std::to_string(comm_size - 1).size()); + int right_round_width = std::to_string(CHUNKS_PER_PAIR * ROUNDS_PER_CHUNK).size(); + int right_chunk_width = std::to_string(chunks).size(); + + int left_name_width = std::max(right_name_width, (int)std::string("match").size() - right_name_width - 4); + int left_round_width = std::max((int)std::to_string((CHUNKS_PER_PAIR - 1) * ROUNDS_PER_CHUNK + 1).size(), (int)std::string("rounds").size() - right_round_width - 3); + int left_chunk_width = std::max(right_chunk_width, (int)std::string("chunk").size() - right_chunk_width - 3); + + fprintf(stderr, "\x1b""7\x1b[?47h\x1b[?25l\x1b[2J\x1b[0H"); + fprintf(stderr, "%*s | %*s | %*s | %*s", rank_width, "rank", + left_name_width + 4 + right_name_width, "match", + left_round_width + 3 + right_round_width, "rounds", + left_chunk_width + 3 + right_chunk_width, "chunk"); + + for (int i = 0; i < warrior_count; ++i) + for (int j = i + 1; j < warrior_count; ++j) for (int x = 0; x < CHUNKS_PER_PAIR; ++x) { + ++on_chunk; int rank = get_result(); int message[3] = {i, j, x * ROUNDS_PER_CHUNK}; MPI_Send(message, 2, MPI_INT, rank, 0, MPI_COMM_WORLD); - fprintf(stderr, "sent rounds %d through %d to worker %d\n", - x * ROUNDS_PER_CHUNK + 1, x * ROUNDS_PER_CHUNK + ROUNDS_PER_CHUNK, rank); + fprintf(stderr, "\x1b[%d;0H%*d | %*s vs %*s | %*d - %*d | %*d / %*d\x1b[0K", rank + 1, rank_width, rank, + left_name_width, warriors[i]->name.c_str(), right_name_width, warriors[j]->name.c_str(), + left_round_width, x * ROUNDS_PER_CHUNK + 1, right_round_width, x * ROUNDS_PER_CHUNK + ROUNDS_PER_CHUNK, + left_chunk_width, on_chunk, right_chunk_width, chunks); } - fputc('\n', stderr); - } - for (int i = 0; i < comm_size - 1; ++i) { int rank = get_result(); int message[3] = {-1}; MPI_Send(message, 3, MPI_INT, rank, 0, MPI_COMM_WORLD); + fprintf(stderr, "\x1b[%d;0H%*d | %*s | %*s | %*s\x1b[0K", + rank + 1, rank_width, rank, + left_name_width + 4 + right_name_width, "", + left_round_width + 3 + right_round_width, "", + left_chunk_width + 3 + right_chunk_width, "done"); } + fprintf(stderr, "\x1b[?25h\x1b[?47l\x1b""8"); + for (int i = 0; i < warrior_count; ++i) for (int j = i + 1; j < warrior_count; ++j) if (score_results[i][j] < 0) { diff --git a/tabulator-mpi/main.cpp b/tabulator-mpi/main.cpp index 959cd8c..cb60ecb 100644 --- a/tabulator-mpi/main.cpp +++ b/tabulator-mpi/main.cpp @@ -33,6 +33,11 @@ int main(int argc, char **argv) { MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank); MPI_Comm_size(MPI_COMM_WORLD, &comm_size); + if (comm_size < 2) { + fprintf(stderr, "at least two processes are required\n"); + return 1; + } + const lib94::warrior **warriors = new const lib94::warrior *[argc - 1]; for (int i = 0; i < argc - 1; ++i) warriors[i] = load_warrior(argv[i + 1]); |