Share E-Book

CUDA C编程权威指南 (高性能计算技术丛书) (程润伟(John Cheng)) (z-library.sk, 1lib.sk, z-lib.sk)

Author 程润伟(John Cheng)

c
Language Chinese

No Description

Format PDF
Size 28.2 MB
4
Views
0
Downloads
0.00
Total Donations
(First 20 pages)

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 C编程权威指南 Professional CUDA C Programming (美)程润伟(John Cheng) 等著 颜成钢 殷建 李亮 译 ISBN:978-7-111-56547-5 本书纸版由机械工业出版社于2017年出版,电子版由华章分社(北京华 章图文信息有限公司,北京奥维博世图书发行有限公司)全球范围内制 作与发行。 版权所有,侵权必究 客服热线:+ 86-10-68995265 客服信箱:service@bbbvip.com 官方网址:www.hzmedia.com.cn 新浪微博 @华章数媒 微信公众号 华章电子书(微信号:hzebook)
Page 3
目录 译者序 推荐序 自序 作者简介 技术审校者简介 前言 致谢 第1章 基于CUDA的异构并行计算 1.1 并行计算 1.1.1 串行编程和并行编程 1.1.2 并行性 1.1.3 计算机架构 1.2 异构计算 1.2.1 异构架构 1.2.2 异构计算范例 1.2.3 CUDA:一种异构计算平台 1.3 用GPU输出Hello World 1.4 使用CUDA C编程难吗 1.5 总结
Page 4
1.6 习题 第2章 CUDA编程模型 2.1 CUDA编程模型概述 2.1.1 CUDA编程结构 2.1.2 内存管理 2.1.3 线程管理 2.1.4 启动一个CUDA核函数 2.1.5 编写核函数 2.1.6 验证核函数 2.1.7 处理错误 2.1.8 编译和执行 2.2 给核函数计时 2.2.1 用CPU计时器计时 2.2.2 用nvprof工具计时 2.3 组织并行线程 2.3.1 使用块和线程建立矩阵索引 2.3.2 使用二维网格和二维块对矩阵求和 2.3.3 使用一维网格和一维块对矩阵求和 2.3.4 使用二维网格和一维块对矩阵求和 2.4 设备管理 2.4.1 使用运行时API查询GPU信息
Page 5
2.4.2 确定最优GPU 2.4.3 使用nvidia-smi查询GPU信息 2.4.4 在运行时设置设备 2.5 总结 2.6 习题 第3章 CUDA执行模型 3.1 CUDA执行模型概述 3.1.1 GPU架构概述 3.1.2 Fermi架构 3.1.3 Kepler架构 3.1.4 配置文件驱动优化 3.2 理解线程束执行的本质 3.2.1 线程束和线程块 3.2.2 线程束分化 3.2.3 资源分配 3.2.4 延迟隐藏 3.2.5 占用率 3.2.6 同步 3.2.7 可扩展性 3.3 并行性的表现 3.3.1 用nvprof检测活跃的线程束
Page 6
3.3.2 用nvprof检测内存操作 3.3.3 增大并行性 3.4 避免分支分化 3.4.1 并行归约问题 3.4.2 并行归约中的分化 3.4.3 改善并行归约的分化 3.4.4 交错配对的归约 3.5 展开循环 3.5.1 展开的归约 3.5.2 展开线程的归约 3.5.3 完全展开的归约 3.5.4 模板函数的归约 3.6 动态并行 3.6.1 嵌套执行 3.6.2 在GPU上嵌套Hello World 3.6.3 嵌套归约 3.7 总结 3.8 习题 第4章 全局内存 4.1 CUDA内存模型概述 4.1.1 内存层次结构的优点
Page 7
4.1.2 CUDA内存模型 4.2 内存管理 4.2.1 内存分配和释放 4.2.2 内存传输 4.2.3 固定内存 4.2.4 零拷贝内存 4.2.5 统一虚拟寻址 4.2.6 统一内存寻址 4.3 内存访问模式 4.3.1 对齐与合并访问 4.3.2 全局内存读取 4.3.3 全局内存写入 4.3.4 结构体数组与数组结构体 4.3.5 性能调整 4.4 核函数可达到的带宽 4.4.1 内存带宽 4.4.2 矩阵转置问题 4.5 使用统一内存的矩阵加法 4.6 总结 4.7 习题 第5章 共享内存和常量内存
Page 8
5.1 CUDA共享内存概述 5.1.1 共享内存 5.1.2 共享内存分配 5.1.3 共享内存存储体和访问模式 5.1.4 配置共享内存量 5.1.5 同步 5.2 共享内存的数据布局 5.2.1 方形共享内存 5.2.2 矩形共享内存 5.3 减少全局内存访问 5.3.1 使用共享内存的并行归约 5.3.2 使用展开的并行归约 5.3.3 使用动态共享内存的并行归约 5.3.4 有效带宽 5.4 合并的全局内存访问 5.4.1 基准转置内核 5.4.2 使用共享内存的矩阵转置 5.4.3 使用填充共享内存的矩阵转置 5.4.4 使用展开的矩阵转置 5.4.5 增大并行性 5.5 常量内存
Page 9
5.5.1 使用常量内存实现一维模板 5.5.2 与只读缓存的比较 5.6 线程束洗牌指令 5.6.1 线程束洗牌指令的不同形式 5.6.2 线程束内的共享数据 5.6.3 使用线程束洗牌指令的并行归约 5.7 总结 5.8 习题 第6章 流和并发 6.1 流和事件概述 6.1.1 CUDA流 6.1.2 流调度 6.1.3 流的优先级 6.1.4 CUDA事件 6.1.5 流同步 6.2 并发内核执行 6.2.1 非空流中的并发内核 6.2.2 Fermi GPU上的虚假依赖关系 6.2.3 使用OpenMP的调度操作 6.2.4 用环境变量调整流行为 6.2.5 GPU资源的并发限制
Page 10
6.2.6 默认流的阻塞行为 6.2.7 创建流间依赖关系 6.3 重叠内核执行和数据传输 6.3.1 使用深度优先调度重叠 6.3.2 使用广度优先调度重叠 6.4 重叠GPU和CPU执行 6.5 流回调 6.6 总结 6.7 习题 第7章 调整指令级原语 7.1 CUDA指令概述 7.1.1 浮点指令 7.1.2 内部函数和标准函数 7.1.3 原子操作指令 7.2 程序优化指令 7.2.1 单精度与双精度的比较 7.2.2 标准函数与内部函数的比较 7.2.3 了解原子指令 7.2.4 综合范例 7.3 总结 7.4 习题
Page 11
第8章 GPU加速库和OpenACC 8.1 CUDA库概述 8.1.1 CUDA库支持的作用域 8.1.2 通用的CUDA库工作流 8.2 cuSPARSE库 8.2.1 cuSPARSE数据存储格式 8.2.2 用cuSPARSE进行格式转换 8.2.3 cuSPARSE功能示例 8.2.4 cuSPARSE发展中的重要主题 8.2.5 cuSPARSE小结 8.3 cuBLAS库 8.3.1 管理cuBLAS数据 8.3.2 cuBLAS功能示例 8.3.3 cuBLAS发展中的重要主题 8.3.4 cuBLAS小结 8.4 cuFFT库 8.4.1 使用cuFFT API 8.4.2 cuFFT功能示例 8.4.3 cuFFT小结 8.5 cuRAND库 8.5.1 拟随机数或伪随机数的选择
Page 12
8.5.2 cuRAND库概述 8.5.3 cuRAND介绍 8.5.4 cuRAND发展中的重要主题 8.6 CUDA 6.0中函数库的介绍 8.6.1 Drop-In库 8.6.2 多GPU库 8.7 CUDA函数库的性能研究 8.7.1 cuSPARSE与MKL的比较 8.7.2 cuBLAS与MKL BLAS的比较 8.7.3 cuFFT与FFTW及MKL的比较 8.7.4 CUDA库性能小结 8.8 OpenACC的使用 8.8.1 OpenACC计算指令的使用 8.8.2 OpenACC数据指令的使用 8.8.3 OpenACC运行时API 8.8.4 OpenACC和CUDA库的结合 8.8.5 OpenACC小结 8.9 总结 8.10 习题 第9章 多GPU编程 9.1 从一个GPU到多GPU
Page 13
9.1.1 在多GPU上执行 9.1.2 点对点通信 9.1.3 多GPU间的同步 9.2 多GPU间细分计算 9.2.1 在多设备上分配内存 9.2.2 单主机线程分配工作 9.2.3 编译和执行 9.3 多GPU上的点对点通信 9.3.1 实现点对点访问 9.3.2 点对点的内存复制 9.3.3 统一虚拟寻址的点对点内存访问 9.4 多GPU上的有限差分 9.4.1 二维波动方程的模板计算 9.4.2 多GPU程序的典型模式 9.4.3 多GPU上的二维模板计算 9.4.4 重叠计算与通信 9.4.5 编译和执行 9.5 跨GPU集群扩展应用程序 9.5.1 CPU到CPU的数据传输 9.5.2 使用传统MPI在GPU和GPU间传输数据 9.5.3 使用CUDA-aware MPI进行GPU到GPU的数据传输
Page 14
9.5.4 使用CUDA-aware MPI进行节点内GPU到GPU的数据传输 9.5.5 调整消息块大小 9.5.6 使用GPUDirect RDMA技术进行GPU到GPU的数据传输 9.6 总结 9.7 习题 第10章 程序实现的注意事项 10.1 CUDA C的开发过程 10.1.1 APOD开发周期 10.1.2 优化因素 10.1.3 CUDA代码编译 10.1.4 CUDA错误处理 10.2 配置文件驱动优化 10.2.1 使用nvprof寻找优化因素 10.2.2 使用nvvp指导优化 10.2.3 NVIDIA工具扩展 10.3 CUDA调试 10.3.1 内核调试 10.3.2 内存调试 10.3.3 调试小结 10.4 将C程序移植到CUDA C的案例研究 10.4.1 评估crypt
Page 15
10.4.2 并行crypt 10.4.3 优化crypt 10.4.4 部署crypt 10.4.5 移植crypt小结 10.5 总结 10.6 习题 附录 推荐阅读
Page 16
译者序 CUDA(Compute Unified Device Architecture,统一计算设备架构) 是NVIDIA(英伟达)提出的并行计算架构,结合了CPU和GPU的优 点,主要用来处理密集型及并行计算。CPU和GPU是两个独立的处理 器,通过单个计算节点中的PCI-Express总线相连,GPU用来提高计算密 集型应用程序中并行程序段的执行速度,CPU则负责管理设备端的资 源。CUDA编程的独特优势在于开放的架构特性可以使程序员在功能强 大的硬件平台上充分挖掘其并行性,既满足了计算密集型程序的需要, 又实现了程序的易读性及便捷性。 对任何想要使用GPU来进行科研或技术编程的人来说,本书都将是 一个珍贵的资源宝库,它全面介绍了CUDA编程接口及其用法,包含但 不局限于CUDA编程模型、GPU执行模型、GPU内存模型、CUDA流和 事件、多GPU编程的相关技术、CUDA库等内容。此外,本书列举了大 量的范例来帮助读者入门,并提供了程序下载地址,供读者亲自运行体 验。在基本掌握了本书的内容之后,你将发现CUDA C编程是一项十分 简单、有趣且高效的工作。 本书第1章简要介绍了GPU和CPU构成的异构架构,对使用CUDA 进行异构并行计算的原理进行了简要说明。第2章介绍了CUDA编程模 型,从逻辑上解释了什么是CUDA大规模并行计算。第3章介绍了CUDA
Page 17
执行模型。第4章给出了CUDA内存模型,分析了全局内存的访问模 式。第5章介绍了数据在共享内存中的存储方式,以及如何使用共享内 存提高函数性能。第6章讲述了如何使用CUDA流实现网格级的并发。 第7章介绍了计算密集型应用程序中的CUDA指令级原语。第8章介绍了 CUDA函数库及其作用域,包括线性代数、傅里叶变换、随机数等。第 9章讲述了多GPU编程。第10章则说明了在使用CUDA进行程序开发时 的一些注意事项。 译者在翻译过程中力求忠于原著,但限于译者的能力及水平,如有 纰漏,还望读者朋友们不吝赐教,译者在此表示衷心的感谢。
Page 18
推荐序 图形处理器(GPU)已经有了很大的发展。从最初能够瞬时生成图 像输出的专业图形处理器,发展到显示单元,GPU已经成为人们在进行 超高速数据处理时热衷的技术手段。在过去的几年中,GPU已经越来越 多地附加到CPU上,用于加速异构计算中的各种计算。如今,许多桌面 系统、计算集群,甚至世界上许多最大的超级计算机都配置有GPU。图 形处理器有着用于专业技术计算的大数据计算能力,它们已经在广泛的 学科领域中实现了科学和工程的巨大进步,因为它们使大量计算核心并 行工作,同时又将功耗预算保持在合理范围内。 所幸,GPU编程接口也一直与时俱进。过去,要在应用功能之外使 用它们要费好大一番功夫,GPU编程人员不得不去熟练掌握那些通常只 有图形程序员才能理解到位的诸多概念。如今的系统提供了一个更加便 捷的手段来创建可以在其上运行的应用软件,这就是CUDA。 CUDA是最受欢迎的应用编程接口之一,可用于加速GPU上的一系 列计算内核。它可以让C或C++代码在GPU上合理高效地运行。CUDA 既满足了为使其良好运行而了解其架构的需要,又有为了使用和输出可 读程序的编程接口,并且完美地平衡了这两项功能。 对任何想要使用GPU来进行科研或技术编程的人来说,该书都将是
Page 19
一个珍贵的资源宝库。它全面介绍了CUDA编程接口及其用法。首先, 它描述了在异构架构上并行计算的基础知识,并介绍了CUDA的功能。 其次,它解释了CUDA程序的执行方式。由于CUDA为程序员提供了操 作手段和内存模型,因而CUDA程序员直接掌控了大规模并行环境。除 了提供CUDA内存模型的细节之外,该书还提供了丰富的关于如何使用 CUDA的信息。接下来的章节将讨论流,以及如何执行并行和重叠的内 核。然后是关于调整指令级原语,关于如何使用CUDA库,以及关于使 用OpenACC指令进行GPU编程的部分。在第9章之后,本书还提供了一 些应用时的注意事项。此外,书中列举大量的范例来帮助读者更好地入 门,读者可以下载并亲自运行体验。 实践证明,CUDA在表现力和可编程性之间实现了绝佳的平衡。但 是,以简化应用开发为使命的人深知,路漫漫其修远兮。在过去的几年 中,CUDA的研究人员一直在努力改善异构编程工具。CUDA 6.0引入了 许多新功能,包括统一的内存和插件库,极大地简化了GPU编程。它们 还提供了一组名为OpenACC的指令,这在书中也有所涉及。OpenACC 有望进一步完善CUDA,它将减少在程序执行中所需的直接控制,与此 同时提供一个更加便捷的方法来利用GPU的编程能力。目前看来,收效 良好。无论是OpenACC、CUDA 6.0,还是书中讲到的其他主题,都将 帮助CUDA开发人员加快应用程序的运行,从而实现前所未有的高性 能。请相信我,这本书值得占据你书架的一席之地!
Page 20
祝大家编程愉快! 芭芭拉·查普曼 休斯敦大学计算机辅助创新设计系统与计算机系
The above is a preview of the first 20 pages. Register to read the complete e-book.

Recommended for You

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
Back to List