/* ****************************** Functions related to the SMPI_SAMPLE_ macros ************************************/
typedef struct {
- int iters; /* amount of requested iterations */
- int count; /* amount of iterations done so far */
double threshold; /* maximal stderr requested (if positive) */
double relstderr; /* observed stderr so far */
double mean; /* mean of benched times, to be used if the block is disabled */
double sum; /* sum of benched times (to compute the mean and stderr) */
double sum_pow2; /* sum of the square of the benched times (to compute the stderr) */
+ int iters; /* amount of requested iterations */
+ int count; /* amount of iterations done so far */
int benching; /* 1: we are benchmarking; 0: we have enough data, no bench anymore */
} local_data_t;
-int smpi_sample_is_running = 0;
-
static char *sample_location(int global, const char *file, int line) {
if (global) {
return bprintf("%s:%d", file, line);
local_data_t *data;
smpi_bench_end(); /* Take time from previous, unrelated computation into account */
- smpi_sample_is_running++;
+ smpi_process_set_sampling(1);
if (!samples)
samples = xbt_dict_new_homogeneous(free);
{
char *loc = sample_location(global, file, line);
local_data_t *data;
+ int res;
xbt_assert(samples, "Y U NO use SMPI_SAMPLE_* macros? Stop messing directly with smpi_sample_* functions!");
data = xbt_dict_get(samples, loc);
// we need to run a new bench
XBT_DEBUG("benchmarking: count:%d iter:%d stderr:%f thres:%f; mean:%f",
data->count, data->iters, data->relstderr, data->threshold, data->mean);
- smpi_bench_begin();
- return 1;
+ res = 1;
} else {
// Enough data, no more bench (either we got enough data from previous visits to this benched nest, or we just ran one bench and need to bail out now that our job is done).
// Just sleep instead
XBT_DEBUG("No benchmark (either no need, or just ran one): count >= iter (%d >= %d) or stderr<thres (%f<=%f). apply the %fs delay instead",
data->count, data->iters, data->relstderr, data->threshold, data->mean);
smpi_execute(data->mean);
-
- smpi_sample_is_running--;
- smpi_bench_begin(); // prepare to capture future, unrelated computations
- return 0;
+ smpi_process_set_sampling(0);
+ res = 0; // prepare to capture future, unrelated computations
}
+ smpi_bench_begin();
+ return res;
}