2012-03-20:并行计算相关知识总结

进入这个行业也不算很久,一直希望能有一套系统性的资料可以解答我所有关于并行计算的疑问。终究还是自己来总结了,我从以下几个方面做了一些归纳,但仅仅作为对并行计算的入门概述。要想具体实现并行开发,还需要更多的时间去实践,可以先在网上搜索多线程编程、OpenMP、扩展指令集(如SSE、AVX等)的相关具体资料进行学习。

1.什么是并行计算

在讲并行计算之前,我们先来看一下流水线技术和时间片轮换技术,流水线技术是将一个指令的执行分为若干个步骤并分别放到相关硬件上同时执行,形成类似流水线的执行模式,具体可以参考百度百科上的解说,这样一来在一个时钟周期内就可以完成一条指令。而时间片轮换技术主要是为了提高进程的响应速度,一个处理器可能同一时间需要处理不止一个进程,如果不采用时间片轮换技术很难想象我们的电脑会如何工作。好了这里说到的流水线技术和时间片轮换技术已经在计算机上使用很久了,不是什么新鲜的东西。那么什么是并行计算呢?他的思想基础是绝对和前面提到的两种技术有关的,并行计算所做的事情就是实现多个任务同时执行,是在流水线技术和时间片轮换技术的基础上的真正的多任务并行(实际上时间片轮换技术还谈不上并行,只是给人的感觉好像是多个任务都在同时执行,但对于CPU来说,每个时间片只能处理一个进程;流水线技术也谈不上真正的并行,只是将一个指令拆分成多个过程分给多个对应硬件执行),就像流水线技术一样,并行计算也是需要硬件支持的,例如多个执行单元的计算机系统。


2.并行计算的编程模型,即有哪几种并行方式?

根据并行计算机系统的存储结构可以将并行编程分为两类:

1)共享存储器并行编程模型:多线程;OpenMP

2)分布式存储器编程模型:MPI、PVM


3.并行计算机系统的分类。

根据flynn的分类方法可将计算机分为四类:

1)SISD:单指令单数据流系统,早期的串行机就是这种类型

2)MISD:多指令单数据流系统,不实用,只是一种研究模型

3)SIMD:单指令多数据流系统,支持intel扩展指令集的向量机系统

4)MIMD:多指令多数据流系统,现在实用的大部分并行机都属于这一类型

下面列举几种较为知名的并行计算机体系结构模型:

1)并行向量处理机PVP:

vp是vector processor,即向量处理器。标量是指没有方向只有大小的量,一般用一维数x表示即可,而向量是有方向有大小的量,至少用俩维数组(x,y)表示。向量处理机能同时实现对多个数的处理,这就好比向量运算需要同时处理各个维度一样,当然这不是绝对一致的,例如向量乘法。并行向量处理机也就是CPU属于专门定制的向量处理器的系统,该类机器广泛应用与早期的并行计算机,GPU中也有类似结构。

2)对称多处理机SMP:

目前基本上所有PC都属于这种系统,即典型多核或多CPU系统,所谓对称指的是各个内核对内存的访问是一致的,包括速度和地址范围。

3)大规模并行处理机MPP:

物理上的分布存储器,各节点之间采用定制的高速互联网络连接,典型代表为天河一号、曙光5000a、神威等。

4)分布式共享存储多处理机DSM

不同于MPP的地方在于,DSM将分布的局部存储器形成了一个逻辑上共享的全局存储器,地址空间是统一的,较MPP编程容易些。

5)工作站机群COW

没有定制的高速互联网络,而是采用以太网等商品网络互联的低成本变形MPP,节点是工作站或PC,网络接口松耦合,典型代表为信号分析通用计算机系统。



4.并行计算的性能评测。

并行加速比:Sp =  ts /  tp          (ts 和 tp分别为程序的串行时间和并行时间)  在多核系统上,当Sp =  P时(P为核数),称为线性加速比。

并行效率:E=Sp / P

