cs_notes

CMU 15-418\618 Parallel Computer Architecture and Programming 2016 SP

https://www.youtube.com/playlist?list=PLMDSb3PWPnvivPLXHM9SlZLljrO9unIAW

01 Why Parallelism Why Efficiency

02 A Modern Multi Core Processor

多核处理器工作原理

SIMD技术

多核处理器的并行计算

03 Parallel Programing Abstractions

并行编程中的抽象概念和实现机制

ISPC中的工作组抽象

ISPC中的向量计算实现

04 Parallel Programing Basics

并行程序设计的思考框架

图像处理例子

并行程序的性能

05 GPU Architecture and CUDA Programming

GPU架构

计算机绘图原理

现代GPU的发展历程

CUDA编程模型

OpenGL渲染管道模型

CUDA kernel函数语法

OpenCL标准

06 Performance Optimization Part I

并行任务分配

静态分配

动态分配

动态分配的优化

任务粒度选择

07 Performance Optimization Part II

并行计算性能优化

通信同步开销

消息传递

同步消息传递

异步消息传递

延迟与吞吐量

流水线

并行计算性能优化建议

08 Parallel Programming Case Studies

并行编程案例

海洋浪流模拟

内存优化

Barnes-Hut算法

任务分配与平衡

09 Workload Driven Performance Evaluation

工作负载驱动的性能评估

海洋模拟程序的性能评估

10 Snooping Based Cache Coherence

缓存一致性问题

在多核处理器系统中,每个处理器都有自己的私有缓存,这意味着每个处理器可能拥有相同内存地址的数据的不同副本。如果一个处理器对某个数据进行写操作,而其他处理器仍然使用旧的值,就会产生缓存一致性问题。

一致性内存系统

一致性内存系统是指所有处理器中的缓存数据都保持一致的系统。在一致性内存系统中,如果一个处理器写了某个地址的值,其他处理器后续读这地址时应该返回写值。

解决方案

缓存一致性问题可以通过以下方式解决:

缓存一致性协议

缓存一致性协议是解决缓存一致性问题的一种常用方法。常见的缓存一致性协议包括:

11 Directory Based Cache Coherence

基本思想

目录式缓存一致性是多处理器系统中实现缓存一致性的一种方法。其基本思想是为每段内存使用一个目录结构来跟踪其拷贝的位置。

基本协议

目录式缓存一致性的基本协议如下:

优化方法

目录式缓存一致性存在目录过大的问题。为了解决这个问题,可以使用以下优化方法:

性能提升

目录式缓存一致性的协议流程比较复杂,可以通过以下方法来提升性能:

实现

Intel多核CPU的缓存一致性实现使用层次式总线和目录 agent。在每个处理器上都有一个目录 agent,负责管理该处理器上的缓存数据。当发生缓存一致性事件时,目录 agent会向其他处理器发送请求或通知。

12 Basic Snooping Based Multiprocessor Implementation

缓存一致性协议

缓存一致性协议是多处理器系统中保证不同处理器间缓存数据一致性的一种方法。在缓存一致性协议中,每个缓存行都具有以下状态:

并发问题

在多处理器系统中,可能出现以下并发问题:

总线

总线是一种常用的多处理器系统中的通信链路。总线工作原理如下:

缓存初始化读取数据

在采用原子总线的情况下,缓存初始化读取数据的整个流程如下:

  1. 处理器获取总线权限。
  2. 在总线上发送读请求地址。
  3. 总线仲裁器将读请求转发给所有处理器。
  4. 所有处理器检查请求地址对应的缓存行。
  5. 如果处理器的缓存行中没有对应的数据,则从主存中读取数据。
  6. 处理器向总线仲裁器发送读响应数据。
  7. 总线仲裁器将读响应数据转发给所有处理器。

13 Memory Consistency + Exam 1 Review

概述

内存一致性模型是指不同处理器或线程访问共享内存时,对内存读写操作的顺序约束。

缓存一致性协议是内存一致性模型的一种实现方式,它确保不同缓存对同一地址的读写操作保持一致性。

内存一致性模型

内存一致性模型可以分为以下几种:

顺序一致性模型

顺序一致性模型是内存一致性模型的一种严格的模型,它保证程序中读写指令的顺序执行。

在顺序一致性模型下,如果一个线程写入了一个变量,那么其他线程读取该变量时,一定会看到写入后的值。

宽松一致模型

宽松一致性模型是内存一致性模型的一种松散的模型,允许不同地址间读写顺序的重新排列。

在宽松一致性模型下,如果一个线程写入了一个变量,那么其他线程读取该变量时,可能看到写入前的值。

面试题

从一条写指令发出到完成的整个过程可以分为以下几个步骤:

  1. 指令发出:处理器将指令发送给内存控制器。
  2. 数据写入:内存控制器将数据写入主存。
  3. 缓存更新:内存控制器将写入的数据刷新到缓存。
  4. 指令完成:处理器接收到内存控制器的完成信号。

14 Scaling a Website

网站扩容是指在保证网站性能和可用性的前提下,提高网站的吞吐量和减少 latency 的过程。

