Cilk je paralelní programovací jazyk vyvinutý na MIT Charlesem E. Leisersonem, Keithem H. Randallem a Silviu C. Craciunas. Vychází z programovacího jazyka C a přidává několik klíčových slov pro podporu paralelismu.
Programy v jazyce Cilk jsou vykonávány běhovým systémem, který spravuje fond pracovních vláken. Když je vyvolána funkce Cilk, systém runtime vytvoří nové vlákno, které funkci vykoná. Zplozené vlákno může následně zplodit další vlákna, čímž se vytvoří strom vláken.
Běhový systém Cilk je navržen tak, aby mohl pracovat s jakýmkoli modelem paralelního programování, například se sdílenou pamětí nebo předáváním zpráv. Nejběžnějším modelem je však sdílená paměť, kde má každé vlákno svá vlastní soukromá data, ale může také přistupovat ke sdíleným datům.
Cilk poskytuje několik klíčových slov pro podporu paralelismu. Nejdůležitějším je "cilk_spawn", které vytvoří nové vlákno pro vykonání funkce. Zplozené vlákno může následně zplodit další vlákna a vytvořit tak strom vláken.
Klíčové slovo "cilk_sync" slouží k synchronizaci všech vláken v programu Cilk. Když vlákno dosáhne příkazu "cilk_sync", počká, až všechna podřízená vlákna skončí, a teprve potom pokračuje. Tím je zajištěno, že všechna vlákna dokončí svou práci před pokračováním programu.
Programovací model Cilk je založen na principu "rozděl a panuj". Pro paralelizaci se problém rozdělí na menší podproblémy, které se pak řeší paralelně. Tento přístup je vhodný pro problémy, které lze rozdělit na nezávislé podproblémy.
Jednoduchým příkladem programu v jazyce Cilk je program "Hello, World!":
#include <stdio.h>
int main() {
cilk_spawn printf("Hello, ");
printf("World!\n");
cilk_sync;
return 0;
}
V tomto programu je řetězec "Hello, World!" vypisován dvěma vlákny. První vlákno je spuštěno klíčovým slovem "cilk_spawn" a vytiskne řetězec "Hello, ". Druhé vlákno, které je hlavním vláknem, vytiskne řetězec "World! ". Klíčové slovo "cilk_sync" synchronizuje obě vlákna, takže řetězec "World!" se nevytiskne, dokud není vytištěn řetězec "Hello, ".
Cilk je mocný nástroj pro paralelní programování, ale má několik nevýhod. Zaprvé, programy v Cilku mohou být obtížné na pochopení a ladění. Za druhé, běhový systém Cilk může být pomalý, zejména při spouštění mnoha vláken. A konečně, Cilk nepodporuje některé důležité modely paralelního programování, například datový paralelismus.