CUDA编程01- 并行编程介绍

目录

一:概述

二:异构并行计算

三:为什么需要并行计算

四:加速应用程序

五:并行编程的挑战

六:并行编程接口介绍

七:学习目标

八:学习计划


一:概述

        自计算机诞生以来,许多高端应用程序对执行速度和资源的需求超出了计算机所能提供的能力范围。早期的应用依赖于处理器速度、存储速度、存储容量的提升来增强应用程序的能力,例如,天气预报的及时性、工程结构分析的准确性、计算机生成图形的逼真度、每秒处理的机票预订数量,以及每秒处理的资金转账数量。最近,深度学习等新应用对执行速度和资源的要求甚至超过了最新计算机的处理能力。这些应用需求在过去的五十年里推动了计算设备的快速发展,并将在可预见的未来继续如此。

       基于单个中央处理器(CPU)的微处理器近乎是按顺序执行指令的,如英特尔和 AMD 的 x86 处理器,在时钟频率和硬件资源快速增长的支持下,推动了 20 世纪 80 年代和 90 年代计算机应用性能的快速提高和成本的降低。在二十年的发展过程中,这些单 CPU 处理器为台式机带来了 GFLOPS(即每秒十亿浮点运算),为数据中心带来了 TFLOPS(即每秒万亿浮点运算)。对性能提升的不懈追求使应用软件能够提供更多功能、更好的用户界面,并产生更有用的结果。反过来,用户一旦习惯了这些改进,就会要求处理器及硬件资源有更多的改进,从而为计算机行业创造了一个积极的(良性)循环。

      然而,自 2003 年以来,由于处理器能耗和散热问题,这种增长趋势已经放缓。这些问题限制了时钟频率的提高,以及单个CPU在每个时钟周期内指令执行能力的提升。从那时起,几乎所有的微处理器供应商都转到多核模式,即在每个芯片中使用多个物理 CPU(称为处理器内核)来提高处理能力。在这种模式下,传统 CPU 可被视为单核 CPU。要从多个处理器内核中获益,用户必须有多个指令序列,无论是来自同一应用还是不同应用的指令序列,都可以同时在这些处理器内核上执行。要使特定应用受益于多个处理器内核,其工作必须被划分为多个指令序列,这些指令序列可同时在这些处理器内核上执行。从单个 CPU 分步执行指令到多个内核并行执行多个指令序列,这一转变对软件开发人员产生了巨大的影响。

        传统上,绝大多数软件应用程序都是以顺序程序的形式编写的,由冯-诺依曼(von Neumann)在其 1945 年的开创性报告中设想的处理器来执行。根据程序计数器(文献中也称作指令指针)的概念,人类可以将这些程序的执行理解为按顺序执行的代码。程序计数器包含处理器将要执行的下一条指令的内存地址。这种按顺序逐步执行应用程序所产生的一连串指令执行活动,在文献中被称为执行线程,或简称线程。线程的概念非常重要,在本书的其余部分将对其进行更正式的定义和广泛的使用。

        从历史上看,大多数软件开发人员都是依靠硬件的进步,如提高时钟速度和在周期执行多条指令,来提高其应用程序的速度;每一代新处理器的推出,同样的软件就会运行得更快。计算机用户也开始期望,每一代新的微处理器都能使这些程序运行得更快。十多年来,这种期望已不复存在。程序只能在其中一个处理器内核上运行,而处理器内核的速度不会随着处理器的更新换代而明显加快。如果不提高性能,随着新微处理器的推出,应用软件开发人员将无法再在其软件中引入新的功能和特性;这将减少整个计算机行业的发展机会。

        相反,随着新一代微处理器的问世,并行编程使得应用软件的性能将继续得到显著提高,在并行程序中,多个执行线程相互配合,以更快的速度完成工作。并行程序相对于顺序程序来说,这种新的、显著提升的性能优势被称为并发革命(Sutterand Larus, 2005)。并行编程实践绝非新生事物。几十年来,高性能计算(HPC)领域一直在开发并行程序。这些并行程序通常运行在昂贵的大型计算机上。只有少数精英才有理由使用这些计算机,因此并行编程的实践仅限于少数应用开发人员。现在,所有新型微处理器都是并行计算机,需要开发并行程序的应用数量急剧增加。现在,软件开发人员亟需学习并行程序设计,这正是学习并行编程(CUDA)的意义。(CUDA具有代表性)

二:异构并行计算

        自 2003 年以来,在微处理器设计方面,半导体行业已确定了两条主要发展轨迹。多核轨迹旨在保持原有程序的执行速度,同时向多核发展。多核处理器始于双核处理器,每一代半导体工艺都会增加核数。一个最近的例子是英特尔的多核心服务器微处理器,它拥有多达24个处理器核心,每个核心都是一个乱序的、多指令发射处理器,实现了完整的386指令集,支持超线程技术,可同时运行两个硬件线程,旨在最大化顺序程序的执行速度。另一个例子是最近推出的具有 128 个处理器内核的 ARM Ampere 多核服务器处理器。

        相比之下,多线程轨迹更注重并行应用的执行吞吐量。多线程轨迹从大量线程开始,每一代半导体工艺都会增加线程数量。最近的一个例子是英伟达™(NVIDIA®)公司的 Tesla A100 图形处理器(GPU),它拥有数万个线程。通过大量简单的顺序流水线执行。多线程处理器,尤其是 GPU,自 2003 年以来一直引领着浮点性能的发展。A100 GPU 的浮点数运算吞吐量峰值为 9.7 TFLOPS(64位双精度)、 15.6 TFLOPS(32 位单精度) 和 31.2 TFLOPS(16 位半精度)。 相比之下,最近英特尔 24 核处理器的浮点计算吞吐量峰值为0.33 TLOPS(双精度 ) 和0.66 TFLOPS(单精度 )。在过去几年中,多线程 GPU 和多核 CPU 的峰值浮点运算吞吐量之比一直在上升。这些不一定是应用程序的执行速度,而只是这些芯片的执行单元可能支持的原始速度。

        这种多核与多线程性能峰值之间的巨大差距已经形成了相当大的“电位差”。到了某个时候,就必须有所变化。我们已经走到了这一步。迄今为止,这种巨大的峰值性能差距已经促使许多应用软件开发人员将其软件的计算密集型部分转移到 GPU 上执行。更重要的是,并行执行性能的大幅提升使得深度学习等革命性的新应用成为可能,而这些应用本身就是由计算密集型部分组成的。毫不奇怪,这些计算量大的部分也是并行编程的主要目标:当有更多的工作要做时,就有更多的机会将分配给并行程序开发者。

        有人可能会问,为什么多线程 GPU 和多核 CPU 之间的峰值性能差距如此之大?答案就在于这两类处理器的基本设计理念不同,如下图所示:

        如图左侧所示,CPU的设计是为了优化代码顺序执行的性能。通过以增加芯片面积和单位功耗为代价,最大限度地减少算术运算的延迟(latency)。 设计大量的片上高速缓存是为了提高数据访问的速度,将长延时的内存访问转换为短延时的高速缓存访问。成熟的分支预测逻辑和执行控制逻辑可以减少条件分支指令的延迟。通过减少上述延迟,CPU 硬件可以减少每个线程的执行的延迟。然而,低延迟算术单元、复杂的操作数传送逻辑

  • 61
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑不溜秋的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值