cilk之User Guide学习笔记(6)操作系统相关
2012-02-06 16:11
302 查看
说明:
下载User Guide: http://software.intel.com/zh-cn/forums/showthread.php?t=77996&o=a&s=lr(Cilk_User_Guide.pdf)
主要是对该用户指南(中文版)的一些学习笔记和简化并更加自己的理解添加一些代码示例,可以参考原文档获取更多细节。
1. 在Cilk程序上使用其它工具
由于Cilk程序拥有和C/C++标准不同的堆栈布局和调用规则,那些应用于二进制代码的工具(包括类似valgrind的内存检查工具和代码覆盖工具)可能无法用于Cilk并行程序。很多时候通过只使用一个工作线程(通过把环境变量CILK_NWORKERS设置为1)来运行程序就可以了。如果这样不能奏效,你可以在Cilk程序的串行版本上使用这些工具。
2. 和操作系统线程的一般交互
在和操作系统线程一起工作时请记住下面几点:
工作线程就是操作系统线程
运行时系统会通过操作系统自身的相关机制来分配一个“工作线程”集合。
Cilk程序不会总是100%用掉所有可用的处理器。
这几点比较容易理解,工作线程最终是会映射到操作系统线程的。
Cilk strands并不是操作系统线程。同一Cilk strand在运行过程中不会在工作线程间迁移。但是在cilk_spawn,cilk_sync,或cilk_for语句后工作线程会发生变更,这是因为这些语句会中止一个或多个strand并创建一个或多个新的strand。而且,你无法控制某个特定strand由哪一个工作线程来执行。
上述内容会从多方面影响一个程序,最重要的是:
不要使用Windows线程本地存储或Linux Pthread线程专有数据,因为在工作密取OS线程可能会发生变更。作为替代,可以使用其它编程技巧,比如前面讨论的Cilk holder reducer。
不要跨越cilk_spawn,cilk_sync或cilk_for语句使用操作系统锁或互斥锁,因为只有加锁的线程能进行解锁操作。
总之,这两点其实在理解了cilk的执行模型就容易理解了,cilk的执行模型决定了它的这些限制,比如cilk中衍生的strand是运行在当前的worder上的,但是同步后的线程可能是原来的worker,也可能是新的worder,这就是“工作密取OS线程可能发生变更”的含义了。
3. MFC和cilk程序
这一点和上面"工作密取OS线程可能会发生变更"是一个内容,是在MFC中的一个实际例子而已。即:
Microsoft Foundation Class(MFC)库依赖于线程本地存储来完成由包装类到GDI对象句柄的映射。Cilk strand本身并不能保证一直运行在任何特定线程上,所以使用Cilk的并行程序无法安全地调用MFC函数。
当然,这并不是说不能在MFC中使用cilk,仍然是可以通过一定的策略使用cilk完成计算密集型任务的。核心就是将cilk计算代码和MFC中UI相关的代码隔离,防止由于OS线程变更导致MFC无法工作。简单理解,就是通过MFC创建一个用于计算的本地线程(主线程为UI线程),这样,在计算线程中利用cilk进行计算进行衍生同步等,无论如何,不会影响到主线程的变更。
下载User Guide: http://software.intel.com/zh-cn/forums/showthread.php?t=77996&o=a&s=lr(Cilk_User_Guide.pdf)
主要是对该用户指南(中文版)的一些学习笔记和简化并更加自己的理解添加一些代码示例,可以参考原文档获取更多细节。
1. 在Cilk程序上使用其它工具
由于Cilk程序拥有和C/C++标准不同的堆栈布局和调用规则,那些应用于二进制代码的工具(包括类似valgrind的内存检查工具和代码覆盖工具)可能无法用于Cilk并行程序。很多时候通过只使用一个工作线程(通过把环境变量CILK_NWORKERS设置为1)来运行程序就可以了。如果这样不能奏效,你可以在Cilk程序的串行版本上使用这些工具。
2. 和操作系统线程的一般交互
在和操作系统线程一起工作时请记住下面几点:
工作线程就是操作系统线程
运行时系统会通过操作系统自身的相关机制来分配一个“工作线程”集合。
Cilk程序不会总是100%用掉所有可用的处理器。
这几点比较容易理解,工作线程最终是会映射到操作系统线程的。
Cilk strands并不是操作系统线程。同一Cilk strand在运行过程中不会在工作线程间迁移。但是在cilk_spawn,cilk_sync,或cilk_for语句后工作线程会发生变更,这是因为这些语句会中止一个或多个strand并创建一个或多个新的strand。而且,你无法控制某个特定strand由哪一个工作线程来执行。
上述内容会从多方面影响一个程序,最重要的是:
不要使用Windows线程本地存储或Linux Pthread线程专有数据,因为在工作密取OS线程可能会发生变更。作为替代,可以使用其它编程技巧,比如前面讨论的Cilk holder reducer。
不要跨越cilk_spawn,cilk_sync或cilk_for语句使用操作系统锁或互斥锁,因为只有加锁的线程能进行解锁操作。
总之,这两点其实在理解了cilk的执行模型就容易理解了,cilk的执行模型决定了它的这些限制,比如cilk中衍生的strand是运行在当前的worder上的,但是同步后的线程可能是原来的worker,也可能是新的worder,这就是“工作密取OS线程可能发生变更”的含义了。
3. MFC和cilk程序
这一点和上面"工作密取OS线程可能会发生变更"是一个内容,是在MFC中的一个实际例子而已。即:
Microsoft Foundation Class(MFC)库依赖于线程本地存储来完成由包装类到GDI对象句柄的映射。Cilk strand本身并不能保证一直运行在任何特定线程上,所以使用Cilk的并行程序无法安全地调用MFC函数。
当然,这并不是说不能在MFC中使用cilk,仍然是可以通过一定的策略使用cilk完成计算密集型任务的。核心就是将cilk计算代码和MFC中UI相关的代码隔离,防止由于OS线程变更导致MFC无法工作。简单理解,就是通过MFC创建一个用于计算的本地线程(主线程为UI线程),这样,在计算线程中利用cilk进行计算进行衍生同步等,无论如何,不会影响到主线程的变更。
相关文章推荐
- cilk之User Guide学习笔记(5)数据竞争加锁和reducers
- cilk之User Guide学习笔记(3)Cilk执行模型
- cilk之User Guide学习笔记(1)Cilk 语言特性说明
- cilk之User Guide学习笔记(4)cilk_for的分析
- Uuntn操作系统学习笔记之服务-web相关
- ASM学习笔记--ASM 4 user guide 第二章要点翻译总结
- User Guide:eccrypto.h学习笔记(翻译)
- JBoss AOP - User Guide 学习笔记
- ASM学习笔记--ASM 4 user guide 第一章翻译
- UserGuide:cryptlib.h学习笔记(翻译)
- ASM学习笔记--ASM 4 user guide 第一章翻译
- Flume 学习笔记 一 : Flume User Guide
- JavaScript学习笔记2:通过user-Agent获取浏览器和操作系统信息
- nginx 源码学习笔记(七)——内存分配相关源码分析
- 操作系统学习笔记(5)
- [笔记分享] [Hardware] MSM8x60 User Guide study report
- 模式识别学习笔记之一:模式识别的步骤及相关概念
- Scala学习笔记-数组相关操作
- 学习笔记:一个操作系统的实现--搭建你的工作环境
- Numpy np.array 相关常用操作学习笔记