您的位置:首页 > 产品设计 > UI/UE

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进行计算进行衍生同步等,无论如何,不会影响到主线程的变更。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: