技术讨论:Intel Cilk Plus与OpenMP

intel_jeff 2012-02-02 02:30:16
加精
在论坛中已经有一些Intel® Cilk™ Plus(以下简称Cilk Plus)的介绍,讨论OpenMP的帖子也不少,请参考“技术文章索引”。我想现在有必要比较一下Cilk Plus和OpenMP,以便我们在多线程编程时作出最恰当的选择。

一般我们把并行方式划分为两种:数据并行和任务并行。我们来看一下Cilk Plus和OpenMP在这两种并行方式下有什么不同的特点。

首先,在数据并行方面,使用OpenMP的相当容易上手,而且并行的效率也颇高,这也是OpenMP在HPC领域得到广泛应用的原因。OpenMP提供三种工作量的划分与调度:静态方式、动态方式和Guided方式。我们开发人员可以根据循环迭代的工作量分布情况选择最合适的调度方式。如果工作量的分布比较固定而且均匀(每个迭代花费的时间基本相同),我们可以选择静态方式。如果工作量分布是不确定的,或者工作量非常不均衡,就需要选择另外两种调度方式了。否则,将导致多线程负载不均衡。相对来说,静态方式的开销非常小。另外两种方式在底层实现中需要维护一个队列,并提供入队、出队和派发的功能,以便将总的工作量分块并入队,然后派发给空闲线程。因此,这两种方式的开销要大于静态方式的开销。


Cilk Plus在数据并行时对程序源代码的改动非常小,只需要将for改写成clik_for即可,Cilk Plus的底层运行库能高效地完成工作量的划分、调度,不需要我们开发人员的干预。空闲线程通过Cilk Plus的工作密取(Work-Stealing)从其他线程获取一部分工作量,同时运行库能将密取的次数控制在最低水平,减少密取带来的性能开销。如下图所示,线程A首先开始执行这个循环,它会将工作量不断按照循环控制变量x来平均分块,直到每块的大小足够小为止,这样就得到下面这个类似二叉树的图,每一个右侧分支都表示一部分可以被密取的工作。因此在循环迭代的工作量分布均匀的情况下,线程B只需要密取一次就可以了。而在分布不均匀的情况下,线程B从顶部开始密取,这是因为越接近顶部的密取能获得的工作量越多,接近底部的密取能获得的工作量则相对较少。这种自顶向下的策略能有效地减少密取次数。可以想象,自顶向下在性能上要优于自底向上。


在任务并行方面,Cilk Plus提供cilk_spawn和cilk_sync这两个关键字,我们可以很灵活地将基于任务的串行代码并行化,比如递归函数。一般来说,一次cilk_spawn的开销仅相当于一次函数调用开销的3至5倍,一次密取的开销则比较高。因此,cilk_spawn不会给程序带来很大的开销。经过精心设计,我们可以将串行代码转化为高效的Cilk Plus并行代码,使密取次数尽可能的少,获得相当不错的性能加速比。


OpenMP 3.0标准中增加了对任务并行的支持,使用#pragma omp task来创建任务。语法也比较简单,但是对代码的可读性略有影响,不如Cilk Plus代码直观易读。


另外,Cilk Plus与OpenMP还有一些不同,包括:
l Cilk Plus还提供了一些向量化方面的支持,包括Elemental Function、Array Notation,开发人员可以使用这些功能,将向量操作以自然方式来书写,极大的增强程序的可读性,编译器也更容易将向量操作向量化。
l 主流编译器均已支持OpenMP,VS 2010还不支持OpenMP 3.0。目前仅有Intel编译器支持Cilk Plus。英特尔已将Cilk Plus开源,在GCC 4.7的分支中已支持Cilk Plus。

目前想到的不同点有这些,欢迎大家补充。

...全文
3273 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
洋桔子 2012-12-02
  • 打赏
  • 举报
回复
赞 好东西!! 谢谢分享~~
ll_gao 2012-05-22
  • 打赏
  • 举报
