首页>参考读物>计算机科学与技术>软件与程序设计

并行编程方法与优化实践
作者 : 刘文志 著
出版日期 : 2015-06-06
ISBN : 978-7-111-50194-7
定价 : 59.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 226
开本 : 16
原书名 : 并行编程方法及优化实践
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书介绍了并行编程的方法和优化实践,主要结合X86 SSE与AVX、ARM Neon、OpenMP、CUDA和OpenCL等讲解了并行编程的技术、方法和最佳实践。第1章讲解X86 SSE与AVX的矩阵实现;第2章讲解如何利用ARM Neon进行编程;第3章介绍OpenMP并行程序设计;第4章讲解基于GPU的CUDA和OpenCL程序设计;第5章讲解OpenACC的应用;第6~7章讲解线性代数和图形学在并行编程中的实践与应用,并给出大量示例。

图书特色

国内顶尖的并行计算领域知名专家风辰多年实践经验总结,兼具深度和高度
简洁明了,辅以大量示例,全面介绍主流硬件平台上的向量化库,并行编程语言的设计细节,OpenCL程序在硬件平台的映射与执行,并给出多个性能优化实战案例

近两三年来,在互联网企业中,代码优化、并行计算和GPU的使用越来越受到重视。无论是国外的Google、Facebook还是国内的百度、腾讯、阿里和360,都在使用代码优化、并行计算和GPU来完成以前不能完成的任务。而现在中小型企业也在使用代码优化和并行化技术来提升产品的使用体验。对于软件开发人员来说,如果不掌握并行计算和代码性能优化技术,在不久的将来就会被淘汰。
本书不但涵盖主流的现代多核处理器平台架构、并行指令集和编译制导语句,还介绍了常见并行程序设计语言、图像处理和线性代数算法的代码性能优化,OpenCL程序如何在AMD、GCN、GPU和NVIDIA GPU上的编程执行,以及CUDA和OpenCL在GPU上的执行区别等。
笔者基于自身丰富的理论和实践经验,将大量“不传之秘”融入本书,主要体现在:
深入剖析了SSE/AVX和NEON指令集、OpenMP编译制导语句、基于GPU的异构并行计算环境(OpenCL、CUDA和OpenACC),并辅以细节丰富的简单示例。
简洁明了地展现了如何在不同的现代处理器上执行OpenCL程序及执行的区别,通过了解这些区别,读者能够编写出在各个处理器上性能良好的程序。
详细描述了如何在X86、ARM、AMD和NVIDIA GPU上实现、优化代码的性能,让读者能够很好地评估在不同处理器上实现性能良好的程序需要的考量。

作者简介
刘文志 花名风辰,毕业于中国科学院研究生院,闻名于并行计算江湖,尤善异构并行计算(X86、ARM、GPU、APU、PHI)和大规模集群计算相关技术,有7年相关经验,涉及图像处理、计算机视觉、数据挖掘和石油勘探。曾任英伟达并行计算工程师(协助建立英伟达北京CUDA团队)、百度在线高级研发工程师(协助建立百度深度学习实验室异构计算团队)。

本书是“并行计算与性能优化”系列的第2本,主要讲解了如何利用主流的C语言向量化扩展和并行库在X86 、ARM和GPU平台上向量化代码,使软件开发人员跳出烦琐的Intel和ARM参考资料(通常无示例),了解其概要。第1本和第3本则涵盖了并行优化和并行计算相关的理论、算法设计及高层次的实践经验,以及科学计算与企业级应用的并行优化等重要主题,这些内容被许多顶级开发人员视为“不传之秘”。本书作者是国内顶尖的并行计算专家,曾任英伟达并行计算工程师和百度在线高级研发工程师,在该领域的经验和修为极为深厚,他毫不吝啬地将自己多年的积累呈现在了这3本书中,得到了百度深度学习研究院“杰出科学家”吴韧的高度评价和强烈推荐。

