CUDA并行程序设计:GPU编程指南
本书是CUDA并行程序设计领域最全面、最详实和最具权威性的著作之一,由CUDA开发者社区技术总监亲自撰写,英伟达中国首批CUDA官方认证工程师翻译,详实地讲解了CUDA并行程序设计的技术知识点(平台、架构、硬件知识、开发工具和热点技术)和编程方法,包含大量实用代码示例,实践性非常强。
基本信息
- 定价
99.00
- 外文名
CUDA Programming:A Developer's Guide to Parallel Computing with GPUs
- 出版社
机械工业出版社
- 作者
库克 (Shane Cook) 马培军
- 开本
16
基本内容
本书是CUDA并行程序设计领域最全面、最详实和最具权威性的著作之一,由CUDA开发者社区技术总监亲自撰写,英伟达中国首批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应用中易犯错误以及应对建议。
编辑推荐
CUDA开发者社区技术总监亲自撰写,英伟达中国首批CUDA官方认证工程师翻译,译著双馨 全面、详实地讲解了CUDA并行程序设计的技术知识点和编程方法,包含大量实用代码示例,是目前学习CUDA编程最权威的著作之一
目录
致中国读者 译者序 前 言 第1章 超级计算简史1 1.1简介1 1.2冯·诺依曼计算机架构2 1.3克雷4 1.4连接机5 1.5 Cell处理器6 1.6多点计算8 1.7早期的GPGPU编程10 1.8单核解决方案的消亡11 1.9英伟达和CUDA12 1.10GPU硬件13 1.11CUDA的替代选择15 1.11.1 OpenCL15 1.11.2DirectCompute16 1.11.3CPU的替代选择16 1.11.4编译指令和库17 1.12本章小结18 第2章 使用GPU理解并行计算19 2.1简介19 2.2传统的串行代码19 2.3串行/并行问题21 2.4并发性22 2.5并行处理的类型25 2.5.1基于任务的并行处理25 2.5.2基于数据的并行处理27 2.6弗林分类法29 2.7常用的并行模式30 2.7.1基于循环的模式30 2.7.2派生/汇集模式31 2.7.3分条/分块33 2.7.4分而治之34 2.8本章小结34 第3章 CUDA硬件概述35 3.1PC架构35 3.2GPU硬件结构39 3.3CPU与GPU41 3.4GPU计算能力42 3.4.1计算能力1.042 3.4.2计算能力1.143 3.4.3计算能力1.244 3.4.4计算能力1.344 3.4.5计算能力2.044 3.4.6计算能力2.146 第4章 CUDA环境搭建48 4.1简介48 4.2在Windows下安装软件开发工具包48 4.3VisualStudio49 4.3.1工程49 4.3.264位用户49 4.3.3创建工程51 4.4Linux52 4.5Mac55 4.6安装调试器56 4.7编译模型58 4.8错误处理59 4.9本章小结60 第5章 线程网格、线程块以及线程61 5.1 简介61 5.2 线程61 5.2.1 问题分解62 5.2.2 CPU与GPU的不同63 5.2.3 任务执行模式64 5.2.4 GPU线程64 5.2.5 硬件初窥66 5.2.6 CUDA内核69 5.3 线程块70 5.4 线程网格74 5.4.1 跨幅与偏移76 5.4.2 X与Y方向的线程索引77 5.5 线程束83 5.5.1 分支83 5.5.2 GPU的利用率85 5.6 线程块的调度88 5.7 一个实例——统计直方图89 5.8 本章小结96 第6章 CUDA内存处理99 6.1 简介99 6.2 高速缓存100 6.3 寄存器的用法103 6.4 共享内存112 6.4.1 使用共享内存排序113 6.4.2 基数排序117 6.4.3 合并列表123 6.4.4 并行合并128 6.4.5 并行归约131 6.4.6 混合算法134 6.4.7 不同GPU上的共享内存138 6.4.8 共享内存小结139 6.5 常量内存140 6.5.1 常量内存高速缓存140 6.5.2 常量内存广播机制142 6.5.3 运行时进行常量内存更新152 6.6 全局内存157 6.6.1 记分牌165 6.6.2 全局内存排序165 6.6.3 样本排序168 6.7 纹理内存188 6.7.1 纹理缓存188 6.7.2 基于硬件的内存获取操作189 6.7.3 使用纹理的限制190 6.8 本章小结190 第7章 CUDA实践之道191 7.1 简介191 7.2 串行编码与并行编码191 7.2.1 CPU与GPU的设计目标191 7.2.2 CPU与GPU上的最佳算法对比194 7.3 数据集处理197 7.4 性能分析206 7.5 一个使用AES的示例218 7.5.1 算法219 7.5.2 AES的串行实现223 7.5.3 初始内核函数224 7.5.4 内核函数性能229 7.5.5 传输性能233 7.5.6 单个执行流版本234 7.5.7 如何与CPU比较235 7.5.8 考虑在其他GPU上运行244 7.5.9 使用多个流248 7.5.10 AES总结249 7.6 本章小结249 第8章 多CPU和多GPU解决方案252 8.1 简介252 8.2 局部性252 8.3 多CPU系统252 8.4 多GPU系统253 8.5 多GPU算法254 8.6 按需选用GPU255 8.7 单节点系统258 8.8 流259 8.9 多节点系统273 8.10 本章小结284 第9章 应用程序性能优化286 9.1 策略1:并行/串行在GPU/CPU上的问题分解286 9.1.1 分析问题286 9.1.2 时间286 9.1.3 问题分解288 9.1.4 依赖性289 9.1.5 数据集大小292 9.1.6 分辨率293 9.1.7 识别瓶颈294 9.1.8 CPU和GPU的任务分组297 9.1.9 本节小结299 9.2 策略2:内存因素299 9.2.1 内存带宽299 9.2.2 限制的来源300 9.2.3 内存组织302 9.2.4 内存访问以计算比率303 9.2.5 循环融合和内核融合308 9.2.6 共享内存和高速缓存的使用309 9.2.7 本节小结311 9.3 策略3:传输311 9.3.1 锁页内存311 9.3.2 零复制内存315 9.3.3 带宽限制322 9.3.4 GPU计时327 9.3.5 重叠GPU传输330 9.3.6 本节小结334 9.4 策略4:线程使用、计算和分支335 9.4.1 线程内存模式335 9.4.2 非活动线程337 9.4.3 算术运算密度338 9.4.4 一些常见的编译器优化342 9.4.5 分支347 9.4.6 理解底层汇编代码351 9.4.7 寄存器的使用355 9.4.8 本节小结357 9.5 策略5:算法357 9.5.1 排序358 9.5.2 归约363 9.5.3 本节小结384 9.6 策略6:资源竞争384 9.6.1 识别瓶颈384 9.6.2 解析瓶颈396 9.6.3 本节小结403 9.7 策略7:自调优应用程序403 9.7.1 识别硬件404 9.7.2 设备的利用405 9.7.3 性能采样407 9.7.4 本节小结407 9.8 本章小结408 第10章 函数库和SDK410 10.1 简介410 10.2 函数库410 10.2.1 函数库通用规范411 10.2.2 NPP411 10.2.3 Thrust419 10.2.4 CuRAND434 10.2.5 CuBLAS库438 10.3 CUDA运算SDK442 10.3.1 设备查询443 10.3.2 带宽测试445 10.3.3 SimpleP2P446 10.3.4 asyncAPI和cudaOpenMP448 10.3.5 对齐类型455 10.4 基于指令的编程457 10.5 编写自己的内核464 10.6 本章小结466 第11章 规划GPU硬件系统467 11.1 简介467 11.2 CPU处理器469 11.3 GPU设备470 11.3.1 大容量内存的支持471 11.3.2 ECC内存的支持471 11.3.3 Tesla计算集群驱动程序471 11.3.4 更高双精度数学运算472 11.3.5 大内存总线带宽472 11.3.6 系统管理中断472 11.3.7 状态指示灯472 11.4 PCI—E总线472 11.5 GeForce板卡473 11.6 CPU内存474 11.7 风冷475 11.8 液冷477 11.9 机箱与主板479 11.10 大容量存储481 11.10.1 主板上的输入/输出接口481 11.10.2 专用RAID控制器481 11.10.3 HDSL483 11.10.4 大容量存储需求483 11.10.5 联网483 11.11 电源选择484 11.12 操作系统487 11.12.1 Windows487 11.12.2 Linux488 11.13 本章小结488 第12章 常见问题、原因及解决方案489 12.1 简介489 12.2 CUDA指令错误489 12.2.1 CUDA错误处理489 12.2.2 内核启动和边界检查490 12.2.3 无效的设备操作491 12.2.4 volatile限定符492 12.2.5 计算能力依赖函数494 12.2.6 设备函数、全局函数和主机函数495 12.2.7 内核中的流496 12.3 并行编程问题497 12.3.1 竞争冒险497 12.3.2 同步498 12.3.3 原子操作502 12.4 算法问题504 12.4.1 对比测试504 12.4.2 内存泄漏506 12.4.3 耗时的内核程序506 12.5 查找并避免错误507 12.5.1 你的GPU程序有多少错误507 12.5.2 分而治之508 12.5.3 断言和防御型编程509 12.5.4 调试级别和打印511 12.5.5 版本控制514 12.6 为未来的GPU进行开发515 12.6.1 开普勒架构515 12.6.2 思考518 12.7 后续学习资源519 12.7.1 介绍519 12.7.2 在线课程519 12.7.3 教学课程520 12.7.4 书籍521 12.7.5 英伟达CUDA资格认证521 12.8 本章小结522
作者简介
Shane Cook CUDA开发者社区技术总监,有20余年行业经验。当认识到异构系统以及CUDA对于已有串行和并行编程技术的革命性冲击时,创立了CUDA开发者社区(欧洲的咨询公司,专门帮助企业重构代码以充分利用GPU硬件的威力)。他专注于高性能软件开发、GPU利用、嵌入式系统,并参与了多个C语言编程标准的建设,包括广泛应用于汽车软件行业的汽车工业软件MISRA Safer C。他常为德国汽车行业、国防承包行业、北电网络以及福特汽车公司等机构或蓝筹股公司提供专业咨询服务和软件定制开发。 译者简介 苏统华 博士,英伟达中国首批CUDA官方认证工程师,主要研究领域包括大规模并行计算、模式识别、物联网智能信息处理、智能媒体交互与计算等。2013年,其所开发的CUDA识别算法,在文档分析和识别国际会议(ICDAR’ 2013)上获得手写汉字识别竞赛的双料冠军。另外,他在手写汉字识别领域建立了里程碑式的工作,论文他引300余次;他所建立的HIT-MW库,为全世界100多家科研院所采用;目前负责国家自然科学基金项目2项。著有英文专著《Chinese Handwriting Recognition: An Algorithmic Perspective》(德国施普林格出版社),CUDA相关译作2本(机械工业出版社)。现任哈尔滨工业大学软件学院高级讲师、硕士生导师。
序言
前言 过去的五年中,计算领域目睹了英伟达(NVIDIA)公司带来的变革。随后的几年,英伟达公司异军突起,逐渐成长为最知名的游戏硬件制造商之一。计算统一设备架构(Compute Unified Device Architecture,CUDA)编程语言的引入,第一次使这些非常强大的图形协处理器为C程序员日常所用,以应对日益复杂的计算工作。从嵌入式设备行业到家庭用户,再到超级计算机,所有的一切都因此而改变。 计算机软件界最大的变迁是从串行编程转向并行编程。其中,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应用程序时易犯的错误类型,并对如何检测和避免这些错误给出了建议。
名人推荐
本书旨在为读者学习cuDA打下坚实基础。涵盖如何理解串行程序并把它转化到单指令流多数据流编程模型下,以及如何基于cuDA实现高效的并行程序。本书除了提供多个实例,还深入讨论了GPU程序的优化,同时对共享内存、内存预读和线程的使用均有涉及。 ——Nagarajan Kandasamy博士,德雷塞尔大学电子与计算机工程系副教授