1.3 为什么需要编写并行程序
利用低频多核所获得的性能收益大于高频单核,为发挥多核性能,需要根据多核处理器编写并行程序。
1.4 如何编写并行程序
有两种广泛采用的方法:任务并行和数据并行。
1.任务并行是指:将待解决问题所执行的各个任务分配到各个核上执行。
2. 数据并行是指:将待解决问题所处理的数据分配到各个核,每个核在分配的数据集上执行大致相似的操作。
在reduce的例子中,需要协调的工作如下:
1.通信:一个或多个核将自己的部分和结果发送给其他核;
2.负载平衡:希望给每个核分配大致相同数目的数据来计算。
3.同步:在大多数系统中,核之间不会自动地同步,而是每个核在自己地空间中工作。比如在master核初始化完x数组并使其他数组能够被其他核访问之前,不希望其他核开始工作。
1.5 将做什么
学会C语言三个扩展:消息传递接口(Message Passage Interface, MPI),POSIX线程(POSIX threads),(OpenMP)。
关注两种主要地并行系统:共享内存系统和分布式内存系统。
1.在共享内存系统中,各个核能够共享访问计算机的内存,理论上每个核能够读、写内存的所有区域。因此可以通过检测和更新共享内存中的数据来协调各个核。
2.在分布式内存系统中,每个核都拥有自己的私有内存,核之间的通信时显示的,必须使用类似于网络中发送消息的机制。
Pthreads和openMP是为共享内存系统的编程而设计的,它们提供访问共享内存的机制。
MPI是为分布式系统的编程而设计的,它提供发送消息的机制。
1.6 并发、并行、分布式
并发计算(cocurrent computing): 一个程序的多个任务在同一个时段内可以同时执行。
并行计算(parallel computing): 一个程序通过多个任务紧密协作来解决问题。
分布式计算(dostributed computing): 一个程序需要和其他程序协作来解决问题。
在并行程序和分布式程序之间没有一条明确的分界线,但是并行程序往往同时在多个核上执行多个任务,这些核在物理上紧密靠近,或者共享内存或者通过互联网络相互连接。
分布式程序往往更加”松耦合“。任务是在多个计算机上执行。这些计算机之间相隔较远并且任务是由独立创建的程序来完成的。
1.10 小结
在编写并行程序时,我们需要协调各个核的工作。这涉及核之间的通信、负载平衡和同步。
1.MPI用于分布式内存系统的编程。
2.Pthreads和OpenMP用于共享内存系统编程。
3.在分布式系统中,每个核都拥有自己的私有内存,而在共享内存系统中,原则上每个核能访问每个内存区域。
4.并发程序是指多个任务在一段时间内同时执行。
5.并行程序核分布式程序的多个任务能在同一时刻一起执行。