全书8章,逻辑上分为四大部分:
代码向量化优化
本部分主要介绍常见的C语言的向量化库,主要是X86平台和ARM平台的向量化扩展,如Intel SSE/AVX指令集和ARM NEON指令集。
并行程序设计语言
本部分主要介绍目前主流的并行程序设计语言OpenMP、CUDA、OpenCL及OpenACC的并行编程语言或扩展的细节。
主流的并行硬件平台的平台映射
本部分主要介绍Intel Haswell、ARM A15、AMD GCN GPU和NVIDIA Kepler/Maxwell GPU的架构及OpenCL程序如何在这些硬件上执行并行程序的映射。
常见简单应用的向量化和并行化
本部分主要介绍如何使用SSE/AVX、ARM NEON、OpenMP和CUDA等向量化扩展和并行语言来优化图像处理、线性代数应用的性能。

图书前言

为什么要写这本书
本书主要是为软件工程师写的。在解释为什么笔者认为软件工程师需要这本书之前,先来介绍并行、并发和代码性能优化这3个概念,理解这3个概念是阅读本书的基础。
并行对应的英文单词是parallelism,是指在具有多个处理单元的系统上,通过将计算或数据划分为多个部分,然后将各个部分分配到不同的处理单元上,各处理单元相互协作,同时运行,以达到加快求解速度或者扩大求解问题规模的目的。
并发对应的英文单词是concurrency,是指在一个处理单元上运行多个应用,各应用分时占用处理单元。这是一种微观上串行、宏观上并行的模式,有时也称其为时间上串行、空间上并行。
代码性能优化是指通过调整源代码,使其生成的机器指令能够更高效地执行。通常高效是指执行时间更少、使用的存储器更少或能够计算更大规模的问题。
从大的方面来说,并行和并发都是代码性能优化的一种方式。但是今天并行和并发已经变得如此重要,以至于需要“开宗立派”。为了划清并行、并发和代码性能优化的界线,在本书中,代码性能优化特指除并行和并发以外的代码优化方法,比如向量化和提高指令流水线效率。在本书中,笔者将向量化独立出来解说。
2003年以前,在摩尔定律的作用下,单核标量处理器的性能持续提升,软件开发人员只需要写好软件,而性能的提升则等待下次硬件的更新。2003年之前的几十年里,这种“免费午餐”的模式一直在持续。2003年后,主要由于功耗的原因,这种“免费午餐”已经不复存在了。为了生存,各硬件生产商不得不采用各种方式提高硬件的计算能力。目前最流行的3种方式如下:
1)让处理器在一个周期处理多条指令,多条指令可相同可不同。如Intel Haswell处理器一个周期可执行4条整数加法指令、2条浮点乘加指令,访存和运算指令也可同时执行。
2)使用向量指令,主要是SIMD和VLIW技术。SIMD技术将处理器一次能够处理的数据位数从字长扩大到128位或256位,从而提升了计算能力。
3)在同一个芯片中集成多个处理单元,根据集成方式的不同,相应地称为多核处理器或多路处理器。多核处理器是如此的重要,以至于现在即使是手机上的嵌入式ARM处理器都已经是四核或八核的了。
目前绝大部分应用软件都是串行的,串行执行过程符合人类的思维习惯,易于理解、分析和验证。由于串行软件只能在多核处理器中的一个核上运行,和2003年以前的CPU没有多少区别,这意味着花多核处理器的价钱买到了单核的性能。通过多核技术,硬件生产商成功地将提高实际计算能力的任务转嫁给了软件开发人员,而软件开发人员则没有选择,只有直面挑战。
标量单核的计算能力没有办法持续大幅度提升,而应用对硬件计算能力的需求依旧在提升,这是个实实在在的矛盾。在可见的将来,要解决这个矛盾,软件开发人员只有选择代码优化和并行。代码优化并不能利用多核CPU的全部计算能力,它也不要求软件开发人员掌握并行开发技术,另外通常也无须对软件架构做改动,而且串行代码优化有时能够获得非常好的性能(如果原来的代码写得很差的话)。因此相比采用并行技术,应当优先选择串行代码优化。一般来说,采用并行技术获得的性能加速不超过核数,这是一个非常大的限制,因为目前CPU硬件生产商最多只能集成几十个核。
从2006年开始,可编程的GPU越来越为大众所认可。GPU是图形处理单元(Graphics Processing Unit)的简称,最初主要用于图形渲染。自20世纪90年代开始,NVIDIA、AMD(ATI)等GPU生产商对硬件和软件加以改进,GPU的可编程能力不断提高,GPGPU(General-Purpose computing on Graphics Processing Units)比以前容易许多。另外,由于GPU具有比CPU更强大的峰值计算能力,引起了许多科研人员和企业的兴趣。
近两三年来,在互联网企业中,GPU和并行计算越来越受到重视。无论是国外的Google、Facebook,还是国内的百度、腾讯、阿里和360,都在使用代码优化、并行计算和GPU来完成以前不能完成的任务。
10年前,并行计算还是大实验室里教授们的研究对象,而今天,多核处理器和GPU的普及已经使得普通人就可以研究它们。对于软件开发人员来说,如果不掌握并行计算和代码性能优化技术,在不久的将来就会被淘汰。
为了学习如何在X86和ARM平台上向量化代码,软件开发人员需要了解Intel 和ARM提供的参考资料,它们通常细节丰富,开发人员需要从多如牛毛的细节上(而且通常没有示例)了解其概要,可谓难上加难。而本书通过丰富的简单示例,让读者能够从全局上把握这些扩展的特性。
NVIDIA的CUDA和开放的OpenCL标准越来越得到大家的重视,OpenCL和CUDA在概念上有太多相似的地方,在本书中,笔者尝试将它们放在一起描述,以便于读者理解。
为了帮助读者理解,本书使用了大量的示例。开发人员通常比较忙,因此本书力求简洁明了,点到为止。
读者对象
由于多核处理器和GPU已经非常便宜,而代码优化、向量化和并行已经深入IT行业的骨髓,所有IT行业的从业者都应当阅读本书。如果非要列一个清单,笔者认为下列人员应当阅读:
互联网及传统行业的IT从业者,尤其是希望将应用移植到多核向量处理器或GPU上的开发人员
对向量化和并行化感兴趣的专业工作者
高等院校、研究所的学生及教师
如何阅读本书
本系列包括3本书,本书是此系列的第二本。本书的重点在于介绍如何利用目前主流的C语言的各种特定硬件或平台的向量化扩展、并行化库,来编写和优化串行代码的性能。而本系列的第一本《并行算法设计与性能优化》则关注并行优化和并行计算相关的理论、算法设计及高层次的实践经验。本书同时关注C程序设计语言的向量化和并行化扩展,以及算法到硬件的映射。
本书不但包括如何使用SSE/AVX向量化扩展、如何使用OpenMP编译制导语句优化运行在X86多核处理器上的代码的性能,还包括如何使用NEON向量化扩展、OpenMP编译制导语句优化运行在移动处理器(ARM)上的代码性能优化,以及使用CUDA和OpenCL优化运行在图形处理器(GPU)上的代码性能优化及并行。不但有实际的各个扩展解析或语言的介绍说明,还有丰富的算法优化实例。作者希望通过这种方式让阅读本书的软件开发人员了解、掌握常见的向量化库、并行编程语言,学会如何使用这些语言或库,将常见算法映射到具体硬件上以获得高性能,以及这些库和语言的优缺点。
整体而言,本书分为如下几个部分:
代码向量化优化,主要介绍常见的C语言的向量化库,主要是X86平台和ARM平台的向量化扩展。主要内容见第1章和第2章。
并行程序设计语言,主要介绍目前主流的并行程序设计语言OpenMP、CUDA、OpenCL及OpenACC。主要内容见第3~5章。
主流的向量化和并行化硬件平台,以及OpenCL程序如何映射到这些平台上。主要介绍Intel Haswell、ARM A15、AMD GCN GPU和NVIDIA Kepler/Maxwell GPU的架构,及OpenCL程序如何在这些硬件上执行。主要内容见第6章。
常见简单应用的向量化和并行化,主要介绍如何使用前面提到的向量化扩展和并行语言来优化图像处理、线性代数应用的性能。主要内容见第7章和第8章。
第1章 主要介绍Intel SSE/AVX的C语言向量化扩展(内置函数)的相关细节,如支持哪些操作,使用AVX/SSE向量化时需要注意哪些问题。另外还介绍了如何在Intel X86上测得峰值,及如何使用SSE/AVX优化一些实例代码(这些示例由高洋提供)。
第2章 介绍了ARM A15高性能处理器的特性,及ARM提供的向量化扩展(内置函数)NEON的细节。另外介绍了如何在ARM A15处理器上优化彩色图转灰度图、矩阵转置和矩阵乘法等。
第3章 介绍了OpenMP程序设计的细节内容。主要包括OpenMP的环境变量、函数和编译制导语句。本章提供了许多OpenMP编译制导语句构造和子句的编程实例,以帮助读者理解。本章还简单介绍了OpenMP 4.0标准引入的异构并行计算的内容。并以如何使用OpenMP计算圆周率为例,介绍了OpenMP的互斥同步支持,并比较了这些不同同步方式的性能。
第4章 介绍了目前用于异构并行计算平台(主要是GPU)的CUDA和OpenCL的细节。首先介绍了基于GPU的异构并行计算的历史与现状,及GPU和CPU的优缺点。然后介绍了CUDA和OpenCL编程的细节,并展示了如何使用CUDA和OpenCL来计算圆周率。接着介绍了如何基于GPU优化CUDA和OpenCL程序性能。最后以矩阵转置和矩阵乘法为例介绍了如何在GPU上优化程序性能。
第5章 简单介绍了用于异构平台的OpenACC标准。介绍了常见的OpenACC编译制导语句,然后介绍了CUDA和OpenACC如何通过共享存储器指针实现通信。最后以一个简单的迭代算法为例,介绍了如何优化OpenACC程序。
第6章 介绍了常见的并行编程硬件平台的架构及OpenCL程序如何映射到这些平台上执行。简略介绍了Intel Haswell、ARM A15、AMD GCN GPU和NVIDIA Kepler/Maxwell GPU的架构。然后介绍了OpenCL程序如何映射到Intel Haswell处理器、AMD GCN GPU和NVIDIA Kepler/Maxwell GPU上执行。
第7章 详细介绍了如何使用SSE/AVX、ARM NEON、OpenMP和CUDA来优化常见的图像处理应用,比如均值滤波和中值滤波、图像直方图和曼德勃罗集。
第8章 详细介绍了如何使用SSE/AVX、ARM NEON、OpenMP和CUDA来优化两向量距离和稠密矩阵向量乘法。
本书希望通过这种方式让读者渐进地、踏实地拥有并行思维,了解各个向量化和并行化编程库的优缺点,并且能够写出优良的向量化、并行代码。
对并行和代码优化不太了解的人员,笔者希望你们按章节顺序仔细阅读本书;对并行或代码优化非常了解的人员,可按照需求选择章节阅读。
勘误和支持
笔者的水平有限,工作繁忙,编写时间仓促,而向量化、并行和代码优化又是一个正在高速发展、与硬件及算法密切相关、影响因素非常多、博大精深、又具有个人特色的领域,许多问题还没有统一的解决方案。虽然笔者已经努力确认很多细节,但书中难免会出现一些不准确的地方,甚至是错误,恳请读者批评指正。你可以将书中的错误或写得不好的地方通过邮件发送到ly152832912@163.com,或微信联系“风辰”,以便再版时修正,笔者会尽快回复邮件。如果你有更多的宝贵意见,也欢迎发送邮件,期待能够得到你们的真挚反馈。
致谢
首先要感谢我的老婆,她改变了我的人生轨迹,让我意识到人生有如此多的乐趣。
感谢中国地质大学(武汉)图书馆,那是使我对并行计算产生兴趣的地方。感谢中国科学院研究生院和中国科学院图书馆,那里为我奠定了从事并行计算事业的基础。
感谢我的朋友陈实富、赖俊杰、高洋、李修宇等,如果没有你们,我会需要更多时间来提升水平。感谢我的领导王鹏、吴韧和汤晓欧,在这些“技术大佬”和“人生赢家”的指导下,我才会成长得如此迅速。
感谢机械工业出版社华章分社的高婧雅和杨福川,我本无意出版此书,是你们鼓励我将它付梓成书;是你们帮我修改书稿,让它变得可读可理解;是你们帮我修正错误,是你们的鼓励和帮助使得我顺利完成全部书稿。
最后感谢我的爸爸、妈妈、姥姥、姥爷、奶奶、爷爷,感谢你们将我培养成人,并时时刻刻为我提供精神力量!
谨以此书献给我最爱的家人,以及众多热爱代码优化、向量化、并行计算的朋友们!愿你们快乐地阅读本书!

