Cilk介绍

来源:互联网 发布:淘宝证书 编辑:程序博客网 时间:2024/05/20 07:31
cilk介绍
http://software.intel.com/zh-cn/articles/cilk-information/?cid=sw:prccsdn1239
http://baike.baidu.com/view/2024850.htm

参考上面的链接可以初步了解Cilk技术:

“英特尔® C++ 编译器的新功能 Cilk 语言扩展技术(以下简称 “Cilk 技术”)为 C/C++ 语言增加了细粒度任务支持,使其为新的和现有的软件增加并行性来充分发掘多处理器能力变得更加容易。”

“Cilk 技术的设计特别适合但不限于 “divide 和 conquer” 的算法。它将问题分解成可以独立完成的子问题(任务),然后再将这些执行结果合并起来。”


1. Cilk为Intel编译器的语言扩展,通过提供一些关键字、环境变量、函数库等方便进行并行编程。由于是语言扩展,所以不需要对编译器增加额外的选项。当然,编译器提供了选项将cilk程序进行串行化。

2. Cilk的特点之一是"简单",极大的简化了将串行程序进行并行的难度,其核心内容是三个关键字和其工作原理的理解。

3. Cilk的历史:(http://www.oschina.net/p/cilk)

“Cilk多线程编程技术最早由MIT开 发,是一个基于Gcc编译器的开源项目。后来开发者创建了一个创业公司,推出改进的私有版本,整合到Windows下的多种编译器中。之后它被英特尔公司 收购,整合进英特尔的编译器中。现在,它再次成为一个开源项目,成为Gcc 4.7下的一个分支。Cilk Plus允许C和C++程序员能高效利用多核处理器的并行处理能力。"

说明:在未来的gcc 4.7中,就可以使用cilk扩展语法写多线程并行程序了。

4. 通常,Cilk程序会查询操作系统信息,尽可能多地使用多核处理器。 

缺省地, 工作线程的数量被设定等同于运行系统的核的总数。 这样的缺省值设定, 能够满足大多数情况下的要求。

通过程序逻辑控制, 或者环境变量(CILK_NWORKERS), 你可以增加或者减少工作线程的数量。

5. 如何使用 Cilk 技术?

下面描述了使用 Cilk 技术创建一个并行程序的操作步骤:
(1)通常,要有一个已经实现了基本功能的串行 C++ 程序。要确保该串行程序是正确无误的。因为虽然在串行程序中的任何 bug 仍会在并行程序中发生,但是这些 bug 在并行程序中将更加难以辨别和调试。
(2)找出程序中可以从并行操作中获益的代码段。那些执行时间相对长,并且能独立执行的操作是首选修改目标。
(3)用三个 Cilk 关键字标明那些能并行执行的任务: 
_Cilk_spawn(或 cilk_spawn, 如果程序包含了 cilk.h 文件)表示对一个函数(“子”)的调用,能与调用者(“父”)一起被并行处理。
_Cilk_sync(或 cilk_sync, 如果程序包含了 cilk.h 文件)表示所有衍生的“子”函数完成后,才能继续后续代码执行。
_Cilk_for(或 cilk_for, 如果程序包含了 cilk.h 文件)表示一个循环包含的迭代可以被并行执行。
(4)编译程序: 
Window* 操作系统:选择使用 icl 命令行工具,或者在微软的 Visual Studio* 下进行编译。如果使用 Visual Studio* 进行开发,确保已经从英特尔® Parallel Composer 相关菜单中选择了“Use Intel C++”
Linux* 操作系统:使用 icc 命令
(5)执行程序。如果没有竞争条件,并行程序将输出和串行程序相同的结果。
(6)通过使用 reducer,锁,或者重写代码解决任何由于竞争条件而产生的冲突问题。

说明:对于cilk程序的调试,一般先调试保证串行化的cilk程序的正确性,再考虑并行程序的错误(是否有数据竞争等).

6. 


主要概念/术语:

1. worker:术语worker表示在一个Cilk程序里,一个用于执行任务的操作系统线程。

2. 串行化

Cilk语言扩展设计为具有串行语义。 也就是说, 每一个Cilk程序对应于一个等价的C/C++程序。这样的C/C++程序被称作Cilk程序的串行化(Serialization)。 这种串行化对于Cilk程序的调试特别有帮助。
如何对已有的cilk程序进行串行化?
方法一:头文件 cilk_stub.h 包含了将Cilk关键字和系统库调用定义为对应的串行形式的宏。在其它头文件前面引用 cilk_stub.h 就可以生成串行化。

方法二:使用/Qcilk_serialize选项编译。当然,方法一也可以通过选项-include cilk/cilk_stub.h(linux)或/FI cilk/cilk_stub.h(win)达到同样效果。

3.