#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; }