风辰

上架指导

计算机\程序设计

封底文字

近两三年来,在互联网企业中,代码优化、并行计算和GPU的使用越来越受到重视。无论是国外的Google、Facebook还是国内的百度、腾讯、阿里和360,都在使用代码优化、并行计算和GPU来完成以前不能完成的任务。而现在中小型企业也在使用代码优化和并行化技术来提升产品的使用体验。对于软件开发人员来说,如果不掌握并行计算和代码性能优化技术,在不久的将来就会被淘汰。
本书不但涵盖主流的现代多核处理器平台架构、并行指令集和编译制导语句,还介绍了常见并行程序设计语言、图像处理和线性代数算法的代码性能优化,OpenCL程序如何在AMD、GCN、GPU和NVIDIA GPU上的编程执行,以及CUDA和OpenCL在GPU上的执行区别等。
笔者基于自身丰富的理论和实践经验,将大量“不传之秘”融入本书,主要体现在:
 深入剖析了SSE/AVX和NEON指令集、OpenMP编译制导语句、基于GPU的异构并行计算环境(OpenCL、CUDA和OpenACC),并辅以细节丰富的简单示例。
 简洁明了地展现了如何在不同的现代处理器上执行OpenCL程序及执行的区别,通过了解这些区别,读者能够编写出在各个处理器性能良好的程序。
 详细描述了如何在X86、ARM、AMD和NVIDIA GPU上实现、优化代码的性能,让读者能够很好地评估在不同处理器上实现性能良好的程序需要的考量。

