一 并行计算概述:
(1)并发、并行、分布式之间的差别(尚无统一意见,比较认同的如下):
*并发计算中,一个程序的多个任务会在同一时段内可以同时执行。
*并行计算中,一个程序通过多个任务紧密协作来解决某个问题。
*分布式计算中,一个程序需要和其它程序协作来解决某个问题。
*并行计算和分布式计算都是并发的,某些程序如多任务操作系统也是并发的,因为即使它运行在单核机器上,多个任务都能在同一个时间里同时执行。
*并行计算和分布式计算之间没有一条明确的分界线。并行程序往往同时在多个核上执行多个任务,这些核在物理上紧密靠近或者通过高速网络相互连接。分布式程序的任务是在多个计算机上执行,这些计算机之间相隔较远并且任务是由独立创建的程序来完成的。
二 怎么编写并行程序?
(1)基本思想:都是将要完成的任务分配给各个核。
1.两种广泛采用的方法:任务并行和数据并行。
*任务并行:将待解决问题所需要执行的各个任务分配到各个核上执行。
*数据并行:将待解决问题所需要处理的数据分配给各个核,每个核在分配到的数据集上执行大致相似的操作。
2.两种主要的并行系统:
*共享内存系统:各个核能够共享访问计算机的内存,理论上每个核能够读写内存的所有区域,可以通过检测和更新共享内存中的数据来协调各个核。
*分布式内存系统:每个核都有自己的私有内存,核之间的通信是显式的,必须使用类似于在网络中发送消息的机制。
(2)函数库:
三个不同c语言扩展的函数库:MPI、POSIX线程、OpenMP。
MPI为分布式内存系统的编程而设计;Pthreads和OpenMP是为共享内存系统而设计的。
MPI和Pthreads是C语言的扩展;OpenMP包含了一个扩展库以及对C编译器的部分修改。
1.消息传递接口(Message-Passing Interface,MPI):分布式内存。
在消息传递系统上,运行在一个核-内存对上的程序通常称为进程。两个进程通过调用函数来进行通信。
2.POSIX线程:
在共享内存编程中,运行在一个处理器上的一个程序称为线程(不同于MPI,在MPI中称为进程)。
3.OpenMP:
与Pthreads一个针对共享内存并行编程的API。
4.OpenMP与Pthreads的区别:
*Pthreads:
------要求程序员显式的明确每个线程的行为;
------Pthreads和MPI一样是一个可以被链接到C程序的函数库,只要系统有Pthreads库,Pthreads程序就能够被任意C编译器使用。
------Pthreads更底层,并且提供了虚拟编写任何可知线程行为的能力,代价:每个线程行为的每一个细节都得由我们自己来定义。
*OpenMP:
------允许程序员只需要声明一块代码应该并行执行,然后由编译器和运行时系统来决定哪个线程执行哪个任务。
------OpenMP需要编译器的支持,有可能你使用的编译器无法把OpenMP程序编译成并行程序。
------使用OpenMP编程编写并行行为更容易些,但代价是难以对一些底层的线程交互进行编程。
三 混合系统编程:
MPI+OpenMP为多处理器结点集群提供了一种有效的并行策略,结点内部共享内存空间编程模式适合 OpenMP并行,消息传递模型MPI被用在集群的结点与结点之间,这样就实现了并行的层次结构化。