技术开发 频道

Visual C++ 2010 新特性:并行计算

  食材、菜谱和厨具都很重要

  2007年,微软宣布成立并行计算平台组,致力于简化并行应用程序的开发。随着Visual Studio 2010和.NET Framework 4的发布,微软为并行计算提供了完整的解决方案。

1

  图 3 Visual Studio 2010和.NET Framework 4对并行开发的支持

  食材-并发运行时

  不论是任务并行、数据并行,还是管道并行,都意味着需要把一个耗时的任务或数据分割成更小的单位。分割的颗粒度往往是由任务的性质决定的。细颗粒度并行的好处主要体现在可扩展性和负载平衡上。假设一个耗时的任务只被粗略分割成四个子任务并发执行,那么它对于多于四核的机器的扩展性就不够好;即使是在四核的机器上运行,也无法做到实时动态的负载平衡,可能发生三个子任务早早完成,而另一个任务还在一个核上苦苦等待的悲剧性事件。

  为了支持细粒度并行,在Visual C++ 2010中提供了一套并发编程框架,支持常用的协同任务调度和硬件资源(CPU和内存)管理。.NET Framework 4也在已有的线程池(Thread Pool)基础上,实现了协同任务调度和工作窃取(work-stealing)算法。工作窃取算法充分利用了细颗粒度并行的优势,保证空闲的线程依照一定的顺序,从本地、全局,甚至是其他线程的任务队列中“偷取”任务执行。当然,默认的任务调度器可以被扩展或配置以支持特殊的调度策略。

  并发运行时是 C++ 并发编程框架,使用该框架,可以简化并行编程,能够帮助我们编写可靠、可伸缩且具有响应能力的并行应用程序。

  菜谱-编程模型

  高抽象级别的、统一的编程模式是简化并行程序开发的一个重要方向。因此在Visual Studio 2010和.NET Framework 4中看到许多新的语言和库功能,以及一系列面向任务的并行结构和算法。

  在Visual C++ 2010中,并行模式库(Parallel Pattern Library)引入了支持任务并行的任务(Tasks)和任务组(Task Groups)概念。任务是一类计算,可将其分解为多个更精细的计算。在并行模式库中,task_handle包含执行细颗粒度的代码,用来代表一个任务。任务句柄(task_handle)非常重要,因为它们将管理封装的工作函数的生存期。 例如,将 task_handle 对象传递给任务组时,该 task_handle 对象必须保持有效,直到任务组完成为止。任务组是用来组组织、调度、等待或者取消某个或某些任务,它会将任务推入工作窃取队列, 计划程序从该队列中移除任务,并用可用的计算资源执行任务。下面示例代码并发执行若干个任务

食材、菜谱和厨具都很重要
 

  为了方便将串行应用程序改为并行应用程序,并行模式库提供了parallel_for和parallel_for_each,我们可以很容易将自己写的for和for_each循环代码改写为并发执行,并且不会降低代码的可读性;同样,对于管道并行,代理库(Agents Library)提供了基于数据流编程模型的C++模板库,通过使用消息传递在对象之间传输状态更改,可以隔离对共享资源的访问,从而提高可伸缩性。消息传递的优点就是它将同步绑定到数据,而不是绑定到外部的同步对象。这样就简化了组件之间的数据传输,可以消除应用程序中的编程错误。 

0
相关文章