Cilk CISC 879 Parallel Computation Erhan Atilla Avinal
2/21 Introduction What is Cilk ? Multithreaded Computation Language Specifications Cilk Runtime System Compiling & Running
3/21 What is Cilk? A language for multithreaded parallel programming based on C. Effective in highly asynchronous parallelism. No message passing
4/21 Multithreaded Computation Cilk guarantees that programs are scheduled efficiently by its runtime system. Programmer does not deal with message passing.
5/21 int fib (int n) { if (n<2) return (n); else { int x, y; x = fib (n-1); y = fib (n-2); return (x+y); } int main (int argc, char *argv[]) { int n, result; n = atoi(argv[1]); result = fib (n); printf ("Result: %d\n", result); return 0; } #include cilk int fib (int n) { if (n<2) return n; else { int x, y; x = spawn fib (n-1); y = spawn fib (n-2); sync; return (x+y); } cilk int main (int argc, char *argv[]){ int n, result; n = atoi(argv[1]); result = spawn fib(n); sync; printf ("Result: %d\n", result); return 0; }
6/21 Multithreaded Computation
7/21 Spawn Spawns Cilk procedures to start parallel computations int i; float j; cilk int foo(); i= spawn foo(); YES j= spawn foo(); NO x = spawn foo() + spawn bar(); NO
8/21 Shared Memory Cilk supports shared memory Sharing occurs by passing pointers to spawned procedures (call by reference).
9/21 Shared Memory cilk int foo (void) { int x = 0, y; spawn bar(&x); y = x + 1; sync; return (y); } cilk void bar (int *px) { printf("%d", *px + 1); return; } cilk int foo (void) { int x = 0; spawn bar(&x); x = x + 1; sync; return (x); } cilk void bar (int *px) { *px = *px + 1; return; } Data Race
10/21 Locking Cilk_lockvar data type #include : :Cilk_lockvar mylock; : { Cilk_lock_init(mylock); : Cilk_lock(mylock); /* begin critical section */ : Cilk_unlock(mylock); /* end critical section */ }
11/21 Inlets C Functions internal to a Cilk procedure Cannot contain spawn or sync Cilk guarantees that all operations in inlets are atomic
12/21 Inlets cilk int fib (int n) { int x = 0; inlet void summer (int result) { x += result; return; } if (n<2) return n; else { summer(spawn fib (n-1)); summer(spawn fib (n-2)); sync; return (x); }
13/21 SYNCHED Keyword Tests if procedure is synchronized. state1 = alloca(state_size); /* fill in *state1 with data */ spawn foo(state1); if (SYNCHED) state2 = state1; else state2 = alloca(state_size); /* fill in *state2 with data */ spawn bar(state2); sync;
14/21 Aborting “abort” : causes all of the spawned children to abort. Cilk does not guarantee that all children will be aborted instantly.
15/21 Aborting cilk void baz(int n); cilk void foo(int n) { inlet void bar() { abort; } bar(spawn baz(17)); spawn baz(28); sync; }
16/21 Cilk Runtime System(CRS) CRS implements a efficient scheduling policy : work-stealing When a processor runs out of work it steals work from another processor randomly. Deque (Double-Ended Queue)
17/21 Cilk Runtime System(CRS)
18/21 Compiling “cilk” command supports gcc options cilk fib.cilk -o fib cilk -cilk-profile -cilk-critical-path -O2 fib.cilk -cilk-profile : how much memory is used, how much time each processor spends, etc.
19/21 Compiling “cilk” command -cilk-critical-path : measures ideal execution time of your program on an infinite number of processors. It may slow down the execution of the program because of many calls to timing routines.
20/21 Running fib --nproc 4 --stats stats : shows performance dataif -cilk- profile is used incompilation. --nproc : number of processors used
21/21 Reading List Cilk Main Page Cilk Reference Manual