推荐阅读的多核编程技术书籍

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://linuxstyle.blog.csdn.net/article/details/7198709
 

多核编程技术好书推荐

多核程序设计技术——通过软件多线程提升性能 ,

作 者: (孟加拉)阿克特(Akhter,S.),(美)罗伯茨(Roberts,J.) 著,李宝峰,富弘毅,李韬 译

本书从原理、技术、经验和工具等方面为读者提供关于多核程序设计技术的全方位解释。本书由三大部分组成:第一部分包括第1~4章,介绍软件多线程的 内容;第二部分包括第5章和第6章,其中讨论用于编写并行程序的常用编程API:第三部分包括其余五章关于多核程序设计的内容,讲述常见并行程序设计问题 及解决方法(第7章)、多线程应用程序的调试技术(第8章)、单核与多核处理器基本原理(第9、10章)和所需的Inter公司的软件开发辅助工具(第11章)。

本书作者都是长期供职于Inter公司的资深软件工程师和结构师,书中融入了他们自己丰富的软硬件开发经验,可以为面向多核体系 结构进行并行程序设计的开发人员提供巨大的帮助。不论对从未接触过并行程序设计的开发人员,还是转型面向多核体系结构进行并行程序设计的开发人员来讲,本书都是一本难得的参考书。

 

多处理器编程的艺术

作  者:(美)荷里希,(以)谢菲特 著,金海,胡侃 译

工业界称为多核的多处理器机器正迅速地渗入计算的各个领域。多处理器编程要求理解新型计算原理、算法及编程工具,至今很少有人能够精通这门编程艺术。

现今,大多数工程技术人员都是通过艰辛的反复实践.求助有经验的朋友来学习多处理器编程技巧。这本最新的权威著作致力于改变这种状况,作者全面阐述了多处理 器编程的指导原则,介绍了编制高效的多处理器程序所必备的算法技术。了解本书所涵盖的多处理器编程关键问题将使在校学生以及相关技术人员受益匪浅。

 

软件优化技术——IA-32平台的高性能手册(第2版),

作  者: (美)格贝尔(Gerber,R.) 等著,王涛 等译

《软件优化技术——IA-32平台的高性能手册》是Intel出版社最畅销的书籍之一。它填补了软件优化的初级课本与解决专门Intel®架构的高 级手册之间的空白。随着Intel扩展内存64位技术(Intel EM64T)、多核处理技术、超线程技术、OpenMP†和多媒体扩展等新技术的流行,Intel出版社邀请另外三位Intel专家与原作者一起扩展、更 新形成了本书的第2版。 《软件优化技术——IA-32平台的高性能手册》第2版提供了如何优化软件,使软件在Intel平台上获得巨大性能提升的最新技术。通过简单的讲解和示例,四位Intel专家向我们展示了如何从以下一些方面改进软件性能,包括算法、内存访问、分支预测、自动矢量化、SIMD指令、多线程和浮点计算。想了解最新技术以提高应用性能和想提高编码技巧的软件开发者,均可以从本书中受益。

 

Intel Threading Building Blocks编程指南,

作 者: (美)仁达敬(Reinders,J) 著;聂雪军 等译.

多核处理器的出现使得并行编程成为了每个程序员关注的主题。不具备多处理器核的计算机系统已经变得越来越少。本书为c++程序给出了并行编程的解决方案,它既不要求放弃c++,也不要求使用那些裸线程或者本地线程。

本书介绍的是Intel线程构建模块。线程构建模块是一个用来实现并行语义的c++模板库,它对c++进行了扩展,抽象出了线程管理机制并支持简明的并行编 程。在使用这个库时,你所要指定的是任务而不是线程,然后库将高效自动地将这些任务映射到线程上。如果希望程序在处理器核不断增加的情况下也能够继续运行,那么这种方式将带来许多好处。与裸线程相比,线程构建模块能够使你更方便地表达并行语义,同时还能够提高程序的性能,可移植性和可扩展性。在使用本书时,你无需任何并行编程经验或者在多核处理器上的编程经验。无论你是拥有丰富的并行编程经验,还是对并行编程一无所知,本书的内容都将是非常有用的。此外,本书也不要求之前是否对线程有所了解。

 

并行程序设计(第2版)

作 者: (美)威尔金森,(美)阿兰 著,陆鑫达 等译

