《CUDA C编程权威指南》——1.2节异构计算

1.2 异构计算
最初,计算机只包含用来运行编程任务的中央处理器(CPU)。近年来,高性能计算领域中的主流计算机不断添加了其他处理元素,其中最主要的就是GPU。GPU最初是被设计用来专门处理并行图形计算问题的,随着时间的推移,GPU已经成了更强大且更广义的处理器,在执行大规模并行计算中有着优越的性能和很高的效率。
CPU和GPU是两个独立的处理器,它们通过单个计算节点中的PCI-Express总线相连。在这种典型的架构中,GPU指的是离散的设备从同构系统到异构系统的转变是高性能计算史上的一个里程碑。同构计算使用的是同一架构下的一个或多个处理器来执行一个应用。而异构计算则使用一个处理器架构来执行一个应用,为任务选择适合它的架构,使其最终对性能有所改进。
尽管异构系统比传统的高性能计算系统有更大的优势,但目前对这种系统的有效利用受限于增加应用程序设计的复杂性。而且最近得到广泛关注的并行计算也因包含异构资源而增加了复杂性。
如果你刚开始接触并行编程,那么这些性能的改进和异构架构中可用的软件工具将对你以后的编程有很大帮助。如果你已经是一个很好的并行编程程序员了,那么适应并行异构架构的并行编程是很简单的。
1.2.1 异构架构
一个典型的异构计算节点包括两个多核CPU插槽和两个或更多个的众核GPU。GPU不是一个独立运行的平台而是CPU的协处理器。因此,GPU必须通过PCIe总线与基于CPU的主机相连来进行操作,如图1-9所示。这就是为什么CPU所在的位置被称作主机端而GPU所在的位置被称作设备端。

一个异构应用包括两个部分。
主机代码
设备代码
主机代码在CPU上运行,设备代码在GPU上运行。异构平台上执行的应用通常由CPU初始化。在设备端加载计算密集型任务之前,CPU代码负责管理设备端的环境、代码和数据。
在计算密集型应用中,往往有很多并行数据的程序段。GPU就是用来提高这些并行数据的执行速度的。当使用CPU上的一个与其物理上分离开的硬件组件来提高应用中的计算密集部分的执行速度时,这个组件就成为了一个硬件加速器。GPU可以说是最为常见的硬件加速器。
以下产品应用了NVIDIA公司的GPU计算平台。
Tegra
GeForce
Quadro
Tesla
Tegra系列产品是专为移动和嵌入式设备而设计的,如平板电脑和手机,GeForce面向图形用户,Quadro用于专业绘图设计,Tesla用于大规模的并行计算。Fermi是Tesla系列产品中的一种,用作GPU加速器,近来在高性能计算中获得了广泛应用。NVIDIA于2010年发布的Fermi架构是世界上第一款完整的GPU计算架构。Fermi GPU加速器的出现让许多领域的高性能计算有了新的发展,如地震资料处理、生化模拟、天气和气候建模、信号处理、计算金融、计算机辅助工程、计算流体力学和数据分析等。Fermi之后的新一代GPU计算架构Kepler,于2012年秋季发布,其处理能力相比以往的GPU有很大提升,并且提供了新的方法来优化和提高GPU并行工作的执行,有望将高性能计算提升到新的高度。Tegra K1包含一个Kepler GPU,并能满足GPU在嵌入式应用中的一切要求。
以下是描述GPU容量的两个重要特征。
CUDA核心数量
内存大小
相应的,有两种不同的指标来评估GPU的性能。
峰值计算性能
内存带宽
峰值计算性能是用来评估计算容量的一个指标,通常定义为每秒能处理的单精度或双精度浮点运算的数量。峰值性能通常用GFlops(每秒十亿次浮点运算)或TFlops(每秒万亿次浮点运算)来表示。内存带宽是从内存中读取或写入数据的比率。内存带宽通常用GB/s表示。表1-1所示为Fermi架构和Kepler架构的一些性能指标。

①单精度浮点性能的峰值。
本书中的大多数示例程序均可在Fermi和Kepler两种GPU上运行。一些示例需要在只包含Kepler GPU中特殊的架构上运行。
计算能力
NVIDIA使用一个术语“计算能力”(compute capability)来描述整个Tesla系列的GPU加速器的硬件版本。表1-2给出了Tesla产品的各个版本及其计算能力。
具有相同主版本号的设备具有相同的核心架构。
主版本NO.3是Kepler类架构。
主版本NO.2是Fermi类架构。
主版本NO.1是Tesla类架构。
NVIDIA发布的第一版GPU包含了与整个Tesla GPU加速器系列相同的名称“Tesla”。
本书中的所有示例都需要版本2以上的计算能力。

1.2.2 异构计算范例
GPU计算并不是要取代CPU计算。对于特定的程序来说,每种计算方法都有它自己的优点。CPU计算适合处理控制密集型任务,GPU计算适合处理包含数据并行的计算密集型任务。GPU与CPU结合后,能有效提高大规模计算问题的处理速度与性能。CPU针对动态工作负载进行了优化,这些动态工作负载是由短序列的计算操作和不可预测的控制流程标记的;而GPU在其他领域内的目的是:处理由计算任务主导的且带有简单控制流的工作负载。如图1-10所示,可以从两个方面来区分CPU和GPU应用的范围。

并行级
数据规模
如果一个问题有较小的数据规模、复杂的控制逻辑和/或很少的并行性,那么最好选择CPU处理该问题,因为它有处理复杂逻辑和指令级并行性的能力。相反,如果该问题包含较大规模的待处理数据并表现出大量的数据并行性,那么使用GPU是最好的选择。因为GPU中有大量可编程的核心,可以支持大规模多线程运算,而且相比CPU有较大的峰值带宽。
因为CPU和GPU的功能互补性导致了CPU+GPU的异构并行计算架构的发展,这两种处理器的类型能使应用程序获得最佳的运行效果。因此,为获得最佳性能,你可以同时使用CPU和GPU来执行你的应用程序,在CPU上执行串行部分或任务并行部分,在GPU上执行数据密集型并行部分,如图1-11所示。
这种代码的编写方式能保证GPU与CPU相辅相成,从而使CPU+GPU系统的计算能力得以充分利用。为了支持使用CPU+GPU异构系统架构来执行应用程序,NVIDIA设计了一个被称为CUDA的编程模型。这个新的编程模型是本书将要介绍的重点。

CPU线程与GPU线程
CPU上的线程通常是重量级的实体。操作系统必须交替线程使用启用或关闭CPU执行通道以提供多线程处理功能。上下文的切换缓慢且开销大。
GPU上的线程是高度轻量级的。在一个典型的系统中会有成千上万的线程排队等待工作。如果GPU必须等待一组线程执行结束,那么它只要调用另一组线程执行其他任务即可。
CPU的核被设计用来尽可能减少一个或两个线程运行时间的延迟,而GPU的核是用来处理大量并发的、轻量级的线程,以最大限度地提高吞吐量。
现在,四核CPU上可以同时运行16个线程,如果CPU支持超线程可支持多至32个线程。
现代的NVIDIA GPU在每个多处理器上最多可以并发支持1 536个同时活跃的线程。有16个多处理器的GPU,可以并发支持超过24 000个同时活跃的线程。

1.2.3 CUDA:一种异构计算平台
CUDA是一种通用的并行计算平台和编程模型,它利用NVIDIA GPU中的并行计算引擎能更有效地解决复杂的计算问题。通过使用CUDA,你可以像在CPU上那样,通过GPU来进行计算。
CUDA平台可以通过CUDA加速库、编译器指令、应用编程接口以及行业标准程序语言的扩展(包括C、C++、Fortran、Python,如图1-12所示)来使用。本书重点介绍CUDA C的编程。
CUDA C是标准ANSI C语言的一个扩展,它带有的少数语言扩展功能使异构编程成为可能,同时也能通过API来管理设备、内存和其他任务。CUDA还是一个可扩展的编程模型,它使程序能对有不同数量核的GPU明显地扩展其并行性,同时对熟悉C编程语言的程序员来说也比较容易上手。

一个CUDA程序包含了以下两个部分的混合。
在CPU上运行的主机代码
在GPU上运行的设备代码
NVIDIA的CUDA nvcc编译器在编译过程中将设备代码从主机代码中分离出来。如图1-14所示,主机代码是标准的C代码,使用C编译器进行编译。设备代码,也就是核函数,是用扩展的带有标记数据并行函数关键字的CUDA C语言编写的。设备代码通过nvcc进行编译。在链接阶段,在内核程序调用和显示GPU设备操作中添加CUDA运行时库。

时间: 2024-08-04 02:14:32

《CUDA C编程权威指南》——1.2节异构计算的相关文章

《CUDA C编程权威指南》——3.1节CUDA执行模型概述

3.1 CUDA执行模型概述 一般来说,执行模型会提供一个操作视图,说明如何在特定的计算架构上执行指令.CUDA执行模型揭示了GPU并行架构的抽象视图,使我们能够据此分析线程的并发.在第2章里,已经介绍了CUDA编程模型中两个主要的抽象概念:内存层次结构和线程层次结构.它们能够控制大规模并行GPU.因此,CUDA执行模型能够提供有助于在指令吞吐量和内存访问方面编写高效代码的见解. 在本章会重点介绍指令吞吐量,在第4章和第5章里会介绍更多的关于高效内存访问的内容.3.1.1 GPU架构概述 GPU

《CUDA C编程权威指南》——1.4节使用CUDA C编程难吗

1.4 使用CUDA C编程难吗CPU编程和GPU编程的主要区别是程序员对GPU架构的熟悉程度.用并行思维进行思考并对GPU架构有了基本的了解,会使你编写规模达到成百上千个核的并行程序,如同写串行程序一样简单.如果你想编写一个像并行程序一样高效的代码,那么你需要对CPU架构有基本的了解.例如,数据局部性在并行编程中是一个非常重要的概念.数据局部性指的是数据重用,以降低内存访问的延迟.数据局部性有两种基本类型.时间局部性是指在相对较短的时间段内数据和/或资源的重用.空间局部性是指在相对较接近的存储

