Parallel Programming with Microsoft Visual C++

来源:互联网 发布:乐购数码淘宝是正品吗 编辑:程序博客网 时间:2024/05/18 16:35

ParallelProgramming with Microsoft Visual C++:Design Patterns for Decomposition andCoordination on Multicore Architectures

link:http://msdn.microsoft.com/en-us/library/gg675934.aspx

download:http://parallelpatternscpp.codeplex.com/

 

并行计算技术大约诞生于40年前,那时候它还只是一门冷僻学科(如高能物理学)和工程应用技术(如计算流体力学),是一个只有专家们才会涉足的领域。而如今这项技术已经取得了长足的进步。

这种变化的根源来自于硬件的发展趋势。崇尚一味提高处理器时钟频率的时代已经走到了终点,取而代之的是由摩尔定律所预测的芯片密度的增加,由此多核处理器和单芯片集成多处理器应运而生。如今四核处理器已经司空见惯,按照这样的趋势,几十核的处理硬件也会在不久的将来面世。

在过去的五年中,Microsoft公司借力这个技术变革的时机开发了多种并行软件,其中包括专为基于消息传递接口Message-Passing InterfaceMPI)程序而设计的高性能计算集群(High Performance ClusterHPC)技术,提供基于映射-缩减Map-Reduce)风格并行数据处理的Dryad平台,应用户要求提供计算处理核心的Windows Azure技术平台,为代码编写开发的并行模式库(PPL)和异步代理库,以及Microsoft .NET Framework 4的并行扩展等。 

从复杂的科学和设计问题到商业应用和新型人机交互接口,多核计算对应用程序开发的方方面面产生了广泛的影响。我们以前总是自嘲说:并行计算的确是未来趋势,只是它永远在未来。今天看来,显然是我们过于悲观了,并行计算最终从角落走向了应用开发和IT产业的中心舞台。

但是这也带来了一个隐患。为了能让应用程序运行得更快,如今的程序员们不得不考虑怎样划分计算工作量以充分利用多核处理器的能力,而这种高级技能只有专家们才掌握。并行化编程给大多数开发人员提出了巨大的挑战,这种挑战对于很多人来说还是初次遇到。所以,怎样让诸多程序员尽快地从实践中学习并将并行化融入他们的应用程序,是当下迫在眉睫的需求。

在我一些从事计算机学科的同事中,流行着两种可能的设计思路:一是设计一种新的并行化编程语言;二是开发一个无所不能的并行编译器。这两种方法在学术上听起来确实很有意思,但是在面对一般开发人员的普及和简化并行化编程方面则显得力不从心。与之相对,一种更为实用的方法是为程序员提供一个封装了并行化编程复杂细节的库,然后告诉他们应该如何使用。

出于这样的目的,MicrosoftVisual C++并行模式库和异步代理库提供了比以往API更高层的编程模型。举例来说,程序员可以以任务而非线程为单位来思考,这样就能避免复杂的线程管理问题。本书通过阐释将这些库放到设计模式的方式来告诉程序员如何使用它们,这样程序员们可以很快上手编写并行程序,从而提高程序的执行效率。

 

中文目录:
第1章 引言 9 
1.1 潜在并行化的重要意义10 
1.2 分解、协调、可扩展性共享11 
1.2.1 理解任务12 
1.2.2 协调任务13 
1.2.3 可扩展性数据共享13 
1.2.4 设计方法14 
1.3 选择正确的设计模式15 
1.4 关于术语 16 
1.5 并行的局限 16 
1.6 一些建议 18 
1.7 练习题 19 
1.8 更多资源 19 
第2章 并行循环 21 
.2.1 基本用法 22 
2.1.1 并行版的for循环 22 
2.1.2 parallel_for_each23 
2.1.3 期望为何24 
2.2 实例示范 26 
2.2.1 串行版的creditreview 26 
2.2.2 parallel_for_each版的creditreview 27 
2.2.3 性能对比27 
2.3 模式变体 28 
2.3.1 提前退出循环28 
2.3.2 异常处理29 
2.3.3 小型循环体的特殊处理29 
2.3.4 并行度控制30 
2.4 反面模式 31 
2.4.1 隐性循环体依赖31 
2.4.2 少量迭代的小循环体31 
2.4.3 重复输入性枚举32 
2.4.4 基于协同性阻塞的交叉调度32 
2.5 相关模式 32 
2.6 练习题 32 
2.7 补充阅读 33 
第3章 并行任务 35 
3.1 基本用法 36 
3.2 实例示范 38 
3.3 模式变体 39 
3.3.1 基于协同性阻塞的任务协调40 
3.3.2 取消一个任务组42 
3.3.3 异常处理44 
3.3.4 预测性执行44 
3.4 反面模式 46 
3.4.1 闭包中的变量捕获46 
3.4.2 计划外的取消状态传递47 
3.4.3 同步化成本48 
3.5 设计注意事项 48 
3.5.1 任务组调用约定48 
3.5.2 任务与线程48 
3.5.3 如何调度任务49 
3.5.4 结构化任务组及任务处理49 
3.5.5 轻量级任务50 
3.6 练习题 50 
3.7 补充阅读 50 
第4章 并行聚合 53 
4.1 基本用法 54 
4.2 实例示范 57 
4.3 模式变体 63 
4.3.1 基于小型循环体的考虑63 
4.3.2 combinable对象的其他用处 63 
4.4 设计注意事项 63 
4.5 相关模式 65 
4.6 练习题 65 
4.7 补充阅读 66 
第5章 future69 
5.1 基本用法 71 
5.2 实例示范:adatum金融仪表盘 73 
5.2.1 业务对象74 
5.2.2 分析引擎75 
5.3 模式变体 78 
5.3.1 取消future对象 78 
5.3.2 消除瓶颈78 
5.3.3 在运行时修改任务图79 
5.4 设计注意事项 79 
5.4.1 分解到future对象中去 79 
5.4.2 函数式风格79 
5.5 相关模式 80 
5.5.1 管道模式80 
5.5.2 master/worker模式 80 
5.5.3 动态任务并行化模式80 
5.5.4 离散事件模式80 
5.6 练习题 81 
第6章 动态任务并行化 83 
6.1 基本用法 83 
6.2 实例示范 84 
6.3 模式变体 87 
6.3.1 非空while循环体的并行化 87 
6.3.2 在挂起等待环境中添加任务89 
6.4 练习题 90 
6.5 补充阅读 90 
第7章 管道 93 
7.1 消息块类型概述 94 
7.2 基本用法 94 
7.3 实例示范 101 
7.3.1 串行化的图形处理101 
7.3.2 图形管道102 
7.3.3 性能特征104 
7.4 模式变体 106 
7.4.1 异步管道106 
7.4.2 管道中的取消操作109 
7.4.3 管道中的异常处理110 
7.4.4 多生产者作用下的负载平衡111 
7.4.5 管道与流的关系114 
7.5 反面模式 114 
7.5.1 在管道各阶段之间进行大量的数据拷贝114 
7.5.2 管道阶段中的工作量过小114 
7.5.3 在消息传递时忘记使用隔离技术114 
7.5.4 无限期的等待114 
7.5.5 无限制的队列增长115 
7.5.6 更多信息115 
7.6 设计注意事项 115 
7.7 关联模式 116 
7.8 练习题 116 
7.9 补充阅读 116 
附录a 任务调度器与资源管理器 117 
附录b 并行应用程序的调试与分析 139 
附录c 技术总览 153 
术语表 157 

原创粉丝点击