目录

CUDA学习笔记——初识异构计算

并行计算

并行计算通常涉及CS的两个领域:

  • 计算机架构(硬件)
  • 并行计算编程(软件)

计算机架构专注于在架构层面对并行计算的支持。比如从单核到多核、乃至众核;从单核 cache 到多核 cache,以及随之的 cache 一致性问题;指令级并行(ILP)中的流水线、多发射支持;线程级并行(TLP)中的硬件多线程支持;从 SISD 系统到 SIMD系统乃至 MIMD系统的指令集支持等。

并行计算编程专注于通过某个编程语言或者基于传统语言的扩展,支持程序员编写高效的、并行运行的程序。

应用程序包含两种类型的并行:

  • 数据并行
  • 任务并行

数据并行类似于 SIMD 概念,对一个数据集中的每个元素或每个子集,做并行的计算,所以需要对数据进行划分。任务并行指按任务种类划分,不同的线程执行不同的任务。在 GPU 上用 CUDA 编程,通常是属于数据并行。

 

数据划分

在用 CUDA 进行数据并行的开发中,先要设计如何划分数据块。典型的数据块划分分为两种:

  • 块划分
  • 循环划分
数据块划分

由于 Nvidia GPU 架构的工作模式,不同的划分方法,对性能的影响可能是巨大的。系列后文会展开介绍。

 

架构分类

根据弗林分类法(Flynn’s Taxonomy),根据同时操作的指令和数据流数目,计算机的架构可以分为四类:

  • 单指令单数据(SISD)
  • 单指令多数据(SIMD)
  • 多指令单数据(MISD)
  • 多指令多数据(MIMD)

早期的计算机都是 SISD,如冯·诺依曼架构。

向量处理器,就是典型的 SIMD 架构。

MISD 架构只有理论模型,实际中并没有采纳。

MIMD 架构就是如今多核处理器,如 Intel 和 AMD 的双核处理器等都属于 MIMD。

 

计算机架构也可以按照内存组织方式来分类:

  • 多节点-分布式内存系统
  • 多处理器-共享内存系统

分布式内存系统的例子是集群(cluster)。有一组商品化系统组成,通过网络连接,单个系统也可以称为节点(node)。

共享内存系统的典型例子是多核处理器。又可以分为:

  • 一致内存访问系统(UMA)
  • 非一致内存访问系统(NUMA)

 

GPU 代表了一种众核架构,它具备了多种类型的并行:多线程、SIMD、MIMD、指令级并行等。Nvidia 把这种类型的架构称为 SIMT —— 单指令多线程。

 

CPU 和 GPU

CPU 是一种重量级的处理单元,专为非常复杂的控制逻辑而设计。除了前面提到过的流水线、多发射等技术外,CPU 还会采用分支预测、乱序执行等方式来提高执行速度。CPU 适合任务并行式的应用。

GPU 是一种轻量级的众核处理单元,最早是为图像处理而生。它具有上百个核,每个核支持基本的浮点运算。和 CPU 相比,它没有复杂的控制逻辑,适合数据并行式的应用。

通常, 在单个系统/节点中,CPU 和 GPU 之间通过 PCI-Express 总线连接,两者是独立的处理设备。

 

同构计算和异构计算

同构(homogeneous)计算使用同一种架构的多处理器执行应用程序。相反,异构(heterogeneous)计算使用两种或多种不同架构的处理器执行程序,把不同的任务分配给合适的架构,从而改善执行性能。

异构的典型例子就是 CPU/GPU 组合。

异构计算

Nvidia 把异构计算的应用程序分为两部分:

  • host code

  • device code

host code 在 CPU 上运行,device code 在 GPU 上运行。一个典型的异构应用程序是由 CPU 负责启动、初始化,以及管理相关的环境、代码和数据,然后将数据装载至 GPU,而 GPU 负责基于这些数据做计算密集型任务。

当一个硬件物理上独立于 CPU,用来加速计算密集型任务,我们通常称它为硬件加速。毫无疑问,GPU 是硬件加速的典型例子。


- 全文完 -

相关文章

「 您的赞赏是激励我创作和分享的最大动力! 」