文档库 最新最全的文档下载
当前位置:文档库 › LabVIEW驰骋多核技术时代

LabVIEW驰骋多核技术时代

https://www.wendangku.net/doc/468073731.html,

2008.9电子产品世界

多核时代的编程挑战

众所周知,由于对芯片功率和热效应的制约,以往单纯通过提高主频来提高处理器运行速度的做法已经不再可行,一个新的架构已经逐渐成型,那就是多核。

多核时代的来临已成为主流的发展趋势,在2006年的Intel开发者论坛上,Intel的CEO Paul Otellini向全世界展示了一个80核的原型,它可以在一秒内处理数以千兆字节的数据,那是非常惊人的处理能力,并且Intel希望在5年内将其推入消费市场。

然而,这对于工程师和程序员们来说,意味着什么呢?

在以往,程序开发人员们只需换上一块更高计算性能的处理器,就可以在无需任何代码修改的情况下,自动加快了每一行代码的执行速度。然而在如今的多核时代,这样的“免费午餐”已经结束了。如图1所示,即

使是在一个4核处理器上,如果其应用只是单线程的话,操作系统仍旧会将所有的任务分配到其中一个核上运行,导致多核处理器无法得到充分的利用。因此,为了充分利用多核处理器,需要有新的编程方法。

而这恰恰是一个巨大的编程挑战,针对这个问题,比尔盖茨也说过:“要想充分利用并行工作的处理器威力,……软件必须能够处理并发性问题。但正如任何一位编写过多线程代码的开发者告诉你的那样,这是编程

领域最艰巨的任务之一。”

总体而言,多核处理器编程存在以下几大难点:首先是并行的思考方式,比如要分辨出哪些任务是可以同时执行的,这并不是一件容易的事情,尤其对于习惯于顺序结构

编程的开发人员来说,思考方式的转变往往需要花相当长的一段时间。

其次是线程的创建和管理。开发人员把任务划分成多个并行步骤之后,就要通过线程的方式来编程实现。事实上,多线程编程是相当困难的,很多传统的编程语言都需要一组新的函数或结构来创建、同步、加解锁线程,这意味着工作量的增加。例如用C++写一个多线程的程序,程序员就必须要非常熟悉C++,了解如何将C++程序分成多个线程和任务间并发的同步,此外还要了解Windows多线程的机制,熟悉WindowsAPI的调用方法,或者MFC的架构等等;在C++上调试多线程程序,更是被许多程序员视为噩梦。

最后,开发人员还需要自己考虑并行代码段之间哪些资源是不能共享的,比如文件、内存、硬件等等,否则会导致资源的冲突和争夺,使得并行线程因等待资源而暂停甚至死锁。

以往基于文本的编程语言,由于其自身是一种顺序的编程模式,因此在对待并行编程时显得有些力不从心。虽然对于一些学习计算机编程或软件工程的专业开发人员来

LabVIEW驰骋多核技术时代

LabVIEW Fitting for Multi-Core Times

■ 周斌 NI技术市场工程师

图1 单线程编程无法充分利用多核处理器

测试

Test and Measument

讲,使用文本语言在一个双核处理器中开发并行编程机制可能还不足以被难倒的话,那么当Intel推出80核处理器之后,其编程的复杂度相信任何开发人员都无法应付。因此,工程师和开发人员们都期待着一种更高效、更具创新的并行编程工具,能够协助他们顺利迎接多核时代的到来。

LabVIEW — 天生并行的编程语言LabVIEW就是这样一种驰骋多核技术时代的编程语言,可以帮助开发人员高效地享用多核技术所带来的益处。

LabVIEW是一个基于数据流的图形化开发平台,它提供了直观的图形化编程方式和用户界面。与传统的文本编程相比,LabVIEW天生就是一种并行结构的编程语言。基于LabVIEW的数据流特性,如果连线中存在着分支,或者是框图中有着并行序列,那么后台的LabVIEW执行器就将自动

