异步代理 - 使用异步代理库进行基于角色的编程2010-11-18 MSDN Mike Chu随着多核处理器在市场上的日益普及,它已广泛用于服务器、台式机以及便携 式计算机,代码并行化的重要性也前所未有地凸显出来。为了满足这一关键需求 ,Visual Studio 2010 引入了若干新的方法,帮助 C++ 开发人员利用新的并行 运行时和新的并行编程模型带来的这些功能。然而,开发人员面临的一个主要障 碍是确定哪种编程模型适合于他们的应用程序。正确的模型可以充分利用底层并 行性,不过也需要重新考虑程序结构和实际的执行方式。目前,最常见的并行编程模型涉及到通用的并发感知容器以及并行循环迭代等 。虽然这些传统技术功能强大,可扩展应用程序来配合多核计算机使用,但 它们并未解决影响并行性能的其他主要因素之一,那就是不断加深的延迟影响。 由于并行技术加快计算速度并将计算分布在多个内核之间,因此,Amdahl 定律 (wikipedia.org/wiki/Amdahl"s_law) 告诉我们性能改进受到执行速度最慢的那 一部分制约。在许多情况下,等待来自 I/O(例如磁盘或网络)的数据所花的时 间比例越来越大。基于角色的编程模型能够很好地处理延迟等问题,这些模型最初是在二十世纪 七十年代初引入的,目的是利用具有成百上千个独立处理器的高度并行计算机资 源。角色模型背后的基本概念是将应用程序的各个组件视为单独的角色,这些角 色可以通过发送、接收和处理消息与外界交互。最近,随着大量多核处理器的运用,角色模型已作为一种减少延迟、实现高效 并行执行的有效方法重新露面。Visual Studio 2010 引入了异步代理库 (AAL), 这是一个令人激动的基于角色的新模型,它具有消息传递接口,在该模型中代理 就是角色。AAL 使开发人员可以通过更加以数据流为中心的方式设计自己的应用 程序。这样的设计通常有利于在等待数据时有效使用延迟。在本文中,我们将概述 AAL 并介绍如何在应用程序中使用它。并发运行时Visual Studio 2010 和 AAL 中并发支持的基础是新的并发运行时,该运行时 作为 Visual Studio 2010 中 C 运行时 (CRT) 的一部分提供。并发运行时提供 协调任务计划程序和资源管理器,后者对计算机的底层资源有深入了解。这就允 许运行时以负载平衡的方式在整个多核计算机中执行任务。图 1 简要地展示了 Visual Studio 2010 中对本机代码并发的支持。计划程 序是确定何时何地执行任务的主要组件。它借助资源管理器收集的信息来充分地 利用执行资源。尽管应用程序和库也可以直接与运行时交互,但它们本身主要还 是通过两个位于计划程序之上的编程模型(即 AAL 和并行模式库 (PPL))与并发 运行时交互。

图 1 并发运行时PPL 提供更为传统的并行技术(例如 parallel_for 和 parallel_for_each constructs)、可识别运行时的锁和并发数据结构(例如队列和向量)。虽然 PPL 不是本文介绍的重点,但它也是一种功能强大的工具,开发人员可以将其与 AAL 中引入的所有新方法配合使用。有关 PPL 的详细信息,请参阅 2009 年 2 月刊载的《使用 C++ 的 Windows》专栏 (msdn.microsoft.com/magazine/dd434652)。相比之下,AAL 能够在更高级别以不同于传统技术的角度来并行化应用程序。 开发人员需要从待处理数据的角度思考应用程序,并思考如何将数据处理分隔到 可并行执行的组件或阶段中。AAL 提供两个主要组件:消息传递框架和异步代理。消息传递框架包括一组消息块,用于接收、处理和传播消息。通过将消息块串 连起来,可创建能够同时执行的工作管道。异步代理是通过接收消息、在自己维护的状态下执行本地工作和发送消息,以 此与外界交互的角色。这两个组件结合在一起,使开发人员能够在数据流而不是控制流方面利用并行 性,并通过更高效地使用并行资源来改善对延迟的容忍度。