UNB/ CS/ David Bremner/ teaching/ cs3383/ examples/ parfib2.cc
// 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;
}