《CUDA高性能并行计算》----第2章 CUDA基础知识 2.1 CUDA并行模式

简介: 在第1章中我们的讨论以计算从一个参考点到一组输入位置距离的函数distance-Array()结束。这个计算完全是串行的,距离数值是根据一个for循环中的计数i和输入数组的范围顺序计算的。但是,任何一个距离的计算相对于其他计算都是独立的。

本 节 书 摘 来 自 华 章 出 版 社 《CUDA高性能并行计算》 一 书 中 的 第2章,第2.1节, 作 者 CUDA for Engineers: An Introduction to High-Performance Parallel Computing[美] 杜安·斯托尔蒂(Duane Storti)梅特·尤尔托卢(Mete Yurtoglu) 著,苏统华 项文成 李松泽 姚宇鹏 孙博文 译 , 更 多 章 节 内 容 可 以 访 问 云 栖 社 区 “华 章 计 算 机” 公 众 号 查 看。

第2章

CUDA基础知识

在第1章中我们的讨论以计算从一个参考点到一组输入位置距离的函数distance-Array()结束。这个计算完全是串行的,距离数值是根据一个for循环中的计数i和输入数组的范围顺序计算的。但是,任何一个距离的计算相对于其他计算都是独立的。在串行实现中,我们不能发挥计算独立的优势反而会在计算中等待,直到一个计算完成再进行下一个计算。如果读者所使用的系统同一时间只能进行一个计算,那么串行的实现无可苛责。然而,在一个通用的GPU计算中,我们拥有成百上千的可以同时进行运算的硬件单元。为了让我们拥有的众多处理器发挥优势,我们将串行模式(同一时间内只进行一个计算任务,其他的依次等待)转换为并行模式(大量的计算同时执行)。本章中描述了CUDA模式中的并行、CUDA的基本编程语言扩展以及应用程序编程接口(API)[1, 2]。

2.1 CUDA并行模式

从串行到CUDA并行同时涉及硬件和软件两方面。硬件的转换涉及包含了多个运算单元以及运算规划和数据传输机制的芯片。软件的转换涉及API以及对编程语言的扩展。


3fee72e60cd3614c350ad39d2c9029e4f93181cb

GPU能够进行并行化的关键属性是其并不是只有一个或几个计算单元(像现代多核CPU一样)而是其具有成百上千计算单元。如果读者能够将计算分成大量的独立子任务,这些大量的计算单元为并行执行这些任务提供了可行性,换言之,同时执行这些任务而不是串行进行。值得注意的是,这样的并行涉及许多规划方面的问题:如何让一个特定的计算单元知道其需要执行哪个子任务?如何让大量的计算单元进行指令和数据的访问而不会造成巨大的通信阻塞?

CUDA引用了单指令多线程(SIMT)的并行模式。CUDA GPU包含了大量的基础计算单元,这些单元被称为核(core)每一个核都包含了一个逻辑计算单元(ALU)和一个浮点计算单元(FPU)。多个核集成在一起被称为多流处理器(SM)。

我们将一个计算任务分解为多个子任务,并将其称为线程,多个线程被组织为线程块。线程块被分解为大小与一个SM中核数量相同的线程束(warp)。每个线程束由一个特定的多流处理器执行。这些多流处理器的控制单元指挥其所有核同时在一个线程束的每个线程中执行同一个指令,因此这个术语称为单指令多线程(single instruction multiple thread)

执行同一指令并不是仅仅重复一种运算,因为每个线程使用由CUDA提供的单独的索引值进行了不同的运算[3]。这种SIMT的方法是可拓展的,因为可以通过使用更多的多流处理器分担计算负载来增加计算的吞吐量。图2.1显示了一个GPU和一个CPU之间的架构对比。CPU拥有较少的核,占据芯片的小部分,而更多的区域被用来加速那些少量核的控制器和缓存占据。通常而言,访问数据所需的时间会随着计算核和存贮数据的内存间位置的距离而增加。核等待数据的时间被称为延迟(latency),并且一个CPU通过设计大量的可以快速访问的空间存储数据来缩小延迟。


