XBT_PUBLIC(unsigned int) smpi_sleep(unsigned int secs);
XBT_PUBLIC(int) smpi_gettimeofday(struct timeval *tv, struct timezone *tz);
XBT_PUBLIC(void) smpi_sample_1(int global, const char *file, int line,
- int max);
+ int iters, double threshold);
XBT_PUBLIC(int) smpi_sample_2(int global, const char *file, int line);
XBT_PUBLIC(void) smpi_sample_3(int global, const char *file, int line);
XBT_PUBLIC(void) smpi_sample_flops(double flops);
-#define SMPI_SAMPLE_LOCAL(num) for(smpi_sample_1(0, __FILE__, __LINE__, num); \
- smpi_sample_2(0, __FILE__, __LINE__); \
- smpi_sample_3(0, __FILE__, __LINE__))
+#define SMPI_SAMPLE_LOCAL(iters,thres) for(smpi_sample_1(0, __FILE__, __LINE__, iters, thres); \
+ smpi_sample_2(0, __FILE__, __LINE__); \
+ smpi_sample_3(0, __FILE__, __LINE__))
-#define SMPI_SAMPLE_GLOBAL(num) for(smpi_sample_1(1, __FILE__, __LINE__, num); \
- smpi_sample_2(1, __FILE__, __LINE__); \
- smpi_sample_3(1, __FILE__, __LINE__))
+#define SMPI_SAMPLE_GLOBAL(iters,thres) for(smpi_sample_1(1, __FILE__, __LINE__, iters, thres); \
+ smpi_sample_2(1, __FILE__, __LINE__); \
+ smpi_sample_3(1, __FILE__, __LINE__))
#define SMPI_SAMPLE_DELAY(flops) for(smpi_sample_flops(flops); 0; )
} shared_data_t;
typedef struct {
- double time;
int count;
- int max;
+ double sum;
+ double sum_pow2;
+ double mean;
+ double relstderr;
+ int iters;
+ double threshold;
int started;
} local_data_t;
}
}
-void smpi_sample_1(int global, const char *file, int line, int max)
+void smpi_sample_1(int global, const char *file, int line, int iters, double threshold)
{
char *loc = sample_location(global, file, line);
local_data_t *data;
data = xbt_dict_get_or_null(samples, loc);
if (!data) {
data = (local_data_t *) xbt_new(local_data_t, 1);
- data->time = 0.0;
data->count = 0;
- data->max = max;
+ data->sum = 0.0;
+ data->sum_pow2 = 0.0;
+ data->iters = iters;
+ data->threshold = threshold;
data->started = 0;
xbt_dict_set(samples, loc, data, &free);
}
xbt_assert0(data, "Please, do thing in order");
}
if (!data->started) {
- if (data->count < data->max) {
+ if ((data->iters > 0 && data->count >= data->iters)
+ || (data->count > 1 && data->threshold > 0.0 && data->relstderr <= data->threshold)) {
+ DEBUG1("Perform some wait of %f", data->mean);
+ smpi_execute(data->mean);
+ } else {
data->started = 1;
data->count++;
- } else {
- DEBUG1("Perform some wait of %f", data->time / (double) data->count);
- smpi_execute(data->time / (double) data->count);
}
} else {
data->started = 0;
{
char *loc = sample_location(global, file, line);
local_data_t *data;
+ double sample, n;
xbt_assert0(samples, "You did something very inconsistent, didn't you?");
data = xbt_dict_get_or_null(samples, loc);
- if (!data || !data->started || data->count >= data->max) {
+ if (!data || !data->started || data->count >= data->iters) {
xbt_assert0(data, "Please, do thing in order");
}
smpi_bench_end();
- data->time += smpi_process_simulated_elapsed();
- DEBUG2("Average mean after %d steps is %f", data->count,
- data->time / (double) data->count);
+ sample = smpi_process_simulated_elapsed();
+ data->sum += sample;
+ data->sum_pow2 += sample * sample;
+ n = (double)data->count;
+ data->mean = data->sum / n;
+ data->relstderr = sqrt((data->sum_pow2 / n - data->mean * data->mean) / n) / data->mean;
+ DEBUG4("Average mean after %d steps is %f, relative standard error is %f (sample was %f)", data->count,
+ data->mean, data->relstderr, sample);
}
void smpi_sample_flops(double flops)