本书系统介绍并行程序设计原理及应用。除介绍常用的一些算法范例,包括分治、流水、同步计算、主从及工作池,还介绍了一些常用的经典数值和非数值算 法,如排序、矩阵相乘、线性方程组求解、图像处理中的预处理和相应的变换、搜索和优化等。第2版新增了机群计算等使用机群的内容,对如何打造专用和通用的 机群以及设置相应的程序设计环境做了较为详尽的介绍。章后包含大量习题,其中现实生活习题非常实用,既可增强学习兴趣,又可提高并行程序设计技巧。 本书可作为高等院校计算机专业高年级本科生或研究生的教材,对从事高性能计算的科技工作者也是一本很有价值的参考书。

 

并行程序设计原理

作  者:(美)林,(美)斯奈德 著,陆鑫达 等译

出 版 社:机械工业出版社

出版时间:2009-7-1

本书内容新颖,涉及现代并行硬件和软件技术,包括多核体系结构及其并行程序设计技术。本书侧重论述并行程序设计的原理,并论述了并行程序设计中一些深层次问题,如可扩展性、可移植性以及并行程序设计应遵循的方法学等。

 

多核计算与程序设计,

作  者: 周伟明 著

本书是一本专业的多核程序设计方面的著作,覆盖了多核程序设计的各个方面。重点围绕多核(或多处理器)计算机系统的算法和程序这一重心,分五个部分 展开讲述。书中重点剖析了多核编程的核心技术——共享资源分布式编程技术,包括各种设计模式、分布式队列、分布式查找、分布式内存管理、任务图分解与调 度、动态任务调度等。这些技术简单易学,并可以解决锁竞争、负载均衡等多核编程难题,免去学习复杂并行算法之苦。同时,书中讲解了专门针对多核的并行计算 方法,如并行搜索、并行排序、并行数值计算等内容,并包含了对CPU核数扩展性及Cache伪共享等多核相关问题的处理。此外,为便于读者更准确和深入理 解,作者还对多核基本概念和理论、多线程编程基础、OpenMP编程、常用数据结构与算法、Lock-Free编程等基础概念和知识进行了讲解。

 

多任务下的数据结构与算法

作  者:周伟明 著

出 版 社:华中科技大学出版社

出版时间:2006-4-1

 

本书和传统同类书籍的区别是除了介绍基本的数据结构容器如栈、队列、链表、树、二叉树、红黑树、AVL树和图之外,引进了多任务;还介绍了将任意数据结构容器变成支持多任务的方法;另外,还增加了复合数据结构和动态数据结构等新内容的介绍。在复合数据结构中不仅介绍了哈希链表、哈希红黑树、哈希AVL树等容器,还介绍了复合数据结构的通用设计方法;在动态数据结构中主要介绍了动态环形队列、动态等尺寸内存管理算法。在内存管理中介绍了在应用程序层实现的内存垃圾回收算法、内存泄漏检查和内存越界检查的方法等。本书选取的内容均侧重于在实际中有广泛应用的数据结构和算法,有很好的商业使用价值。
展开阅读全文

推荐分享】多核编程中的条件同步模式~

01-15

