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

本文介绍了多核编程中的几种基本模式,包括MPI、OpenMP、Intel IPP/TBB以及MapReduce,并讨论了它们的特点和适用场景。OpenMP作为常用的并行编程标准,适合SMP结构,而MPI则适用于分布式集群。此外,提到了Intel的TBB库和Boost库等并行编程资源。最后,提供了一个简单的OpenMP并行循环示例,强调了在多核编程中使用现有库的重要性。

一、基本模式

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的出现不可避免的要求新的编程模式,一些新设计和架构思想也在不断的涌现和产生。这就需要软件开发人员不断的紧跟着技术的脚步向前走。正如古人所言,学如逆水行舟,不进则退。共勉之!
在这里插入图片描述

一. 并发与并行的区别? ........................................................................................................................... 1 1.1 串行 .................................................................................................................................................. 1 1.2 并发 .................................................................................................................................................. 1 1.3 并行 .................................................................................................................................................. 1 1.4 多核编程的难点 ............................................................................................................................... 2 二. 多核体系架构 ...................................................................................................................................... 3 2.1 多核处理器定义 ............................................................................................................................... 3 2.2 多核发展趋势 .................................................................................................................................. 3 2.3 一个多核处理器架构例子 ............................................................................................................... 5 2.4 LINUX 线程核绑定 .............................................................................................................................. 6 2.4.1 核亲性绑定 ........................................................................................................................... 6 2.4.2 资源控制 cgroup ...................................................................................................................... 8 三. 内存模型 .............................................................................................................................................. 8 3.1 操作原子性 ...................................................................................................................................... 9 3.1.1 原子性的3种保证机制 ........................................................................................................... 9 3.1.2 硬件原子操作 ........................................................................................................................... 9 3.1.3 总线锁-原子操作原语 ............................................................................................................ 12 3.2 缓存一致性 .................................................................................................................................... 16 3.2.1 定义 ........................................................................................................................................ 16 3.2.2 CC协议 .................................................................................................................................... 17 3.2.3 伪共享 .................................................................................................................................... 21 3.3 顺序一致性 .................................................................................................................................... 24 3.3.1 定义 ........................................................................................................................................ 24 3.3.2 几种顺序约束 ......................................................................................................................... 25 3.3.3 乱序执行内存屏障 ............................................................................................................. 28 四. 并发级别 ............................................................................................................................................ 31 4.1 WAIT-FREEDOM 无等待并发 .............................................................................................................. 32 4.2 LOCK-FREEDOM 无锁并发 ................................................................................................................... 32 4.3 OBSTRUCTION-FREEDOM 无阻塞并发 .................................................................................................. 33 4.4 BLOCKING ALGOITHMS 阻塞并发 .......................................................................................................... 33 五. 锁 ....................................................................................................................................................... 34 5.1 信号量 ............................................................................................................................................ 34 5.2 自旋锁 ............................................................................................................................................ 35 5.3 读写锁 ............................................................................................................................................ 35 5.4 顺序锁 ............................................................................................................................................ 37 5.5 RCU .................................................................................................................................................. 38 六. 无锁编程 ............................................................................................................................................ 38 6.1 定义 ................................................................................................................................................ 39 七. 并发数据结构、开源 ..................................................................................................................... 41 7.1 一些开源的并发 ......................................................................................................................... 41 7.2 一次无锁哈希表跟基于锁的哈希表性能对比测试 ..................................................................... 41 7.2.1 测试平台 ................................................................................................................................ 41 7.2.2 测试过程 ................................................................................................................................ 42 7.2.3 哈希算法 ................................................................................................................................ 43 7.2.4 测试结果 ................................................................................................................................ 44 八. 多核工程实践 .................................................................................................................................... 44 8.1 网络设备 :INTEL DPDK .................................................................................................................. 44 8.2 网络游戏 ........................................................................................................................................ 44 8.3 手机开发 ........................................................................................................................................ 45 九. 参考 ................................................................................................................................................... 45
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值