diff --git a/pipepar/pipeline_template.c b/pipepar/pipeline_template.c index 8d0ae33..16958df 100644 --- a/pipepar/pipeline_template.c +++ b/pipepar/pipeline_template.c @@ -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; }