CUDA C编程权威指南

CUDA C编程权威指南

高性能计算技术丛书

暂无评价综合评分的显示会考虑用户真实性等多项因素,每部作品出现综合评分的时间不定。
5.923 评价豆瓣读书
春暖花开季 恰是读书时满500减300、满200减120、满100减60活动详情

作品简介

本书主要介绍了如何使用GPU和利用CUDAC语言对其进行编程的。首先从基本的CUDA概念及结构讲起,一步一步地引导读者进入CUDA的内部世界,由浅入深地介绍了其编程要求及其内部架构,使读者对其有了整体印象后,逐步深入了解其内部机能,后介绍了GPU的一些专用函数和注意事项。

程润伟(John Cheng),博士是休斯敦BGP靠前的研究科学家,利用GPU开发出了地震成像产品,并开发了许多异构计算平台上的高性能并行生产应用程序。

马克斯·格罗斯曼(Max Grossman)是GPU计算方面的专家,主要用CUDA解决医学影像、机器学习和地球物理学等问题。

泰·麦克切尔(Ty McKercher)是NVIDIA公司的首席方案架构师,他领导的团队专攻跨行业的视觉计算机系统架构。他通常负责在新兴技术评估期间促进客户和产品工程团队之间的沟通交流。

作品目录

  1. 译者序
  2. 推荐序
  3. 自序
  4. 作者简介
  5. 技术审校者简介
  6. 前言
  7. 致谢
  8. 第1章 基于CUDA的异构并行计算
  9. 1.1 并行计算
  10. 1.1.1 串行编程和并行编程
  11. 1.1.2 并行性
  12. 1.1.3 计算机架构
  13. 1.2 异构计算
  14. 1.2.1 异构架构
  15. 1.2.2 异构计算范例
  16. 1.2.3 CUDA:一种异构计算平台
  17. 1.3 用GPU输出Hello World
  18. 1.4 使用CUDA C编程难吗
  19. 1.5 总结
  20. 1.6 习题
  21. 第2章 CUDA编程模型
  22. 2.1 CUDA编程模型概述
  23. 2.1.1 CUDA编程结构
  24. 2.1.2 内存管理
  25. 2.1.3 线程管理
  26. 2.1.4 启动一个CUDA核函数
  27. 2.1.5 编写核函数
  28. 2.1.6 验证核函数
  29. 2.1.7 处理错误
  30. 2.1.8 编译和执行
  31. 2.2 给核函数计时
  32. 2.2.1 用CPU计时器计时
  33. 2.2.2 用nvprof工具计时
  34. 2.3 组织并行线程
  35. 2.3.1 使用块和线程建立矩阵索引
  36. 2.3.2 使用二维网格和二维块对矩阵求和
  37. 2.3.3 使用一维网格和一维块对矩阵求和
  38. 2.3.4 使用二维网格和一维块对矩阵求和
  39. 2.4 设备管理
  40. 2.4.1 使用运行时API查询GPU信息
  41. 2.4.2 确定最优GPU
  42. 2.4.3 使用nvidia-smi查询GPU信息
  43. 2.4.4 在运行时设置设备
  44. 2.5 总结
  45. 2.6 习题
  46. 第3章 CUDA执行模型
  47. 3.1 CUDA执行模型概述
  48. 3.1.1 GPU架构概述
  49. 3.1.2 Fermi架构
  50. 3.1.3 Kepler架构
  51. 3.1.4 配置文件驱动优化
  52. 3.2 理解线程束执行的本质
  53. 3.2.1 线程束和线程块
  54. 3.2.2 线程束分化
  55. 3.2.3 资源分配
  56. 3.2.4 延迟隐藏
  57. 3.2.5 占用率
  58. 3.2.6 同步
  59. 3.2.7 可扩展性
  60. 3.3 并行性的表现
  61. 3.3.1 用nvprof检测活跃的线程束
  62. 3.3.2 用nvprof检测内存操作
  63. 3.3.3 增大并行性
  64. 3.4 避免分支分化
  65. 3.4.1 并行归约问题
  66. 3.4.2 并行归约中的分化
  67. 3.4.3 改善并行归约的分化
  68. 3.4.4 交错配对的归约
  69. 3.5 展开循环
  70. 3.5.1 展开的归约
  71. 3.5.2 展开线程的归约
  72. 3.5.3 完全展开的归约
  73. 3.5.4 模板函数的归约
  74. 3.6 动态并行
  75. 3.6.1 嵌套执行
  76. 3.6.2 在GPU上嵌套Hello World
  77. 3.6.3 嵌套归约
  78. 3.7 总结
  79. 3.8 习题
  80. 第4章 全局内存
  81. 4.1 CUDA内存模型概述
  82. 4.1.1 内存层次结构的优点
  83. 4.1.2 CUDA内存模型
  84. 4.2 内存管理
  85. 4.2.1 内存分配和释放
  86. 4.2.2 内存传输
  87. 4.2.3 固定内存
  88. 4.2.4 零拷贝内存
  89. 4.2.5 统一虚拟寻址
  90. 4.2.6 统一内存寻址
  91. 4.3 内存访问模式
  92. 4.3.1 对齐与合并访问
  93. 4.3.2 全局内存读取
  94. 4.3.3 全局内存写入
  95. 4.3.4 结构体数组与数组结构体
  96. 4.3.5 性能调整
  97. 4.4 核函数可达到的带宽
  98. 4.4.1 内存带宽
  99. 4.4.2 矩阵转置问题
  100. 4.5 使用统一内存的矩阵加法
  101. 4.6 总结
  102. 4.7 习题
  103. 第5章 共享内存和常量内存
  104. 5.1 CUDA共享内存概述
  105. 5.1.1 共享内存
  106. 5.1.2 共享内存分配
  107. 5.1.3 共享内存存储体和访问模式
  108. 5.1.4 配置共享内存量
  109. 5.1.5 同步
  110. 5.2 共享内存的数据布局
  111. 5.2.1 方形共享内存
  112. 5.2.2 矩形共享内存
  113. 5.3 减少全局内存访问
  114. 5.3.1 使用共享内存的并行归约
  115. 5.3.2 使用展开的并行归约
  116. 5.3.3 使用动态共享内存的并行归约
  117. 5.3.4 有效带宽
  118. 5.4 合并的全局内存访问
  119. 5.4.1 基准转置内核
  120. 5.4.2 使用共享内存的矩阵转置
  121. 5.4.3 使用填充共享内存的矩阵转置
  122. 5.4.4 使用展开的矩阵转置
  123. 5.4.5 增大并行性
  124. 5.5 常量内存
  125. 5.5.1 使用常量内存实现一维模板
  126. 5.5.2 与只读缓存的比较
  127. 5.6 线程束洗牌指令
  128. 5.6.1 线程束洗牌指令的不同形式
  129. 5.6.2 线程束内的共享数据
  130. 5.6.3 使用线程束洗牌指令的并行归约
  131. 5.7 总结
  132. 5.8 习题
  133. 第6章 流和并发
  134. 6.1 流和事件概述
  135. 6.1.1 CUDA流
  136. 6.1.2 流调度
  137. 6.1.3 流的优先级
  138. 6.1.4 CUDA事件
  139. 6.1.5 流同步
  140. 6.2 并发内核执行
  141. 6.2.1 非空流中的并发内核
  142. 6.2.2 Fermi GPU上的虚假依赖关系
  143. 6.2.3 使用OpenMP的调度操作
  144. 6.2.4 用环境变量调整流行为
  145. 6.2.5 GPU资源的并发限制
  146. 6.2.6 默认流的阻塞行为
  147. 6.2.7 创建流间依赖关系
  148. 6.3 重叠内核执行和数据传输
  149. 6.3.1 使用深度优先调度重叠
  150. 6.3.2 使用广度优先调度重叠
  151. 6.4 重叠GPU和CPU执行
  152. 6.5 流回调
  153. 6.6 总结
  154. 6.7 习题
  155. 第7章 调整指令级原语
  156. 7.1 CUDA指令概述
  157. 7.1.1 浮点指令
  158. 7.1.2 内部函数和标准函数
  159. 7.1.3 原子操作指令
  160. 7.2 程序优化指令
  161. 7.2.1 单精度与双精度的比较
  162. 7.2.2 标准函数与内部函数的比较
  163. 7.2.3 了解原子指令
  164. 7.2.4 综合范例
  165. 7.3 总结
  166. 7.4 习题
  167. 第8章 GPU加速库和OpenACC
  168. 8.1 CUDA库概述
  169. 8.1.1 CUDA库支持的作用域
  170. 8.1.2 通用的CUDA库工作流
  171. 8.2 cuSPARSE库
  172. 8.2.1 cuSPARSE数据存储格式
  173. 8.2.2 用cuSPARSE进行格式转换
  174. 8.2.3 cuSPARSE功能示例
  175. 8.2.4 cuSPARSE发展中的重要主题
  176. 8.2.5 cuSPARSE小结
  177. 8.3 cuBLAS库
  178. 8.3.1 管理cuBLAS数据
  179. 8.3.2 cuBLAS功能示例
  180. 8.3.3 cuBLAS发展中的重要主题
  181. 8.3.4 cuBLAS小结
  182. 8.4 cuFFT库
  183. 8.4.1 使用cuFFT API
  184. 8.4.2 cuFFT功能示例
  185. 8.4.3 cuFFT小结
  186. 8.5 cuRAND库
  187. 8.5.1 拟随机数或伪随机数的选择
  188. 8.5.2 cuRAND库概述
  189. 8.5.3 cuRAND介绍
  190. 8.5.4 cuRAND发展中的重要主题
  191. 8.6 CUDA 6.0中函数库的介绍
  192. 8.6.1 Drop-In库
  193. 8.6.2 多GPU库
  194. 8.7 CUDA函数库的性能研究
  195. 8.7.1 cuSPARSE与MKL的比较
  196. 8.7.2 cuBLAS与MKL BLAS的比较
  197. 8.7.3 cuFFT与FFTW及MKL的比较
  198. 8.7.4 CUDA库性能小结
  199. 8.8 OpenACC的使用
  200. 8.8.1 OpenACC计算指令的使用
  201. 8.8.2 OpenACC数据指令的使用
  202. 8.8.3 OpenACC运行时API
  203. 8.8.4 OpenACC和CUDA库的结合
  204. 8.8.5 OpenACC小结
  205. 8.9 总结
  206. 8.10 习题
  207. 第9章 多GPU编程
  208. 9.1 从一个GPU到多GPU
  209. 9.1.1 在多GPU上执行
  210. 9.1.2 点对点通信
  211. 9.1.3 多GPU间的同步
  212. 9.2 多GPU间细分计算
  213. 9.2.1 在多设备上分配内存
  214. 9.2.2 单主机线程分配工作
  215. 9.2.3 编译和执行
  216. 9.3 多GPU上的点对点通信
  217. 9.3.1 实现点对点访问
  218. 9.3.2 点对点的内存复制
  219. 9.3.3 统一虚拟寻址的点对点内存访问
  220. 9.4 多GPU上的有限差分
  221. 9.4.1 二维波动方程的模板计算
  222. 9.4.2 多GPU程序的典型模式
  223. 9.4.3 多GPU上的二维模板计算
  224. 9.4.4 重叠计算与通信
  225. 9.4.5 编译和执行
  226. 9.5 跨GPU集群扩展应用程序
  227. 9.5.1 CPU到CPU的数据传输
  228. 9.5.2 使用传统MPI在GPU和GPU间传输数据
  229. 9.5.3 使用CUDA-aware MPI进行GPU到GPU的数据传输
  230. 9.5.4 使用CUDA-aware MPI进行节点内GPU到GPU的数据传输
  231. 9.5.5 调整消息块大小
  232. 9.5.6 使用GPUDirect RDMA技术进行GPU到GPU的数据传输
  233. 9.6 总结
  234. 9.7 习题
  235. 第10章 程序实现的注意事项
  236. 10.1 CUDA C的开发过程
  237. 10.1.1 APOD开发周期
  238. 10.1.2 优化因素
  239. 10.1.3 CUDA代码编译
  240. 10.1.4 CUDA错误处理
  241. 10.2 配置文件驱动优化
  242. 10.2.1 使用nvprof寻找优化因素
  243. 10.2.2 使用nvvp指导优化
  244. 10.2.3 NVIDIA工具扩展
  245. 10.3 CUDA调试
  246. 10.3.1 内核调试
  247. 10.3.2 内存调试
  248. 10.3.3 调试小结
  249. 10.4 将C程序移植到CUDA C的案例研究
  250. 10.4.1 评估crypt
  251. 10.4.2 并行crypt
  252. 10.4.3 优化crypt
  253. 10.4.4 部署crypt
  254. 10.4.5 移植crypt小结
  255. 10.5 总结
  256. 10.6 习题
  257. 附录 推荐阅读
载入中

大家都喜欢