地实现并行化运行,这种在计算机科学术语中叫做“潜在并行化”(图2)。例如,我们在LabVIEW下创建了多个循环,那么相对应的也就创建了数个新的执行线程,从而这些并行循环就会自动分配成多个线程分到多个处理核上,让LabVIEW开发人员享受到了多核处理器的性能优势。

从单核到双核的处理器,理论上来说,获得的运算性能可以达到原先的两倍。但是,与这个极限值的接近程度取决于用户应用程序并行化运行的程度。使用LabVIEW,我们就可以方便地实现应用程序性能的改进,通过最少的编程调整,并行应用便可以获益于多核处理器。对于普通的LabVIEW应用程序而言,如果不考虑多核编程技巧,在不改写代码的情况下,与最初的基准程序相比,可以获得25%到35%性能上的提升,这也就意味着“免费的午餐”还没有结束。

下面我们来看图3的简单例子。其中LabVIEW代码中的分支简化了两个分析任务 ——滤波操作和快速傅立叶变换(FFT),

使它们可以在双核机器上并行化执行。首先

程序在单核的模式下(关闭其中一个核)运行

一次,然后在双核模式下运行。从图中可以

看到,由于两项任务的计算量都很高,因此

利用任务并行化获得的性能改进为原先的

1.8倍。

Windows操作系统是自动将线程分配

到不同的核上,那么对于某些应用,如果有

一个对时间要求非常高的线程,那么是否有

办法能够保证它执行的确定性呢?

使用LabVIEW 就可以很好地解决这个

问题,从而获得对于多核处理器更多的控制

权。在 LabVIEW中,工程师可以根据自身

需求手动设置线程运行在特定的核上,例如

将时间要求苛刻的采集与控制任务放在单独

的核上运行,而将对确定性要求不高的界面

响应、数据记录等任务放在另外一个核上运

行(图4)。值得一提的是,实现这样的操作

非常简单,就像放一个LabVIEW循环一样,

图2 LabVIEW本身就是

自动多线程的编程语言

图3 LabVIEW数据流编

程的并行特性

图4 LabVIEW 允许用户

手动分配线程在指定的

核上运行

https://www.wendangku.net/doc/468073731.html,2008.9电子产品世界

https://www.wendangku.net/doc/468073731.html,

2008.9电子产品世界

并行编程的一个基本理念,那么通常一个程序都会由几个子任务组成,例如在某个测试测量程序中,就可以分为模拟采集和数字输出两个任务,那么如果我们将这些独立的任务并发地执行在多核处理器中,那么就自动提高了运行的效率。这种将独立的几个任务在程序中并发执行的方法,就叫做任务并行化。

对于任务并行化,如何合理地去实现任务分配是需要解决的问题。首先,我们可以将本身就互相独立的任务分配在不同线程中,如上例所提到的模拟采集与数字输出任务,之间就没有任何的数据连接,因此在LabVIEW中我们就可以并行地将代码放在程序框图中,不需要添加任何其他代码,如图5所示。

此外,编程中常见的生产者—消费者循环也是一种任务并行化,在LabVIEW下我们可以将生产者(读取数据)与消费者(分析数据)分成并行的两个任务,任务之间的数据交互可以使用队列结构(Queue)来实现,如图6所示。

数据并行化(Data Parallelism)

除了可以将程序任务进行并行化之外,对于一些海量数据的处理分析,我们还可以将数据分成几个可并行操作的小数据集,然

后分别在各个核上实现并行处理,最后将结果整合起来作为整体数据集的处理分析结果,这种方式称为数据并行化。

如图7(a)所示,一个大的数据集仅仅在一个核上进行处理和运算,当核1在处理数据时,其它的三个CPU核都处在闲置状态,整个系统的运行效率很低。

那么,使用了数据并行化之后,如图7(b),之前的大数据集被分割成4个小数据集,并将它们在各自的核上进行处理运算,最终再将各自的运算结果整合起来作为大数据集的处理结果。经过了数据并行化之后,整个系统的运算效率有了直线的提升。

图5 LabVIEW对独立任务自动实现“任务并行化”

图6 生产者—消费者模型实现任务并行

(b)