回复
不错,有待研究
xyin666 2012-05-09
  • 打赏
  • 举报
回复
不错,有待研究
dianwei_wang 2012-05-09
  • 打赏
  • 举报
回复
单纯的技术性能是只一个方面,更重要的是看这个技术的用户数量,以及是否开源!
harpym123 2012-05-08
  • 打赏
  • 举报
回复
回家好好研究
鈊隨莪動 2012-04-27
  • 打赏
  • 举报
回复
谢谢分享
lg0215081 2012-04-09
  • 打赏
  • 举报
回复
先了解下
凉水 2012-04-04
  • 打赏
  • 举报
回复
OpenMP确实支持很广
beeloveyou1 2012-03-18
  • 打赏
  • 举报
回复
参考文档研究研究
aas1113 2012-03-16
  • 打赏
  • 举报
回复
参考文档研究研究!嘿嘿
Intel_Shenghong 2012-03-15
  • 打赏
  • 举报
回复
这里应该是笔误。根据OpenMP主页就可以看到下面一段话:
The OpenMP API supports multi-platform shared-memory parallel programming in C/C++ and Fortran. The OpenMP API defines a portable, scalable model with a simple and flexible interface for developing parallel applications on platforms from the desktop to the supercomputer.

所以,OpenMP应该是支持C/C++和Fotran。

[Quote=引用 21 楼 magisu 的回复:]
OpenMP不支持C++?这个说的太奇怪了吧。
[/Quote]
alfonso12345 2012-03-12
  • 打赏
  • 举报
回复
很好的文档。。谢谢楼主
dandingyy 2012-03-11
  • 打赏
  • 举报
回复
cilk稍微用过一点,但是有一些地方不是很清楚,想问一下楼主:
(1)cilkview工具测量下的加速比和预测的并行度,是怎么预测的。描述上说,一部分是并行区域的并行度,另一部分是整个程序的并行度;但是有时候实际加速比远远达不到后者的情况。
(2)还是使用cilkview工具可以直接测量并行部分时间,这个时间与我直接用ctime库里的clock_t测的时间有什么不一样,在双核和单核的时候,我用clock_t测的时间相同,但是用cilkview测的时间前者却是后者的一半。
(3)怎样自己实现reducer,一直不太懂,感觉手册上还是太笼统了。。
「已注销」 2012-03-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 intel_jeff 的回复:]
在论坛中已经有一些Intel® Cilk™ Plus(以下简称Cilk Plus)的介绍,讨论OpenMP的帖子也不少,请参考“技术文章索引”。我想现在有必要比较一下Cilk Plus和OpenMP,以便我们在多线程编程时作出最恰当的选择。

一般我们把并行方式划分为两种:数据并行和任务并行。我们来看一下Cilk Plus和OpenMP在这两种并行方式下有什么不同的特点。

首先,在数……
[/Quote]
不是很明白,我在VC++ 2010下C++的程序中使用OpenMP作视频解码(整个工程都是C++,所有源程序都是C++)。所以我不明白OpenMP不支持C++是什么意思?还是希望LZ给出更明确的解释。
MagiSu 2012-03-10
  • 打赏
  • 举报
回复
OpenMP不支持C++?这个说的太奇怪了吧。
waylen0626 2012-03-09
  • 打赏
  • 举报
回复
先看看再说吧~不知道怎么样~
studygirl002 2012-03-08
  • 打赏
  • 举报
回复
不错的问题啊,
Ttoume 2012-03-08
  • 打赏
  • 举报
回复
Cilk Plus和Openmp其实是相差很少,一般用户使用起来相差无几,单纯就技术讲:Openmp适用性更强,但Cilk Plus的积累的更好,看过之后,也学到很多东西。(来源:http://www.xiaoche001.com
sinuoke1111 2012-03-08
  • 打赏
  • 举报
回复
转载文章请注明出自“CSDN
zhanghi7665 2012-03-07
  • 打赏
  • 举报
回复
有时间要好好看看
加载更多回复(12)

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