0268221bf644054d7901a0cf105383a15da2fb8e

GPU的空间分配则十分不同。芯片上的大多数地方被分配给了大量组织成多流处理器的运算单元和共享的控制单元。与其缩小延迟(需要为每个核配备大量缓存)GPU更倾向于隐藏延迟。当一个线程束所需要的数据不可获得时,多流处理器会转向执行另一个可获得数据的线程束。所关注的重点是整体的运算吞吐量而不是单个核心的执行速度。

现在我们已经准备好讨论CUDA的SIMT软件方面的实现。关键的软件结构是一种叫作核函数(kernel)的特殊形式的函数,这个函数中产生大量的组织成可以分配给多流处理器的计算线程。用CUDA术语来讲,我们加载一个核函数来创建一个由多个线程块组成的线程网格,线程块由多个线程组成。为了替换串行的计算,我们需要一种方法来告诉每个线程去执行哪一部分运算,换言之,访问哪一个输入的入口或者哪一个输出的出口,以及选择哪个计算或存储。CUDA通过为每个线程提供内建的索引变量来进行这样的编址。这些CUDA的索引变量会替换串行代码里的循环索引。加载核函数、创建计算网格、索引线程块和线程的具体过程将在2.2节中进行讨论。

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
并行计算 C++ 异构计算
Nvidia 并行计算架构 CUDA 分析(一)——CUDA 简介
    CUDA(Compute Unified Device Architecture,统一计算设备架构)是由 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题。
4084 0
|
并行计算 Windows
《CUDA高性能并行计算》----0.4 学习CUDA的必备
你需要一台支持CUDA的计算机。这台计算机不需要特别花哨,相当于一台网吧里玩游戏的计算机的配置即可。你还需要某些很容易获得的免费软件。如果你所在的机构已经为你准备好了使用CUDA的全部计算资源,那你就太幸运了,可以马上开工。
1227 0
|
并行计算 C++ Windows
《CUDA高性能并行计算》----0.7 本书代码
本书应用程序的代码可以通过www.cudaforengineers.com获取。虽然书中采用了一些代码片断和“骨架”代码(skeleton code),但标记为“代码清单”的代码(包含行号)是真实可运行代码的一部分。
1980 0
|
并行计算
《CUDA高性能并行计算》----3.6 推荐项目
1.改变距离数组中的元素数目并进行实验。当你将数目N定义成128、1024、63、65的时候是否遇到了一些问题? 2.计算包含4096个距离的距离数组并尝试改变TPB。你可以在系统上运行的最大(和最小)线程块大小是多大?注意,这个问题的答案依赖于你的GPU设备的计算能力。
1337 0
|
并行计算
《CUDA高性能并行计算》----1.4 推荐项目
项目1~5是关于运行其他CUDA样例程序的练习。
1349 0
|
Web App开发 并行计算 异构计算
《CUDA高性能并行计算》----2.4 推荐项目
1.去CUDA Zone注册并加入到CUDA开发者中(如果读者还没有这样做的话)。 2.观看 www.nvidia.com/object/nvision08_gpu_v_cpu.html的视频,体会关于并行和串行执行的有趣的对比。
1831 0
|
并行计算 Linux
《CUDA高性能并行计算》----1.2 运行我们自己的串行程序
是时候把我们的目光从CUDA样例程序移开,构建并运行我们自己的程序。在本节我们将给出完成相同功能的两个应用的代码``dist_v1``和``dist_v2``。每个应用都计算了从一个参考点到N个在直线上均匀分布的点之间的一组距离。
1293 0
|
并行计算 Linux
《CUDA高性能并行计算》----0.6 本书体例
本书使用以下约定: 为了跟正常文字区分,代码清单使用等宽(monospace)字体排版。 我们经常把类UNIX系统,如Linux和OS X,统一称为Linux。 我们把完整的示例程序称为应用程序(简写为app)。
907 0

热门文章

最新文章