图7 数据并行化

(a)

8 LabVIEW矩阵相乘的数据并行化

只需放置一个定时循环(Timed Loop),再分配那个循环到指定的核上即可。

作为一个典型的多核应用案例,德国的Max Planck研究院要实现针对核聚变能源的受控热核反应装置的等离

子控制,这种高速控制需要将88个磁感应器上的大量数据转换为64×128个点格上的偏微分方程

组,并要在短短的1ms内完成整个计算过程。最终他们使用LabVIEW在一个8核的系统上采用并行技术,将整个系统的运算速度提高了5

倍,成功地达到了1ms闭环控制速率

的要求,完成了这个“不可能的任务”。

基于LabVIEW的并行编程

LabVIEW自身所具有的并行特性使得开发人员可以不用花过多的时间放在多线程的创建、管理、同步、调试等底层实现过程上,而可以将主要精力聚焦在整个并行程序的高层架构上,这是能否高效利用多核处理

器技术的关键所在。

本节中将简单介绍针对多核的三种常用编程方式及其在LabVIEW下的实现方式。

任务并行化(TaskParallelism)

将整个程序分成多个线程来并发运行,是

与“任务并行化”类似,在LabVIEW下实现“数据并行化”也相当的直观与方便,图8就显示了一个矩阵相乘的代码,程序中将两个大矩阵各自分割成小矩阵进行相乘,最后再整合起来,仅仅这样一个简单的改变就可以在一个双核处理器上得到0.9倍的性能提高。

流水线式(Pipeline)

流水线,顾名思义,就是指将一系列的任务分割成固定的几个步骤,然后按照装配线的方式来执行。

我们以一个最简单的汽车装配线为例,一辆车的装配完成需要3个步骤:底盘安装、零件安装以及上漆。如果每个步骤都需要花费1个小时的话,那么如果一次就装配一辆车的话,我们需要花3个小时来完成(图9a)。

那么,如果我们换一种思路,分别对每个步骤设立一个工作站(例如工作站1就专

门负责底盘安装,以此类推,如图9b)。这样一来,我们看到,当一辆车在上漆时,另外一辆车可能正在进行底盘安装。通过这种方式,我们成功实现了每一个小时就能完成一辆车的装配,是之前装配速度的3倍。这个例子中所说的工作站,其实就可以算作是CPU各个核,那么通过这种流水线的操作方式,就可以充分利用多核技术,大大提高整个程序的运行速率。

而在LabVIEW下实现流水线式编程也是非常方便,图10就是一个最简单的4个步骤的流水线式代码,在一个For循环中,并行地执行4个处理步骤,系统将这并行的4个步骤放在不同的核上运行,从而起到“工作站”的作用,实现了流水线式的编程。

综上所述,任务并行化、数据并行化以及流水线式是并行编程的三种最常用的方式,相对于以往的顺序结构,这些编程方式可以在多核处理器上发挥更强大的作用,而在LabVIEW下可以很方便地实现这些编程方式,从而帮助工程师们从多核处理器技术中得益,提升系统的性能和运算速度。

结语

随着新一代处理器技术的日益普遍,工

程师与开发人员的一个必要考虑因素就是他

们使用的软件如何从多核系统中获得潜在的

性能提升。LabVIEW作为天生并行的图形

化编程环境,可以自动将程序多线程化,避

免了开发人员繁琐的底层实现,将主要精力

投入在高层的编程模式上;而作为并行编程

的三种常用模式(任务并行化、数据并行化

以及流水线式),在LabVIEW下也都能高效

地予以实现。因此,不容置疑的是,随着具

有更多核的处理器不断涌现,LabVIEW将

帮助开发人员真正迈入并行,驰骋多核技术

时代!

参考文献:

1. 刘全周,汪看华,张宏伟,基于LabVIEW

和PXI的汽车数字仪表测控系统,电子产品世界,

2008.2

(b)

(a)

图10 LabVIEW下实现

流水线式编程

图9 流水线式编程思路

https://www.wendangku.net/doc/468073731.html,2008.9电子产品世界

相关文档