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

并行之抽象方法

处理原始线程是并行应该避免的问题之一。抽象化为解决这个问题提供了一种方法……
我是 James Reinders。常常有人问我:“如果我打算在程序中引入并行性,我该怎么做。我需要准备那些东西?”这个问题似乎并不难,我看看能不能做出简单的回答。关于并行编程中使用的抽象,我归纳出了三点。

我要强调的是,当您打算编写并行程序时,应该避免的一个错误是使用最低级的并行编程模型,也就是从原始线程(raw thread)——P 线程或 Windows 线程开始。我们必须避免这个错误。我们必须从抽象层面上处理并行性,也就是说,我们会对应用程序的并行性稍加描述,但主要是靠一些工具来处理这样的低层细节。在我看来,最重要的是各种库。这方面的确有些限制,但如果您打算在程序中引入并行性,又能找到一个能以并行方式实现所需功能的库,那问题就变得非常简单,您应该首选这种方法。所以,不妨想想,您需要的程序功能是否能通过库的调用来实现,如果是,是否能找到以并行方式实现这一功能的库。即使找不到这样的库,只要您手头有一些相关的库,您也可以对这些库进行改造,让它们以并行方式运行。以下是一些简单的例子:英特尔公司提供了一个用于数学运算的 MKL 库,像这样的库很常见——IMSL 就提供了许多以并行方式运行的库。再有,在多媒体领域,您能找到一些以并行方式运行的编码解码库,例如 JPE 和 MPEG 的编码和解码,这些都是非常明显的例子。图形处理领域有许多这样的库;苹果平台上有一个核心动画库,它也利用了并行技术。所以不妨四处找找,看能否找到自己需要的库。对我来说,这始终是第一件要找的工具。道理很简单,它和您今天的程序运行方式是一致的——您调用一个库,它就会不可思议地使用多个处理器。

我的第二个建议是认真研究一下 OpenMP。或许您没听说过 OpenMP,它是 C、C++、Fortran 等语言的一组扩展,为这些语言添加了一些指令,以便给编译器足够的提示,让您的程序能够并发执行。它之所以令人们惊讶,是因为这些人要么没听说过它,要么就是没有意识到,现在几乎所有编译器都支持它。它首先出现于 1996 年,10 年以后,几乎所有的 C、C++ 和 Fortran 编译器中都能找到它。它使用起来极其简单。

假设您用 C 语言编程时有一个简单的 For 嵌套循环——For I、For J、For K,您用了一些数据并行技术,因此,这段程序可以以并行方式运行,但一般来说,编译器不会自动让这段程序以并行方式运行。您可以添加一行代码:Add pragma omp parallel for

基本上这就够了。根据应用程序的具体情况,您可能需要给它一些额外的指令。您可以在同一行中加上 private(I,J,K)。

这样做是进一步提示编译器:这些循环语句中的 Index 变量对于每个线程来说是专有的,这可以提高性能。但是,您可以在程序的新添行中告诉编译器,这个嵌套循环应该以并行方式运行。OpenMP 主要是针对嵌套循环的,因此在应用范围上存在一定限制。OpenMP 的作用还可以更大一些,一些程序进一步把它用于任务并行,我认为今后几年人们会扩大 OpenMP 的应用范围,用它来处理任务并行,但就目前而言,它主要是针对循环语句的,尽管如此,这仍然是一个得心应手的好工具:它简单易用,移植性极强,您可以把它用于任何平台、任何编译器,因此,花点时间学习它是值得的。这是一种非常简单、非常可靠的并行编程方法。

我写出的第三点是线程构件模块。相信大家都读过一些关于线程构件模块的书,相信我们以后还会不断听到有人谈起它,但我现在想退一小步,我在此想要做的,是寻找另外一个等级的抽象,以免坠入原始线程的错误。现在,各种库和 OpenMP 随处可见,让我们再找找看还有什么工具可用?库的应用范围有所限制,OpenMP 对于 C 和 Fortran 来说非常不错,而且在 C++ 程序中也有所应用,但是,对于 C++ 程序员来说,真正重要的却是线程构件模块,它的数据并行性胜过 OpenMP,而且能处理任务并行。

以上就是我要谈的三点。每当有人打算在程序中引入并行性时,我总会按这个顺序给出建议:寻找库;试着使用 OpenMP;寻找线程构件模块;尽一切手段避免落入编写原始线程的套路。避免这一点大有好处:您的程序将不具备未来扩展性,编写起来也不容易,如果您不得不用汇编语言来进行并行编程,程序出错的几率就会更大。如需详细了解 OpenMP,您可以访问 OpenMP.org,如需详细了解线程构件模块,您可以访问 threadingbuildingblocks.org。请您好好想想以上三点,最后祝您并行编程顺利。

多核处理器有前途吗?

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

了解任务和数据并行

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

必须了解的三个并行问题

英特尔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