Add a less naïve script to compare BatchQueue to GOMP native

communication library *and* to sequential code by performing a
more useful computation.
This commit is contained in:
Thomas Preud'homme 2011-11-02 19:35:32 +01:00 committed by Thomas Preud'homme
parent 03b32a950a
commit cf816f0685
1 changed files with 150 additions and 0 deletions

150
pipepar/fibo_pipe.c Normal file
View File

@ -0,0 +1,150 @@
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
#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;
}