最近读了《并行程序设计导论》这本书。感觉这本书讲得挺好的,适合入门。
通过几个例子(pi的计算,积分,n个数累加)讲述了用MPI,PThreads和OpenMP进行并行编程。
一、并行计算概论
两种主要并行系统编程:分布式内存系统的编程和 共享内存系统的编程。
图a为共享内存系统,图b为分布式内存系统
共享内存系统
在共享内存系统中,各个核能够共享访问计算机的内存,理论上每个核都能够读、写内存的所有区域。可以通过检测和更新共享内存中的数据来协调各个核。
共享内存系统最常见的例子就是我们平常使用的PC机。
分布式系统
在分布式内存系统中,每个核都拥有自己的私有内存,核之间的通信是显式的,必须使用类似于在网络中发送消息的机制。
分布式系统成为集群,每个节点都是一个独立的PC,通过网络将节点连在一起。
二、MPI、PThreads、OpenMP的区别
MPI | 分布式系统 | 通过通信子的相互发送消息进行信息交流。 |
PThreads | 共享内存系统 | 使用POSIX线程库(使用的是API),通过信号函数进行信息交流。重新设计程序,相比OpenMP更灵活。 |
OpenMP | 共享内存系统 | 使用的是预编译指令。在原有的程序中,增加一些预编译指令(需要编译器的支持),使编译器将那部分代码编译成并行计算的代码。可在原有串行程序的代码中添加预编译指令,使串行程序成为并行程序,更快捷。 |
选择哪个API
首先看应用使用内存的多少来选使用分布式系统编程还是共享内存系统编程。
如果选择分布式系统编程,毫无疑问就选MPI
如果选择共享内存系统编程,就需要考虑并行化程序的细节。如果是一个大而复杂的串行程序,就需要考虑是否适合采用OpenMP。如果程序涉及线程之间复杂的同步,那么Pthreads会更容易些。
三、书中一些算法
1.函数与坐标轴面积的计算
2.并行排序算法
由于冒泡排序法的按对排序特性,并行化意义不打,但其一个变种奇偶交换排序更适合并行化
3.矩阵向量乘法
四、GPU
在并行计算中最有前途的发展方向之一就是使用GPU进行通用计算。
CUDA与OpenCL (参考文档:点击打开链接)
CUDA | OpenCL |
只支持NVDIA的GPU | 支持设备广 |
支持汇编 | 不支持汇编 |
预编译 | 在线编译 |