PIPS
computation_intensity.c File Reference
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "genC.h"
#include "linear.h"
#include "ri.h"
#include "effects.h"
#include "complexity_ri.h"
#include "text.h"
#include "ri-util.h"
#include "effects-util.h"
#include "effects-generic.h"
#include "effects-convex.h"
#include "text-util.h"
#include "database.h"
#include "pipsdbm.h"
#include "resources.h"
#include "properties.h"
#include "complexity.h"
#include "accel-util.h"
+ Include dependency graph for computation_intensity.c:

Go to the source code of this file.

Data Structures

struct  computation_intensity_param
 

Functions

static void init_computation_intensity_param (computation_intensity_param *p)
 read properties to initialize cost model More...
 
static bool do_computation_intensity (statement s, computation_intensity_param *p)
 a loop statement is considered as compute intensive if transfer costs a re greater than execution cost More...
 
bool computation_intensity (const char *module_name)
 mark all loops (do / for /while) that have sufficient computation intensity with a pragma, suitable for treatment by other phases. More...
 

Function Documentation

◆ computation_intensity()

bool computation_intensity ( const char *  module_name)

mark all loops (do / for /while) that have sufficient computation intensity with a pragma, suitable for treatment by other phases.

computation_intensity.c

The computation intensity is derived from the complexity and the memory footprint. It assumes the cost model: execution_time = startup_overhead + memory_footprint / bandwidth + complexity / frequency

init stuff

do it now !

validate changes

reset

Parameters
module_nameodule_name

Definition at line 123 of file computation_intensity.c.

123  {
124  /* init stuff */
129 
132 
133  /* do it now ! */
136 
137  /* validate changes */
139 
140  /* reset */
145 
146  return true;
147 }
void reset_complexity_map(void)
void set_complexity_map(statement_mapping)
static void init_computation_intensity_param(computation_intensity_param *p)
read properties to initialize cost model
static bool do_computation_intensity(statement s, computation_intensity_param *p)
a loop statement is considered as compute intensive if transfer costs a re greater than execution cos...
void set_cumulated_rw_effects(statement_effects)
void reset_cumulated_rw_effects(void)
const char * module_name(const char *s)
Return the module part of an entity name.
Definition: entity_names.c:296
#define gen_context_recurse(start, ctxt, domain_number, flt, rwt)
Definition: genC.h:285
void reset_current_module_entity(void)
Reset the current module entity.
Definition: static.c:97
void reset_current_module_statement(void)
Reset the current module statement.
Definition: static.c:221
statement set_current_module_statement(statement)
Set the current module statement.
Definition: static.c:165
statement get_current_module_statement(void)
Get the current module statement.
Definition: static.c:208
entity set_current_module_entity(entity)
static.c
Definition: static.c:66
void gen_null2(__attribute__((unused)) void *u1, __attribute__((unused)) void *u2)
idem with 2 args, to please overpeaky compiler checks
Definition: genClib.c:2758
string db_get_memory_resource(const char *rname, const char *oname, bool pure)
Return the pointer to the resource, whatever it is.
Definition: database.c:755
#define DB_PUT_MEMORY_RESOURCE(res_name, own_name, res_val)
conform to old interface.
Definition: pipsdbm-local.h:66
entity module_name_to_entity(const char *mn)
This is an alias for local_name_to_top_level_entity.
Definition: entity.c:1479
#define statement_domain
newgen_sizeofexpression_domain_defined
Definition: ri.h:362

References db_get_memory_resource(), DB_PUT_MEMORY_RESOURCE, do_computation_intensity(), gen_context_recurse, gen_null2(), get_current_module_statement(), init_computation_intensity_param(), module_name(), module_name_to_entity(), reset_complexity_map(), reset_cumulated_rw_effects(), reset_current_module_entity(), reset_current_module_statement(), set_complexity_map(), set_cumulated_rw_effects(), set_current_module_entity(), set_current_module_statement(), and statement_domain.

+ Here is the call graph for this function:

◆ do_computation_intensity()

static bool do_computation_intensity ( statement  s,
computation_intensity_param p 
)
static

a loop statement is considered as compute intensive if transfer costs a re greater than execution cost

compute instruction contribution to execution time

compute transfer contribution to execution time

now let's compare them, using their difference

heuristic to check the behavior at the infinite: assumes all variables are positives, take the higher degree monomial and decide upon its coefficient

seems a computation intensive loop !

Definition at line 72 of file computation_intensity.c.

