| #include <stdio.h> |
| #include <stdlib.h> |
| #include <math.h> |
| #include <omp.h> |
| #include <unistd.h> |
| #define MAX 33 //41 |
| int Fibonacci(int n) |
| { int x, y; |
| if (n < 2) |
| return n; |
| else { |
| x = Fibonacci(n - 1); |
| y = Fibonacci(n - 2); |
| return (x + y); |
| } } |
| int FibonacciTask(int n) |
| { int x, y; |
| if (n < 2) |
| return n; |
| else { |
| #pragma omp task shared(x) |
| x = Fibonacci(n - 1); |
| #pragma omp task shared(y) |
| y = Fibonacci(n - 2); |
| #pragma omp taskwait |
| return (x + y); |
| } } |
| |
| int main(int argc, char * argv[]) |
| {int FibNumber[MAX] = {0}; |
| struct timeval time_start, time_end; |
| int i = 0; |
| // openmp related print message |
| printf("CPU_ONLN= %d\n", sysconf(_SC_NPROCESSORS_ONLN)); |
| printf("Number of CPUs=%d\n", omp_get_num_procs()); |
| printf("Number of max threads=%d\n", omp_get_max_threads()); |
| printf("Number of executing thread=%d\n", omp_get_thread_num()); |
| printf("Number of threads=%d\n", omp_get_num_threads()); |
| omp_set_num_threads( omp_get_num_procs() ); |
| gettimeofday(&time_start, NULL); |
| #pragma omp parallel |
| { |
| #pragma omp single private(i) |
| for(i = 1; i < MAX; i++) { |
| FibNumber[i] = FibonacciTask(i); |
| } } |
| gettimeofday(&time_end, NULL); |
| time_end.tv_usec = time_end.tv_usec-time_start.tv_usec; |
| time_end.tv_sec = time_end.tv_sec-time_start.tv_sec; |
| time_end.tv_usec += (time_end.tv_sec*1000000); |
| printf("Execution time of The Fibonacci Numbers with OpenMP : %lf sec\n", time_end.tv_usec / 1000000.0); |
| for(i = 0; i < MAX; i++) |
| printf("%d ", FibNumber[i]); |
| printf("\n-------------------------------\n"); |
| return 0; |
| } |