网站扩容方法

网站扩容的方法可以分为以下几个步骤:

  1. 使用多线程或进程池来分配计算任务。
  2. 将计算负载分布到多台机器上。
  3. 采用负载均衡来分发请求。
  4. 使用数据库分片或读写分离来扩展数据库容量。
  5. 采用微服务架构来减少 latency。

挑战

网站扩容需要考虑以下几个挑战:

15 Interconnection Networks

集成电路网络拓扑结构是指集成电路中各个节点之间的连接方式。

网络术语

常见网络拓扑结构

现代集成电路网络拓扑结构

16 Implementing Synchronization

同步机制是多线程程序中保证线程安全的重要手段。

锁的三个步骤

忙等待算法

忙等待算法是线程等待锁的一种简单实现。线程在等待锁时,会一直循环检查锁是否已经被释放。

缺点:忙等待算法会导致线程占用 CPU 资源,但没有实际进展。

错误的锁算法

以下是一个简单但不正确的锁算法:

def lock(lock):
    if lock.locked:
        print("锁被占用,等待中...")
        while lock.locked:
            pass
    lock.locked = True

def unlock(lock):
    lock.locked = False

错误:在 lock.locked 为 True 时,没有判断线程是否是当前持有锁的线程。因此,其他线程可能会误以为锁已经被释放,从而导致竞态条件。

测试-设置指令

测试-设置指令是一种原子操作,用于测试和设置一个变量的值。在多处理器环境下,测试-设置指令可以保证两个线程同时执行该指令时,只有一个线程能成功设置变量的值。

自旋锁

自旋锁是基于测试-设置指令实现的一种锁。自旋锁的实现如下:

def lock(lock):
    while lock.locked:
        pass
    lock.locked = True

def unlock(lock):
    lock.locked = False

原理:在 lock.locked 为 True 时,线程将一直循环测试该变量,直到变量值为 False。当线程成功获取锁后,将将变量值设置为 True。

性能问题

由于自旋锁会导致线程一直循环测试变量值,因此可能会导致性能问题。

17 Fine Grained Sync and Lock Free Programming

在并发编程中,同步机制是保证线程安全的重要手段。传统的同步机制通常使用全局锁或互斥量来保护共享资源,这种方式的优点是简单易用,但缺点是会导致过度同步,降低并发性能。

细粒度的同步和无锁编程是并发编程中的一个重要方向,它通过降低锁粒度或避免使用锁来提高并发性能。

全局锁

全局锁是指对共享资源使用一个全局锁进行保护。这种方式的优点是简单易用,但缺点是只允许一个线程操作共享资源,会导致并发性能下降。

细粒度的同步

细粒度的同步是指对共享资源使用多个更小粒度的锁进行保护。这种方式的优点是允许多个线程同时操作共享资源的不同部分,提高了并发性能。但缺点是会增加编程复杂度和性能开支。

无锁编程

无锁编程是指在没有使用锁的情况下实现线程安全。这种方式的优点是可以最大限度地提高并发性能。但缺点是实现难度较大,需要对并发编程有深入的理解。

Hazard pointers

Hazard pointers 是一种无锁编程技术,它允许部分操作不加锁,降低锁粒度,优化性能。

18 Transactional Memory

事务内存机制是并发编程中的一项重要技术,它可以解决使用锁来实现原子操作存在的性能和可扩展性问题。

使用锁的缺点

使用锁来实现原子操作存在以下缺点:

事务的概念

事务是指一组原子操作,要么全部成功,要么全部失败。事务具有原子性、一致性、隔离性和持久性。

事务内存的实现

事务内存可以通过以下方式来实现:

事务的优点

使用事务内存机制可以获得以下优点:

19 Heterogeneous Parallelism and Hardware Specialization

异构并行系统是指由不同类型的处理器组成的系统,例如 CPU、GPU、FPGA 等。硬件专业化是指为特定任务设计特定的硬件。

单核 CPU 性能利用率低的问题

单核 CPU 的性能利用率很低,因为许多工作负载无法完全并行化。因此,需要采用异构并行系统来提高性能。

选择 CPU 时应考虑的因素

在选择 CPU 时,应考虑以下因素:

现代 CPU 的异构结构

现代 CPU 通常采用异构结构,例如集成图形处理器(GPU)。GPU 专门用于图形处理,具有大量的并行处理能力。

异构系统在手机 SoC 和超级计算机中的应用

手机 SoC 和超级计算机都采用异构设计,以提高性能和节能。

Amdahl 定律和性能图

Amdahl 定律指出,系统的总体性能受限于最慢的部分。性能图可以帮助我们分析不同系统的性能。

20 Domain Specific Parallel Programming Systems

领域特定并行编程系统(Domain-Specific Parallel Programming Systems)是指针对特定领域的并行编程系统,它通过限制程序的范围,从而可以在这些限定范围内实现更高效的编译优化。

挑战

传统的通用并行编程语言,如 OpenMP、MPI,需要软件开发人员手动进行并行化,这对于复杂的领域特定应用程序来说非常困难。

解决方案

