Sélectionner une révision Git
EditorUserBuildSettings.asset
mpi_collective.hpp 4,03 Kio
// dependance de tree-pass.H
#include <gcc-plugin.h>
// declare opt_pass
#include <tree-pass.h>
/* Enum to represent the collective operations */
#define DEFMPICOLLECTIVES(CODE, NAME) CODE,
enum mpi_collective_code
{
#include "mpi_collectives.def"
LAST_AND_UNUSED_MPI_COLLECTIVE_CODE
};
#undef DEFMPICOLLECTIVES
/* Name of each MPI collective operations */
#define DEFMPICOLLECTIVES(CODE, NAME) NAME,
const char *const mpi_collective_name[] =
{
#include "mpi_collectives.def"
};
#undef DEFMPICOLLECTIVES
enum domination_status
{
NOT_DOMINATED,
DOMINATED,
NOT_APPLICABLE
};
struct bb_data
{
mpi_collective_code mpi_code;
bitmap_head dom;
bitmap_head post_dom;
bitmap_head dom_front;
bitmap_head post_dom_front;
int collective_rank[LAST_AND_UNUSED_MPI_COLLECTIVE_CODE];
bitmap_head seens;
int mark1; // for graph parkour
int mark2;
domination_status dom_status;
};
struct edge_data
{
// exclude adge that make loop
// excluding edge tag with loop remove all loop from the graph
// used to calculate collectives ranks
bool loop;
};
class pass_mpi_collective : public opt_pass
{
public:
// maximum rank for each collective in the current cfg.
int collective_max_rank[LAST_AND_UNUSED_MPI_COLLECTIVE_CODE];
//
// mpi collective pass
//
// constructor & clone function
pass_mpi_collective(gcc::context *ctxt);
pass_mpi_collective *clone();
// pass functions
bool gate(function *fun);
unsigned int execute(function *fun);
// functions used to detect normal functions,
// mpi functions & mpi collectives.
bool is_func(gimple *stmt);
bool __is_mpi_func(gimple *stmt);
bool is_mpi_func(gimple *stmt);
mpi_collective_code __is_mpi_collec(gimple *stmt);
mpi_collective_code is_mpi_collec(gimple *stmt);
// print basic block with mpi collective
void print_tree(function *fun);
// split blocks according to mpi collectives
void split_blocks(function *fun);
// label blocks according to mpi colelctives
void label_collec(function *fun);
//
// mpi collective graph utils
//
// allocate, free & reset data structure that are used in graph parkour
// in node and edge of the graph.
void alloc_bb_aux(function *fun);
void free_bb_aux(function *fun);
void reset_bb_mark(function *fun);
void alloc_edge_aux(function *fun);
void free_edge_aux(function *fun);
// loop detection algorithms
void __mark_edge_naif(function *fun);
void __mark_edge_naif(basic_block bb);
void __mark_edge_test(function *fun);
void mark_edge(function *fun);
void mark_edge(basic_block bb);
//
// mpi collective dominance
//
// alloc & free dominance info in gcc
void calc_dom_data();
void free_dom_data();
// label graph with dominance, post dominance, dominance frontier
// and post dominance frontier
void label_dom(function *fun);
void label_post_dom(function *fun);
void label_dom_front(function *fun);
void label_post_dom_front(function *fun);
// calculate post dominance of a set of nodes in a bitmap
void __is_post_dom_bitmap(
function *fun, basic_block bb, bitmap nodes, bitmap pds);
void get_post_dom_bitmap(function *fun, bitmap nodes, bitmap pds);
// calculate post dominance frontier of a set of nodes in a bitmap
void get_post_dom_frontier(function *fun, bitmap pds, bitmap pdf);
//
// mpi collective warnings
//
// functions that rank mpi collectives
void rank_collective(function *fun);
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);
// function that calculate agregate a mpi collective
// with the same rank in a bitmap
void get_mpi_coll_rank(
function *fun, int rank, int mpi_code, bitmap mpi_coll);
// raise warnings when mpi collective are badly uses
void raise_warning_mpi_rank(function *fun);
void raise_warning_mpi_order(function *fun);
basic_block get_bb_from_index(function *fun, int index);
//
// mpi collective graphviz
//
char *cfgviz_generate_filename(function *fun, const char *suffix);
void cfgviz_internal_dump(function *fun, FILE *out);
void cfgviz_dump(function *fun, const char *suffix);
};