CUDA专家手册:GPU编程权威指南 (高性能计算技术丛书) ((美)Nicholas Wilt) (z-library.sk, 1lib.sk, z-lib.sk)
c
No Description
2
Views
0
Downloads
0.00
Total Donations
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
Page
1
(This page has no text content)
Page
2
高性能计算系列丛书 CUDA专家手册:GPU编程权威指南 The CUDA Handbook:A Comprehensive Guide to GPU Programming (美)威尔特(Nicholas Wilt) 著 苏统华 马培军 刘曙 吕家明 译 ISBN:978-7-111-47265-0 本书纸版由机械工业出版社于2014年出版,电子版由华章分社(北京 华章图文信息有限公司)全球范围内制作与发行。 版权所有,侵权必究 客服热线:+ 86-10-68995265 客服信箱:service@bbbvip.com 官方网址:www.hzmedia.com.cn 新浪微博 @研发书局 腾讯微博 @yanfabook
Page
3
目录 中文版序 推荐序 译者序 前言 第一部分 基础知识 第1章 简介 1.1 方法 1.2 代码 1.3 资源 1.4 结构 第2章 硬件架构 2.1 CPU配置 2.2 集成GPU 2.3 多GPU 2.4 CUDA中的地址空间 2.5 CPU/GPU交互 2.6 GPU架构 2.7 延伸阅读 第3章 软件架构
Page
4
3.1 软件层 3.2 设备与初始化 3.3 上下文 3.4 模块与函数 3.5 内核(函数) 3.6 设备内存 3.7 流与事件 3.8 主机内存 3.9 CUDA数组与纹理操作 3.10 图形互操作性 3.11 CUDA运行时与CUDA驱动程序API 第4章 软件环境 4.1 nvcc——CUDA编译器驱动程序 4.2 ptxas——PTX汇编工具 4.3 cuobjdump 4.4 nvidia-smi 4.5 亚马逊Web服务 第二部分 CUDA编程 第5章 内存 5.1 主机内存 5.2 全局内存
Page
5
5.3 常量内存 5.4 本地内存 5.5 纹理内存 5.6 共享内存 5.7 内存复制 第6章 流与事件 6.1 CPU/GPU的并发:隐藏驱动程序开销 6.2 异步的内存复制 6.3 CUDA事件:CPU/GPU同步 6.4 CUDA事件:计时 6.5 并发复制和内核处理 6.6 映射锁页内存 6.7 并发内核处理 6.8 GPU/GPU同步:cudaStreamWaitEvent() 6.9 源代码参考 第7章 内核执行 7.1 概况 7.2 语法 7.3 线程块、线程、线程束、束内线程 7.4 占用率 7.5 动态并行
Page
6
第8章 流处理器簇 8.1 内存 8.2 整型支持 8.3 浮点支持 8.4 条件代码 8.5 纹理与表面操作 8.6 其他指令 8.7 指令集 第9章 多GPU 9.1 概述 9.2 点对点机制 9.3 UVA:从地址推断设备 9.4 多GPU间同步 9.5 单线程多GPU方案 9.6 多线程多GPU方案 第10章 纹理操作 10.1 简介 10.2 纹理内存 10.3 一维纹理操作 10.4 纹理作为数据读取方式 10.5 使用非归一化坐标的纹理操作
Page
7
10.6 使用归一化坐标的纹理操作 10.7 一维表面内存的读写 10.8 二维纹理操作 10.9 二维纹理操作:避免复制 10.10 三维纹理操作 10.11 分层纹理 10.12 最优线程块大小选择以及性能 10.13 纹理操作快速参考 第三部分 实例 第11章 流式负载 11.1 设备内存 11.2 异步内存复制 11.3 流 11.4 映射锁页内存 11.5 性能评价与本章小结 第12章 归约算法 12.1 概述 12.2 两遍归约 12.3 单遍归约 12.4 使用原子操作的归约 12.5 任意线程块大小的归约
Page
8
12.6 适应任意数据类型的归约 12.7 基于断定的归约 12.8 基于洗牌指令的线程束归约 第13章 扫描算法 13.1 定义与变形 13.2 概述 13.3 扫描和电路设计 13.4 CUDA实现 13.5 线程束扫描 13.6 流压缩 13.7 参考文献(并行扫描算法) 13.8 延伸阅读(并行前缀求和电路) 第14章 N-体问题 14.1 概述 14.2 简单实现 14.3 基于共享内存实现 14.4 基于常量内存实现 14.5 基于线程束洗牌实现 14.6 多GPU及其扩展性 14.7 CPU的优化 14.8 小结
Page
9
14.9 参考文献与延伸阅读 第15章 图像处理的归一化相关系数计算 15.1 概述 15.2 简单的纹理实现 15.3 常量内存中的模板 15.4 共享内存中的图像 15.5 进一步优化 15.6 源代码 15.7 性能评价 15.8 延伸阅读 附录A CUDA专家手册库 术语表
Page
10
中文版序 得知本书正在被翻译成瑰丽的汉字,我难抑内心的激动。众核计 算对中国读者来说并不陌生。中国已经建造了多个最快的超级计算 机,其中很多采用了CUDA技术。我们耳熟能详的天河-1A,建成于2010 年10月,配备了7168片特斯拉(Tesla)M2050型号的GPU。本书第4章 介绍的亚马逊cg1.4xlarge实例,也采用了同种型号的GPU。天河-1A曾 雄霸世界超级计算机500强榜首逾半年之久,即使现在,它仍排在世界 最快计算机的前12位。它惊人的高速度源于中国自主研发的互联技术 把来自英特尔和英伟达的硬件高效地集成起来了。 当然,CUDA并非只能应用于超级计算机。GPU的出货量巨大,相较 其他众核计算技术,它们具有价格优势。因此,支持CUDA的GPU很容易 用来搭建经济的计算平台,这对于并行程序设计的教育和教学意义重 大。 CUDA技术仍在迅猛发展着。我敢断定,它将继续在并行计算的大 潮中扮演重要角色。本书向大家展示了CUDA的内部工作机制,此中译 本将推动CUDA在中国的普及和发展。 最后,向承担本书翻译工作的苏博士及其团队,致以诚挚谢意! 感谢他们孜孜不倦地致力于GPU计算的推广,特别是把本书带给广大中
Page
11
国读者。 Nicholas Wilt
Page
12
推荐序 自CPU单核性能在2004年左右停止提升后,功耗的限制及大量并行 应用本身的特点决定了多核(CPU)加众核(GPU)的异构架构成为从 最快的超级计算机到手机等移动设备上计算芯片的主流架构。所以如 果想在现在和未来的任何计算设备上写出性能具有竞争力的程序,所 有的开发者都需要学习异构架构下的并行计算技术。CUDA是目前最成 熟、使用者最多的异构并行计算技术。本书对开发者更深入地掌握主 流异构并行计算技术会有很大帮助。 程序优化的目的是提高整体性能,所以优化时需要做的第一件事 就是找出程序的哪个部分需要提高整体性能,即瓶颈分析。这是至关 重要而又经常被刚接触优化的开发者忽略的一件事。如果不先进行定 量的瓶颈分析,而是立刻优化自己认为是瓶颈的地方,经常会事倍功 半。瓶颈分析的第一步是热点分析,即找出哪些部分占程序的大部分 运行时间。热点分析可以通过在源代码里加时间测量代码或使用性能 分析工具(profiler)进行。当确认整体瓶颈是GPU的函数或数据传输 后,读者就可参阅本书对应的GPU优化知识进行优化。 本书第一部分共4章,介绍GPU的架构、系统软件及编程环境。性 能优化本质上就是通过理解架构及相应系统软件的特点,并在程序中
Page
13
利用这些特点更高效地完成计算。所以优化的第一步就应该是理解目 标平台的架构及系统软件基础。这部分讨论的很多内容是第一次在公 开的CUDA书籍中出现。 第二部分共6章,介绍CUDA编程各个方面的具体知识,特别是如何 利用GPU特点的很多优化技术。 如果性能分析告诉我们CPU-GPU数据传输是瓶颈,那么可以参考第 6章使用流来计算隐藏数据传输;另一方面,如果GPU函数的执行是瓶 颈,那么下一步就是分析内核函数的架构瓶颈。此时,定量分析也是 至关重要的。如果不先做定量分析找出瓶颈在哪里,而是立刻随机地 尝试各种优化技术,往往难以收到成效。这样随机尝试,可能有些优 化恰好有效果,有些优化则没有效果,会浪费大量时间在尝试各种技 术上。另外,我们也无法明白为什么一种优化有效果而其他的却没有 效果。除此之外,如果不做分析,我们也无从得知一个内核函数到底 优化到何种程度就可以结束,从而有可能花费大量时间在一个已没有 太大优化空间的内核函数上。这些都是优化技术的初学者很容易觉得 优化是一件复杂而低效的工作的原因。但其实如果能采用先做定量分 析再采用相应的优化技术的方法,优化完全可以变成一种高效、有据 可依的技术。 对内核函数做分析,本质就是找出内核函数的性能瓶颈在架构的 什么地方。一般情况下,性能瓶颈有三种可能类型。
Page
14
1.内存密集型。这种情况是内核函数的大部分时间都花在数据的 读写指令上。从硬件的角度看,在这个内核函数运行期间,大部分时 间都花在数据在内存总线的传输上并且内存总线的带宽已充分利用。 对这种情况,如何优化可以参考第5章及第10章的内容。 2.指令密集型。这种情况是内核函数的大部分时间都花在各种指 令的执行上。从硬件的角度看,在这个内核函数运行期间,大部分时 间都花在处理其指令单元的执行上。对这种情况,如何优化可以参考 第8章的内容。 3.延迟密集型。这种情况是内核函数的大部分时间都花在等待高 延迟的指令(如内存读写)上。从硬件的角度看,在这个内核函数运 行期间,大部分时间都花在数据在内存总线的传输上但内存总线的带 宽没有被充分利用。对这种情况,如何优化可以参考第7章占有率的内 容。 本书的第三部分共5章,给出了多个领域的具体例子,介绍如何应 用各种优化技术。本部分的内容有助于读者学以致用。 虽然本书具体讨论CUDA,但并行优化的技术及想法对几乎任何众 核架构都是适用的。所以读者如果在阅读本书了解具体CUDA优化技术 之外,也能有意识地体会蕴含其中的并行优化的基本方法,会有更大 收获。
Page
15
王鹏 英伟达高性能计算开发技术经理
Page
16
译者序 CUDA入门相对比较容易。也许只需寥寥几个小时的学习,你就可 以开始编写支持CUDA的程序,初窥GPU加速的魅力。但是要修炼成为榨 取GPU处理能力的高级CUDA工程师,却并非易事。你需要了解并行计算 的基本理论,需要研究CPU/GPU的硬件架构,需要熟悉CUDA的软件抽象 架构和工具,需要掌握必要的领域知识,等等。目前,可以助你入门 的CUDA书籍和教程为数不少,但在利用CUDA来深度榨取GPU潜力方面, 仍几乎空白。 本书为深度优化CUDA程序性能提供了全方位的指导。乍看起来, 本书只是一本参考手册。不错,它确实基于英伟达官方CUDA参考手册 的很多内容。然而它又不单单是一本传统意义上的手册,它比较全面 地介绍了CUDA的高级编程特性,是该领域难得的权威参考书。全书高 屋建瓴而又简明扼要。作者从繁芜的文献资源中提炼并予以升华形成 独到的总结。对很多复杂的主题,能够举重若轻;在很多关键的问题 上,给大家一种豁然开朗之感。很多精辟论述是市面上任何一本GPU书 籍所缺失的。译者在阅读本书时,亦为作者在技术和语言上的双重驾 驭能力所折服。
Page
17
本书作者Wilt从事GPU底层开发逾20年,功力深厚。在CUDA诞生之 前,从事了8年Direct3D的开发;在英伟达供职的8年间,参与了CUDA 的开发,实现了多数CUDA的抽象机制;目前转战亚马逊,从事GPU云产 品的开发。作者根据自身多年的经验积淀,对CUDA编程模型进行了深 入浅出的介绍,并结合四个典型应用场合,完美诠释了它们的具体用 法和优化过程。得益于本书的启发,我们研究组基于CUDA的文字识别 算法得到194X的加速,使我们能够抢在其他竞争者之前,取得2013年 手写汉字识别竞赛的两项冠军。很多时候,速度意味着胜利! 本书的技术深度和欲覆盖的读者层面,决定了本书翻译工作的难 度。本书的翻译持续了一年之久,期间得到过很多人的帮助。除了本 书列出的四位译者外,还有5位译者参与了本书的初稿翻译:韦振良参 与了第2章和第7章,李硕参与了第4章和第6章,李松泽参与了第10 章,孙黎参与了第14章,胡光龙参与了第15章。其中,与光龙是在参 加第一届英伟达认证工程师的考试途中相遇,我们一起迷了路、一起 考试过关、一起分享CUDA技术点滴,又一起在本书的翻译期间进行合 作,谢谢光龙的友谊和无私帮助。在本书译文统稿之后,我们努力想 找到合适的CUDA专家为我们把关。如果没有英伟达公司的侯宇涛经 理,这可能会变成无法完成的任务。感谢侯经理为我们推荐了最优秀 的技术审校专家,帮我们邀请了高性能计算开发技术中国区经理王鹏 博士为本译作写序并选定本译作在全国推广。感谢英伟达高性能计算 部门的专家王泽寰和赖俊杰,即使在春节期间,他们也在为改进本书
Page
18
的译稿质量而绞尽脑汁。如果没有泽寰和赖经理的审校,原书的内容 恐难以尽可能原汁原味地展现。王鹏经理特意为本书作了推荐序,其 中浓缩了他多年的CUDA性能优化经验;非常感谢,您真的做到了“读 者最需要什么,您就写点什么”的宗旨。最后,还要特别感谢机械工 业出版社的编辑团队,他们做了大量卓有成效的工作,是本书的幕后 英雄。 本书的翻译,还得到了多项项目的资助,在此一并致谢。国家自 然科学基金(资助号:61203260)、黑龙江省科研启动基金(资助 号:LBH-Q13066)、哈尔滨工业大学科研创新基金(资助号: HITNSRIF2015083)对本书的翻译提供了部分资助。另外,哈尔滨工业 大学创新实验课《CUDA高性能并行程序设计》、黑龙江省教育厅高等 教育教学改革项目(资助号:JG2013010224)、哈尔滨工业大学研究 生教育教学改革研究项目(资助号:JCJS-201309)也对本书的翻译提 供了大力支持。 很多时候,翻译技术书籍是件吃力不讨好的事情。即使是最有资 格的译者,也一定无法免受被读者指责的境遇。对读者负责,对CUDA 教学推广负责,是我和我的团队始终铭记的准则。我们很享受翻译本 书的过程,也很愿意承担因我们的水平和疏忽所招致的批评。文中可 能存在的任何翻译问题,都是我们的责任。真诚地希望读者朋友不吝 赐教,欢迎大家的任何意见:cudabook@gmail.com。
Page
19
并行计算是计算的未来。希望本书的翻译可以帮助你让并行计算 与大数据成功联姻,并享用由此带来的前所未有的新鲜体验。愿你的 CUDA探索之旅愉快! 苏统华 哈尔滨工业大学软件学院
Page
20
前言 如果你正在读本书,意味着我无须再向你兜售CUDA。你应该已经 对CUDA有所了解,可能使用过英伟达的SDK和文档,抑或参加过并行程 序设计的课程,再或者阅读过类似《CUDA by Example》(Jason Sanders和Edward Kandrot著,2011年由Addison-Wesley出版)这样的 入门书籍。 我在审校《CUDA by Example》时,惊诧于该书内容的浅显。它假 设读者是零基础,试图描述从内存类型及其实际应用到图形互操作 性,甚至到原子操作等方方面面的内容。它是很优秀的CUDA入门书 籍,但也只能做到泛泛而谈。对于更深层次的知识,例如,平台的工 作机理、GPU的硬件结构、编译器驱动程序nvcc以及以前缀求和(“扫 描”)为代表的基本并行算法,则鲜有涉及。 本书考虑到不同基础的读者,旨在帮助CUDA新手进阶中级水平, 同时帮助中级程序员继续提升他们的水平到一个新高度。对于入门性 质的书籍,最好从头到尾阅读,而对本书则可以根据需要选读。如果 你正准备建立支持CUDA的新平台并在上面进行编程,建议你精读第2 章。如果你正纳闷你的应用程序是否将受益于CUDA流带来的额外并发 性,你应该查看第6章。其他的章节分别提供了软件架构、GPU的纹理
The above is a preview of the first 20 pages. Register to read the complete e-book.
AI Reading Assistant
Whole-book reading guide from stratified index samples; jump to passages in the text
AI guide
【One-Line Pitch】
A deep, architecture-first guide to CUDA for developers who already write GPU code and want to understand why it runs fast or slow—covering hardware internals, memory models, concurrency, and advanced optimization patterns with concrete, measurable examples.
【Book Arc】
- **Opening (~0%–11%)**: Sets the stage with GPU history and the shift to heterogeneous CPU+GPU computing, then lays out the book’s three-part structure: hardware/software architecture, programming model, and advanced case studies. Establishes why bottleneck analysis must precede optimization.
- **Early (~11%–33%)**: Dives into hardware foundations—virtual memory, page tables, TLB behavior, and the host interface—then explains the CUDA runtime vs. driver API split, context management (including the floating-context trick for multi-GPU), and introduces streams/events as the coarse-grained concurrency mechanism. Also covers host memory types (pageable vs. pinned) and why pinned memory enables async copies.
- **Middle (~33%–56%)**: Moves into the programming model proper: global/static/shared memory allocation, cache behavior across SM 2.x and 3.x, warp-level memory access patterns, and the cost of CPU/GPU synchronization. Includes practical measurement experiments (e.g., null kernel launch overhead) and a first look at reduction kernels—the book’s recurring example.
- **Late (~56%–78%)**: Explores the SM instruction set (SASS), special function units (SFU) and their precision trade-offs, then covers multi-GPU programming via peer-to-peer addressing and copy, plus texture and surface memory in depth—including pitch, normalized coordinates, and the new-in-Fermi surface read/write intrinsics.
- **Ending (~78%–100%)**: Focuses on advanced algorithm patterns: warp-level reductions using shuffles and atomics, parallel scan (prefix sum) with circuit diagrams and recursive implementations, and a full case study on normalized cross-correlation for image matching—showing how to combine texture cache, shared memory, and tiling for real performance gains.
【Key Takeaways】
- **Bottleneck analysis before optimization** (Opening): Profile to find the actual hotspot (GPU kernel vs. data transfer) before touching code; optimizing the wrong part wastes effort. Use timing code or profilers to quantify first.
- **Pinned memory is the gateway to async transfers** (Early): Pageable memory can’t be accessed by the GPU directly; CUDA uses staging buffers. Pinned (page-locked) memory enables faster copies, async operations, and even direct kernel access via mapped memory—critical for hiding transfer latency.
- **Streams and events are the coarse-grained concurrency toolkit** (Early): They let you overlap CPU/GPU work, DMA copies with kernel execution, and even run multiple kernels or GPUs in parallel. Operations within a stream are serial; concurrency comes from using multiple streams.
- **Context management is a hidden performance lever** (Early): The driver API’s push/pop context stack lets a single thread drive multiple GPUs or libraries create “floating” contexts without knowing their caller. On WDDM (Windows Vista+), popping a context with pending commands triggers a kernel thunk—avoid it for speed.
- **Cache behavior varies by architecture—know your SM** (Middle): SM 2.x caches global memory in L1; SM 3.x doesn’t (use `__ldg()` or `const __restrict__` to route through texture cache). Shared memory vs. L1 cache split is configurable on SM 3.x. These details change which optimization works.
- **Synchronization is expensive—measure it** (Middle): Full CPU/GPU syncs (e.g., synchronous memcpy) can cost ~8 microseconds per call on real hardware. Async operations and careful stream usage hide driver overhead; even in CUDA 1.0, kernel launches were async.
- **Warp-level primitives beat shared memory for reductions** (Late): Shuffle instructions, atomics, and memory fences let you implement single-pass reductions without multiple kernel launches or shared memory bank conflicts. This is the modern pattern for high-performance reductions.
- **Texture and surface memory are specialized tools, not defaults** (Late): Textures offer hardware filtering, normalized coordinates, and cache-friendly access for read-only data; surfaces (SM 2.x+) add write access to CUDA arrays. Use them when the access pattern fits—e.g., image processing with overfetch and boundary handling.
【Reading Tips】
- **Skim the historical intro (Ch. 1) and jump to Ch. 2–3 for architecture**: The early GPU history is interesting but not actionable. The hardware diagrams and memory-model explanations in Ch. 2–3 are the foundation for everything later—read them carefully.
- **Deep-read Ch. 5 (memory) and Ch. 6 (streams/events)**: These are the most practically useful chapters for everyday CUDA coding. The pinned-memory discussion and the concurrency experiments (e.g., `concurrencyMemcpyKernel.cu`) directly translate to real performance wins.
- **Treat Ch. 8 (SM instruction set) as a reference, not a cover-to-cover read**: The SASS-level details and SFU precision tables are valuable when you’re optimizing hot loops, but you don’t need them upfront. Bookmark the tables and come back when profiling points to arithmetic bottlenecks.
- **Work through the reduction and scan examples (Ch. 12–13) with code in hand**: These are the book’s core algorithmic case studies. The progression from simple to optimized versions (atomics, shuffles, zero-padding, templates) is the best way to internalize the optimization mindset.
- **Expect some dated material**: The book references CUDA 5.0, Fermi/Kepler architectures, and AWS EC2 instances from that era. Modern GPUs (Volta+) have changed some details (e.g., independent thread scheduling, different cache hierarchies), so cross-check with current NVIDIA docs for the latest hardware.
【Coverage Limits】
This guide synthesizes the provided excerpts, which cover roughly the first 15 chapters and the glossary. The book’s later chapters (beyond Ch. 15) and any appendices are not represented here.
Passage locations
Excerpt 1
书名: CUDA专家手册:GPU编程权威指南 (高性能计算技术丛书) ((美)Nicholas Wilt) (z-library.sk, 1lib.sk, z-lib.sk) 作者: (美)Nicholas Wilt 推荐序 自CPU单核性能在2004年左右停止提升后,功耗的限制及大量并行 应用本身的特点决定了多...
View in text
Excerpt 2
动程序架构中,压入和弹出上下文的成本足够廉价, 所以一个单线程应用程序可以保持多个GPU同时忙碌。对只在Windows Vista和其后续版本中的WDDM驱动程序,弹出当前上下文操作只在没有 GPU命令挂起的时候才能快速运行。当有命令挂起,驱动程序会引发内 核转换,以保证在弹出CUDA上下文之前提交挂起的命令 [...
View in text
Excerpt 3
提交到GPU,并在GPU处理完 毕之前将控制权返回给调用者。 我们可以通过发射一系列用计时操作包围的空内核启动来测量驱 动程序的开销。代码清单6-1展示了nullKernelAsync.cu,它是一个测 量执行内核启动所需时间的小程序。 代码清单6-1 nullKernelAsync.cu. 及一个异步的设备到主...
View in text
Excerpt 4
2.2 节)。 7.3.3 线程块与线程ID 一组特殊的只读寄存器会以线程ID和线程块ID的形式提供每个线 程的上下文。线程与线程块ID会在一个CUDA内核开始执行时分配。对 CUDA确保在所有子网格完成之前,父网格是不会完成的。虽然父 网格与子网格可以并发执行,但这却不能保证一个子网格会在它的父 网格调用cud...
View in text
Recommended for You
{{#thumbnailUrl}}
{{/thumbnailUrl}}
{{^thumbnailUrl}}
{{/thumbnailUrl}}
Loading recommended books...
Failed to load, please try again later
Tip the Site
Scan the WeChat Pay or Alipay code to tip. No login required.
WeChat Pay
Alipay