《C#并行编程高级教程 精通.NET 4 Parallel Extensions》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:(美)希拉里著
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2012
  • ISBN:9787302273561
  • 页数:487 页
图书介绍:本书描述如何充分发挥多核计算机系统的处理能力,阐述如何创建基于任务的专业并行程序,介绍单指令流和多数据流指令等并行编程技术,讨论现代并行库的功能,并讲述如何结合使用Intel高级工具与C#。

第1章 基于任务的程序设计 1

1.1使用共享内存的多核系统 2

1.1.1共享内存多核系统与分布式内存系统之间的区别 3

1.1.2并行程序设计和多核程序设计 4

1.2理解硬件线程和软件线程 5

1.3理解Amdahl法则 8

1.4考虑Gustafson法则 11

1.5使用轻量级并发模型 14

1.6创建成功的基于任务的设计 15

1.6.1以并发的思想指导设计 16

1.6.2理解交错并发、并发和并行之间的区别 17

1.6.3并行化任务 18

1.6.4尽量减少临界区 18

1.6.5理解多核并行程序的设计原则 19

1.7为NUMA架构和更高的可扩展性做好准备 20

1.8判断是否适合并行化 24

1.9小结 25

第2章 命令式数据并行 27

2.1加载并行任务 27

2.1.1 System.Threading.Tasks.Parallel类 29

2.1.2 Parallel.Invoke 30

2.2将串行代码转换为并行代码 37

2.2.1检测可并行化的热点 37

2.2.2测量并行执行的加速效果 40

2.2.3理解并发执行 42

2.3循环并行化 43

2.3.1 Parallel.For 43

2.3.2 Parallel.ForEach 49

2.3.3从并行循环中退出 56

2.4指定并行度 62

2.4.1 ParallelOptions 63

2.4.2计算硬件线程 65

2.4.3逻辑内核并不是物理内核 66

2.5通过甘特图检测临界区 67

2.6小结 68

第3章 命令式任务并行 69

3.1创建和管理任务 70

3.1.1 System.Threading.Tasks. Task 71

3.1.2理解Task状态和生命周期 72

3.1.3通过使用任务来对代码进行并行化 74

3.1.4等待任务完成 80

3.1.5忘记复杂的线程 81

3.1.6通过取消标记取消任务 82

3.1.7从任务返回值 88

3.1.8 TaskCreationOptions 90

3.1.9通过延续串联多个任务 90

3.1.10编写适应并发和并行的代码 95

3.2小结 96

第4章 并发集合 97

4.1理解并发集合提供的功能 98

4.1.1 System.CollectionsConcurrent 100

4.1.2 ConcurrentQueue 101

4.1.3理解并行的生产者… 消费者模式 104

4.1.4 ConcurrentStack 116

4.1.5将使用数组和不安全集合的代码转换为使用并发集合的代码 121

4.1.6 ConcurrentBag 122

4.1.7 IProducerConsumerCollection 129

4.1.8 BlockingCollection 129

4.1.9 ConcurrentDictiona 143

4.2小结 147

第5章 协调数据结构 149

5.1通过汽车和车道理解并发难题 150

5.1.1非预期的副作用 150

5.1.2竞争条件 151

5.1.3死锁 152

5.1.4使用原子操作的无锁算法 153

5.1.5使用本地存储的无锁算法 154

5.2理解新的同步机制 156

5.3使用同步原语 157

5.3.1通过屏障同步并发任务 158

5.3.2屏障和ContinueWhenAll 164

5.3.3在所有的参与者任务中捕捉异常 165

5.3.4使用超时 166

5.3.5使用动态数目的参与者 171

5.4使用互斥锁 172

5.4.1使用Monitor 176

5.4.2使用锁超时 177

5.4.3将代码重构为避免使用锁 180

5.5将自旋锁用作互斥锁原语 183

5.5.1使用超时 186

5.5.2使用基于自旋的等待 187

5.5.3自旋和处理器出让 190