72  {
73  if(statement_loop_p(s)) {
76  /* compute instruction contribution to execution time */
77  Ppolynome instruction_time = polynome_dup(complexity_polynome(comp));
78  polynome_scalar_mult(&instruction_time,1.f/p->frequency);
79 
80  /* compute transfer contribution to execution time */
81  Ppolynome transfer_time = POLYNOME_NUL;
82  FOREACH(REGION,reg,regions) {
83  Ppolynome reg_footprint= region_enumerate(reg); // may be we should use the rectangular hull ?
84  polynome_add(&transfer_time,reg_footprint);
85  polynome_rm(&reg_footprint);
86  }
87  polynome_scalar_mult(&transfer_time,1.f/p->bandwidth);
88  polynome_scalar_add(&transfer_time,p->startup_overhead);
89 
90  /* now let's compare them, using their difference */
91  polynome_negate(&transfer_time);
92  polynome_add(&instruction_time,transfer_time);
93  polynome_rm(&transfer_time);
94  /* heuristic to check the behavior at the infinite:
95  * assumes all variables are positives,
96  * take the higher degree monomial
97  * and decide upon its coefficient
98  */
99  int max_degree = polynome_max_degree(instruction_time);
100  float coeff=-1.f;
101  for(Ppolynome p = instruction_time; !POLYNOME_NUL_P(p); p = polynome_succ(p)) {
102  int curr_degree = (int)vect_sum(monome_term(polynome_monome(p)));
103  if(curr_degree == max_degree) {
104  coeff = monome_coeff(polynome_monome(p));
105  break;
106  }
107  }
108  polynome_rm(&instruction_time);
109  /* seems a computation intensive loop ! */
110  if(coeff> 0) {
112  return false;
113  }
114  }
115  return true;
116 }
void const char const char const int
Ppolynome complexity_polynome(complexity comp)
Because complexity is composed of two elements, we use this function to get the first element : polyn...
Definition: comp_math.c:506
complexity load_statement_complexity(statement)
#define REGION
Ppolynome region_enumerate(effect)
list load_cumulated_rw_effects_list(statement)
#define FOREACH(_fe_CASTER, _fe_item, _fe_list)
Apply/map an instruction block on all the elements of a list.
Definition: newgen_list.h:179
bool statement_loop_p(statement)
Definition: statement.c:349
Value vect_sum(Pvecteur v)
Value vect_sum(Pvecteur v): somme des coefficients d'un vecteur (i.e.
Definition: reductions.c:261
Ppolynome polynome_dup(Ppolynome pp)
Ppolynome polynome_dup(Ppolynome pp) creates and returns a copy of pp.
Definition: pnome-alloc.c:211
void polynome_rm(Ppolynome *ppp)
void polynome_rm(Ppolynome* ppp) frees space occupied by polynomial *ppp returns *ppp pointing to POL...
Definition: pnome-alloc.c:170
void polynome_add(Ppolynome *ppp, Ppolynome pp2)
void polynome_add(Ppolynome* ppp, Ppolynome pp2) (*ppp) = (*ppp) + pp2.
Definition: pnome-bin.c:171
int polynome_max_degree(Ppolynome pp)
int polynome_max_degree(Ppolynome pp) returns the degree of polynomial pp Let's hope there aren't too...
Definition: pnome-reduc.c:113
void polynome_scalar_add(Ppolynome *ppp, float term)
void polynome_scalar_add(Ppolynome* ppp, float term) (*ppp) = (*ppp) + term !usage: polynome_scalar_a...
Definition: pnome-scal.c:86
void polynome_scalar_mult(Ppolynome *ppp, float factor)
void polynome_scalar_mult(Ppolynome* ppp, float factor) (*ppp) = factor * (*ppp) !...
Definition: pnome-scal.c:46
void polynome_negate(Ppolynome *ppp)
void polynome_negate(Ppolynome *ppp); changes sign of polynomial *ppp.
Definition: pnome-unaires.c:45
#define POLYNOME_NUL
#define monome_term(pm)
#define polynome_monome(pp)
#define monome_coeff(pm)
Macros definitions.
#define POLYNOME_NUL_P(pp)
#define polynome_succ(pp)
void add_pragma_str_to_statement(statement st, const char *s, bool copy_flag)
Add a string as a pragma to a statement.
Definition: pragma.c:425
The structure used to build lists in NewGen.
Definition: newgen_list.h:41

References add_pragma_str_to_statement(), computation_intensity_param::bandwidth, complexity_polynome(), FOREACH, computation_intensity_param::frequency, int, load_cumulated_rw_effects_list(), load_statement_complexity(), monome_coeff, monome_term, polynome_add(), polynome_dup(), polynome_max_degree(), polynome_monome, polynome_negate(), POLYNOME_NUL, POLYNOME_NUL_P, polynome_rm(), polynome_scalar_add(), polynome_scalar_mult(), polynome_succ, computation_intensity_param::pragma, REGION, region_enumerate(), computation_intensity_param::startup_overhead, statement_loop_p(), and vect_sum().

Referenced by computation_intensity().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_computation_intensity_param()

static void init_computation_intensity_param ( computation_intensity_param p)
static

read properties to initialize cost model

Definition at line 62 of file computation_intensity.c.

62  {
63  p->startup_overhead=get_int_property("COMPUTATION_INTENSITY_STARTUP_OVERHEAD");
64  p->bandwidth=get_int_property("COMPUTATION_INTENSITY_BANDWIDTH");
65  p->frequency=get_int_property("COMPUTATION_INTENSITY_FREQUENCY");
66  p->pragma=get_string_property("COMPUTATION_INTENSITY_PRAGMA");
67 }
int get_int_property(const string)
char * get_string_property(const char *)

References computation_intensity_param::bandwidth, computation_intensity_param::frequency, get_int_property(), get_string_property(), computation_intensity_param::pragma, and computation_intensity_param::startup_overhead.

Referenced by computation_intensity().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: