CUDA C编程(一)基于CUDA的异构并行计算

并行计算

  并行计算可以被定义为同时使用许多计算资源(核心或计算机)来执行并发计算,一个大的问题被分解成多个小问题,然后再不同的计算资源上并行处理这些小问题。并行计算通常涉及两个不同的技术领域:计算机架构以及并行程序设计。具体如下图:
CUDA C编程(一)基于CUDA的异构并行计算_第1张图片
  大多数现代处理器都应用了哈佛体系结构(Harvard architecture),如下图所示,它主要由3部分组成:内存(指令内存和数据内存)、中央处理单元(控制单元和算术逻辑单元)、输入/输出接口。
CUDA C编程(一)基于CUDA的异构并行计算_第2张图片

串 行 编 程 和 并 行 编 程
  下图描述了区分两个计算单元之间关系的两种方法:
CUDA C编程(一)基于CUDA的异构并行计算_第3张图片

并 行 性
  在编程领域,并行编程设计正在成为主流。多层次的并行性是架构设计的驱动力。在应用程序中有两种基本的并行类型,如下图所示。
CUDA C编程(一)基于CUDA的异构并行计算_第4张图片
  CUDA编程非常适合解决数据并行计算的问题。许多处理大数据集的应用可以使用数据并行模型来提高计算单元的速度,数据并行处理可以将数据映射给并行线程。
  数据并行程序设计的第一步是把数据依据线程进行划分,以使每个线程处理一部分数据。通常来说,有两种方法可以对数据进行划分:块划分和周期划分,区别如下图所示。
CUDA C编程(一)基于CUDA的异构并行计算_第5张图片

计 算 机 架 构
  有多种不同的方法可以对计算机架构进行分类。一个广泛使用的分类方法是弗林分类法(Flynn’s Taxonomy),它根据指令和数据进入CPU的方式,将计算机架构分为4种不同的类型,如下图所示。
CUDA C编程(一)基于CUDA的异构并行计算_第6张图片
  计算机架构也能根据内存组织方式进行进一步划分,一般可分为分布式内存的多节点系统以及共享内存的多处理器系统。
CUDA C编程(一)基于CUDA的异构并行计算_第7张图片
  降低延迟、提高带宽、提高吞吐量这三个目的是架构层次上比较需要的。其中,延迟是一个操作从开始到完成所需要的时间,常用微妙来表示。带宽是单位时间内可以处理的数据量,通常表示为MB/s或GB/s。吞吐量是单位时间内成功处理的运算数量,通常表示为gflops(即每秒十亿次的浮点运算数量),特别是在重点使用浮点计算的科学计算领域经常用到。延迟用来衡量完成一次操作的时间,而吞吐量用来衡量在给定的单位时间内处理的操作量。

异构计算

  同构计算使用的是同一架构下的一个或多个处理器来执行一个应用。而异构计算则使用一个处理器架构来执行一个应用,为任务选择适合它的架构,使其最终对性能有所改进。尽管异构系统比传统的高性能计算系统有更大的优势,但目前对这种系统的有效利用受限于增加应用程序设计的复杂性。

异 构 架 构
  一个典型的异构计算节点包括两个多核CPU插槽和两个或更多个的众核GPU。GPU并不是一个独立运行的平台而是CPU的协处理器。因此,GPU必须通过PCIe总线与基于CPU的主机相连来进行操作,这也就是为什么CPU所在的位置被称作主机端而GPU所在的位置被称作设备端。
CUDA C编程(一)基于CUDA的异构并行计算_第8张图片
  一个异构应用包括两个部分:主机代码和设备代码。其中主机代码在CPU上运行,设备代码在GPU上运行。异构平台上执行的应用通常由CPU初始化。在设备端加载计算密集型任务之前,CPU代码负责管理设备端的环境、代码和数据。在计算密集型应用中,往往有很多并行数据的程序段。GPU就是用来提高这些并行数据的执行速度的。
  以下产品应用NVIDIA共公司的计算平台:
CUDA C编程(一)基于CUDA的异构并行计算_第9张图片
  通常使用CUDA核心数量和内存大小这两个重要特征描述GPU容量,使用峰值计算性能、内存带宽这两种不同的指标来评估GPU的性能。其中,峰值计算性能是用来评估计算容量的一个指标,通常定义为每秒能处理的单精度或双精度浮点运算的数量。峰值性能通常用GFlops(每秒十亿次浮点运算)或者TFlops(每秒万亿次浮点运算)来表示。内存带宽是从内存中读取或写入数据的比率。内存带宽通常用GB/s表示。
  NVIDIA使用一个术语“计算能力”来描述整个Tesla系列的GPU加速器的硬件版本。具有相同主版本号的设备具有相同的核心架构。

异 构 计 算 范 例
  GPU计算并不是要取代CPU计算。对于特定的程序来说,每种计算方法都有它自己的优点。CPU计算适合处理控制密集型任务,GPU计算适合处理包含数据并行的计算密集型任务。CPU与GPU结合后,能有效提高大规模计算问题的处理速度与性能。可以从并行级和数据规模两个方面区分CPU和GPU应用的范围。
CUDA C编程(一)基于CUDA的异构并行计算_第10张图片
  GPU和CPU的区别如下图所示:
CUDA C编程(一)基于CUDA的异构并行计算_第11张图片
CUDA : 一 种 异 构 计 算 平 台
  CUDA是一种通用的并行计算平台和编程模型,它利用NVIDIA GPU中的并行计算引擎能更有效地解决复杂地计算问题。CUDA平台可以通过CUDA加速库、编译器指令、应用程序接口以及行业标准程序语言的扩展(包括C、C++、Fortran、Python)来使用。
CUDA C编程(一)基于CUDA的异构并行计算_第12张图片
  CUDA提供了两层API来管理GPU设备和组织线程:CUDA驱动API、CUDA运行时API。驱动API是一种低级API,它相对来说较难编程,但是它对于在GPU设备使用上提供了更多的控制。运行时API是一个高级API,它在驱动API的上层实现。每个运行时API函数都被分解为更多传给驱动API的基本运算。运行时API和驱动API之间没有明显的性能差异,这两种API是相互排斥的,必须使用两者之一。我们一般用的都是运行时API。
  一个CUDA程序包括在CPU上运行的主机代码和在GPU上运行的设备代码两个部分的混合。NVIDIA的CUDA nvcc编译器在编译过程中将设备代码从主机代码中分离出来。如下图所示,主机代码是标准的C代码,使用C编译器进行编译。设备代码,也就是和函数,是用扩展带有标记数据并行函数关键字的CUDA C语言编写的。设备代码通过nvcc进行编译。在链接阶段,在内核程序调用和显示GPU设备操作中添加CUDA运行时库。
CUDA C编程(一)基于CUDA的异构并行计算_第13张图片

CUDA编程结构及学习

一个典型的CUDA编程结构包括5个主要步骤:
  >1.分配GPU内存;
  >2.从CPU内存中拷贝数据到GPU内存;
  >3.调用CUDA内核函数来完成程序指定的运算;
  >4.将数据从GPU拷回到CPU内存;
  >5.释放GPU内存空间。

你可能感兴趣的:(#,CUDA,cuda)