在多线程编程中,当对共享资源进行操作时,需要使用同步(通常是锁或原子操作)来进行保护,以避免数据竞争问题。不幸的是,同步操作的开销非常大,比如对一个整数变量进行加法操作,那么同步操作的开销是加法操作的上百倍以上。rnrn有没有办法可以减少这种同步操作的开销呢?如果能设计出更快的锁或更快的原子操作来,那么这种开销自然就减少了。以目前的技术来看,最快速的原子操作耗时也是普通加法操作的上百倍,所以从这方面着手是非常困难的。rnrn那么能不能从软件算法的角度来减少同步操作的开销呢?答案是当然可以,基本思想是减少使用同步的次数,比如原来要使用同步1000次,现在改为在满足一定条件下才使用同步,只需要10次,那么同步的开销平摊下来就被减少了100倍,效率大大提高了。下面先来看一个共享队列例子。rnrn一个普通的共享队列通常都是使用锁来实现,当然也有用CAS原子操作来实现的,这里只讨论用锁来实现的共享队列。rnrn在有锁保护的共享队列中,在队列的进队和出队操作时,通常都是使用锁来进行保护的,一个典型的使用锁保护的出队操作伪代码如下:rnrn template class rnrn Locked_DeQueue(T &data)rnrn rnrn Lock();rnrn DeQueue(data); //调用串行的出队操作rnrn Unlock();rnrn rnrn rnrn在使用上面的Locked_DeQueue()函数时,每调用一次,就会发生一次锁操作。事实上,并不是每次都需要加锁操作的,比如队列为空时,这时实际上是不需要进行出队操作的,完全可以采取的一定的方法避免锁操作,但是采用上面的Locked_DeQueue()函数无法避免锁操作,这就需要对上面的函数进行改进。rnrn一种最容易想到的方面就是先判断队列是否为空,如果不为空才使用锁保护进行出队操作。代码如下:rnrn template class rnrn Locked_DeQueue_a(T &data)rnrn rnrn If ( !IsEmpty() )rnrn rnrn Lock();rnrn DeQueue(data); //调用串行的出队操作rnrn Unlock();rnrn rnrn rnrn rnrn上面的Locked_DeQueue_a()函数的一个关键之处是IsEmpty()函数必须不能使用锁操作,否则不仅没有减少同步开销,反而将同步开销增大了近一倍。rnrn如何来使得IsEmtpy()函数不用锁操作呢,以数组实现的环行队列为例,在判断队列是否为空时,其基本方法是判断队首指针是否等于队尾指针。伪代码如下:rnrnINT IsEmpty()rnrnrnrn Lock()rnrn if ( 队首指针 == 队尾指针 )rnrn rnrn Unlock();rnrn return 1; //为空rnrn rnrn elsernrn rnrn Unlock();rnrn return 0; //非空rnrn rnrnrnrn rnrn由于队首指针和队尾指针在进队或出队操作时会发生改变,因此在上面的IsEmpty()函数中,需要使用锁保护,那么如何去掉这层锁保护呢?rnrn基本的方法是设一个标志变量EmptyFlag,在进队和出队操作中,当队列为空时,标志变量的值置为1,队列非空时,标志变量的值置为0。这样判断队列是否为空就可以通过EmptyFlag单个变量来进行,而单个变量的读写可以使用原子操作来实现,使得读操作和普通操作一样不存在同步操作。rnrn下面是使用EmptyFlag变量实现的出队操作。rnrn template class rnrn Locked_DeQueue_b(T &data)rnrn rnrn if ( EmptyFlag )rnrn rnrn return;rnrn rnrn Lock();rnrn if ( !EmptyFlag ) //Lock()前, 其他线程可能修改了标志rnrn rnrn DeQueue(data); //调用串行的出队操作rnrn if ( 队首指针 == 队尾指针 )rnrn rnrn //出队后,队列变空,使用原子操作将EmptyFlag置为1rnrn AtomicIncrement(&EmptyFlag);rnrn rnrn rnrn Unlock();rnrn rnrn rnrn队列的是否为空函数可以使用下面的完全不需要同步的实现。rnrn INT IsEmpty()rnrn rnrn return EmptyFlag;rnrn rnrn rnrn从Locked_DeQueue_b()函数的实现可以看出,如果队列本来为空的情况下,它只判断一个EmptyFlag就返回了,不会调用锁操作,减少了同步使用的次数,并且在IsEmpty()函数中,根本不需要使用同步,这对于那些需要频繁判断队列是否为空的使用场景,有很好的效果。rnrn比如对于动态任务调度,假设使用普通的有锁的共享队列。当一个线程私有队列为空时,需要去偷取其他线程的共享队列中的任务,如果偷取的队列为空则发生了一次锁操作,此时需要再偷另外一个队列的任务,如果这个队列仍然为空则又要一次锁操作,一次获取任务的操作中将可能出现多次加锁解锁的情况。通过上面讲的条件同步方法就可以在偷取取一个任务时,只要一次锁操作就可以实现。rnrn上面讲的条件同步模式非常适应于具有状态机性质的场合,只有在发生状态切换(例如队列中空或非空的状态的切换)时才使用同步,通过对状态变量(例如EmptyFlag)的操作来替代其他非状态变量(例如队首指针和队尾指针)的操作,减少同步的使用。rnrnrn摘自:[url=http://g.csdn.net/5077040]英特尔软件网络博客,文:周伟民[/url] 论坛

没有更多推荐了,返回首页