《CUDA C编程权威指南》——1.2 异构计算

1.2 异构计算 最初,计算机只包含用来运行编程任务的中央处理器(CPU).近年来,高性能计算领域中的主流计算机不断添加了其他处理元素,其中最主要的就是GPU.GPU最初是被设计用来专门处理并行图形计算问题的,随着时间的推移,GPU已经成了更强大且更广义的处理器,在执行大规模并行计算中有着优越的性能和很高的效率. CPU和GPU是两个独立的处理器,它们通过单个计算节点中的PCI-Express总线相连.在这种典型的架构中,GPU指的是离散的设备从同构系统到异构系统的转变是高性能计算史上的一个里程

《CUDA C编程权威指南》——导读

###前 言 欢迎来到用CUDA C进行异构并行编程的奇妙世界! 现代的异构系统正朝一个充满无限计算可能性的未来发展.异构计算正在不断被应用到新的计算领域-从科学到数据库,再到机器学习的方方面面.编程的未来将是异构并行编程的天下! 本书将引领你通过使用CUDA平台.CUDA工具包和CUDA C语言快速上手GPU(图形处理单元)计算.本书中设置的范例与练习也将带你快速了解CUDA的专业知识,助你早日达到专业水平! 目 录 第1章 基于CUDA的异构并行计算 1.1 并行计算 1.1.1 串行编程和

《CUDA C编程权威指南》——1.4 使用CUDA C编程难吗

1.4 使用CUDA C编程难吗 CPU编程和GPU编程的主要区别是程序员对GPU架构的熟悉程度.用并行思维进行思考并对GPU架构有了基本的了解,会使你编写规模达到成百上千个核的并行程序,如同写串行程序一样简单. 如果你想编写一个像并行程序一样高效的代码,那么你需要对CPU架构有基本的了解.例如,数据局部性在并行编程中是一个非常重要的概念.数据局部性指的是数据重用,以降低内存访问的延迟.数据局部性有两种基本类型.时间局部性是指在相对较短的时间段内数据和/或资源的重用.空间局部性是指在相对较接近的

《CUDA C编程权威指南》——3.2节理解线程束执行的本质

3.2 理解线程束执行的本质 启动内核时,从软件的角度你看到了什么?对于你来说,在内核中似乎所有的线程都是并行地运行的.在逻辑上这是正确的,但从硬件的角度来看,不是所有线程在物理上都可以同时并行地执行.本章已经提到了把32个线程划分到一个执行单元中的概念:线程束.现在从硬件的角度来介绍线程束执行,并能够获得指导内核设计的方法.3.2.1 线程束和线程块 线程束是SM中基本的执行单元.当一个线程块的网格被启动后,网格中的线程块分布在SM中.一旦线程块被调度到一个SM上,线程块中的线程会被进一步划分

《CUDA C编程权威指南》——3.3节并行性的表现述

3.3 并行性的表现为更好地理解线程束执行的本质,将使用不同的执行配置分析下述的sumMatrixOn-GPU2D核函数.使用nvprof配置指标,可以有助于理解为什么有些网格/块的维数组合比其他的组合更好.这些练习会提供网格和块的启发式算法,这是CUDA编程人员必备的技能.二维矩阵求和的核函数如下所示: 在接下来的部分,将使用生成的sumMatrix对块和网格配置执行试验.3.3.1 用nvprof检测活跃的线程束首先,需要生成一个参考结果作为性能基准.为此,要先测试一组基础线程块的配置,尤其

《CUDA C编程权威指南》——2.1节CUDA编程模型概述

2.1 CUDA编程模型概述 CUDA编程模型提供了一个计算机架构抽象作为应用程序和其可用硬件之间的桥梁.图2-1说明了程序和编程模型实现之间的抽象结构的重要.通信抽象是程序与编程模型实现之间的分界线,它通过专业的硬件原语和操作系统的编译器或库来实现.利用编程模型所编写的程序指定了程序的各组成部分是如何共享信息及相互协作的.编程模型从逻辑上提供了一个特定的计算机架构,通常它体现在编程语言或编程环境中. 除了与其他并行编程模型共有的抽象外,CUDA编程模型还利用GPU架构的计算能力提供了以下几个特

《CUDA C编程权威指南》——1.1节并行计算

1.1 并行计算 在过去的几十年间,人们对并行计算产生了越来越多的兴趣.并行计算的主要目标是提高运算速度. 从纯粹的计算视角来看,并行计算可以被定义为计算的一种形式,在这种形式下,计算机可以同时进行许多运算,计算原则是一个大的问题往往可以被划分为很多可以同时解决的小问题. 从程序员的角度来说,一个很自然的疑问,就是如何将并发计算映射到计算机上.假设你有许多计算资源,并行计算可以被定义为同时使用许多计算资源(核心或计算机)来执行并发计算,一个大的问题可以被分解成多个小问题,然后在不同的计算资源上并