This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<stdio.h> | |
#include<omp.h> | |
int fibonacci(int n) | |
{ | |
if(n<2) | |
return n; | |
else | |
return fibonacci(n-1)+fibonacci(n-2); | |
} | |
int main() | |
{ | |
int fibnumber[100],i,j,n; | |
printf("Please Enter the series limit\n"); | |
scanf("%d",&n); | |
#pragma omp parallel num_threads(2) | |
{ | |
#pragma omp critical | |
if(omp_get_thread_num()==0) | |
{ | |
printf("There are %d threads\n", omp_get_num_threads()); | |
printf("Thread %d generating numbers..\n", omp_get_thread_num()); | |
for(i=0;i<n;i++) | |
fibnumber[i]=fibonacci(i); | |
} | |
else | |
{ | |
printf("Thread %d Printing numbers..\n", omp_get_thread_num()); | |
for(j=0;j<n;j++) | |
printf("%d\t", fibnumber[j]); | |
} | |
} | |
printf("\n"); | |
return 0; | |
} |
Explanation:
Aim of this program is to create two threads. one to generate Fibonacci numbers upto a series specified by user. another thread to print those generated Fibonacci numbers. We ensure proper synchronization between threads to ensure displaying doesn't take place before generating.
#include<omp.h>
Inclusion of Header files.
int fibonacci(int n)
{
if(n<2)
return n;
else
return fibonacci(n-1)+fibonacci(n-2);
}
This is the function which returns the nth Fibonacci number. 'n' is the input parameter to function. function recursively calls itself to find the nth Fibonacci number.
example:
n=3;
return fib(2)+fib(1);
return (fib(1)+fib(0))+1;
return 1+0+1;
return 2;
3rd Fibonacci number is 2.
int main()
{
int fibnumber[100],i,j,n;
printf("Please Enter the series limit\n");
scanf("%d",&n);
main function begins. input the series limit. (that is up to which fibonacci term?)
and an array to store all those Fibonacci terms with size 100.
#pragma omp parallel num_threads(2)
{
declaring number of threads to be 2. using #pragma pre processor and openmp parameter.
#pragma omp critical
for synchronization.
if(omp_get_thread_num()==0)
{
printf("There are %d threads\n", omp_get_num_threads());
printf("Thread %d generating numbers..\n", omp_get_thread_num());
for(i=0;i<n;i++)
fibnumber[i]=fibonacci(i);
}
Here omp_get_thread_num(), will return current thread number. If 0, then its first thread. we produce Fibonacci numbers here and store in array. (0-n terms using for loop).
omp_get_thread_num() function in the 3rd line of snippet will print total number of threads created.
else
{
printf("Thread %d Printing numbers..\n", omp_get_thread_num());
for(j=0;j<n;j++)
printf("%d\t", fibnumber[j]);
}
} //of outer if statement.
If its not first thread, then its obviously second thread because there are only two threads created. so we print here, the Fibonacci numbers (0-n) as per experiment.
printf("\n");
return 0;
}
This one is self explanatory.
That's it :)
Share your views about this article!