Cilk是一个非常轻量的并行编程框架,仅仅添加了三个关键词
#include <cilk/cilk.h>
cilk_spawn
:等价于fork
,生成一个子任务,不阻塞,与原/主线程并行执行,主线程后面的部分称之为continuation(子任务只是放在当前线程的工作队列中,它并不指定如何/怎么执行这些生成的任务)cilk_sync
:等价于join
,同步设施cilk_for
:更加好的运行时/调度系统int fib(int n)
{
if (n < 2)
return n;
int x = fib(n-1);
int y = fib(n-2);
return x + y;
}
// parallelism
int fib(int n)
{
if (n < 2)
return n;
int x = cilk_spawn fib(n-1);
int y = fib(n-2);
cilk_sync;
return x + y;
}
采用spawn-sync的例子
采用cilk_for
假设只是pthread的元编程,开销会非常大
因此Cilk Plus有自己的运行时系统,维护了一个线程池
cilk_spawn
才产生for (int i = 0; i < N; ++i)
cilk_spawn foo(i);
cilk_sync;
调度策略:
cont:i=0
);若没有偷的话,连续量会不断从工作队列中弹出,并插入新的连续量,执行顺序与原来相同,相当于做DFS注意Cilk Plus是一种编程模型,有几种工具都支持
icpc -O3 <source>
g++ -O3 -fcilkplus -lcilkrts <source>
Tao B. Schardl, William S. Moses, Charles E. Leiserson, Tapir: Embedding Fork-Join Parallelism into LLVM’s Intermediate Representation, PPoPP, 2017