描述
开 本: 16开纸 张: 胶版纸包 装: 平装是否套装: 否国际标准书号ISBN: 9787111448617丛书名: 高性能计算系列丛书
全面、详实地讲解了CUDA并行程序设计的技术知识点和编程方法,包含大量实用代码示例,是目前学习CUDA编程*权威的著作之一
全书共分为12章。第1章从宏观上介绍流处理器演变历史。第2章详解GPU并行机制,深入理解串行与并行程序,以辩证地求解问题。第3章讲解CUDA设备及相关的硬件和体系结构,以实现*CUDA程序性能。第4章介绍CUDA开发环境搭建和可用调试环境。第5章介绍与CUDA编程紧密相关的核心概念——网格、线程块与线程,并通过示例说明线程模型与性能的关系。第6章借助实例详细讲解了不同类型内存的工作机制,并指出实践中容易出现的误区。第7章细述多任务的CPU和GPU协同,并介绍多个CPU/GPU编程秘技。第8章介绍如何在应用程序中编写和使用多GPU。第9章详述CUDA编程性能限制因素、分析CUDA代码的工具和技术。第10章介绍编程实践中的库与软件开发工具包。第11章讲解如何设计基于GPU的系统。第12章总结CUDA应用中易犯错误以及应对建议。
致中国读者
译者序
前 言
第1章 超级计算简史
1.1 简介
1.2 冯?诺依曼计算机架构
1.3 克雷
1.4 连接机
1.5 Cell处理器
1.6 多点计算
1.7 早期的GPGPU编程
1.8 单核解决方案的消亡
1.9 英伟达和CUDA
1.10 GPU硬件
1.11 CUDA的替代选择
1.11.1 OpenCL
1.11.2 DirectCompute
1.11.3 CPU的替代选择
1.11.4 编译指令和库
1.12 本章小结
第2章 使用GPU理解并行计算
2.1 简介
2.2 传统的串行代码
2.3 串行/并行问题
2.4 并发性
2.5 并行处理的类型
2.5.1 基于任务的并行处理
2.5.2 基于数据的并行处理
2.6 弗林分类法
2.7 常用的并行模式
2.7.1 基于循环的模式
2.7.2 派生/汇集模式
2.7.3 分条/分块
2.7.4 分而治之
2.8 本章小结
第3章 CUDA硬件概述
3.1 PC架构
3.2 GPU硬件结构
3.3 CPU与GPU
3.4 GPU计算能力
3.4.1 计算能力1.0
3.4.2 计算能力1.1
3.4.3 计算能力1.2
3.4.4 计算能力1.3
3.4.5 计算能力2.0
3.4.6 计算能力2.1
第4章 CUDA环境搭建
4.1 简介
4.2 在Windows下安装软件开发工具包
4.3 Visual Studio
4.3.1 工程
4.3.2 64位用户
4.3.3 创建工程
4.4 Linux
4.5 Mac
4.6 安装调试器
4.7 编译模型
4.8 错误处理
4.9 本章小结
第5章 线程网格、线程块以及线程
5.1 简介
5.2 线程
5.2.1 问题分解
5.2.2 CPU与GPU的不同
5.2.3 任务执行模式
5.2.4 GPU线程
5.2.5 硬件初窥
5.2.6 CUDA内核
5.3 线程块
5.4 线程网格
5.4.1 跨幅与偏移
5.4.2 X与Y方向的线程索引
5.5 线程束
5.5.1 分支
5.5.2 GPU的利用率
5.6 线程块的调度
5.7 一个实例——统计直方图
5.8 本章小结
第6章 CUDA内存处理
6.1 简介
6.2 高速缓存
6.3 寄存器的用法
6.4 共享内存
6.4.1 使用共享内存排序
6.4.2 基数排序
6.4.3 合并列表
6.4.4 并行合并
6.4.5 并行归约
6.4.6 混合算法
6.4.7 不同GPU上的共享内存
6.4.8 共享内存小结
6.5 常量内存
6.5.1 常量内存高速缓存
6.5.2 常量内存广播机制
6.5.3 运行时进行常量内存更新
6.6 全局内存
6.6.1 记分牌
6.6.2 全局内存排序
6.6.3 样本排序
6.7 纹理内存
6.7.1 纹理缓存
6.7.2 基于硬件的内存获取操作
6.7.3 使用纹理的限制
6.8 本章小结
第7章 CUDA实践之道
7.1 简介
7.2 串行编码与并行编码
7.2.1 CPU与GPU的设计目标
7.2.2 CPU与GPU上的最佳算法对比
7.3 数据集处理
7.4 性能分析
7.5 一个使用AES的示例
7.5.1 算法
7.5.2 AES的串行实现
7.5.3 初始内核函数
7.5.4 内核函数性能
7.5.5 传输性能
7.5.6 单个执行流版本
7.5.7 如何与CPU比较
7.5.8 考虑在其他GPU上运行
7.5.9 使用多个流
7.5.10 AES总结
7.6 本章小结
第8章 多CPU和多GPU解决方案
8.1 简介
8.2 局部性
8.3 多CPU系统
8.4 多GPU系统
8.5 多GPU算法
8.6 按需选用GPU
8.7 单节点系统
8.8 流
8.9 多节点系统
8.10 本章小结
第9章 应用程序性能优化
9.1 策略1:并行/串行在GPU/CPU上的问题分解
9.1.1 分析问题
9.1.2 时间
9.1.3 问题分解
9.1.4 依赖性
9.1.5 数据集大小
9.1.6 分辨率
9.1.7 识别瓶颈
9.1.8 CPU和GPU的任务分组
9.1.9 本节小结
9.2 策略2:内存因素
9.2.1 内存带宽
9.2.2 限制的来源
9.2.3 内存组织
9.2.4 内存访问以计算比率
9.2.5 循环融合和内核融合
9.2.6 共享内存和高速缓存的使用
9.2.7 本节小结
9.3 策略3:传输
9.3.1 锁页内存
9.3.2 零复制内存
9.3.3 带宽限制
9.3.4 GPU计时
9.3.5 重叠GPU传输
9.3.6 本节小结
9.4 策略4:线程使用、计算和分支
9.4.1 线程内存模式
9.4.2 非活动线程
9.4.3 算术运算密度
9.4.4 一些常见的编译器优化
9.4.5 分支
9.4.6 理解底层汇编代码
9.4.7 寄存器的使用
9.4.8 本节小结
9.5 策略5:算法
9.5.1 排序
9.5.2 归约
9.5.3 本节小结
9.6 策略6:资源竞争
9.6.1 识别瓶颈
9.6.2 解析瓶颈
9.6.3 本节小结
9.7 策略7:自调优应用程序
9.7.1 识别硬件
9.7.2 设备的利用
9.7.3 性能采样
9.7.4 本节小结
9.8 本章小结
第10章 函数库和SDK
10.1 简介
10.2 函数库
10.2.1 函数库通用规范
10.2.2 NPP
10.2.3 Thrust
10.2.4 CuRAND
10.2.5 CuBLAS库
10.3 CUDA运算SDK
10.3.1 设备查询
10.3.2 带宽测试
10.3.3 SimpleP2P
10.3.4 asyncAPI和cudaOpenMP
10.3.5 对齐类型
10.4 基于指令的编程
10.5 编写自己的内核
10.6 本章小结
第11章 规划GPU硬件系统
11.1 简介
11.2 CPU处理器
11.3 GPU设备
11.3.1 大容量内存的支持
11.3.2 ECC内存的支持
11.3.3 Tesla计算集群驱动程序
11.3.4 更高双精度数学运算
11.3.5 大内存总线带宽
11.3.6 系统管理中断
11.3.7 状态指示灯
11.4 PCI-E总线
11.5 GeForce板卡
11.6 CPU内存
11.7 风冷
11.8 液冷
11.9 机箱与主板
11.10 大容量存储
11.10.1 主板上的输入/输出接口
11.10.2 专用RAID控制器
11.10.3 HDSL
11.10.4 大容量存储需求
11.10.5 联网
11.11 电源选择
11.12 操作系统
11.12.1 Windows
11.12.2 Linux
11.13 本章小结
第12章 常见问题、原因及解决方案
12.1 简介
12.2 CUDA指令错误
12.2.1 CUDA错误处理
12.2.2 内核启动和边界检查
12.2.3 无效的设备操作
12.2.4 volatile限定符
12.2.5 计算能力依赖函数
12.2.6 设备函数、全局函数和主机函数
12.2.7 内核中的流
12.3 并行编程问题
12.3.1 竞争冒险
12.3.2 同步
12.3.3 原子操作
12.4 算法问题
12.4.1 对比测试
12.4.2 内存泄漏
12.4.3 耗时的内核程序
12.5 查找并避免错误
12.5.1 你的GPU程序有多少错误
12.5.2 分而治之
12.5.3 断言和防御型编程
12.5.4 调试级别和打印
12.5.5 版本控制
12.6 为未来的GPU进行开发
12.6.1 开普勒架构
12.6.2 思考
12.7 后续学习资源
12.7.1 介绍
12.7.2 在线课程
12.7.3 教学课程
12.7.4 书籍
12.7.5 英伟达CUDA资格认证
12.8 本章小结
计算机软件界最大的变迁是从串行编程转向并行编程。其中,CUDA起到了重要的作用。究其本质,图形处理单元(Graphics Processor Unit,GPU)是为高速图形处理而设计的,它具有天然的并行性。CUDA采用一种简单的数据并行模型,再结合编程模型,从而无须操纵复杂的图形基元。
实际上,CUDA与之前的架构不同。它不要求程序员对图形或者图形基元有所了解,也不用程序员有任何这方面的知识。你也不一定要成为游戏开发人员。CUDA语言使得GPU看起来与别的可编程设备一样。
本书并不假定读者有CUDA或者并行编程的任何经验,仅假定读者有一定的C/C++语言编程知识。随着本书的不断深入,读者将越来越胜任CUDA的编程工作。本书包含更高级的主题,帮助你从不知晓并行编程的程序员成长为能够全方位发掘CUDA潜力的专家。
对已经熟悉并行编程概念和CUDA的程序员来说,本书包含丰富的学习资料。专设章节详细讨论GPU的架构,包括最新的费米(Fermi)和开普勒(Kepler)硬件,以及如何将它们的效能发挥到极致。任何可以编写C或C++程序的程序员都可以在经过几个小时的简单训练后编写CUDA程序。通过对本书的完整学习,你将从仅能得到数倍程序加速的CUDA编程新手成长为能得到数十倍程序加速的高手。
本书特别针对CUDA学习者而写。在保证程序正确性的前提下,侧重于程序性能的调优。本书将大大扩展你的技能水平和对编写高性能代码的认识,特别是GPU方面。
本书是实践者在实际应用程序中使用CUDA编程的实用指南。同时我们将提供所需的理论知识和背景介绍。因此,任何人(不管有无基础)都可以使用本书,从中学习如何进行CUDA编程。综上,本书是专业人士和GPU或并行编程学习者的理想之选。
本书编排如下:
第1章 从宏观上介绍流处理器(streaming processor)的演变历史,涉及几个重要的发展历程,正是它们把我们带入今天的GPU处理世界。
第2章 介绍并行编程的概念。例如,串行与并行程序的区别,以及如何采用不同的策略寻找求解问题之道。本章意在为既有串行程序员建立一个基本的认识,这里的概念将在后面进一步展开。
第3章 详尽地讲解CUDA设备及与其紧密相关的硬件和架构。为了编写最优性能的CUDA程序,适当了解设备硬件的相关知识是必要的。
第4章 介绍了如何在Windows、Mac和Linux等不同操作系统上安装和配置CUDA软件开发工具包,另外介绍可用于CUDA的主要调试环境。
第5章 介绍CUDA线程模型,并通过一些示例来说明线程模型是如何影响程序性能的。
第6章 我们需要了解不同的内存类型,它们在CUDA中的使用方式是影响性能的最大因素。本章借助实例详细讲解了不同类型内存的工作机制,并指出实践中容易出现的误区。
第7章 主要详述了如何在若干任务中恰当地协同CPU和GPU,并讨论了几个有关CPU/GPU编程的议题。
第8章 介绍如何在应用程序中编写和使用多GPU。
第9章 对CUDA编程中限制性能的主要因素予以详解,考察可以用来分析CUDA代码的工具和技术。
第10章 介绍了CUDA软件开发工具包的示例和CUDA提供的库文件,并介绍如何在应用程序中使用它们。
第11章 关注构建自己的GPU服务器或者GPU集群时的几个相关议题。
第12章 检视多数程序员在开发CUDA应用程序时易犯的错误类型,并对如何检测和避免这些错误给出了建议。
超级计算简史
1.1?简介
为什么我们会在一本关于CUDA的书籍中谈论超级计算机呢?超级计算机通常走在技术发展的最前沿。我们在这里看到的技术,在未来的5~10年内,将是桌面计算机中很普通的技术。2010年,在德国汉堡举行的一年一度的国际超级计算机大会上宣布,根据500强名单(),英伟达基于GPU的机器在世界最强大的计算机列表中位列第二。从理论上讲,它的峰值性能比强大的IBM Roadrunner和当时的第一名Cray Jaguar的性能还要高。当时Cray Jaguar的性能峰值接近3千万亿次。2011年,采用CUDA技术的英伟达GPU仍然是世界上最快的超级计算机。这时大家突然清楚地认识到,与简陋的桌面PC一起,GPU已经在高性能计算领域达到了很高的地位。
超级计算是我们在现代处理器中看到的许多技术的发展动力。由于对用更快的处理器来处理更大数据集的需求,工业界不断生产出更快的计算机。正是在这些发展变化中,GPU的CUDA技术走到了今天。
超级计算机和桌面计算正在向着异构计算发展——人们试图通过将中央处理器(Central Processor Unit,CPU)和图形处理器(Graphics Processor Unit,GPU)技术混合在一起来实现更高的性能。使用GPU的两个最大的国际项目是BOINC和Folding @ Home,它们都是分布式计算的项目。这两个项目使得普通人也能为具体的科学项目做出真正的贡献。在项目中,采用GPU加速器的CPU/GPU主机的贡献远远超过了仅装备CPU主机的贡献。截至2011年11月,大约550万台主机提供了约5.3千万亿次的计算性能,这将近是2011年世界上最快的超级计算机(日本富士通的“京(K)计算机”)计算性能的一半。
作为美国最快的超级计算机Jaguar的升级换代产品,命名为Titan的超级计算机计划于2013年问世。它将用近30万个CPU核和高达18?000个GPU板卡达到每秒10~20千万亿次的性能。正是由于有像Titan这样的来自世界各地的大力支持,无论是在HPC(高性能计算)行业,还是在桌面电脑领域,GPU编程已经成为主流。
现在,你可以自己“攒”或者购买一台具有数万亿次运算性能的桌面超级计算机了。在21世纪初期,这将会使你跻身500强的首位,击败拥有9632奔腾处理器的IBM ASCI Red。这不仅部分地展现了过去十几年计算机技术取得的巨大进步,更向我们提出了从现在开始的未来十几年,计算机技术将发展到何种水平这个问题。你可以完全相信在未来一段时间内,GPU将位于技术发展的前沿。因此,掌握GPU编程将是任何一个优秀开发人员必备的重要技能。
评论
还没有评论。