欢迎光临澳大利亚新华书店网 [登录 | 免费注册]

    • 并行程序设计导论(原书第2版)/计算机科学丛书
      • 作者:(美)彼得·S.帕切科//马修·马伦塞克|责编:曲熠|译者:黄智濒//肖晨
      • 出版社:机械工业
      • ISBN:9787111743194
      • 出版日期:2024/05/01
      • 页数:347
    • 售价:51.6
  • 内容大纲

        并行硬件已经无处不在,但如何在并行环境下编写出高性能的程序,仍然是摆在广大程序员面前的一道难题,特别是,不少计算机科学专业的学生在毕业时甚至没有并行编程的经验。本书尝试解决这个问题。主要面向没有经验的读者,清晰讲解如何设计、调试和评估分布式内存和共享内存程序的性能。
        新版更新及特色:
        讨论如何利用MPI、Pthreads、OpenMP和CUDA这四种广泛使用的并行编程API来编写并行程序。其中,关于CUDA的章节是全新的。
        新增关于GPU编程和异构编程的章节,此外,还新增了与并行程序开发相关的示例和练习。
        学习曲线友好,从简单的编程示例开始,逐步构建更具挑战性的示例,关于四种API的章节相互独立,便于读者根据需要选择阅读。
        配有丰富的练习和编程作业,所有源代码均可从本书网站免费下载。
  • 作者介绍

  • 目录

    译者序
    前言
    第1章  为什么需要并行计算
      1.1  为什么需要不断提高性能
      1.2  为什么需要建立并行系统
      1.3  为什么需要编写并行程序
      1.4  如何编写并行程序
      1.5  我们将做什么
      1.6  并发、并行和分布式
      1.7  本书其余部分
      1.8  一点警告
      1.9  排版惯例
      1.10  小结
      1.11  练习
    第2章  并行硬件与并行软件
      2.1  背景知识
        2.1.1  冯·诺依曼体系结构
        2.1.2  进程、多任务和线程
      2.2  冯·诺依曼模型的改进
        2.2.1  缓存基础
        2.2.2  缓存映射
        2.2.3  缓存和程序:示例
        2.2.4  虚拟内存
        2.2.5  指令级并行
        2.2.6  硬件多线程
      2.3  并行硬件
        2.3.1  并行计算机的分类
        2.3.2  SIMD系统
        2.3.3  MIMD系统
        2.3.4  互连网络
        2.3.5  高速缓存一致性
        2.3.6  共享内存与分布式内存
      2.4  并行软件
        2.4.1  注意事项
        2.4.2  协调进程/线程
        2.4.3  共享内存
        2.4.4  分布式内存
        2.4.5  GPU编程
        2.4.6  混合系统编程
      2.5  输入和输出
        2.5.1  MIMD系统
        2.5.2  GPU
      2.6  性能
        2.6.1  在MIMD系统中的加速比和效率
        2.6.2  阿姆达定律
        2.6.3  MIMD系统的可扩展性
        2.6.4  MIMD程序的计时
        2.6.5  GPU性能
      2.7  并行程序设计
        2.7.1  示例

      2.8  编写和运行并行程序
      2.9  假设
      2.10  小结
        2.10.1  串行系统
        2.10.2  并行硬件
        2.10.3  并行软件
        2.10.4  输入和输出
        2.10.5  性能
        2.10.6  并行程序设计
        2.10.7  假设
      2.11  练习
    第3章  基于MPI的分布式内存编程
      3.1  入门
        3.1.1  编译和执行
        3.1.2  MPI程序
        3.1.3  MPI_Init和MPI_Finalize
        3.1.4  通信域、MPI_Comm_size和MPI_Comm_rank
        3.1.5  SPMD程序
        3.1.6  通信
        3.1.7  MPI_Send
        3.1.8  MPI_Recv
        3.1.9  消息匹配
        3.1.10  status_p参数
        3.1.11  MPI_Send和MPI_Recv的语义
        3.1.12  一些潜在的陷阱
      3.2  MPI中的梯形法则
        3.2.1  梯形法则
        3.2.2  梯形法则的并行化
      3.3  处理I/O
        3.3.1  输出
        3.3.2  输入
      3.4  集合通信
        3.4.1  树形结构的通信
        3.4.2  MPI_Reduce
        3.4.3  集合通信与点对点通信
        3.4.4  MPI_Allreduce
        3.4.5  广播
        3.4.6  数据分布
        3.4.7  分散
        3.4.8  收集
        3.4.9  综合实例
      3.5  MPI派生的数据类型
      3.6  MPI程序的性能评估
        3.6.1  计时
        3.6.2  结果
        3.6.3  加速比和效率
        3.6.4  可扩展性
      3.7  一种并行排序算法
        3.7.1  一些简单的串行排序算法
        3.7.2  并行奇偶移项排序

        3.7.3  MPI程序中的安全性
        3.7.4  关于并行奇偶排序的一些补充细节
      3.8  小结
      3.9  练习
      3.10  编程作业
    第4章  Pthreads共享内存编程
      4.1  进程、线程和Pthreads
      4.2  Hello, world
        4.2.1  执行
        4.2.2  预备
        4.2.3  启动线程
        4.2.4  运行线程
        4.2.5  停止线程
        4.2.6  错误检查
        4.2.7  启动线程的其他方法
      4.3  矩阵-向量乘法
      4.4  临界区
      4.5  忙等待
      4.6  互斥锁
      4.7  生产者-消费者同步和信号量
      4.8  栅栏和条件变量
        4.8.1  忙等待和互斥锁
        4.8.2  信号量
        4.8.3  条件变量
        4.8.4  Pthreads栅栏
      4.9  读写锁
        4.9.1  排序的链表函数
        4.9.2  多线程链表
        4.9.3  Pthreads的读写锁
        4.9.4  各种实现方案的性能
        4.9.5  实现读写锁
      4.10  缓存、缓存一致性和伪共享
      4.11  线程安全
        4.11.1  不正确的程序可以产生正确的输出
      4.12  小结
      4.13  练习
      4.14  编程作业
    第5章  OpenMP共享内存编程
      5.1  入门
        5.1.1  编译和运行OpenMP程序
        5.1.2  程序
        5.1.3  错误检查
      5.2  梯形法则
        5.2.1  第一个OpenMP版本
      5.3  变量的作用域
      5.4  归约子句
      5.5  parallel指令
        5.5.1  注意事项
        5.5.2  数据依赖性
        5.5.3  寻找循环迭代相关

        5.5.4  估算π
        5.5.5  关于作用域的更多内容
      5.6  关于OpenMP中的循环的更多内容:排序
        5.6.1  冒泡排序
        5.6.2  奇偶移项排序
      5.7  循环的调度
        5.7.1  schedule子句
        5.7.2  static调度类型
        5.7.3  dynamic和guided调度类型
        5.7.4  runtime调度类型
        5.7.5  哪种调度
      5.8  生产者和消费者
        5.8.1  队列
        5.8.2  消息传递
        5.8.3  发送消息
        5.8.4  接收消息
        5.8.5  终止检测
        5.8.6  开始
        5.8.7  atomic指令
        5.8.8  临界区和锁
        5.8.9  在消息传递程序中使用锁
        5.8.10  critical指令、atomic指令或锁
        5.8.11  注意事项
      5.9  缓存、缓存一致性和伪共享
      5.10  任务化
      5.11  线程安全
        5.11.1  不正确的程序可以产生正确的输出
      5.12  小结
      5.13  练习
      5.14  编程作业
    第6章  用CUDA进行GPU编程
      6.1  GPU和GPGPU
      6.2  GPU架构
      6.3  异构计算
      6.4  CUDA hello
        6.4.1  源代码
        6.4.2  编译与运行程序
      6.5  深入了解
      6.6  线程、线程块和线程网格
      6.7  NVIDIA计算能力和设备架构
      6.8  向量加法
        6.8.1  核函数
        6.8.2  Get_args函数
        6.8.3  Allocate_vectors函数和托管内存
        6.8.4  main函数调用的其他函数
        6.8.5  显式内存传输
      6.9  从CUDA核函数返回结果
      6.10  CUDA梯形法则I
        6.10.1  梯形法则
        6.10.2  一种CUDA实现

        6.10.3  初始化、返回值和最后更新
        6.10.4  使用正确的线程
        6.10.5  更新返回值和atomicAdd函数
        6.10.6  CUDA梯形法则的性能
      6.11  CUDA梯形法则II:提升性能
        6.11.1  树形通信
        6.11.2  局部变量、寄存器、共享和全局内存
        6.11.3  线程束和线程束洗牌
        6.11.4  使用线程束洗牌实现树形全局求和
        6.11.5  共享内存和线程束洗牌的替代方案
      6.12  用warpSize个线程块实现梯形法则
        6.12.1  主机代码
        6.12.2  使用线程束洗牌的核函数
        6.12.3  使用共享内存的核函数
        6.12.4  性能
      6.13  CUDA梯形法则III:使用具有多个线程束的线程块
        6.13.1  __syncthreads函数
        6.13.2  关于共享内存的更多内容
        6.13.3  使用共享内存的线程束求和
        6.13.4  共享内存库
        6.13.5  收尾工作
        6.13.6  性能
      6.14  双调排序
        6.14.1  串行双调排序
        6.14.2  蝶式交换和二进制表示
        6.14.3  并行双调排序I
        6.14.4  并行双调排序II
        6.14.5  CUDA双调排序的性能
      6.15  小结
      6.16  练习
      6.17  编程作业
    第7章  并行程序开发
      7.1  两种n-body问题的解决方案
        7.1.1  问题描述
        7.1.2  两种串行方案
        7.1.3  并行化n-body求解方案
        7.1.4  关于I/O的说明
        7.1.5  使用OpenMP并行化基本求解方案
        7.1.6  使用OpenMP并行化简化求解方案
        7.1.7  评估OpenMP代码
        7.1.8  使用Pthreads并行化求解方案
        7.1.9  使用MPI并行化求解方案
        7.1.10  使用MPI并行化简化求解方案
        7.1.11  MPI简化求解的性能
        7.1.12  使用CUDA并行化基本求解方案
        7.1.13  关于CUDA协同组的说明
        7.1.14  基本CUDA n-body求解方案的性能
        7.1.15  提高CUDA n-body求解方案性能的方法
        7.1.16  在n-body求解方案中使用共享内存技术
      7.2  样本排序

        7.2.1  样本排序和桶排序
        7.2.2  选择样本数据
        7.2.3  Map函数的简单实现
        7.2.4  Map的另一种实现方案
        7.2.5  并行化样本排序
        7.2.6  使用OpenMP实现样本排序
        7.2.7  使用Pthreads实现样本排序
        7.2.8  使用MPI实现样本排序
        7.2.9  使用CUDA实现样本排序
      7.3  注意事项
      7.4  使用哪种API
      7.5  小结
        7.5.1  MPI
      7.6  练习
      7.7  编程作业
    第8章  下一步该怎么走
    参考文献