56 lines
1.6 KiB
C
56 lines
1.6 KiB
C
#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;
|
|
}
|