并行编程任务的四个类别

并行编程任务的四个类别

Content #

我们需要周密考虑并行程序编写者的任务,这些任务对于串行编程来说是不需要的。由此,我们可以评估任意一种语言或者环境对开发者的支持程度。这些任务分解成4个类别:

  1. 分割任务

虽然分割任务能极大地提升性能和扩展性,但是也能增加复杂性。允许线程并发执行会大量增加程序的状态集,让程序难以理解和调试,会降低生产率。

  1. 并行访问控制

给定一个单线程的线性程序,这个线程对程序所有的资源都有访问权。这些资源主要是内存数据结构,但也可能是CPU、内存(包括高速缓存)、I/O设备、计算加速器、文件等。并行访问控制的第一个问题是访问特定的资源是否受限于资源的位置。比如,在许多消息传递环境中,本地变量的访问是通过表达式和赋值,但是远程变量的访问是通过一套完全不同的语法,经常要用到消息传递机制。另一个并行访问控制的问题是线程如何协调对资源的访问。这种协调是由不同的并行语言和环境通过大量同步机制来实现的,包括消息传递、加锁、事务、引用计数、显式计时、共享原子变量,以及数据所有权。传统并行编程关注的死锁、活锁和事务回滚都来源于此。

  1. 资源分割和复制

最有效的并行算法和系统非常善于对资源进行并行化,所以并行程序的编写最好从分割写密集型资源和复制经常访问的读密集型资源开始。这里提到的频繁访问的数据,可能会在计算机系统、海量存储设备、NUMA节点、CPU(核或者硬件线程)、页面、高速缓存行(cache line)、同步原语的实例或者代码临界区等不同的层面进行分割。

  1. 与硬件的交互

当需要榨于系统的最后一滴性能时,也需要直接工作于硬件之上。在这时,开发者需要根据目标硬件的高速缓存分布、系统的拓扑结构或者内部互联协议来对应用程序进行量体裁衣。

From #

深入理解并行编程