// from cilkplus.org
//
// compile with (gcc 4.9 plus; tested with 5.3.1)
// gcc -fcilkplus -lcilkrts -o parfib parfib.c
#include <cilk/cilk.h>
#include <cilk/cilk_api.h>
#include <stdio.h>
#include <stdlib.h>
long int fib(int n, int serial)
{
long int x,y;
if (n < 2)
return n;
if (n <= serial) {
x = fib(n-1, serial);
y = fib(n-2, serial);
} else {
x = cilk_spawn fib(n-1, serial);
y = fib(n-2, serial);
cilk_sync;
}
return x + y;
}
int main(int argc, char **argv){
int n = atoi(argv[1]);
int serial = 0;
if (argv[2])
serial = atoi(argv[2]);
if (argv[3])
__cilkrts_set_param("nworkers",argv[3]);
printf("fib(%d) = %d\n", n, fib(n, serial));
return 0;
}