可扩放性:评价并行算法的性能还有一点,即可扩放性,他指的是一个并行算法对硬件系统的适应性,例如系统核数不一样时,能否保持原来的并行效率。


5.并行编程的相关概念

所谓的并行一般是针对进程和线程而言,也就是说一个任务会被划分给多个进程或线程执行。下面先谈谈处理器是如何开启进程和线程的。

1)进程的开启过程:创建新进程时需要执行创建进程的系统调用(如UNIX/Linux系统中的fork),其主要操作有四部:申请一个空闲的PCB(有时也称进程描述块(Process Descriptor),它是进程组成中最关键的部分,其中含有进程的描述信息和控制信息,是进程动态特性的集中反映,是系统对进程施行识别和控制的依据。);为新进程分配资源;将新进程的PCB初始化;将新进程加到就绪队列中。

2)线程的开启过程:现代操作系统中,进程只作为资源拥有者,而调度和运行的属性赋予新的实体——线程。可以说线程是进程中实施调度和分配的基本单位,一个进程中可以包括多个线程。同一个进程中的各个线程可以共用该进程的所有资源,因此在线程的开启过程中只需要为线程分配少量的私有资源,存放线程的私有信息(thread结构的线程控制块)而不需要像开启进程那样分配很大的PCB。实际上处理机也是分配给线程而不是进程的,所以说线程开启之后的工作就和上面提到的进程开启之后的工作类似。

综上所述,有一个明显的结论就是开启线程要比开启进程的开销小得多,这也是并行计算中大量使用多线程而非多进程的原因之一。此外还有一个原因,那就是多进程的通信问题。当然,多线程编程也存在同步、互斥和死锁的问题。具体我暂时也谈不上孰优孰劣,先来看看各自的意义吧。

1)多进程之间的通信:多个进程是不共享资源的,所以在将一个问题划分给几个进程同时执行时就会涉及到进城之间的消息传递,对内存的读取及IO操作通常都是是比较费时的,所以进程间的通讯开销在频繁交互时是不可小觑的。

2)多线程之间的同步:这一点内容较多,也是并行计算中的重点难点,待整理完毕后统一添加进来。


6.并行算法的设计。

并行算法设计一般有三种基本思路:

1)串行算法的直接并行化:发觉和利用现有串行算法的并行性,直接将串行算法改造为并行算法。需要注意的是:有些串行算法不可以直接并行化;好的串行算法不一定能够产生好的并行算法;不好的串行算法有可能产生好的并行算法。

2)从问题描述开始设计并行算法:这个工作量一般较大,但效果一般也是最好的。

3)借用已有算法求解新问题:这个想必是最简单的了。

并行算法一般设计过程分四步:任务划分、通信分析、任务组合、处理器映射。

首先尽量开拓算法的并发性和满足算法的可扩放性;然后着重优化算法的通信成本和全局执行时间,同时通过必要的整个过程的反复回溯,以期最终达到一个满意的设计选择。


7.如何进行并行优化。

在一个并行算法确定之后,我们需要进一步对其优化,以下是并行优化的几个原则:与体系结构相结合、具有可扩展性、粗粒度、减少通信、优化性能。

具体的优化技术有很多:

1)负载平衡技术:并行任务在各处理器分配包括静态分配和动态分配两种。在程序(或进程)运行之前进行的分配称为静态分配;在程序(或进程)运行过程中进行的分配称为动态分配,通过动态分配一般可以使内核上的负载更加均衡。

2)通信优化技术:通过一些办法减少进程间的通信开销,一般从两个方面入手,一是算法上的改进,二是充分利用计算机系统的特点。

3)内存优化技术:内存池技术

4)IO优化技术

5)折衷技术:常见的就是计算量和通信之间的折衷。

6)多级并行技术


扬扬洒洒写了一大堆,到最后难免有点虎头蛇尾的感觉。我会随着自己对并行计算理解的加深慢慢加以补充完善,也欢迎大家指正交流。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值