我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:多盈娱乐注册 > 多处理器 >

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

归档日期:07-17       文本归类:多处理器      文章编辑:爱尚语录

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

本文链接:http://cakesbyrita.net/duochuliqi/938.html