查看完整版本: OpenMP 线程处理的基本消耗

admin 2007-11-17 12:05

OpenMP 线程处理的基本消耗

介绍
如果您有现成的代码,并希望使其实现线程化,以令其在多核系统上达到最佳运行效果。 开始使用前您需要了解哪些内容?

本文将说明如何开始使用 OpenMP 对代码进行线程化处理,帮助您确定从何处进行线程化,并显示如何衡量所产生的代码的性能。 还将举例比较该线程技术与典型的 Win32 线程处理。

现今,越来越多的多核处理器不断面市。 因此,开发人员需要在代码中添加线程来利用系统所提供的多个内核,并将对性能比较敏感的代码分隔在多个内核上。 但同时,必须确保代码具有良好的可伸缩性;无论在单核计算机、双核计算机、四核计算机及更高级别的计算机上,同样的代码都必须能够运行良好。 本文着重说明使用 OpenMP 线程处理库的某些常用线程处理技术以及性能衡量方法。 这将提供某些性能基准供您使用,帮助您理解如何实现代码线程化以及如何衡量其性能。

OpenMP 是用于编写直接线程化代码的线程处理库, 通常用于向现有的单线程代码中添加线程处理。 本文假定您熟悉线程概念,但可能尚未使用过 OpenMP 或很少对代码进行线程化处理来提高性能。

我们不妨看一些简单的代码,使用 OpenMP 添加线程,然后看看它在双核系统上的执行情况。 这样,您可以清楚地了解 OpenMP 是如何运行的,以及如何修改自己编写的代码并对其进行性能评定。 为便于比较,文中还给出了 Win32 线程处理。

所有代码均使用 C++ 编写,使用英特尔 C++ 编译器 9.0 编译。 性能评测平台为 Windows XP SP2。 有关测试硬件的详细信息,请参阅“配置”附录。

在此处显示的示例中,OpenMP 代码具有良好的可伸缩性,当强制其以单线程运行时,性能略有降低。 OpenMP 的消耗与 Win32 线程类似。 但无论是 OpenMP 还是 Win32 线程,循环启动的消耗都很高。 这表明,对于非常小的循环或对性能高度敏感的应用程序来说,不适合使用这些机制进行线程化。 在这些情况下,需要采用象线程池之类的机制实现线程化。
OpenMP 实验
[b]英特尔全球合作伙伴关系部高级软件工程师 Paul Lindberg[/b]

[b]为什么要注意这个代码示例?[/b]

本[url=http://www.intel.com/cd/ids/developer/apac/zho/268666.htm?desturl=316423.htm][color=#0860a8]示例代码[/color][/url]显示了如何衡量 OpenMP 基本的线程处理性能。

[b]摘要/概述[/b]
本代码选取了一段简单的串行代码,通过不同方式对它进行线程化。 然后使用一个测试工具进行性能衡量,从而帮助我们理解不同方法之间的差异。

[b]目标读者[/b]
考虑使用(或已经使用)OpenMP 执行线程处理的 C++ 开发人员,他们希望了解代码如何执行

[b]示例类别:[/b]完整项目

[b]实现语言:[/b] C++

[b]目标软硬件平台[/b]

[b]硬件系统:[/b] 运行有英特尔多核处理器的系统

[b]操作系统:[/b] Windows XP 及更高级别

[b]编译器:[/b] Microsoft Visual Studio.NET 2003、英特尔 C++ 编译器 9.0
页: [1]
查看完整版本: OpenMP 线程处理的基本消耗
查看完整版本: OpenMP 线程处理的基本消耗