在论坛中已经有一些Intel® Cilk™ Plus(以下简称Cilk Plus)的介绍,讨论OpenMP的帖子也不少,请参考“
技术文章索引”。我想现在有必要比较一下Cilk Plus和OpenMP,以便我们在多线程编程时作出最恰当的选择。
一般我们把并行方式划分为两种:数据并行和任务并行。我们来看一下Cilk Plus和OpenMP在这两种并行方式下有什么不同的特点。
首先,在数据并行方面,使用OpenMP的相当容易上手,而且并行的效率也颇高,这也是OpenMP在HPC领域得到广泛应用的原因。OpenMP提供三种工作量的划分与调度:静态方式、动态方式和Guided方式。我们开发人员可以根据循环迭代的工作量分布情况选择最合适的调度方式。如果工作量的分布比较固定而且均匀(每个迭代花费的时间基本相同),我们可以选择静态方式。如果工作量分布是不确定的,或者工作量非常不均衡,就需要选择另外两种调度方式了。否则,将导致多线程负载不均衡。相对来说,静态方式的开销非常小。另外两种方式在底层实现中需要维护一个队列,并提供入队、出队和派发的功能,以便将总的工作量分块并入队,然后派发给空闲线程。因此,这两种方式的开销要大于静态方式的开销。
Cilk Plus在数据并行时对程序源代码的改动非常小&