说明:
下载User Guide: http://software.intel.com/zh-cn/forums/showthread.php?t=77996&o=a&s=lr(Cilk_User_Guide.pdf)
主要是对该用户指南(中文版)的一些学习笔记和简化并更加自己的理解添加一些代码示例,可以参考原文档获取更多细节。
1. cilk的运行系统API
头文件cilk/cilk_api.h里包含了Cilk运行函数和类的声明。除此之外,关于cilk reducers的相关api在相应的头文件定义。cilk_api.h是另外一些cilk运行时API的定义接口。
cilk暴露的api比较少,这也是cilk比较简单易用的原因吧。
(1) __cilkrts_set_param
int __cilkrts_set_param(const char* name, const char* value);
该函数使程序员可以控制Cilk运行系统的多个参数。它的两个字符串参数构成了一个名/值对。下面是支持的name值:
nworkers: 参数value指定可使用工作线程数量,缺省用十进制表示,也可以通过前缀0x或0分别用十六或八进制表示。如果程序中没有调用这个函数,工作线程的数量由环境变量CILK_NWORKERS的值决定。缺省情况下,工作线程的数量和处理器的数量相同。该函数只有在第一次调用包含cilk_spawn或cilk_for的函数前才有效。
(2)__cilkrts_get_nworkers
int __cilkrts_get_nworkers(void);
该函数返回被分配用于处理Cilk任务的工作线程数量,同时冻结该数量值,防止__cilkrts_set_paramd对其进行修改。如果在一段串行代码中调用,该函数将返回1。
工作线程的ID值不一定在一个连续的范围里,所以工作线程的ID值可能会大于__cilkrts_get_nworkers的返回值。
(3) __cilkrts_get_worker_number
int __cilkrts_get_worker_number(void);
该函数返回一个整数值,表示执行该函数的Cilk工作线程号。
(4)__cilkrts_get_total_workers
int __cilkrts_get_total_workers(void);
在一个特定时间里,Cilk运行系统有可能分配比活动工作线程数量更多的工作线程。该函数返回所有工作线程的总数,包括哪些不正在使用的workers。换句话说,该函数将返回比可分配给工作线程使用的最大ID值大一的值。典型情况下,这个值比实际执行Cilk任务的工作线程数稍大一些。
这几个api在学习过程中可以通过分析工作线程ID等来帮助理解cilk的执行模型。
2. cilk总结:
主要内容:
三个关键字cilk_spawn,cilk_sync,cilk_for
数据竞争reducer
运行API
重点理解:
cilk的执行模型:衍生的时候,衍生的函数运行在当前工作线程,当前函数的剩余部分运行在新的工作线程上(前提是工作密取确实发生了)。同步后的线程是随机的,可能是原来的工作线程,也可能是新的工作线程。所以,工作密取会导致线程的迁移。
cilk_for的理解:二分法划分策略,并不是简单的每次循环迭代进行衍生。粒度的理解。
总结来说,cilk包含的内容比较少,学习难度小,关键在于执行模型的理解。更深入的学习,由于cilk已经开源,所以通过源码学习其原理和机制不失为一个好方式!