290 lines
11 KiB
C
290 lines
11 KiB
C
|
#ifndef ISL_SCHEDULER_H
|
||
|
#define ISL_SCHEDULER_H
|
||
|
|
||
|
#include <isl/aff_type.h>
|
||
|
#include <isl/hash.h>
|
||
|
#include <isl/id_type.h>
|
||
|
#include <isl/map_type.h>
|
||
|
#include <isl/map_to_basic_set.h>
|
||
|
#include <isl/mat.h>
|
||
|
#include <isl/space_type.h>
|
||
|
#include <isl/set_type.h>
|
||
|
#include <isl/val_type.h>
|
||
|
#include <isl/vec.h>
|
||
|
#include <isl/union_map_type.h>
|
||
|
|
||
|
#include "isl_schedule_constraints.h"
|
||
|
#include "isl_tab.h"
|
||
|
|
||
|
/* Internal information about a node that is used during the construction
|
||
|
* of a schedule.
|
||
|
* space represents the original space in which the domain lives;
|
||
|
* that is, the space is not affected by compression
|
||
|
* sched is a matrix representation of the schedule being constructed
|
||
|
* for this node; if compressed is set, then this schedule is
|
||
|
* defined over the compressed domain space
|
||
|
* sched_map is an isl_map representation of the same (partial) schedule
|
||
|
* sched_map may be NULL; if compressed is set, then this map
|
||
|
* is defined over the uncompressed domain space
|
||
|
* rank is the number of linearly independent rows in the linear part
|
||
|
* of sched
|
||
|
* the rows of "vmap" represent a change of basis for the node
|
||
|
* variables; the first rank rows span the linear part of
|
||
|
* the schedule rows; the remaining rows are linearly independent
|
||
|
* the rows of "indep" represent linear combinations of the schedule
|
||
|
* coefficients that are non-zero when the schedule coefficients are
|
||
|
* linearly independent of previously computed schedule rows.
|
||
|
* start is the first variable in the LP problem in the sequences that
|
||
|
* represents the schedule coefficients of this node
|
||
|
* nvar is the dimension of the (compressed) domain
|
||
|
* nparam is the number of parameters or 0 if we are not constructing
|
||
|
* a parametric schedule
|
||
|
*
|
||
|
* If compressed is set, then hull represents the constraints
|
||
|
* that were used to derive the compression, while compress and
|
||
|
* decompress map the original space to the compressed space and
|
||
|
* vice versa.
|
||
|
*
|
||
|
* scc is the index of SCC (or WCC) this node belongs to
|
||
|
*
|
||
|
* "cluster" is only used inside extract_clusters and identifies
|
||
|
* the cluster of SCCs that the node belongs to.
|
||
|
*
|
||
|
* coincident contains a boolean for each of the rows of the schedule,
|
||
|
* indicating whether the corresponding scheduling dimension satisfies
|
||
|
* the coincidence constraints in the sense that the corresponding
|
||
|
* dependence distances are zero.
|
||
|
*
|
||
|
* If the schedule_treat_coalescing option is set, then
|
||
|
* "sizes" contains the sizes of the (compressed) instance set
|
||
|
* in each direction. If there is no fixed size in a given direction,
|
||
|
* then the corresponding size value is set to infinity.
|
||
|
* If the schedule_treat_coalescing option or the schedule_max_coefficient
|
||
|
* option is set, then "max" contains the maximal values for
|
||
|
* schedule coefficients of the (compressed) variables. If no bound
|
||
|
* needs to be imposed on a particular variable, then the corresponding
|
||
|
* value is negative.
|
||
|
* If not NULL, then "bounds" contains a non-parametric set
|
||
|
* in the compressed space that is bounded by the size in each direction.
|
||
|
*/
|
||
|
struct isl_sched_node {
|
||
|
isl_space *space;
|
||
|
int compressed;
|
||
|
isl_set *hull;
|
||
|
isl_multi_aff *compress;
|
||
|
isl_pw_multi_aff *decompress;
|
||
|
isl_mat *sched;
|
||
|
isl_map *sched_map;
|
||
|
int rank;
|
||
|
isl_mat *indep;
|
||
|
isl_mat *vmap;
|
||
|
int start;
|
||
|
int nvar;
|
||
|
int nparam;
|
||
|
|
||
|
int scc;
|
||
|
int cluster;
|
||
|
|
||
|
int *coincident;
|
||
|
|
||
|
isl_multi_val *sizes;
|
||
|
isl_basic_set *bounds;
|
||
|
isl_vec *max;
|
||
|
};
|
||
|
|
||
|
int isl_sched_node_scc_exactly(struct isl_sched_node *node, int scc);
|
||
|
|
||
|
isl_stat isl_sched_node_update_vmap(struct isl_sched_node *node);
|
||
|
__isl_give isl_multi_aff *isl_sched_node_extract_partial_schedule_multi_aff(
|
||
|
struct isl_sched_node *node, int first, int n);
|
||
|
|
||
|
/* An edge in the dependence graph. An edge may be used to
|
||
|
* ensure validity of the generated schedule, to minimize the dependence
|
||
|
* distance or both
|
||
|
*
|
||
|
* map is the dependence relation, with i -> j in the map if j depends on i
|
||
|
* tagged_condition and tagged_validity contain the union of all tagged
|
||
|
* condition or conditional validity dependence relations that
|
||
|
* specialize the dependence relation "map"; that is,
|
||
|
* if (i -> a) -> (j -> b) is an element of "tagged_condition"
|
||
|
* or "tagged_validity", then i -> j is an element of "map".
|
||
|
* If these fields are NULL, then they represent the empty relation.
|
||
|
* src is the source node
|
||
|
* dst is the sink node
|
||
|
*
|
||
|
* types is a bit vector containing the types of this edge.
|
||
|
* validity is set if the edge is used to ensure correctness
|
||
|
* coincidence is used to enforce zero dependence distances
|
||
|
* proximity is set if the edge is used to minimize dependence distances
|
||
|
* condition is set if the edge represents a condition
|
||
|
* for a conditional validity schedule constraint
|
||
|
* local can only be set for condition edges and indicates that
|
||
|
* the dependence distance over the edge should be zero
|
||
|
* conditional_validity is set if the edge is used to conditionally
|
||
|
* ensure correctness
|
||
|
*
|
||
|
* For validity edges, start and end mark the sequence of inequality
|
||
|
* constraints in the LP problem that encode the validity constraint
|
||
|
* corresponding to this edge.
|
||
|
*
|
||
|
* During clustering, an edge may be marked "no_merge" if it should
|
||
|
* not be used to merge clusters.
|
||
|
* The weight is also only used during clustering and it is
|
||
|
* an indication of how many schedule dimensions on either side
|
||
|
* of the schedule constraints can be aligned.
|
||
|
* If the weight is negative, then this means that this edge was postponed
|
||
|
* by has_bounded_distances or any_no_merge. The original weight can
|
||
|
* be retrieved by adding 1 + graph->max_weight, with "graph"
|
||
|
* the graph containing this edge.
|
||
|
*/
|
||
|
struct isl_sched_edge {
|
||
|
isl_map *map;
|
||
|
isl_union_map *tagged_condition;
|
||
|
isl_union_map *tagged_validity;
|
||
|
|
||
|
struct isl_sched_node *src;
|
||
|
struct isl_sched_node *dst;
|
||
|
|
||
|
unsigned types;
|
||
|
|
||
|
int start;
|
||
|
int end;
|
||
|
|
||
|
int no_merge;
|
||
|
int weight;
|
||
|
};
|
||
|
|
||
|
int isl_sched_edge_has_type(struct isl_sched_edge *edge,
|
||
|
enum isl_edge_type type);
|
||
|
int isl_sched_edge_is_condition(struct isl_sched_edge *edge);
|
||
|
int isl_sched_edge_is_conditional_validity(struct isl_sched_edge *edge);
|
||
|
int isl_sched_edge_scc_exactly(struct isl_sched_edge *edge, int scc);
|
||
|
int isl_sched_edge_is_proximity(struct isl_sched_edge *edge);
|
||
|
|
||
|
/* Internal information about the dependence graph used during
|
||
|
* the construction of the schedule.
|
||
|
*
|
||
|
* intra_hmap is a cache, mapping dependence relations to their dual,
|
||
|
* for dependences from a node to itself, possibly without
|
||
|
* coefficients for the parameters
|
||
|
* intra_hmap_param is a cache, mapping dependence relations to their dual,
|
||
|
* for dependences from a node to itself, including coefficients
|
||
|
* for the parameters
|
||
|
* inter_hmap is a cache, mapping dependence relations to their dual,
|
||
|
* for dependences between distinct nodes
|
||
|
* if compression is involved then the key for these maps
|
||
|
* is the original, uncompressed dependence relation, while
|
||
|
* the value is the dual of the compressed dependence relation.
|
||
|
*
|
||
|
* n is the number of nodes
|
||
|
* node is the list of nodes
|
||
|
* maxvar is the maximal number of variables over all nodes
|
||
|
* max_row is the allocated number of rows in the schedule
|
||
|
* n_row is the current (maximal) number of linearly independent
|
||
|
* rows in the node schedules
|
||
|
* n_total_row is the current number of rows in the node schedules
|
||
|
* band_start is the starting row in the node schedules of the current band
|
||
|
* root is set to the original dependence graph from which this graph
|
||
|
* is derived through splitting. If this graph is not the result of
|
||
|
* splitting, then the root field points to the graph itself.
|
||
|
*
|
||
|
* sorted contains a list of node indices sorted according to the
|
||
|
* SCC to which a node belongs
|
||
|
*
|
||
|
* n_edge is the number of edges
|
||
|
* edge is the list of edges
|
||
|
* max_edge contains the maximal number of edges of each type;
|
||
|
* in particular, it contains the number of edges in the inital graph.
|
||
|
* edge_table contains pointers into the edge array, hashed on the source
|
||
|
* and sink spaces; there is one such table for each type;
|
||
|
* a given edge may be referenced from more than one table
|
||
|
* if the corresponding relation appears in more than one of the
|
||
|
* sets of dependences; however, for each type there is only
|
||
|
* a single edge between a given pair of source and sink space
|
||
|
* in the entire graph
|
||
|
*
|
||
|
* node_table contains pointers into the node array, hashed on the space tuples
|
||
|
*
|
||
|
* region contains a list of variable sequences that should be non-trivial
|
||
|
*
|
||
|
* lp contains the (I)LP problem used to obtain new schedule rows
|
||
|
*
|
||
|
* src_scc and dst_scc are the source and sink SCCs of an edge with
|
||
|
* conflicting constraints
|
||
|
*
|
||
|
* scc represents the number of components
|
||
|
* weak is set if the components are weakly connected
|
||
|
*
|
||
|
* max_weight is used during clustering and represents the maximal
|
||
|
* weight of the relevant proximity edges.
|
||
|
*/
|
||
|
struct isl_sched_graph {
|
||
|
isl_map_to_basic_set *intra_hmap;
|
||
|
isl_map_to_basic_set *intra_hmap_param;
|
||
|
isl_map_to_basic_set *inter_hmap;
|
||
|
|
||
|
struct isl_sched_node *node;
|
||
|
int n;
|
||
|
int maxvar;
|
||
|
int max_row;
|
||
|
int n_row;
|
||
|
|
||
|
int *sorted;
|
||
|
|
||
|
int n_total_row;
|
||
|
int band_start;
|
||
|
|
||
|
struct isl_sched_graph *root;
|
||
|
|
||
|
struct isl_sched_edge *edge;
|
||
|
int n_edge;
|
||
|
int max_edge[isl_edge_last + 1];
|
||
|
struct isl_hash_table *edge_table[isl_edge_last + 1];
|
||
|
|
||
|
struct isl_hash_table *node_table;
|
||
|
struct isl_trivial_region *region;
|
||
|
|
||
|
isl_basic_set *lp;
|
||
|
|
||
|
int src_scc;
|
||
|
int dst_scc;
|
||
|
|
||
|
int scc;
|
||
|
int weak;
|
||
|
|
||
|
int max_weight;
|
||
|
};
|
||
|
|
||
|
isl_stat isl_sched_graph_init(struct isl_sched_graph *graph,
|
||
|
__isl_keep isl_schedule_constraints *sc);
|
||
|
void isl_sched_graph_free(isl_ctx *ctx, struct isl_sched_graph *graph);
|
||
|
|
||
|
int isl_sched_graph_is_node(struct isl_sched_graph *graph,
|
||
|
struct isl_sched_node *node);
|
||
|
isl_bool isl_sched_graph_has_validity_edge(struct isl_sched_graph *graph,
|
||
|
struct isl_sched_node *src, struct isl_sched_node *dst);
|
||
|
|
||
|
struct isl_sched_node *isl_sched_graph_find_node(isl_ctx *ctx,
|
||
|
struct isl_sched_graph *graph, __isl_keep isl_space *space);
|
||
|
|
||
|
isl_stat isl_sched_graph_detect_ccs(isl_ctx *ctx, struct isl_sched_graph *graph,
|
||
|
isl_bool (*follows)(int i, int j, void *user));
|
||
|
|
||
|
__isl_give isl_union_set *isl_sched_graph_extract_scc(isl_ctx *ctx,
|
||
|
struct isl_sched_graph *graph, int scc);
|
||
|
__isl_give isl_union_set_list *isl_sched_graph_extract_sccs(isl_ctx *ctx,
|
||
|
struct isl_sched_graph *graph);
|
||
|
isl_stat isl_sched_graph_extract_sub_graph(isl_ctx *ctx,
|
||
|
struct isl_sched_graph *graph,
|
||
|
int (*node_pred)(struct isl_sched_node *node, int data),
|
||
|
int (*edge_pred)(struct isl_sched_edge *edge, int data),
|
||
|
int data, struct isl_sched_graph *sub);
|
||
|
isl_stat isl_sched_graph_compute_maxvar(struct isl_sched_graph *graph);
|
||
|
isl_stat isl_schedule_node_compute_wcc_band(isl_ctx *ctx,
|
||
|
struct isl_sched_graph *graph);
|
||
|
__isl_give isl_schedule_node *isl_schedule_node_compute_finish_band(
|
||
|
__isl_take isl_schedule_node *node, struct isl_sched_graph *graph,
|
||
|
int initialized);
|
||
|
|
||
|
#endif
|