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 */ //#define NB_CORES 12; /* Quad Hexa */
#endif #endif
long seq_len = 27720; //#define NOSLEEP
long nb_packets = 100000;
useconds_t stage_time = 0;
typedef unsigned long data_t; 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)$ */ /* $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) 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; long i;
static __thread data_t *prev_data = NULL; static __thread data_t *prev_data = NULL;
data_t prev_process_step; 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) if (prev_data == NULL)
{ {
prev_data = malloc(sizeof(*prev_data) * seq_len / NB_CORES); prev_data = malloc(sizeof(*prev_data) * seq_len / NB_CORES);
memset(prev_data, 0, 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; prev_process_step = *prev_pipeline_stage;
for (i = 0; i < seq_len / NB_CORES; i++) 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]; prev_process_step = prev_data[i];
} }
*next_pipeline_stage = prev_data[i - 1]; *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) 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[]) int analyse_options(int argc, char *argv[])
{ {
char **arg_p; char **arg_p;
long total_time = 10000000; long stg_time, total_time = 10000000000;
argc--; argc--;
arg_p = argv; 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; return 0;
} }