五种主要多核并行编程方法分析与比较
随着多核时代的到来与流行,传统的单线程串行程序的编程模式必将改变,取而代之的将是并行编程。目前已经有五种主要并行编程模型,下面将对此五种模型进行概括性的分析与比较:
1. MPI
MPI(Message Passing Interface)消息传递接口是MPI论坛发布的一个库,而不是一门实现语言,支持C/C++/Fortran。是一种消息传递编程模型,为进程间通信服务。MPI提供了一种与平台无关,可以被广泛使用的编写消息传递程序的标准。用它来编写消息传递程序,不仅实用、可移植、高效和灵活,而且和当前已有的实现没有太大的变化。目前MPI的主要实现有以下三种:
优点:可以在集群上使用,也可以在单核/多核CPU上使用,它能协调多台主机间的并行计算,因此并行规模上的可伸缩性很强,能在从个人电脑到世界TOP10的超级计算机上使用。
缺点:第一,基于消息传递,需要显示划分和分布计算任务,显示进行消息传递与同步,且不易增量开发串行程序的并行性;第二,使用进程间通信的方式协调并行计算,这导致并行效率较低、内存开销大、不直观、编程麻烦。
参考资料:MPI论坛
2. OpenMP
OpenMP(Open Multi Processing)是由Open ARB发布的一种用于并行编程的规范,是建立在串行语言上的扩展,目前可以在C/C++/Fortran中使用。
OpenMP由三部分组成:编译指导(compiler directive)、运行库(runtime library)和环境变量(environment variables)。其语言模型基于以下假设:执行单元是共享一个地址空间的线程,即OpenMP是基于派生/连接(fork/join)的编程模型。Fork/join的并行机制如下图所示:
Fork/join并行机制:并行区前,串行命令派生出多条并行命令并行执行,执行到并行区末等待,等所有并行任务都结束,再转到串行执行。
OpenMP有两种常用的并行开发形式:一是通过简单的fork/join对串行程序并行化;二是采用单程序多数据对串行程序并行化。
优点:第一,共享存储模型,使得程序员不必进行数据划分和分布,使得开发并行程序比较容易;第二,更适合于SMP系统;第三,主要面向循环级的并行开发,可以容易地实现增量性的并行化。
缺点:第一,OpenMP只适用于SMP结构;第二,OpenMP主要开发循环级的并行程序,受此限制,对某些应用并不适合;第三,OpenMP的编写、正确性调试和性能调度复杂。
参考资料:Open ARB - OpenMP
3. Intel IPP
Intel IPP(Integrated Performance Primitives),Intel集成性能基元是Intel函数库的第二代。Intel为每种新的多核处理器都发布一个IPP函数库(C/C++ API),专用于多核架构,提供了调度优化的函数库,其中涉及的领域有数学、信号处理、音频视频、图像处理与编码、字符串、密码学。 IPP的组成如下图所示:
优点:是经过性能高度优化的库,执行效率高。
缺点:专用于Intel处理器和某些领域,不方便移植。
参考资料:Intel IPP产品介绍
4. Intel TBB
Intel TBB(Threading Building Blocks),Intel线程构建模块,是一个为创建可靠的、可移植的和可扩展的并行程序的C++模板库。专用于编写高层抽象的C++程序,和可移植的程序。
优点:可移植、可扩展。
缺点:性能没有IPP高。
参考资料:Intel TBB产品介绍
5. MapReduce
MapReducesh是Google的人研究出来的一个模型,开发的一个针对大规模群组中的海量数据处理的分布式编程模型。
参考资料:http://www.mapreduce.org/
此外,并行编程模式还有X3H5, Phreads, HPF等,但都不常用。