一般我们把并行方式划分为两种:数据并行和任务并行。我们来看一下Cilk Plus和OpenMP在这两种并行方式下有什么不同的特点。
首先,在数据并行方面,使用OpenMP的相当容易上手,而且并行的效率也颇高,这也是OpenMP在HPC领域得到广泛应用的原因。OpenMP提供三种工作量的划分与调度:静态方式、动态方式和Guided方式。我们开发人员可以根据循环迭代的工作量分布情况选择最合适的调度方式。如果工作量的分布比较固定而且均匀(每个迭代花费的时间基本相同),我们可以选择静态方式。如果工作量分布是不确定的,或者工作量非常不均衡,就需要选择另外两种调度方式了。否则,将导致多线程负载不均衡。相对来说,静态方式的开销非常小。另外两种方式在底层实现中需要维护一个队列,并提供入队、出队和派发的功能,以便将总的工作量分块并入队,然后派发给空闲线程。因此,这两种方式的开销要大于静态方式的开销。
Cilk Plus在数据并行时对程序源代码的改动非常小,只需要将for改写成clik_for即可,Cilk Plus的底层运行库能高效地完成工作量的划分、调度,不需要我们开发人员的干预。空闲线程通过Cilk Plus的工作密取(Work-Stealing)从其他线程获取一部分工作量,同时运行库能将密取的次数控制在最低