diff --git a/include/pass_mpi_collective.hpp b/include/pass_mpi_collective.hpp index 8bea3b348ef7818284acc3da387605ba11056e07..a2b3d62ad9f1b8bd1031803e6a0c05880c078e64 100644 --- a/include/pass_mpi_collective.hpp +++ b/include/pass_mpi_collective.hpp @@ -31,7 +31,7 @@ struct bb_data std::set<basic_block> post_dom_front; int mark1; // for graph parkour int mark2; - int collective_rank; + int *collective_rank; }; struct edge_data @@ -83,8 +83,11 @@ public: // rank definition void rank_collective(function *fun); - int __rank_collective(basic_block bb, - mpi_collective_code mpi_code, int rank); + void __rank_collective(basic_block bb); + + void better_rank_collective(function *fun); + int __better_rank_collective(basic_block bb, + mpi_collective_code mpi_code, int rank); private: // MPI function / collectives detections diff --git a/src/pass_mpi_collective.cpp b/src/pass_mpi_collective.cpp index e605fda7dee02a444fa6caedea9de9e2472368e0..7da61f6715183525554c4954d936672556cca40a 100644 --- a/src/pass_mpi_collective.cpp +++ b/src/pass_mpi_collective.cpp @@ -66,7 +66,8 @@ unsigned int pass_mpi_collective::execute(function *fun) alloc_edge_aux(fun); mark_edge(fun); - rank_collective(fun); + //rank_collective(fun); + better_rank_collective(fun); cfgviz_dump(fun, "_split"); @@ -196,6 +197,13 @@ void pass_mpi_collective::alloc_bb_aux(function *fun) FOR_ALL_BB_FN(bb, fun) { bb->aux = (bb_data *) new bb_data(); + ((bb_data *) bb->aux)->collective_rank = + new int[(int) LAST_AND_UNUSED_MPI_COLLECTIVE_CODE]; + for (int i = 0; i < LAST_AND_UNUSED_MPI_COLLECTIVE_CODE; ++i) + { + ((bb_data *) bb->aux)->collective_rank[i] = 0; + } + } } @@ -229,6 +237,7 @@ void pass_mpi_collective::free_bb_aux(function *fun) { if (bb->aux != NULL) { + delete ((bb_data *) bb->aux)->collective_rank; delete (bb_data *) bb->aux; bb->aux = NULL; } @@ -390,28 +399,30 @@ void pass_mpi_collective::free_edge_aux(function *fun) } // naive version of mark_edge (work but Omax(2^n)) -//void pass_mpi_collective::mark_edge(function *fun) -//{ -// mark_edge(ENTRY_BLOCK_PTR_FOR_FN(fun)); -//} -// -//void pass_mpi_collective::mark_edge(basic_block bb) -//{ -// edge e; -// edge_iterator ei; -// -// ((bb_data *) bb->aux)->mark = 1; -// FOR_EACH_EDGE(e, ei, bb->succs) -// { -// if (((bb_data *) e->dest->aux)->mark) -// { -// ((edge_data *) e->aux)->loop = true; -// } else { -// mark_edge(e->dest); -// } -// } -// ((bb_data *) bb->aux)->mark = 0; -//} +void pass_mpi_collective::mark_edge_naif(function *fun) +{ + mark_edge(ENTRY_BLOCK_PTR_FOR_FN(fun)); +} + +void pass_mpi_collective::mark_edge_naif(basic_block bb) +{ + edge e; + edge_iterator ei; + + ((bb_data *) bb->aux)->mark = 1; + FOR_EACH_EDGE(e, ei, bb->succs) + { + if (((bb_data *) e->dest->aux)->mark) + { + ((edge_data *) e->aux)->loop = true; + } + else + { + mark_edge(e->dest); + } + } + ((bb_data *) bb->aux)->mark = 0; +} void pass_mpi_collective::mark_edge(function *fun) { @@ -486,20 +497,101 @@ void pass_mpi_collective::mark_edge(function *fun) reset_bb_mark(fun); } +// WIP for new mark edge +//struct basic_block_elem { +// bitmap_head seen; +// basic_block bb; +//} +// +//struct basic_block_elem *new_bb_elem(){ +// return new +//} +// +//void free_bb_elem(){ +// +//} +// +// +//void mark_loop(){ +// vect<struct basic_block_elem> pile; +// struct basic_block_elem *first; +// +// first = new_bb_elem(); +// first->bb = ENTRY_BLOCK_PTR_FOR_FN(fun); +// pile.push(first); +// +// while(pile.length() != 0){ +// // mettre a jour edge & already seen +// +// } +// +//} +// +//void pass_mpi_collective::mark_edge(function *fun) +//{ +// edge e; +// edge_iterator ei; +// std::list<basic_block> nodes; +// basic_block bb; +// +// +// +//} + void pass_mpi_collective::rank_collective(function *fun) +{ + __rank_collective(EXIT_BLOCK_PTR_FOR_FN(fun)); + reset_bb_mark(fun); +} + +void pass_mpi_collective::__rank_collective(basic_block bb) +{ + edge e; + edge_iterator ei; + + ((bb_data *) bb->aux)->mark1 = 1; + FOR_EACH_EDGE(e, ei, bb->preds) + { + if (((edge_data *) e->aux)->loop) + { + continue; + } + + if (! ((bb_data *) e->src->aux)->mark1) + { + __rank_collective(e->src); + } + + for (int mpi_code = 0; + mpi_code < LAST_AND_UNUSED_MPI_COLLECTIVE_CODE; + ++mpi_code) + { + ((bb_data *) bb->aux)->collective_rank[mpi_code] = + std::max(((bb_data *) bb->aux)->collective_rank[mpi_code], + ((bb_data *) e->src->aux)->collective_rank[mpi_code]); + if (((bb_data *) bb->aux)->mpi_code == mpi_code) + { + ((bb_data *) bb->aux)->collective_rank[mpi_code]++; + } + } + } + return; +} + +void pass_mpi_collective::better_rank_collective(function *fun) { size_t i; - int next_rank = 1; + int next_rank = 0; for (i = 0; i < LAST_AND_UNUSED_MPI_COLLECTIVE_CODE; ++i) { - next_rank = __rank_collective(EXIT_BLOCK_PTR_FOR_FN(fun), - (enum mpi_collective_code) i, next_rank); - reset_bb_mark(fun); + next_rank = __better_rank_collective(EXIT_BLOCK_PTR_FOR_FN(fun), + (enum mpi_collective_code) i, next_rank); } + reset_bb_mark(fun); } -int pass_mpi_collective::__rank_collective(basic_block bb, +int pass_mpi_collective::__better_rank_collective(basic_block bb, mpi_collective_code mpi_code, int rank) { edge e; @@ -507,6 +599,8 @@ int pass_mpi_collective::__rank_collective(basic_block bb, int next_rank; next_rank = rank; + ((bb_data *) bb->aux)->mark1 = mpi_code + 1; + FOR_EACH_EDGE(e, ei, bb->preds) { if (((edge_data *) e->aux)->loop) @@ -515,25 +609,25 @@ int pass_mpi_collective::__rank_collective(basic_block bb, } // cache or travell - if (((bb_data *) e->src->aux)->mark1) + if (((bb_data *) e->src->aux)->mark1 <= mpi_code) { next_rank = std::max(next_rank, - ((bb_data *) e->src->aux)->mark1); + __better_rank_collective(e->src, mpi_code, rank)); } else { next_rank = std::max(next_rank, - __rank_collective(e->src, mpi_code, rank)); + ((bb_data *) e->src->aux)->collective_rank[mpi_code]); } } // set mpi code if (((bb_data *) bb->aux)->mpi_code == mpi_code) { - ((bb_data *) bb->aux)->collective_rank = next_rank; next_rank++; + printf("set rank %d at %d for coll %d\n", next_rank, bb->index, mpi_code); } - // set mark before recusion - ((bb_data *) bb->aux)->mark1 = next_rank; + ((bb_data *) bb->aux)->collective_rank[mpi_code] = next_rank; + return next_rank; } @@ -578,7 +672,7 @@ void pass_mpi_collective::cfgviz_internal_dump(function *fun, FILE *out) if (data->mpi_code != LAST_AND_UNUSED_MPI_COLLECTIVE_CODE) { fprintf(out, "|%s (%d) ", mpi_collective_name[data->mpi_code], - data->collective_rank); + data->collective_rank[data->mpi_code]); } if (! data->dom.empty())