5.5.4使用volatile修饰符 193

5.6使用轻量级的手动重置事件 194

5.6.1使用ManualResetEventSlim进行自旋和等待 194

5.6.2使用超时和取消 199

5.6.3使用ManualResetEvent 203

5.7限制资源的并发访问 204

5.7.1使用SemaphoreSlim 205

5.7.2使用超时和取消 209

5.7.3使用Semaphore 209

5.8通过CountdownEvent简化动态fork和join场景 211

5.9使用原子操作 215

5.10小结 220

第6章PLNQ:声明式数据并行 221

6.1从LINQ转换到PLINQ 222

6.1.1 ParallelEnumerable及其AsParallel方法 224

6.1.2 AsOrdered和orderby子句 225

6.2指定执行模式 228

6.3理解PLINQ中的数据分区 229

6.4通过PLINQ执行归约操作 234

6.5创建自定义的PLINQ聚合函数 235

6.6并发PLINQ任务 240

6.7取消PLINQ 243

6.8指定所需的并行度 245

6.8.1 WithDegreeOfParallelism 245

6.8.2测量可扩展性 247

6.9使用ForAll 249

6.9.1 foreach和ForAll的区别 250

6.9.2测量可扩展性 251

6.10通过WithMergeOptions配置返回结果的方式 253

6.11处理PLINQ抛出的异常 255

6.12使用PLINQ执行MapReduce 算法 257

6.13使用PLINQ设计串行多步操作 259

6.14小结 261

第7章Visual Studio 2010的任务调试能力 263

7.1充分利用多显示器的支持 264

7.2理解并行任务调试器窗口 267

7.3查看Parallel Stacks图 273

7.4跟踪并发代码 280

7.4.1调试匿名方法 288

7.4.2查看方法 290

7.4.3在源代码中查看线程 292

7.5检测死锁 294

7.6小结 300

第8章 线程池 301

8.1探究任务的底层技术 301

8.2理解新的CLR 4线程池引擎 303

8.2.1理解全局队列 303

8.2.2等待工作线程完成工作 313

8.2.3跟踪动态数目的工作线程 319

8.2.4使用任务(而不是线程)将作业加入队列 323

8.2.5理解任务和线程池之间的关系 326

8.2.6理解局部队列和工作窃取算法 330

8.2.7指定自定义的任务调度器 335

8.3小结 340

第9章 异步编程模型 341

9.1结合使用异步编程和任务 342

9.1.1使用TaskFactory.FromAsync 343

9.1.2编写异步方法执行结束之后的延续 348

9.1.3合并多个并发异步操作的结果 349

9.1.4执行异步WPF UI更新 351

9.1.5执行异步Windows Forms UI更新 358

9.1.6创建执行EAP操作的任务 365

9.1.7使用TaskCompletionSource 373

9.2小结 377

第10章 并行测试和调优 379

10.1准备并行测试 379

10.1.1使用性能剖析功能 383

10.1.2测量并发性 385

10.2常见问题模式的解决方案 394

10.2.1串行化的执行 395

10.2.2锁争用 397

10.2.3锁封护 398

10.2.4申请超额 401

10.2.5申请不足 404

10.2.6分区问题 406

10.2.7工作站垃圾回收开销 408

10.2.8使用服务器垃圾回收 411

10.2.9 I/O瓶颈 412

10.2.10主线程过载 413

10.3理解伪共享 416

10.4小结 419

第11章 向量化、SIMD指令以及其他并行库 421

11.1理解SIMD和向量化 421

11.2从MMX到SSE4.X和AVX 423

11.3使用Intel Math KernelLibrary 425

11.3.1使用适用于多核的高度优化的软件函数 433

11.3.2将基于任务的编程和外部优化的库混合使用 434

11.3.3并行生成伪随机数 434

11.4使用Intel IntegratedPerformance Primitives 439

11.5小结 445

附录A.NET4中与并行相关的类图 447

附录B并发UML模型 461

附录C Parallel Extensions Extras 469