以下为截止2009年3月21日前发布在本人博客中的多核相关的文章汇总,这些文章大部分摘自于我写的《多核计算与程序设计》一书。现将这些文章分类汇总,方便大家阅读。
后续如果博客中继续发布了多核相关的文章,那么本文章将会被更新。如果对多核编程技术非常感兴趣的话,可以考虑将这篇文章加入您的浏览器收藏夹中,也欢迎您将这篇文章推荐给您的朋友。
一、基础篇
主要讲解多核编程时的串行化方面的难题及其应对策略。阅读全文
锁竞争会导致加速系数随CPU核数增多而下降的现象。核数增加到128时,加速系数只有0.78,还不如在单核CPU上运行的速度。 S(p) = (t +1)/ (p + t/p) = p*(t+1) / (p*p+t) (锁竞争下的加速系数公式) 。阅读全文
负载平衡的难度与CPU的核数成正比,CPU核数越多,负载划分的难度就越大。 阅读全文
二、OpenMP专题
介绍OpenMP程序在并行计算时的效率,在双核CPU上效率增加了整整一倍。 阅读全文
1、fork/join并行执行模式的概念 2、OpenMP指令和库函数介绍 3、parallel 指令的用法 4、for指令的使用方法 5 sections和section指令的用法。阅读全文
本文主要介绍了OpenMP中的private、firstprivate、lastprivate、threadprivate、reduction、copyin、copyprivate等数据处理子句的用法。 阅读全文
本文主要介绍了OpenMP中任务调度子句schedule的使用方法。阅读全文
主要比较了原子操作,Windows CriticalSection, OpenMP库带的锁在单任务运行情况下和多任务运行情况下的性能情况,在多核CPU上,多任务的锁竞争花费的时间是单任务时的锁运行花费时间的18倍。锁竞争带来的效率下降完全出乎意料之外,由此也可见多核编程和单核多任务编程是有很大区别的。 阅读全文
讲述了如何动态设置线程数量以适应硬件和软件的扩展性,如何将嵌套循环并行化的技巧。 阅读全文
三、性能篇
在双核CPU上运行后,打印出花费的时间为 234 ms , 单任务版的快速排序函数约需406ms左右,并行运行效率为:406/(2×234) = 86.7% 左右。运行速度快了172ms。 阅读全文
本文主要讨论了固定式锁竞争、随机锁竞争、分布式锁竞争三种典型锁竞争情况下的加速比,并分析了任务粒度因子和锁粒度因子对加速比的影响。结论: 分布式锁竞争加速比随CPU核数成正比,可以达到和单核多任务时相当的性能,是多核编程的发展方向。 阅读全文
本文重点比较了无锁编程和分布式锁竞争的性能,无锁(原子操作)实际上是一种细粒度锁。然后又从实现的功能,程序员掌握难易程度,现有软件的移植等方面进行了比较,得出结论:无锁编程远不如分布式编程。分布式编程更适合多核CPU系统。 阅读全文
四、多核编程模式专题
讨论了使用任务分组锁竞争方式来消除锁竞争导致的CPU饥饿现象,队列池就是任务分组竞争的一个非常好的实践任务分组竞争模式相对于无锁编程具有更好的优势。 阅读全文
本文主要分析了多个任务在随机分布式锁竞争的情况下,有不少于CPU核数个数的任务在运行的概率。然后将随机竞争和无锁编程的性能进行了理论上的比较。阅读全文
本文讲解了一种减少锁使用的方法,将每次都加锁改为满足一定条件时才加锁,非常适合具有状态机性质的场合使用。 阅读全文
五、多核数据结构与算法专题
本文讲述了多核系统中分布式队列的实现方法,所谓分布式队列指的是每个线程除了可以访问线程池外还自动拥有一个本地队列。实现分布式队列的基本方法就是“偷”与“自私”。 阅读全文
用数组进行查找,由于其插入和删除需要按顺序进行,需要移动较多的数据,对于大数据量的查找是无法使用的。然而,在多核时代,一切都改变了,大数据量的查找结构也可以用数组来实现。并且用数组实现的大数据量查找结构有着比其他查找结构更明显的优势:效率高、内存占用少、并且容易避免伪共享问题。 阅读全文
前缀和计算在并行计算中很有用,因为在处理负载平衡问题时,经常需要将若干段数据重新平分,而计算前缀和通常是一种有效的将数据平分的方法。 阅读全文
六、多核编程思想专题
象使用内存一样使用CPU? 阅读全文
本文主要论述道家的“小国寡民”,“无为”“大道自然”等思想与多核计算中使用的思想的异曲同工之处,给出了道家思想在多核计算中的实践实例分析。大道自然,“贪心”,“自私”,“偷窃”这些大自然赋给人类的自然力量,在多核计算中得到了广泛的使用。 阅读全文
从先天方法策略、目标需求评价、本质根源保障、算法实现执行四个层面阐述多核计算的含义 阅读全文
本文主要从多核计算的角度来论述高房价问题及其对社会的影响,并给出了高房价问题的最终解决措施。 阅读全文
将道家老子的思想与软件中的思想进行对比分析,得出结论,道家追求稳定可靠性。所以历代在拨乱反正时期,用的都是道家思想。历史上最典型的三个朝代汉、唐、明为例,汉朝时张良等人都是好黄老之术(也就是道家思想),唐朝的宰相魏征也是道家人物,明朝的刘伯温也是属于道家人物。 阅读全文
屈原与渔父两种不同的思想,相当于软件中的两种不同算法思想。“世人皆浊,众人皆醉”可以理解为软件运行的场景。 阅读全文
更多的多核相关的资源,可以访问:
1)Intel软件社区多核论坛:http://forum.csdn.net/Intel/IntelMulti-core/
2)Intel的博客:http://softwareblogs-zho.intel.com/
关于多核相关的书籍介绍可以参考下面这篇文章:
“多核编程高处并不“寒””,文章地址: http://news.csdn.net/n/20081107/120632.html
这篇文章里有我对现在市面上有关多核编程和并行计算书籍的一个点评。可以给大家购买书籍作为一个参考。
多核相关的开源项目介绍:
1、Intel 开源项目TBB库,链接:http://www.threadingbuildingblocks.org/
这是一个专门针对多核的开源项目,包含一些常见的多核数据结构与算法,如分段锁的哈希表、分布式内存管理、动态任务调度器等,其中最重要的一个是动态任务调度器,可以使用动态任务调度器将串行算法自动变成并行算法,免去程序员学习并行算法之苦。
TBB开源项目的使用方法详见O’Reilly出版的James Reinders的《Intel Threading Building Blocks》一书,如果要了解它的实现原理和方法,可以参考我写的《多核计算与程序设计》一书。
2、Capi开源项目,链接:http://gforge.osdn.net.cn/projects/capi
这个项目是我开发的一个针对多核的数据结构与算法库,提供了许多实用的适应多核系统的数据结构与算法,主要的功能有以下一些:
1)各种并行算法,如并行归并排序、并行基数排序等并行排序算法;并行顺序搜索及终止检测算法、并行Dijikstra最短路径算法等并行搜索算法;并行前缀和、并行矩阵乘法等并行数值算法;等等。
2)分布式查找算法,如分段锁的哈希表、动态分布式哈希数组、动态哈希AVL树等。
3)抢夺式内存管理算法,即使在分配和释放共享内存时,也几乎不需要使用锁。
4)基于偷取和自私的分布式队列,用分布式队列实现的两种动态任务调度器、以及用动态嵌套任务调度器实现的Parallel_For()功能,用Parallel_For()实现的并行快速排序算法、并行归并算法等。
5)任务图调度器,可以用来实现对有依赖关系的执行块的并行计算。
这个开源项目和TBB相比起来各有特色,TBB库的优势在于它是商业化的开源项目,代码经过优化和相对完善的测试。CAPI的代码专门为学习而设计,代码没有经过优化,代码简单易懂,易于学习,并且实现了比TBB库更多的数据结构与算法容器,有一些创新的数据结构与算法在里面。其缺点是,现在发布的版本为0.2版本,如果进行商业使用需要自行增加测试用例进行更完善的测试和优化。
CAPI开源项目的实现原理和使用方法详见我写的《多核计算与程序设计》一书。