From cf816f06850b72c6977cd638d2e30fc461556dd9 Mon Sep 17 00:00:00 2001 From: Thomas Preud'homme Date: Wed, 2 Nov 2011 19:35:32 +0100 Subject: [PATCH] =?UTF-8?q?Add=20a=20less=20na=C3=AFve=20script=20to=20com?= =?UTF-8?q?pare=20BatchQueue=20to=20GOMP=20native=20communication=20librar?= =?UTF-8?q?y=20*and*=20to=20sequential=20code=20by=20performing=20a=20more?= =?UTF-8?q?=20useful=20computation.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipepar/fibo_pipe.c | 150 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 pipepar/fibo_pipe.c diff --git a/pipepar/fibo_pipe.c b/pipepar/fibo_pipe.c new file mode 100644 index 0000000..395c92c --- /dev/null +++ b/pipepar/fibo_pipe.c @@ -0,0 +1,150 @@ +#include +#include +#include +#include + + +#define STRTOL_OVERFLOW(n) (((n == LONG_MIN) || (n == LONG_MAX)) && \ + (errno == ERANGE)) + +long seq_len; +long per_core_seq_len; +long nb_seqs; +int nb_cores = 8; /* Bossa */ +//int nb_cores = 12; /* Quad Hexa */ + +/* General note on variable names: _ denotes a minus sign */ + +void fibo_node(long fibi_2, long fibi_1, long *fibk_1, long *fibk) +{ + long i, fibj_2, fibj_1, fibj = 0; + + fibj_2 = fibi_2; + fibj_1 = fibi_1; + for (i = 0; i < per_core_seq_len; i++) + { + fibj = fibj_2 + fibj_1; + fibj_2 = fibj_1; + fibj_1 = fibj; + } + *fibk_1 = fibj_1; + *fibk = fibj; +} + +int main(int argc, char *argv[]) +{ + long i, fib1_1, fib1, fib2_1, fib2, fib3_1, fib3, fib4_1, fib4, fib5_1; + long fib5, fib6_1, fib6, fib7_1, fib7, fib8_1, fib8; + char **arg_p; + + argc--; + arg_p = argv; + while(arg_p++, argc--) + { + if ((*arg_p)[0] == '-') + { + if ((!(*arg_p)[1]) || (*arg_p)[2]) + { + printf("Unsupported option: %s\n", *arg_p); + return -1; + } + switch((*arg_p)[1]) + { + char *endptr; + + case 'l': + argc--, arg_p++; + seq_len = strtol(*arg_p, &endptr, 10); + if ((endptr == *arg_p) || + (STRTOL_OVERFLOW(seq_len))) + { + fprintf(stderr, "Invalid length: " + "%s\n", *arg_p); + return -1; + } + if (seq_len % nb_cores) + { + fprintf(stderr, "The length of " + "the sequence must be " + "divisible by %d\n", + nb_cores); + return -1; + } + per_core_seq_len = seq_len / nb_cores; + break; + + case 'n': + argc--, arg_p++; + nb_seqs = strtol(*arg_p, &endptr, 10); + if ((endptr == *arg_p) || + (STRTOL_OVERFLOW(nb_seqs))) + { + fprintf(stderr, "Invalid number" + "of sequences: " + "%s\n", *arg_p); + return -1; + } + break; + + default: + printf("Unsupported option: %s\n", *arg_p); + return -1; + } + } + } + + printf("Number of sequence: %ld, sequence lengths: %ld\n", nb_seqs, seq_len); + +#pragma omp parallel num_threads (1) default (none) \ + shared (nb_seqs, seq_len, fib8_1, fib8) \ + private (i, fib1_1, fib1, fib2_1, fib2, fib3_1, fib3, fib4_1, fib4, fib5_1, fib5, fib6_1, fib6, fib7_1, fib7) + //private (i, fib1_1, fib1, fib2_1, fib2, fib3_1, fib3, fib4_1, fib4, fib5_1, fib5, fib6_1, fib6, fib7_1, fib7, fib8_1, fib8, fib9_1, fib9, fib10_1, fib10, fib11_1, fib11) + { +#pragma omp single + { + for (i = 0; i < nb_seqs; i ++) + { + +#pragma omp task output (fib1_1, fib1) shared (i) + fibo_node(i, i + 1, &fib1_1, &fib1); +#pragma omp task input (fib1_1, fib1) output (fib2_1, fib2) + fibo_node(fib1_1, fib1, &fib2_1, &fib2); + + +#pragma omp task input (fib2_1, fib2) output (fib3_1, fib3) + fibo_node(fib2_1, fib2, &fib3_1, &fib3); +#pragma omp task input (fib3_1, fib3) output (fib4_1, fib4) + fibo_node(fib3_1, fib3, &fib4_1, &fib4); + + +#pragma omp task input (fib4_1, fib4) output (fib5_1, fib5) + fibo_node(fib4_1, fib4, &fib5_1, &fib5); +#pragma omp task input (fib5_1, fib5) output (fib6_1, fib6) + fibo_node(fib5_1, fib5, &fib6_1, &fib6); + + +#pragma omp task input (fib6_1, fib6) output (fib7_1, fib7) + fibo_node(fib6_1, fib6, &fib7_1, &fib7); +#pragma omp task input (fib7_1, fib7) shared (fib8_1, fib8) + fibo_node(fib7_1, fib7, &fib8_1, &fib8); +#if 0 +#pragma omp task input (fib8_1, fib8) output (fib9_1, fib9) + fibo_node(fib8_1, fib8, &fib9_1, &fib9); +#pragma omp task input (fib9_1, fib9) output (fib10_1, fib10) + fibo_node(fib9_1, fib9, &fib10_1, &fib10); + + +#pragma omp task input (fib10_1, fib10) output (fib11_1, fib11) + fibo_node(fib10_1, fib10, &fib11_1, &fib11); +#pragma omp task input (fib11_1, fib11) output (fib12_1, fib12) + fibo_node(fib11_1, fib11, &fib12_1, &fib12); +#endif + if (!(i % (nb_seqs / 100))) + printf("fib_0=%ld, fib_1=%ld => " + "fib_%ld=%ld\n", i, i + 1, + seq_len, fib8); + } + } + } + return 0; +}