领域特定并行编程系统通过提供领域特定的语法和抽象,可以帮助软件开发人员更轻松地编写并行程序。

例子

使用List语言编译程序运行在CPU和GPU上的不同方法

21 Domain Specific Programming on Graphs

概述

域特定图处理系统(Domain-Specific Graph Processing Systems)是指针对图处理应用程序的编程系统,它通过提供图处理特定的语法和抽象,可以帮助软件开发人员更轻松地编写图算法。

设计考虑

在设计域特定图处理系统时,需要考虑以下因素:

例子

GraphLab实现PageRank算法

GraphLab实现PageRank算法使用了Gather、Apply等操作来描述每个节点的计算逻辑。程序通过迭代运行来求解PageRank。

22 Spark

概述

Spark 是用于大数据处理的开源框架,它提供了比 MapReduce 更高效的计算模型和运行机制。

MapReduce 编程模型

MapReduce 是 Hadoop 框架的基础,它是一种用于分布式计算的编程模型。MapReduce 程序由两个阶段组成:Map 和 Reduce。

Spark 编程模型

Spark 编程模型基于内存计算,它可以将中间结果保存在内存中,避免多次读写磁盘,从而提高性能。

Spark 提供了丰富的 API,可以用来编写各种数据处理应用程序,包括批处理、流式处理、机器学习等。

MapReduce 和 Spark 的比较

MapReduce 和 Spark 都是用于大数据处理的框架,但它们在以下几个方面存在差异:

迭代计算

MapReduce 的迭代计算效率较低,因为每次迭代都要将中间结果保存到磁盘,然后再次读取到内存中。

Spark 通过 RDD 的 checkpoint 机制来解决迭代计算效率低的问题。RDD 的 checkpoint 机制将 RDD 中的数据保存到磁盘,这样在下次迭代时,就可以直接从磁盘中读取数据,无需重新计算。

23 Addressing the Memory Wall

概述

计算机内存系统是计算机系统中的重要组成部分,负责存储程序和数据。内存系统的性能直接影响计算机系统的整体性能。

内存访问成本

内存访问成本主要包括延迟和功耗。内存访问延迟是指从 CPU 发出内存访问请求到数据返回的时间。内存访问功耗是指内存访问过程中消耗的电能。

DRAM 内存数组

DRAM 是目前计算机系统中使用最广泛的内存类型。DRAM 内存数组由行、列和缓冲区组成。

软硬件协作优化

软硬件协作可以有效地提高内存访问性能。

存储器控制器

存储器控制器负责管理内存与 CPU 之间的数据传输。存储器控制器可以组织多个 DRAM 芯片,形成更宽带宽的内存通道。

GPU 等多核系统

GPU 等多核系统中,每个核心都有自己的内存控制器。内存控制器可以独立地访问内存,以提高内存访问性能。

24 The Future of High Performance Computing

概述

高性能计算(High-Performance Computing,HPC)是指利用大型计算机系统来解决复杂、计算量大的问题。

概述

深度卷积神经网络(Deep Convolutional Neural Networks)是一种用于图像识别、自然语言处理等任务的深度学习模型。CNN 通过卷积层和池化层来提取图像中的特征,然后通过全连接层进行分类。

内容

26 Parallel Deep Network Training

概述

深度学习网络训练通常需要大量的计算资源和时间。并行计算是提高深度学习网络训练效率的有效手段。

内容

27 Parallelizing the Graphics Pipeline

概述

图形渲染管线是将三维模型渲染为二维图像的过程。该过程通常需要大量的计算资源,并行计算是提高图形渲染效率的有效手段。

内容

28 Course Wrap up and Project Presentations

概述

内容

  1. 课程考试反馈:老师询问学生对考试的反馈,并说明试卷难易程度。
  2. 项目报告要求:老师提醒学生项目报告将在 5 月 9 日进行,分六到七分钟个人报告。报告将决定部分奖品,但不影响分数。
  3. 项目报告准备建议:老师给出项目报告准备的一些建议,包括报告要清晰为主,选择重点,提供论据证明工作完成得好等。
  4. 项目报告标题:老师分享一些学生过去项目报告的例子,指出好的报告标题可以概括报告内容。
  5. 项目报告流程:老师具体解释如何设置问题、目标、难点,展示结果和分析等报告流程。

CMU 15-418\618 Student Presentations

概述

会议内容

  1. 主持人介绍会议流程和奖品安排。会议采取 8 分钟报告 + 5 分钟问答的形式,各组报告之间会选出获奖项目。
  2. 第一个项目组报告了他们开发的分布式并行计算框架 Gregor。他们介绍了优化步骤,并与 Silk 框架进行性能对比。
  3. 第二个项目组报告了针对 Raspberry Pi 内置视频核心 GPU 开发的并行计算库 Kiny。他们介绍了 GPU 架构,并展示了如何使用操作和函数简化编程。
  4. 第三个项目组报告了他们在药品设计领域的一个 Virtual Screening 软件的 GPU 优化。他们介绍了算法细节和不同优化方案的效果。
  5. 第四个项目组报告了针对返回定向攻击算法开发的并行搜索生成器。他们展示了实时攻击演示。