Stage time can be made smaller

Allow stage time to be smaller by adjusting after the computing was done
instead of before.
This commit is contained in:
Thomas Preud'homme 2012-02-01 18:47:50 +01:00
parent cacde80b30
commit 8010f34abe
1 changed files with 26 additions and 6 deletions

View File

@ -20,12 +20,13 @@
//#define NB_CORES 12; /* Quad Hexa */
#endif
long seq_len = 27720;
long nb_packets = 100000;
useconds_t stage_time = 0;
//#define NOSLEEP
typedef unsigned long data_t;
long seq_len = 24/*27720*/;
long nb_packets = 100000;
struct timespec stage_time;
/* $Stage_{i+1} (data_{j+1}) = E_i (data_{j+1}) + E_{i+1} (data_j)$ */
void process_stage(data_t *prev_pipeline_stage, data_t *next_pipeline_stage)
@ -33,13 +34,24 @@ void process_stage(data_t *prev_pipeline_stage, data_t *next_pipeline_stage)
long i;
static __thread data_t *prev_data = NULL;
data_t prev_process_step;
#ifndef NOSLEEP
struct timespec beginning, now, end;
clock_gettime(CLOCK_REALTIME, &beginning);
end.tv_sec = beginning.tv_sec + stage_time.tv_sec;
if (beginning.tv_nsec + stage_time.tv_nsec < 1000000000)
end.tv_nsec = beginning.tv_nsec + stage_time.tv_nsec;
else
{
end.tv_nsec = beginning.tv_nsec + stage_time.tv_nsec - 1000000000;
end.tv_sec++;
}
#endif
if (prev_data == NULL)
{
prev_data = malloc(sizeof(*prev_data) * seq_len / NB_CORES);
memset(prev_data, 0, sizeof(*prev_data) * seq_len / NB_CORES);
}
usleep(stage_time); // stage_time is in usecs
prev_process_step = *prev_pipeline_stage;
for (i = 0; i < seq_len / NB_CORES; i++)
{
@ -47,6 +59,12 @@ void process_stage(data_t *prev_pipeline_stage, data_t *next_pipeline_stage)
prev_process_step = prev_data[i];
}
*next_pipeline_stage = prev_data[i - 1];
#ifndef NOSLEEP
do
{
clock_gettime(CLOCK_REALTIME, &now);
} while ((now.tv_sec < end.tv_sec) || (now.tv_nsec < end.tv_nsec));
#endif
}
void last_process_stage(data_t *prev_stage)
@ -60,7 +78,7 @@ void last_process_stage(data_t *prev_stage)
int analyse_options(int argc, char *argv[])
{
char **arg_p;
long total_time = 10000000;
long stg_time, total_time = 10000000000;
argc--;
arg_p = argv;
@ -119,7 +137,9 @@ int analyse_options(int argc, char *argv[])
}
}
}
stage_time = total_time / (nb_packets * NB_CORES);
stg_time = total_time / (nb_packets * NB_CORES);
stage_time.tv_sec = stg_time / 1000000000;
stage_time.tv_nsec = stg_time % 1000000000;
return 0;
}