Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 706de60a45dc299fda00ebd52503601e75e60fa4
  • master par défaut protégée
2 résultats

EditorUserBuildSettings.asset

Blame
  • 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);
    
    };