OpenCL编程语言可以帮助我们使用GPU或者多核处理器的并行能力

描述

一、并行处理

所谓并行处理就是同时处理多个计算程序,应用程序处理器典型的设计是使用单线程尽可能快的去执行应用程序,这种类型的处理器通常包含标量操作单元和程序控制器。GPU是被设计用来同时执行大量线程的处理器,GPU处理器的典型设计是使用多处理器并行的处理多个任务。

OpenCL编程语言可以帮助我们使用GPU或者多核处理器的并行能力。OpenCL是一种开放标准的变成语言,它能够使开发者在GPU或者其他类型的多核处理器上运行通用计算任务。

二、并行类型

1.数据并行

数据并行,任务并行和流水线(pipelines)并行是主要的并行类型。

数据并行是将数据划分为不同的数据元素或者数据块,使得处理器可以并行的处理不同的数据元素。多个处理器可以同时的读写和处理不同的数据。因此数据并行要求数据的数据结构可以满足多个处理器同时读写的要求。GPU进行通用计算,最典型的应用便是数据并行。通过OpenCL等编程语言可以很轻松的实现不同的线程以相同的方式处理不同的数据。如下图所示:可以使用9个线程,同时完成9组数据的相加。

gpu

2.任务并行

任务并行,是指一个任务被分解为多个小任务,由多个处理器同时处理。任务并行的一个简单例子便是在网页上播放一段视频,为了能够在网页上播放视频,我们的设备需要做如下几个任务:

运行一个执行通信的网络堆栈

从外部服务器请求数据

分析数据

解码视频数据

解码音频数据

渲染视频帧数据

播放音频数据

下图显示了播放在线视频的时候应用程序同时操作的系统;

gpu

3.流水线并行

流水线是通过多个不同的计算阶段处理数据,在流水线上多个阶段可以同时操作,但是他们操作的是不同的数据。流水线通常拥有相当少的阶段。下面是一个关于流水线的例子,一个录像程序必须执行的几个阶段:

从图像传感器捕捉图像数据,并且计算亮度级别

根据镜头效果修正图像数据

修正图像数据的对比度,色彩平衡和曝光

压缩图像数据

将图像数据添加到视频文件

将视频数据写入存储器

这些阶段必须按照顺序执行,但是他们可以同时在视频中的不同帧上执行。

我们将6个处理阶段,对应6中颜色,分别表示6个处理单元:

gpu

按照串行的处理方式,处理一帧图像需要串行的经过6个处理单元,假设需要300us的延迟,每一个处理单元消耗50us。这是一种组合逻辑的实现过程,我们只需要每300us输入一帧图像即可,不需要在处理单元内部做同步。

如果使用流水线技术,那么处理流程将完全不同,流水线技术是一种指令叠加技术,能够增加系统的吞吐量,但是同时会带来每一帧数据的处理延迟会增加。具体处理流程如下图所示:

gpu

图中给出了A、B、C三帧数据的处理流程;当A进入第二阶段的时候,B便可以进入第一阶段,当B进入第二阶段的时候,C便可以进入第一阶段,以此类推;但是需要注意的是,我们需要在每一个阶段的结束位置添加寄存器,用于数据同步。假设寄存器延迟为20us(请忽略单位,寄存器延迟不会达到us级别,为了计算方便这里做了不合实际的假设)。那么处理3帧数据,需要消耗的时间为:

8×(50 + 20) = 560 us;

而串行处理方式需要消耗300 × 3 = 900 us;但是不使用流水线获取每一帧数据输入到输出的延迟为300us,而加入流水线技术后,获取数据的延迟为420us。

不使用流水线时,系统的吞吐量为:1/300;使用流水线后,系统的吞吐量为:3/420= 1/140;可以看到系统的吞吐量增加了2.14倍(注:吞吐量的计算忽略单位,倍数的计算是准确的)。所以通过使用流水线技术可以显著增加系统的吞吐量,但是会增加系统的延迟。

但是流水线在使用过程中也存在弊端,以上的任务划分是均分的,但是在实际使用中,由于任务划分的不均匀,会造成流水线产生不同的延迟,不合理的阶段划分,很容易导致流水线阻塞,造成性能降低。

三.混合使用不同的并行方式及其并行加速限制

在具体的应用中可以综合使用不同的并行方式,例如在一个音频分析的应用中,就可以同时使用以上三种并行方式。

可以使用任务并行来独立的计算音符

使用音频生成流水线和处理模块来创造独特的音符

在流水线内部,一些处理阶段可以使用数据并行来加速计算

但同时并行加速也有他的限制,假设你的应用程序能够完全并行化,那么使用10个处理器来执行,可以将程序性能提升10倍,但是很少有应用程序可以完全并行化,程序中很大可能会存在串行部分,而串行部分则会限制程序的并行化数量。

Amdahl定律描述了并行程序可以实现的最大加速,Amdahl定律的公式如下:

Speedup = 1/(s + p / n);其中,s表示应用程序中串行的部分,p表示应用程序中并行的部分,n表述处理器的数量。

下图展示了不同数量的处理器对串行比例不同的应用程序所能提供的加速比率变化曲线:

gpu

在后续的文章中会更加细致的介绍如何使用OpenCL在移动端GPU上对应用程序进行并行化。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分