• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4 #include <omp.h>
5 #include <unistd.h>
6 #define MAX 33 //41
Fibonacci(int n)7 int Fibonacci(int n)
8 {   int x, y;
9     if (n < 2)
10         return n;
11     else {
12         x = Fibonacci(n - 1);
13         y = Fibonacci(n - 2);
14         return (x + y);
15 }    }
FibonacciTask(int n)16 int FibonacciTask(int n)
17 {   int x, y;
18     if (n < 2)
19         return n;
20     else {
21 #pragma omp task shared(x)
22         x = Fibonacci(n - 1);
23 #pragma omp task shared(y)
24         y = Fibonacci(n - 2);
25 #pragma omp taskwait
26         return (x + y);
27  }    }
28 
main(int argc,char * argv[])29 int main(int argc, char * argv[])
30 {int FibNumber[MAX] = {0};
31   struct timeval time_start, time_end;
32   int i = 0;
33   // openmp related print message
34   printf("CPU_ONLN= %d\n", sysconf(_SC_NPROCESSORS_ONLN));
35   printf("Number of CPUs=%d\n", omp_get_num_procs());
36   printf("Number of max threads=%d\n", omp_get_max_threads());
37   printf("Number of executing thread=%d\n", omp_get_thread_num());
38   printf("Number of threads=%d\n", omp_get_num_threads());
39   omp_set_num_threads( omp_get_num_procs()  );
40   gettimeofday(&time_start, NULL);
41 #pragma omp parallel
42     {
43 #pragma omp single private(i)
44         for(i = 1; i < MAX; i++) {
45             FibNumber[i] = FibonacciTask(i);
46     }    }
47    gettimeofday(&time_end, NULL);
48    time_end.tv_usec = time_end.tv_usec-time_start.tv_usec;
49    time_end.tv_sec = time_end.tv_sec-time_start.tv_sec;
50    time_end.tv_usec += (time_end.tv_sec*1000000);
51    printf("Execution time of The Fibonacci Numbers with OpenMP : %lf sec\n", time_end.tv_usec / 1000000.0);
52    for(i = 0; i < MAX; i++)
53        printf("%d ", FibNumber[i]);
54    printf("\n-------------------------------\n");
55    return 0;
56 }
57