/* { dg-options "-fcilkplus" } */ /* { dg-do run { target i?86-*-* x86_64-*-* } } */ /* { dg-options "-fcilkplus -lcilkrts" { target { i?86-*-* x86_64-*-* } } } */ #if HAVE_IO #include #endif #define FIB_ITERATION 30 void fib (int *, int); int fib_serial (int); int main(void) { int ii = 0, error = 0; int fib_result[FIB_ITERATION+1], fib_serial_result[FIB_ITERATION+1]; #if HAVE_IO for (ii = 0; ii <= FIB_ITERATION; ii++) { int result = 0; fib (&result, ii); printf("fib (%2d) = %10d\n", ii, result); } #else for (ii = 0; ii <= FIB_ITERATION; ii++) { fib (&fib_result[ii], ii); } fib_serial_result[0] = 0; fib_serial_result[1] = 1; for (ii = 2; ii <= FIB_ITERATION; ii++) fib_serial_result[ii] = fib_serial_result[ii-1] + fib_serial_result[ii-2]; for (ii = 0; ii <= FIB_ITERATION; ii++) { if (fib_result[ii] != fib_serial_result[ii]) __builtin_abort (); } #endif return 0; } int fib_serial (int n) { int x = 0, y = 0; if (n < 2) return n; else { x = fib_serial (n-1); y = fib_serial (n-2); return (x+y); } } void fib(int *result, int n) { int x = 0, y = 0; if (n < 2) x = n; else { _Cilk_spawn fib(&x, n-1); fib(&y, n-2); _Cilk_sync; } *result = (x+y); }