Intel® Concurrent Collections (CnC) – 一个新的平行开发模式
开发多核应用程序的用户一般比较头疼的问题是跟线程相关的问题, 比如程序运行的硬件架构, 线程的同步, 调度与分配,负载平衡等。 某个系统领域内的专家(Domain expert)一般都会专注于程序语义的正确性以及程序本身的一些限制, 所以这些并行相关的问题对于Domain expert来说比较困难。而对于并行系统内的专家(Tuning expert)来说, 由于缺乏对某个领域内专业知识的了解,即使他对并行系统非常了解, 往往也很难开发出非常高效的某个专业领域的应用。
Intel® Concurrent Collections (简称CnC) 是一个全新C++的并行编程模式。在这种编程模式下, 用户可以不用考虑太多的并行系统问题。 如同创建线性程序一样, 用户可以把更多的精力放在程序的整体架构上, 专注于解决专业领域内的问题, 而把Tuning expert要做的事情交给CnC来完成。 这样, Domain expert就可以从并行系统里解放出来, 开发出高效的适用于某个专业领域的并行程序。在CnC这个编程模式下, 如同写线性程序一样, 用户可以专注于各个功能模块, 处理好各个功能模块的输入和输出, 以及这些功能模块的执行先后次序。 这些问题其实就是应用程序本身的流程问题。
并行的本质是一个处理数据依赖关系(Data Dependence) 和控制依赖关系(Control Dependence)的一个过程。 Data Dependence就是我们经常说的生产者和消费者关系。 一个功能模块生成一些数据提供给其他功能模块。 数据被某个生产者模块产生, 然后被某个消费者模块使用。 Control Dependence 是一个控制与被控制关系。 这个关系涉及到两个因素, 如果(if)和何时(when)。 在线性程序里面, if 和 when 是紧密结合在一起的。 在CnC里面, 我们引入了Tag这个概念。 如果某个控制模块执行完成了, 那么他产生一个Tag, 这样被控制的模块就可以被调度起来。 但是要注意, 这里和线性程序不一样的是, 线性程序里面被控制的模块是马上就开始执行了, 但是在CnC里面,被控制模块是被调度到一个线程池里面, 被控制模块并不见得就是马上开始执行。
所以在Data Dependence 和Control Dependence 中, 我们需要3个元素来满足这两个关系。
Step: Step就是计算, 就是我们的程序功能模块, 对应程序中的某个function。.
Item: Item是数据, 就是执行某个程序需要的数据以及该程序生成的数据。
Tag: Tag 用来维护function之间的控制与被控制的关系。
这3个元素其实也是我们在开发一般程序的时候需要考虑的问题。 根据这3个元素, 我们就可以构造一个程序的流程图(Graph). 这个Graph的实质就是在描述数据依赖关系和控制依赖关系。举个例子来说, 在我们的程序里面我们可以有这样一些元素:
Item Data: [I1], [I2]
Step function: (S1), (S2)
Tag: <T1>, <T2>
那么我们可以这样描述我们的程序:
<T1>::(S1) 只有当Tag <T1>准备好的时候, S1才可以被执行
<T2>::(S2) 只有当Tag <T2>准备好的时候, S2才可以被执行
[I1]-> (S1) -> [I2], <T2> ->(S2)
数据[I1]输入给function (S1), (S1)在执行完后生成数据[I2], 并且生成Tag <T2>。
实际上, 在这个例子中, 我们就是在用文本的方式来描述我们的程序流程图:
[I1]-->(S1)-->[I2]-->(S2)
只是在模块S1和模块S2之间, 我们用T2来控制S1 和S2之间的Control Dependence. 那么S2什么时候开始执行呢? 根据这个关系我们知道, 当S1执行完成生成Tag <T2>后, S2就被调度到线程池。 当数据I2准备好之后, S2就可以开始真正执行了。
当我们把上述关系用文本的方式记录在一个文件中后, 我们就可以开始CnC编程了。
下面这个图描述了CnC这种并行编程模式。
用户在定义好文本方式的关系图后, CnC中的Translator会把它转换成一个C++头文件以及一个C++程序提示文件。 在C++程序提示文件里面定义好了系统的框架, 用户需要做的大部分工作就是往这些具体的功能模块里面填写具体的程序代码即可。在程序开发完成后, 编译器会自动链接一个CnC的Runtime库, 生成最终的应用程序。 当然, 这个应用程序是真成的多线程并行应用程序。
CnC支持各种形式的并行开发,比如Data, Task, 和Pipeline Parallel. 目前CnC同时提供Windows 版和Linux版。 在Windows 版本下, CnC可以嵌入Visual Studio 中, 用户可以在Visual Studio的框架下开发基于CnC的并行程序。
下载和使用CnC或者想要了解更多的关于CnC的信息, 请访问网站: http://software.intel.com/en-us/articles/intel-concurrent-collections-for-cc/
Intel® Concurrent Collections (CnC) – 一个新的平行开发模式
最新推荐文章于 2021-12-26 12:21:13 发布