You'll need Macromedia Flash Player 8 or above in order to view some of our content. Download now!

了解任务和数据并行

任务和数据并行之间的差异,以及如何避免阿姆达尔定律施加的限制。
我是 James Reinders,今天我将讨论两个与并行性有关的关键概念。当您开始并行编程,当您开始了解多核处理器并为它们编写程序的时候,您就会听说这两个概念。这些概念非常重要,需要透彻了解。它们又是极其简单的概念。现在让我们来逐一介绍。

今天我要讲的第一个概念是任务与数据的并行性。我将介绍它们的定义和含义,最后还会简单介绍一下阿姆达尔定律(Amdahl’s Law)。阿姆达尔定律是一个非常有趣的结论,有时候它却用来预测不合常理的事情。

现在,让我们从任务与数据并行性开始讲起。并行性是指同时做多件事情,人们所说的并行性根本上有两类。一类是任务并行性,另一种是数据并行性。

任务并行性非常简单。它是指您有大量数据需要处理——也许是图像中的许多像素,也许是需要更新的大量工资支票。把这些数据进行分解并交给多个处理器进行处理,这就是一种数据并行方法。许多年来,这一直是超级计算机最擅长的领域。人们对这类问题有着非常清楚的了解,过去对数据并行性的重视程度也一直超过任务并行性。

任务并行性则是指您有多个任务需要完成。例如您有一个很大的数据集,您想知道该数据集的最小值、最大值和平均值。这只是一个简单的例子,但您可以让不同的处理器针对同一个数据集分别计算不同的答案。因此,任务并行性是一种不同的看待问题的方式,它不是通过数据分解让不同的处理器同时做同一项工作,而是对任务进行分解。

最常见的任务并行技术是流水线技术。流水线技术是指您有多个任务需要完成,例如任务 1、任务 2 和任务 3。您不是让每个任务对数据进行独立操作,而是先把数据交给第一个任务,处理完以后再依次交给第二个和第三个任务。图像处理中常常采用流水线技术——图像处理器常常采用流水线操作。您打开一张图像,然后第一个任务开始对它进行处理——应用某个滤镜,然后把它依次传给后面的任务进行处理。这是任务并行与数据并行的结合,而且很常见。要适应这种方式需要一点时间。您应该花些时间进行研究,了解自己的程序中并行性究竟位于何处。实际中常常还有其它一些并行技术,当您学习并掌握了并行技术后,您就会明白用哪种方式编写程序才算最好:是用任务并行技术、数据并行技术,还是两者的结合——流水线技术。

通过上面的介绍,您已经知道,要么分解任务,要么分解数据,要么两者同时分解。现在的问题是,多核处理器能带来多大程度的速度和性能提升。Gene Amdahl 发现了一个非常著名的定律。这个定律叫“阿姆达尔定律”,其内容为:速度的提升受程序中串行部分的限制,所谓串行部分,是指程序中不能并行执行的部分。现在让我们看一个简单的例子。有一个程序由五个部分组成,每个部分占用 100 个单位时间。这里,我们假设第一部分、第三部分和第五部分是串行的,其中不包含任何并行处理。我们又假设第二部分和第四部分含有数据和任务并行处理。执行这个程序最初需要 500 个单位时间。如果我们改变第 2 部分和第4 部分的运行方式,让它们在两个处理器上运行,则这两个部分只需要 50 个单位时间。如此一来,执行整个程序只需要 400 个单位时间,也就是说,速度提高了 25%。我们继续假设有 4 个处理器,则第 2 部分和第 4 部分的执行时间缩短为 25 个单位时间,让我们再来看看速度的提升。由于我们有四个处理器处理同样的工作,这两个部分的执行时间变为 25 单位时间。这样一来,整个程序的执行时间就缩短到了 350 个单位时间,也就是说,速度提升了 40%。

现在,阿姆达尔定律的重点在于,串行部分的执行时间不会缩短。试想一下,我们有许多处理器,可以把那两个部分的执行时间缩短到几乎为零。但因为有串行部分的存在,整个程序的执行时间仍为 300 个单位时间。这就是阿姆达尔定律的关键所在。从根本上说,您将受到程序代码中串行部分的限制。如果用阿姆达尔定律来预测这个简单的例子,结果是无论您有多少处理器,您最多只能把速度提高 70%。

如果只从表面来看阿姆达尔定律现在如何提高程序的运行速度,您会发现,多核处理器和并行技术并非那么吸引人。这究竟是怎么回事?我们已经造出了有数千个处理器的超级计算机,显然,仅凭阿姆达尔定律并不能解释这一现象。Gene Amdahl 的这个定律是在 1967 年发现的。

令人奇怪的是,很久以后,直到 1988 年,Gustafson 才就阿姆达尔定律提出了自己的意见。他对此抱有完全不同的看法,他认为,计算机所做的工作每年都在发生变化。随着计算机运算能力的增强,我们交给它的工作量也越来越大,让它处理的数据越来越多。直至今天,这一趋势仍未改变。如果我们换个角度来看,比如说,程序的执行需要 500 个单位时间,我们就把并行部分的工作量增加一倍,在相同时间内,我们将完成 200 个单位的工作。 执行这个程序仍然需要 500 个单位时间,但我们完成了 700 个单位时间的工作,也就是说,只需要 2 个处理器,就能把速度提高 40%。如果我们再增加两个处理器,每个处理器完成同样的工作量,我们就能在同样时间内完成 1100 个单位时间的工作,也就是说,速度提高了 2.2 倍。Gustafson 的基本观点是,如果我们不断增加需要完成的工作量——这正是计算机发展过程中的实际情况,那么串行部分对我们的影响将逐渐减弱,运行速度将随着处理器数量的增加而迅速提升。也许我们对并行技术的使用和速度的提升还不够尽如人意——并非每个处理器都能用以提高速度。如果我们有 10 个处理器,我们无法把速度提高 10 倍,但我们能使速度呈线性提升。如果我们把 10 个处理器增加到 20 个,则速度大概能提高一倍。

如果您听到有人以阿姆达尔定律为由称并行技术无用,您可以引用 Gustafson 的结论来回应,并说明具体的方法。这就是超级计算机能够成功运用并行技术的关键所在——我们不断增加数据集,因为有了多核处理器,这一趋势会不断延续。

多核处理器有前途吗?

了解多核处理器的功耗、内存和并行指令集。

了解任务和数据并行

任务和数据并行之间的差异,以及如何避免阿姆达尔定律施加的限制。

必须了解的三个并行问题

英特尔James Reinders称,在管理多核系统方面,可扩展性、正确性和可维护性全都是至关重要的因素。

并行之抽象方法

处理原始线程是并行应该避免的问题之一。抽象化为解决这个问题提供了一种方法……

成功的并行编程

说明一些开发者在为并行系统编程,力求改善工作效率时重复出现的话题。

并行编程基础:第一部分

了解线程构造块的核心算法——一个并行编程C++模板库。

并行编程基础:第二部分

英特尔的James Reinders深入探究线程建构基础——一个并行编程C++模板库。

并行编程之API

英特尔James Reinders解释消息传递接口(MPI)——一个并行API。

About Us | Contact Us | Membership | RSS Feeds
Privacy Policy | Terms of Use

Copyright © 2007 CNET Networks, Inc. All rights reserved.

Other CNET Networks sites: ZDNet Australia | CNET.com.au | AppleSource
Builder.com | Builder UK | TechRepublic