2 #include "pips_config.h"
29 #include "resources.h"
120 double *ec = (
double *)
malloc(
sizeof(
double));
130 double time = cl->
time;
146 double time = cl->
time;
181 double min_tlevel = an->
tlevel;
193 double new_tlevel = cl_s->
time;
206 new_tlevel = new_tlevel > time ? new_tlevel : time;
212 if(new_tlevel <= min_tlevel){
213 min_tlevel = new_tlevel;
214 min_predecessor = parent;
221 min_pred.
min_tau = min_predecessor;
230 int i, j, min_cluster = -1;
231 bool zeroing_p =
false;
236 zeroing *zeroing_can;
238 double min_tlevel = an->
tlevel;
251 double new_tlevel = cl->
time;
253 new_tlevel = new_tlevel > time ? new_tlevel : time;
254 if(new_tlevel <= min_tlevel + edge_c){
256 zeroing *zer_new = (zeroing *)
malloc(
sizeof(zeroing));
257 zer_new->predecessor = parent;
258 zer_new->time = new_tlevel;
265 if(new_tlevel <= zeroing_can->time)
269 if(new_tlevel <= zeroing_can->time)
331 double min_time = an->
tlevel, time_cluster;
333 int min_cluster = -1;
335 for(
int cl = 0; cl < nbclusters; cl++){
337 time_cluster = cl_s->
time;
338 if(time_cluster <= min_time)
364 min_time = min_time > time_cluster ? time_cluster : min_time;
365 min_cluster = (min_time > time_cluster || min_cluster == -1) ? cl : min_cluster;
378 int min_cluster = -1, cl;
379 for(cl = 0; cl < nbclusters; cl++)
382 double time = cl_s->
time;
383 if(time <=
min ||
min == -1)
396 for(cl = 0; cl < nbclusters; cl++)
399 double time = cl_s->
time;
400 if(time >=
max ||
max == -1)
408 int cl_p;
bool DSRW_p =
false;
414 double ptlevel_before = u_min_pred_s.
min_tlevel;
418 double ptlevel_after = u_min_pred_s.
min_tlevel;
419 if(ptlevel_after > ptlevel_before){
467 return annotations_s;
517 if(nbclusters < P && (
MEMORY_SIZE == -1 ||
MCW(ready_task,nbclusters,M)))
518 cl_p = nbclusters ++;
525 fprintf (stderr,
"OUUPS, Not Enough Memory but let's try the hierarchical enclosed tasks\n");
539 int order = 0, cl_p = -1;
545 bool other_rules_p =
false, scanf_p =
false;
562 other_rules_p =
false, scanf_p =
false;
580 bool zeroing_p =
true;
596 other_rules_p =
true;
599 other_rules_p =
DSRW(ready_task, unready_task,order,M);
602 nbclusters =
find_cluster(ready_task, nbclusters, P, M, order, stmts, annotations_s);
626 int order = 0, cl_p = -1;
632 bool other_rules_p =
false;
646 other_rules_p =
false;
650 bool zeroing_p =
true;
665 other_rules_p =
true;
668 other_rules_p =
DSRW(ready_task, unready_task,order,M);
674 int i = nbclusters++;
static int end_idle_clusters(statement ready_st, int nbclusters)
pply the second priority : load balancing : length_cluster(c_i) < tlevel(ready_st) and forall node n_...
static statement select_task_with_highest_priority(list tasks, statement ready)
int DSC(sequence seq, int ordering)
static gen_array_t schedule_failsafe()
static void move_task_to_cluster(statement ready_st, int cl_p)
static bool zeroing_multiple_edges(statement ready_st, int order, int M)
static void initialization_clusters(bool first_p)
eset to zero for each new sequence to handle
static void update_priority_values(statement ready_st)
int BDSC(sequence seq, int P, int M, int ordering)
dg_vertex_label vertex_label
void allocate_task_to_cluster(statement ready_st, int cl_p, int order)
BDSC.c.
dg_arc_label arc_label
Instantiation of the dependence graph:
static void cancel_schedule(gen_array_t annotations_s, list stmts)
static int find_cluster(statement ready_task, int nbclusters, int P, int M, int order, list stmts, gen_array_t annotations_s)
static bool MCW(statement ready_st, int cl, int M)
static bool DSRW(statement ready_st, statement unready_st, int order, int M)
static bool ready_node(statement st)
static void update_parallel_task(int ordering, int nbclusters)
static int min_start_time_cluster(int nbclusters)
pply the third priority if bounded number of processors is exceeded start-time(ready_st) = min(length...
static double max_start_time_cluster(int nbclusters)
sed to compute the parallel task time of a task
static min_start_time tlevel_decrease(statement ready_st, int M)
persistant_statement_to_cluster stmt_to_cluster
graph kdg
Global variables.
void update_persistant_statement_to_cluster(persistant_statement_to_cluster f, intptr_t k, intptr_t v)
void extend_persistant_statement_to_cluster(persistant_statement_to_cluster f, intptr_t k, intptr_t v)
statement copy_statement(statement p)
STATEMENT.
bool bound_persistant_statement_to_cluster_p(persistant_statement_to_cluster f, intptr_t k)
int NBCLUSTERS
parameters of BDSC, to be recovered using pips properties
gen_array_t annotations
Global variables.
size_t gen_array_nitems(const gen_array_t a)
gen_array_t gen_array_make(size_t size)
declarations...
void gen_array_addto(gen_array_t a, size_t i, void *what)
void * gen_array_item(const gen_array_t a, size_t i)
void gen_array_free(gen_array_t a)
void bottom_level(graph dg, gen_array_t annotations)
Second parameter is the bottom level (latest start time) for each node.
void top_level(graph dg, gen_array_t annotations)
double t_level(vertex v, graph dg, gen_array_t annotations)
First parameter is the top level (earliest start time) for each node.
double size_of_regions(list l_data)
void priorities(gen_array_t annotations)
list RegionsMustUnion(list l1, list l2, bool(*union_combinable_p)(effect, effect))
list RegionsMustUnion(list l1, list l2, union_combinable_p) input : two lists of regions output : a l...
bool w_w_combinable_p(effect, effect)
bool r_w_combinable_p(effect, effect)
bool get_bool_property(const string)
FC 2015-07-20: yuk, moved out to prevent an include cycle dependency include "properties....
static int array_size(dim)
ARRAY_SIZE returns the number of elements in the array whose dimension list is DIM.
#define successor_vertex(x)
#define vertex_successors(x)
#define SUCCESSOR(x)
SUCCESSOR.
#define graph_vertices(x)
void gen_remove_once(list *pl, const void *o)
Remove the first occurence of o in list pl:
#define NIL
The empty list (nil in Lisp)
size_t gen_length(const list l)
#define CONS(_t_, _i_, _l_)
List element cell constructor (insert an element at the beginning of a list)
#define FOREACH(_fe_CASTER, _fe_item, _fe_list)
Apply/map an instruction block on all the elements of a list.
call statement_call(statement)
Get the call of a statement.
bool statement_call_p(statement)
bool declaration_statement_p(statement)
Had to be optimized according to Beatrice Creusillet.
statement vertex_to_statement(vertex v)
Vertex_to_statement looks for the statement that is pointed to by vertex v.
static vertex statement_to_vertex(statement s, graph g)
int f(int off1, int off2, int n, float r[n], float a[n], float b[n])
static bool statement_equal_p(statement s1, statement s2)
#define ENTITY_FSCANF_P(e)
#define ENTITY_SCANF_P(e)
#define ENTITY_ISOC99_SSCANF_P(e)
#define ENTITY_ISOC99_SCANF_P(e)
#define ENTITY_SSCANF_P(e)
#define ENTITY_ISOC99_FSCANF_P(e)
#define statement_ordering(x)
#define sequence_statements(x)
#define statement_undefined_p(x)
#define statement_undefined
#define STATEMENT(x)
STATEMENT.
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
t_real sum(int n1, int n2, int n3, t_real u[n1][n2][n3])
The structure used to build lists in NewGen.