作者 |
[德]贝蒂尔·施密特(Bertil Schmidt) [西]豪尔赫·冈萨雷斯-多明格斯(Jorge González-Domínguez) [德]克里斯蒂安·洪特(Christian Hundt) [德]莫里茨·施拉布(Moritz Schlarb) 等 |
丛书名 |
高性能计算技术丛书 |
出版社 |
机械工业出版社 |
ISBN |
9782110261824 |
简要 |
简介 |
内容简介书籍计算机书籍 ---------------------------8071136 - 并行程序设计:概念与实践--------------------------- 本书由德国约翰内斯·古腾堡大学并行和分布式架构团队撰写,对并行编程的高级主题进行了深入讨论,除了涵盖基础概念外,还讲授了共享内存和分布式内存体系结构的实用编程技巧。作者提供了一套进行自动代码评估的开源系统,可方便地访问并行计算资源,这也使得本书特别适合于课堂教学。 ---------------------------3769261 - CUDA并行程序设计:GPU编程指南--------------------------- 《CUDA并行程序设计:GPU编程指南》是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应用中易犯错误以及应对建议。 |
目录 |
[套装书具体书目] 3769261 - CUDA并行程序设计:GPU编程指南 - 9787111448617 - 机械工业出版社 - 定价 99 8071136 - 并行程序设计:概念与实践 - 9787111656661 - 机械工业出版社 - 定价 119 ---------------------------8071136 - 并行程序设计:概念与实践--------------------------- 译者序 前言 致谢 第1章 绪论 1 1.1 一个有趣的例子及其分析 2 1.2 并行计算基础 10 1.2.1 分布式内存系统 10 1.2.2 共享内存系统 11 1.2.3 并行程序设计需考虑的因素 13 1.3 HPC动态和排名 15 1.4 附加练习 17 第2章 理论背景 19 2.1 PRAM 20 2.1.1 PRAM变体 21 2.1.2 PRAM上的并行前缀计算 22 2.1.3 PRAM上稀疏数组的压缩算法 24 2.2 网络拓扑 25 2.3 Amdahl定律和Gustafson定律 29 2.4 Foster的并行算法设计方法学 34 2.5 附加练习 37 参考文献 40 第3章 现代体系结构 41 3.1 存储层次 42 3.1.1 冯·诺依曼瓶颈 42 3.1.2 高速缓冲存储器 43 3.1.3 缓存算法 44 3.1.4 优化缓存访问 45 3.1.5 高速缓存一致性 48 3.1.6 虚假共享 50 3.1.7 并发多线程技术和预取技术 50 3.1.8 展望 51 3.2 并行性的层次 51 3.2.1 Flynn分类法 51 3.2.2 SIMD概念 53 3.2.3 通用微处理器上的向量化 54 3.2.4 结构体数组和数组结构体 57 3.2.5 展望 63 3.3 附加练习 63 参考文献 67 第4章 C++多线程编程 68 4.1 多线程编程简介 69 4.1.1 多线程编程和多进程编程的区别 69 4.1.2 派生和并入线程 69 4.1.3 我们的第一个多线程程序 71 4.2 处理返回值 73 4.2.1 传统方法 74 4.2.2 使用promise和future的现代方法 75 4.2.3 异步方式 80 4.3 基于静态分发的调度机制 82 4.3.1 串行程序 83 4.3.2 线程的区块分发 87 4.3.3 线程的循环分发 90 4.3.4 虚假共享 91 4.3.5 线程的块循环分发 93 4.4 处理负载不平衡 95 4.4.1 静态调度 99 4.4.2 动态块循环分发 101 4.5 用条件变量通知线程 104 4.5.1 为一个睡觉的学生建模 105 4.5.2 使用条件变量 107 4.5.3 使用future和promise单发同步 108 4.6 隐式可数集合上的并行化 110 4.6.1 隐式可数集合 111 4.6.2 线程池用例 112 4.6.3 一个简单线程池的实现 114 4.7 附加练习 119 参考文献 121 第5章 高级C++11多线程编程 122 5.1 无锁编程 122 5.1.1 原子计数 123 5.1.2 非基本原子数据类型 124 5.1.3 利用比较交换以原子方式并行化最大值归约 126 5.1.4 任意原子操作 129 5.1.5 ABA问题 132 5.2 工作共享线程池 133 5.2.1 工作共享线程池的用例 133 5.2.2 工作共享的实现 135 5.3 并行图搜索 137 5.3.1 二元背包问题 138 5.3.2 串行实现 139 5.3.3 并行实现 144 5.4 展望 146 5.5 附加练习 148 参考文献 149 第6章 OpenMP 150 6.1 OpenMP简介 151 6.1.1 OpenMP简史 151 6.1.2 基础 151 6.2 parallel for制导语句 153 6.2.1 向量加法 154 6.2.2 变量共享和私有化 157 6.2.3 矩阵向量乘法 160 6.3 基本的并行归约 162 6.3.1 最近邻分类 162 6.3.2 手写数字数据集MNIST 163 6.3.3 完全配对距离计算的理论视角 164 6.3.4 完全配对计算的实现 165 6.3.5 并行标签预测 168 6.3.6 性能评测 169 6.4 不平衡循环调度 171 6.4.1 对称性引起的负载失衡 172 6.4.2 内积计算实现 173 6.4.3 性能评测 174 6.5 高级归约 175 6.5.1 MNIST数据集上的SOFTMAX回归分类器 175 6.5.2 定制归约操作符 183 6.5.3 OpenMP高级归约 187 6.6 任务并行 189 6.6.1 树遍历 190 6.6.2 循环中生成任务 193 6.7 SIMD向量化 193 6.7.1 数据依赖 195 6.7.2 向量化感知函数 196 6.8 展望 196 6.9 附加练习 197 参考文献 202 第7章 统一计算设备架构 203 7.1 CUDA简介 204 7.2 支持CUDA的GPU硬件架构 206 7.2.1 主机与设备之间的互连 206 7.2.2 显存和峰值宽度 207 7.2.3 计算资源的组织 207 7.3 内存访问模式 211 7.3.1 均值名人脸的计算 212 7.3.2 计算中心化的数据矩阵 218 7.3.3 计算协方差矩阵 221 7.3.4 计算特征脸 229 7.4 内存层次结构 232 7.4.1 问题简介 233 7.4.2 串行DTW的线性内存算法 237 7.4.3 线性内存DTW的一个初始CUDA移植 243 7.4.4 共享内存中的波前松弛 248 7.4.5 并发调度和bank冲突 253 7.4.6 纹理内存和常量内存 254 7.5 优化准则 257 7.6 附加练习 258 参考文献 259 第8章 高级CUDA编程 261 8.1 warp内联函数和原子操作 261 8.1.1 分段并行归约 262 8.1.2 全局并行归约 265 8.1.3 任意原子操作 267 8.1.4 展望 269 8.2 利用多块GPU和流 269 8.2.1 牛顿迭代 269 8.2.2 利用多块GPU 272 8.2.3 通信和计算交叉 274 8.2.4 多块GPU上的流式计算 278 8.3 展望 280 8.3.1 统一内存 280 8.3.2 动态并行性 281 8.3.3 协作组 281 8.3.4 张量核心 281 8.3.5 GPU集群上的分布式计算 282 8.4 附加练习 282 参考文献 284 第9章 MPI 286 9.1 MPI简介 286 9.2 基本概念 288 9.3 点到点通信 289 9.4 非阻塞通信 292 9.5 集合通信 295 9.6 计算通信重叠 300 9.7 派生数据类型 309 9.8 复杂通信域 315 9.9 展望 322 9.10 附加练习 322 参考文献 327 第10章 统一并行C++ 329 10.1 PGAS和UPC++简介 329 10.2 基本概念 331 10.3 内存亲和性和私有化 332 10.4 全局指针和集合函数 337 10.5 锁 343 10.6 远程函数调用 348 10.7 附加练习 355 参考文献 357 ---------------------------3769261 - CUDA并行程序设计:GPU编程指南--------------------------- 《CUDA并行程序设计:GPU编程指南》 致中国读者 译者序 前 言 第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 |