From 6678dccccdfffb9c40f64a828fd769c53bb2d29f Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Tue, 30 May 2023 03:01:25 -0400 Subject: mpi-based tabulator --- tabulator-mpi/main.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 tabulator-mpi/main.cpp (limited to 'tabulator-mpi/main.cpp') diff --git a/tabulator-mpi/main.cpp b/tabulator-mpi/main.cpp new file mode 100644 index 0000000..f76ed70 --- /dev/null +++ b/tabulator-mpi/main.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +void head_main(int comm_size, int warrior_count, const lib94::warrior *const *warriors); + +void worker_main(const lib94::warrior *const *warriors); + +const lib94::warrior *load_warrior(const char *file) { + std::ifstream stream(file); + if (!stream) { + fprintf(stderr, "could not open %s\n", file); + exit(1); + } + + std::string source(std::istreambuf_iterator(stream), {}); + + auto w = lib94::compile_warrior(source); + + if (std::holds_alternative(w)) { + fprintf(stderr, "error compiling %s: %s\n", file, std::get(w).c_str()); + exit(1); + } + + return std::get(w); +} + +int main(int argc, char **argv) { + MPI_Init(&argc, &argv); + + int comm_rank, comm_size; + MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank); + MPI_Comm_size(MPI_COMM_WORLD, &comm_size); + + 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]); + + if (comm_rank == 0) + head_main(comm_size, argc - 1, warriors); + else + worker_main(warriors); + + MPI_Finalize(); +} -- cgit v1.2.3