一 简介
1 并行编程的目标
并行编程(在单线程编程的目标之上)有如下三个主要目标。
1.性能。
2.生产率。
3.通用性。
线程优化:性能与扩展
通用:
需要牢记的是,并行编程只是提高性能的方案之一。其他熟知的
方案按实现难度递增的顺序罗列如下。
1.运行多个串行应用实例。
2.利用现有的并行软件构建应用。
3.对串行应用进行逻辑优化。
2.4 是什么使并行编程变得复杂
2.4.1 分割任务
对任务的分割绝对是并行计算最需要的,如果存在一个任务的最小集,那么根据线性执行的定义,它同时只能被一个CPU执行。但是,分割代码需要十分小心,比如,不均匀的分割会导致当较小的分割执行完后,剩下的部分被顺序执行[Amd67]。在不是很极端的情况下,负载均衡可以充分利用硬件,因此获得更优化的性能和扩展性。
虽然分割任务能极大地提升性能和扩展性,但是也能增加复杂性。比如,分割任务可能让全局错误处理和事件处理更加复杂,并行程序可能需要一些相当复杂的同步措施来安全地处理这些全局事件。概括地讲,每个任务分割都需要一些交互,毕竟如果某个线程基本不交互,那么它不执行也不会对工作本身产生任何影响。但是由于交互会引起开销,不仔细地选择分割会导致严重的性能下降。
而且,并发的线程数量通常是有限的,因为每个线程都会占用一
些资源,比如CPU高速缓存空间。如果同时执行太多的线程,CPU缓存将会溢出,引起过高的缓存未命中,从而降低性能。另一方面,大量的线程可能会带来大量的重复计算和I/O操作,不能有效地利用I/O设备。
2.4.2 并行访问控制
2.4.3 资源分割和复制
2.4.4 与硬件的交互
2.4.5 组合使用
2.4.6 语言和环境如何支持这些任务
第3章 硬件和它的习惯
3.1 概述
缓存命中 分支预测 电子在半导体导体中断的速率
用到才通知 可以判定了立马通知吗