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

CUDA并行程序设计:GPU编程指南
作者 : (美)Shane Cook 著
译者 : 苏统华 李东 李松泽 魏通 译 马培军 主审
出版日期 : 2014-01-21
ISBN : 978-7-111-44861-7
定价 : 99.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 534
开本 : 16
原书名 : CUDA Programming: A Developer's Guide to Parallel Computing with GPUs
原出版社: Elsevier (Singapore) Pte Ltd
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

图书特色

本书旨在为读者学习CUDA打下坚实基础。涵盖如何理解串行程序并把它转化到单指令流多数据流编程模型下,以及如何基于CUDA实现高效的并行程序。本书除了提供多个实例,还深入讨论了GPU程序的优化,同时对共享内存、内存预读和线程的使用均有涉及。
—— Nagarajan Kandasamy博士,德雷塞尔大学电子与计算机工程系副教授

CUDA是一种专门为提高并行程序开发效率而设计的计算架构。在构建高性能应用程序时,CUDA架构可充分发挥GPU的强大计算功能,颇受广大开发者拥趸。本书以并行编程实践者视角,展示了全面、快速提升CUDA程序效能的途径。从并行机制到CUDA开发环境搭建,从GPU高性能计算相关硬件知识到并行计算和CUDA编程技巧,从核心概念到多个热点技术和高级主题,无所不包。本书侧重于CUDA实践应用,特别在CUDA程序优化上下足了工夫,例如发挥多GPU效力。难能可贵的是,作者结合多年实践经验,精心总结出开发者在使用CUDA过程中易犯的错误和有效的规避方法。
本书亮点:
全面介绍并行机制和CUDA编程,即便没有CUDA编程经验也能够轻松掌握;
细致指导,以帮助读者优化CUDA应用程序;
以实用技术演示如何在并行程序中管理内存、线程、算法和各种资源;
涵盖英伟达硬件上三大操作系统的CUDA开发;
每章附有练习,方便检验读者的掌握程度或为课堂提供讨论要点。


作者简介
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本(机械工业出版社)。现任哈尔滨工业大学软件学院高级讲师、硕士生导师。

技术审校
马培军 教授、博士生导师、哈尔滨工业大学软件学院院长。20余年行业经验,实践经验十分丰富。曾游学日本,获日本琦玉大学计算机应用专业硕士和博士学位,并在日本佳能集团工作多年。主要研究方向包括:航天软件工程、智能信息处理与信息融合、图像处理与识别、嵌入式系统仿真等。其主持或参加完成多项国家自然科学基金、国家863项目、国防基础科研和国际合作项目,获省部级二等奖2项,软件著作权3项,申请发明专利2项,在国内外期刊和会议上发表论文100余篇。现任哈尔滨工业大学计算机科学与技术学院航天软件工程研究中心主任、中国宇航学会计算机应用专业委员会委员、日本计算机服务公司IT教育顾问。


CUDA开发者社区技术总监亲自撰写,英伟达中国首批CUDA官方认证工程师翻译,译著双馨
全面、详实地讲解了CUDA并行程序设计的技术知识点和编程方法,包含大量实用代码示例,是目前学习CUDA编程最权威的著作之一

图书前言

