210 likes | 218 Views
Cilk. CISC 879 Parallel Computation Erhan Atilla Avinal. Introduction. What is Cilk ? Multithreaded Computation Language Specifications Cilk Runtime System Compiling & Running. What is Cilk?. A language for multithreaded parallel programming based on C.
E N D
Cilk CISC 879 Parallel Computation Erhan Atilla Avinal
Introduction • What is Cilk ? • Multithreaded Computation • Language Specifications • Cilk Runtime System • Compiling & Running
What is Cilk? • A language for multithreaded parallel programming based on C. • Effective in highly asynchronous parallelism. • No message passing
Multithreaded Computation • Cilk guarantees that programs are scheduled efficiently by its runtime system. • Programmer does not deal with message passing.
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.h> 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; }
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
Shared Memory • Cilk supports shared memory • Sharing occurs by passing pointers to spawned procedures (call by reference).
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; } Shared Memory Data Race
Locking • Cilk_lockvar data type #include <cilk-lib.h> : :Cilk_lockvar mylock; : { Cilk_lock_init(mylock); : Cilk_lock(mylock); /* begin critical section */ : Cilk_unlock(mylock); /* end critical section */ }
Inlets • C Functions internal to a Cilk procedure • Cannot contain spawn or sync • Cilk guarantees that all operations in inlets are atomic
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); } }
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;
Aborting • “abort” : causes all of the spawned children to abort. • Cilk does not guarantee that all children will be aborted instantly.
Aborting cilk void baz(int n); cilk void foo(int n) { inlet void bar() { abort; } bar(spawn baz(17)); spawn baz(28); sync; }
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)
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.
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.
Running • fib --nproc 4 --stats 1 30 • --stats : shows performance data if -cilk-profile is used incompilation. • --nproc : number of processors used
Reading List Cilk Main Page http://supertech.lcs.mit.edu/cilk Cilk 5.3.2 Reference Manual http://supertech.lcs.mit.edu/cilk/manual-5.3.2.pdf