#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), {}); try { return lib94::compile_warrior(source); } catch (const lib94::compiler_exception &ex) { fprintf(stderr, "error in %s on line %u: %s\n", file, ex.source_line_number, ex.message.c_str()); exit(1); } } 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); 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]); for (int i = 0; i < argc - 1; ++i) for (int j = i + 1; j < argc - 1; ++j) { const lib94::warrior *wbuf[2] = {warriors[i], warriors[j]}; if (!lib94::init_round(wbuf, 2)) { fprintf(stderr, "warriors do not fit in core\n"); return 1; } } if (comm_rank == 0) head_main(comm_size, argc - 1, warriors); else worker_main(warriors); MPI_Finalize(); }