过去的五年中,计算领域目睹了英伟达(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博士,德雷塞尔大学电子与计算机工程系副教授

CUDA是一种专门为提高并行程序开发效率而设计的计算架构。在构建高性能应用程序时,CUDA架构可充分发挥GPU的强大计算功能,颇受广大开发者拥趸。本书以并行编程实践者视角,为你展示全面、快速提升CUDA程序效能的途径。从并行机制到CUDA开发环境搭建,从GPU高性能计算相关硬件知识到并行计算和CUDA编程技巧,从核心概念到多个热点技术和高级主题,无所不包。本书侧重于CUDA实践应用,特别在CUDA程序优化上下足了工夫,例如发挥多GPU效力。难能可贵的,作者结合多年实践经验,精心总结开发者在使用CUDA过程中易犯的错误和有效的规避方法。
本书亮点如下:
 全面介绍并行机制和CUDA编程,即便没有CUDA编程经验;
 细致指导,以帮助读者优化CUDA应用程序;
 以实用技术演示如何在并行程序中管理内存、线程、算法和各种资源;
 涵盖英伟达硬件上三大操作系统下的CUDA开发;
 每章附有练习,方便检验读者的掌握程度或为课堂提供讨论要点。

作者简介

(美)Shane Cook 著:暂无简介

译者简介

苏统华 李东 李松泽 魏通 译 马培军 主审:暂无简介

译者序

我们正在由单核时代进入多核时代和众核时代。在单核时代,软件行业一直享用着“免费的午餐”。 受益于CPU主频的指数级提速,开发软件无须任何代码修改,只要换上新一代的处理器,即可获得性能上的飞速提升。随着汹涌而来的众核时代,这里已经“不再有免费午餐”。随着计算架构的不断演进,编程模型也发生着深刻的变化。计算机软件行业面临着最大的变迁问题——从串行、单线程的问题求解方式切换到大规模线程同时执行的问题求解方式。而CUDA提供了非常优秀的可扩展架构,以支持这种大规模并行程序设计需求。
  本书是一本很出众的CUDA书籍,内容全面而又不落窠臼。全书可以分成四个部分。第一部分为背景篇,包括前4章。其中前两章简述流处理器历史和并行计算基本原理,第3~4章分别介绍了CUDA的硬件架构与计算能力和软件开发配置。第二部分为CUDA基本篇,包括第5~7章。第5、6章依次介绍了CUDA线程抽象模型和内存抽象模型,在此过程中,紧密结合直方图统计实例和样本排序实例进行讨论。为了更好地增进读者的实践经验,第7章全方位剖析了AES加密算法的CUDA实现过程。第三部分为CUDA扩展篇,包括第8~10章。其中第8、9章面向优化执行性能,而第10章为提升开发生产效率。第8章从充分利用多个硬件设备的角度,讲述了流的使用。相反的,第9章从程序优化角度,给出了CUDA性能调优的全方位指导。第10章介绍了一些常用的函数库和CUDA开发包中提供的优质SDK,为大型软件的快速发布提供了支持。第四部分为CUDA经验篇,包括最后的两章。这两章分别针对硬件系统搭建和软件生产过程中的共性问题提供建议,是作者多年CUDA开发经验的总结。
  本书特色鲜明。作者在介绍CUDA时,仿佛在跟朋友聊天论道,谈论家常,讲着故事,娓娓道来。论到关键之处,却又语重心长,体贴备至。在不知不觉中,把CUDA的魅力展示得淋漓尽致,同时把CUDA程序设计的功力传授于你。
  本书的翻译工作经过精心的组织,整个过程得到大批专业人士的帮助。在交付出版社之前,译者团队经过了全书讨论、初译、初核、再译、再核、审校等六个环节。很荣幸地邀请到在哈尔滨工业大学长年承担“并行程序设计”和“计算机体系结构”等课程教学工作的李东教授,加盟本书的翻译团队。李东教授翻译了第1~3章,对保证本书的翻译质量起到了重要作用。本书第5~7章的初译以及第9章部分小节的初译和再译由李松泽负责。本书第10章和第12章的初译以及第9章部分小节的初译和再译由魏通负责。苏统华负责了本书前言、第4章、第8章、第9章部分小节和第11章的初译和再译任务,除此之外,他还负责了全书的初核和再核任务。特别感谢哈尔滨工业大学软件学院院长马培军教授,他应邀审校了全部译文,提出了很多中肯的改进意见。本书在交到出版社之后,又得到了机械工业出版社编辑团队的大力帮助,他们的工作专业而细致,让人钦佩。另外还要感谢哈尔滨工业大学软件学院2012级数字媒体方向的硕士研究生,参与了部分内容的初译,特别是王烁行同学做了不少工作。如果没有这么多人的辛勤奉献,这本中译本很难如期呈现。另外,国家自然科学基金(资助号:61203260)对本书的翻译提供了部分资助,哈尔滨工业大学创新实验课《CUDA高性能并行程序设计》也对本书的翻译提供了大力支持。
  由于本书涉及面广,很多术语较新,目前尚无固定译法,翻译难度很大。有时,为一个术语选择一个恰当的中文译法,译者经常反复推敲、讨论。但由于译者水平有限,译文中难免存在一些问题,真诚地希望读者朋友们将您的意见发往 cudabook@gmail.com。

苏统华
哈尔滨工业大学软件学院

图书目录

致中国读者
译者序
前 言
第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 英伟达和CUDA 12
1.10 GPU硬件 13
1.11 CUDA的替代选择 15
1.11.1 OpenCL 15
1.11.2 DirectCompute 16
1.11.3 CPU的替代选择 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.1 PC架构 35
3.2 GPU硬件结构 39
3.3 CPU与GPU 41
3.4 GPU计算能力 42
3.4.1 计算能力1.0 42
3.4.2 计算能力1.1 43
3.4.3 计算能力1.2 44
3.4.4 计算能力1.3 44
3.4.5 计算能力2.0 44
3.4.6 计算能力2.1 46
第4章 CUDA环境搭建 48
4.1 简介 48
4.2 在Windows下安装软件开发工具包 48
4.3 Visual Studio 49
4.3.1 工程 49
4.3.2 64位用户 49
4.3.3 创建工程 51
4.4 Linux 52
4.5 Mac 55
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 按需选用GPU 255
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章 函数库和SDK 410
10.1 简介 410
10.2 函数库 410
10.2.1 函数库通用规范 411
10.2.2 NPP 411
10.2.3 Thrust 419
10.2.4 CuRAND 434
10.2.5 CuBLAS库 438
10.3 CUDA运算SDK 442
10.3.1 设备查询 443
10.3.2 带宽测试 445
10.3.3 SimpleP2P 446
10.3.4 asyncAPI和cudaOpenMP 448
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 HDSL 483
11.10.4 大容量存储需求 483
11.10.5 联网 483
11.11 电源选择 484
11.12 操作系统 487
11.12.1 Windows 487
11.12.2 Linux 488
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

教学资源推荐
作者: 陈秋劲
作者: 苏俊
作者: (美)Kenneth C.Louden
作者: 许畅 陈嘉 朱晓瑞 编著
参考读物推荐
作者: James Gosling, Bill Joy, Guy Steele, Gilad Bracha
作者: 周志鹏 著
作者: 陆凌牛 著