一、基本模式

1、MPI
MPI(Message Passing Interface)消息传递接口是MPI论坛发布的一个支持C/C++/Fortran库。属于一种消息传递编程模式,它提供了一种与平台无关的消息传递程序标准。它主要有三种实现:mpich、chimp 和lam。这种模型适应性好,无论是多核、多CPU还是分布式集群都可以使用。缺点是复杂的进程通信导致对开发者的要求较高,而且需要进行通信间的控制。
2、OpenMP
OpenMP(Open Multi Processing)是由Open ARB发布的一种用于并行编程支持C/C++/Fortran的标准,OpenMP是基于派生/连接(fork/join)的编程模式,这个模型一般的程序都还是比较了解的。此标准由编译指导(compiler directive)、运行库(runtime library)和环境变量(environment variables)三部分组成。通过简单的fork/join对串行程序并行化或者采用单程序多数据对串行程序两种方式实现并行化。
OpenMP只适应于SMP结构(后面会介绍相关的硬件基础),开发相对简单,特别对循环更实现并行开发,但是调试比较麻烦。
3、Intel IPP/TBB
Intel IPP(Integrated Performance Primitives)和Intel TBB(Threading Building Blocks),前者是接近于硬件底层的API库,后者是更高一层抽象的并行模板库。前者对硬件依赖比较大,移植性差,后者则移植性较好。
4、MapReduce
这个模式其实主要还是应用于分布式也即多CPU(多服务器)编程中,用于解决海量数据的处理。有兴趣可以看看Google的三篇相关论文。

基本模式的划分可能角度不同,认知各有不同,这个可能是一个需要讨论的地方。抛砖引玉吧。

二、基本库

在现在的软件编程中,自己单独造轮子的可能性几乎是零了,特别是在国内,基本都已经是开源的天下,小打小闹一番就挺出彩的。在多核编程中,当然也就有已经成型的现有库了。一般来说,从内核的API到语言的开发库再到抽象的语言开发库再到上层应用框架,一层比一层更抽象,更简单。但对于初学者来说,可能越简单,越愿意深入学下去。这也是一个矛盾的地方。
在多核编程中,目前比较常用的标准即OMP(OpenMP),它其实最先是在Fortran后来支持了C和c++,它提供了一整套的与平台无关的编译指令。一般来说,并行编程和硬件的底层实现有相当的联系度,所以Intel提供了TBB(intel Threading Building Blocks)这个库。另外一个c++程序员比较熟悉的可能就是Boost库了,同样还有其它的库STAPL和POOMA以及PPL,GPU上的并行MapReduce库Mars等。当然,借助于开源,并行库还有很多,包括特定于某个场景的并行库等都是比较有各自特点的。
这里不介绍操作系统中对线程和进程支持的API和库(包括c++11以上STL中的线程库),这些在前面的c++学习系列中已经有了较为详尽的描述和分析,有兴趣可以翻一下以前的相关文章。
许多的库其实并不是单一的某一个功能,可能贯穿着整体的从底层硬件到上层接口应用的一整套体系,这也是c++越来越难学的一个重要原因,但是有库用总比自己从头再造一个要强很多。

三、例程

这里限于相关应用,只提供一个OMP的相关的例程,以后会对一些基本库进行逐一分析时,再展现相关的例程:

int main(int argc,char **argv)
{
#pragma omp parallel for
	for (int num = 0; num < 1000 * 1000; num++)
	{
		std::cout << "parallel run!" << std::endl;
	}

	return 0;
}

这是一个非常简单的例程,但也确实表现出了OMP中对循环的并行展示。在有些时候儿,需要让线程和CPU的核绑定,OMP也提供了相关的函数和应用接口,在以后再慢慢的分析说明。

四、总结

在单核的硬件设计到达瓶颈时,多核和多CPU的出现不可避免的要求新的编程模式,一些新设计和架构思想也在不断的涌现和产生。这就需要软件开发人员不断的紧跟着技术的脚步向前走。正如古人所言,学如逆水行舟,不进则退。共勉之!

更多推荐

多核和多CPU编程——基本模式和库