151 lines
3.8 KiB
C
151 lines
3.8 KiB
C
#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;
|
|
}
|