作者简介

刘文志 著:暂无简介

图书目录

前 言
第1章 X86 SSE/AVX指令集1
1.1 SSE内置函数2
1.1.1 算术运算2
1.1.2 逻辑运算5
1.1.3 比较5
1.1.4 加载和存储6
1.2 AVX内置函数8
1.2.1 算术运算8
1.2.2 逻辑运算10
1.2.3 比较10
1.2.4 加载和存储10
1.3 优化实例及分析11
1.3.1 如何测得CPU的浮点峰值性能11
1.3.2 积分计算圆周率π14
1.3.3 稀疏矩阵向量乘法16
1.3.4 二维单通道图像离散卷积19
1.4 本章小结22
第2章 ARM NEON SIMD 指令优化23
2.1 NEON指令集综述23
2.2 ARM A15 处理器性能25
2.3 NEON 支持的操作25
2.3.1 基本算术运算26
2.3.2 基本比较运算28
2.3.3 基本数据类型转换及舍入运算29
2.3.4 基本位运算30
2.3.5 基本逻辑运算30
2.3.6 基本设置加载存储操作31
2.3.7 特殊操作32
2.4 应用实例33
2.4.1 彩色图像转灰度图像33
2.4.2 矩阵转置37
2.4.3 矩阵乘39
2.5 本章小结42
第3章 OpenMP程序设计43
3.1 OpenMP编程模型44
3.1.1 OpenMP执行模型44
3.1.2 OpenMP存储器模型45
3.2 环境变量46
3.3 函数46
3.3.1 普通函数47
3.3.2 锁函数48
3.4 OpenMP编译制导语句49
3.4.1 常用的OpenMP构造49
3.4.2 常用的OpenMP子句59
3.5 OpenMP异构并行计算65
3.6 OpenMP程序优化66
3.6.1 OpenMP程序优化准则66
3.6.2 OpenMP并行优化实例67
3.7 本章小结71
第4章 基于GPU的异构并行计算环境:CUDA与OpenCL72
4.1 GPU计算概述73
4.1.1 GPU计算历史75
4.1.2 CUDA概述76
4.1.3 OpenCL概述77
4.2 异构并行计算模型78
4.2.1 平台模型79
4.2.2 执行模型80
4.2.3 存储器模型83
4.2.4 编程模型85
4.3 C语言接口86
4.3.1 OpenCL C语言86
4.3.2 CUDA C语言108
4.4 基于GPU的异构并行计算性能优化122
4.4.1 总体优化准则123
4.4.2 全局存储器优化125
4.4.3 合并访问125
4.4.4 局部存储器127
4.4.5 存储体冲突127
4.4.6 常量存储器优化128
4.4.7 CUDA纹理存储器优化129
4.4.8 寄存器及私有存储器优化130
4.4.9 工作组数目及大小131
4.4.10 占用率132
4.4.11 指令优化133
4.4.12 分支优化133
4.4.13 数据传输优化134
4.5 GPU与CPU精度差别136
4.6 矩阵转置137
4.6.1 初次实现137
4.6.2 满足合并访问的实现137
4.6.3 没有存储体冲突的实现138
4.7 矩阵乘法139
4.7.1 初次实现140
4.7.2 矩阵分块实现140
4.8 本章小结141
第5章 OpenACC143
5.1OpenACC 编程模型143
5.1.1 执行模型144
5.1.2存储器模型145
5.2编译制导语句146
5.2.1kernels构造147
5.2.2parallel构造147
5.2.3 线程配置相关子句148
5.2.4data构造148
5.2.5loop构造150
5.2.6 atomic构造151
5.2.7 dtype子句151
5.2.8reduction子句152
5.2.9变量可见性子句152
5.2.10if子句152
5.2.11async和wait153
5.3OpenACC和CUDA协作153
5.3.1CUDA使用OpenACC生产的数据153
5.3.2 OpenACC使用CUDA生产的数据155
5.4两小时性能提升10倍156
5.5本章小结158
第6章 多核向量处理器架构及OpenCL程序映射159
6.1多核向量处理器架构159
6.1.1Intel Haswell CPU 架构160
6.1.2ARM A15 多核向量处理器架构163
6.1.3AMD GCN GPU架构164
6.1.4NVIDIA Kepler 和 Maxwell GPU架构166
6.2OpenCL 程序在多核向量处理器上的映射170
6.2.1OpenCL程序在多核向量CPU上的映射170
6.2.2OpenCL程序在NVIDIA GPU上的映射171
6.2.3OpenCL程序在AMD GCN上的映射174
6.3本章小结177
第7章 利用多种技术优化图像处理中的算法性能178
7.1图像滤波178
7.1.1均值滤波178
7.1.2中值滤波184
7.2图像直方图189
7.2.1OpenMP 实现189
7.2.2CUDA 实现190
7.3曼德勃罗集195
7.3.1串行算法195
7.3.2不适合进行向量化196
7.3.3OpenMP实现196
7.3.4CUDA 实现197
7.4本章小结197
第8章 利用多种技术优化线性代数中的算法性能198
8.1两向量距离198
8.1.1串行代码198
8.1.2循环展开代码199
8.1.3AVX指令加速200
8.1.4NEON 实现201
8.1.5CUDA实现203
8.2稠密矩阵与向量乘法205
8.2.1串行算法205
8.2.2AVX 指令加速205
8.2.3NEON 实现207
8.2.4CUDA 实现208
8.2.5OpenMP 实现214
8.3本章小结216

教学资源推荐
作者: 辛运帏 饶一梅
作者: (美)Byron S.Gottfried
作者: [美]布鲁斯·埃克尔(Bruce Eckel) 戴安娜·马什(Dianne Marsh) 著
参考读物推荐
作者: (美)F.Scott Barker
作者: (美)Jos Dirksen 著
作者: (美)W. Clay Richardson Donald Avondolio Joe Vitale Scot Schrager Mark W. Mitchell Jeff Scanlon
作者: [美]乔纳森·E.斯坦哈特 (Jonathan E. Steinhart ) 著