[精华]Linux版的Intel线程工具详解
milex 2007-10-25 12:38:27 简介
融合了两项重要技术之后,英特尔大大扩展了对 Linux* 线程的支持。英特尔的开发产品系列现已成为面向 Linux 平台的最完善的工具集之一。
作者:Andrew Binstock
Linux* 在出现早期是通过宣传工作发展壮大的,当时该操作系统尚未提供任何支持线程化的强大功能。从某种程度上讲,这是源于 Linus Torvalds 最初支持的独特线程模型,而这也正是 Linux 项目背后的驱动力。随着人们对更为标准的线程模型的需求日益涌现,Torvalds 开始接受一种新型模型,这种模型与商用服务器操作系统(如 UNIX)更为相似。在过去的几年里,Torvalds 和 Linux 技术的传承者们对这些线程操作进行了重大的改进,其中一项就是采用 Pthreads API。该规范由 POSIX 协会设计,是最大限度实现 UNIX 界面标准化的工作的一部分。因此,除了 Linux 之外,Pthreads 还成为许多 UNIX 版本的主要 API。(有一个 Pthreads 版本还适用于 Windows*,尽管它不是 Windows API 的组成部分。请访问 http://sources.redhat.com/pthreads-win32/* )
于 2001 年发布的 Linux 内核 2.4 版中增加了强大的线程功能。这些新增功能使得该操作系统能够为仅有少数几个处理器的系统提供多处理器支持。随着 2.6 版内核的发布,Linux 线程功能向前迈进了一大步,具体表现在它能够支持的处理器数量大大增多,并且其线程调度程序也经过了彻底的重新设计。这些变化的结果便是,操作系统的可扩展性大大增强,目前已能够运行真正意义上的企业级应用程序。
随着 Linux 逐渐完善对线程的支持,英特尔也增强了其对线程化 Linux 应用程序的支持。英特尔从未像支持即将发布的线程导向开发工具这样支持过其他产品。本文将对这些工具和现有产品予以介绍,还将讨论它们如何使 Linux 开发人员受益。
Linux* 版本的英特尔线程工具
英特尔® 编译器提供了对线程的第一层支持。当然,它们支持 Pthreads。但更为重要的是,这些编译器还支持一种称为"OpenMP"的可移植线程接口。OpenMP 是由一个称为"OpenMP 架构审核委员会(ARB)"的硬件供应商团体设计的一种线程规范。其目的就是为线程程序提供一种简单、可移植的方法。OpenMP 标准(www.openmp.org* )由库函数、环境变量和 Pragma 组成,目前已发布了第二个主版本。虽然用户可以使用函数和环境变量来调试 OpenMP 程序的运行时环境,但是 OpenMP 的核心内容还是 Pragma(在 Fortran 中称为指令)集。
在此提醒一段时间未使用 Pragma 的读者:Pragma 是可以嵌入到源代码中的特定编译器命令。如果编译器无法识别 Pragma,便会将其忽略。例如,OpenMP 使用 Pragma 来告知编译器将某个循环线程化。在 C/C++ 中执行此操作的代码如下所示:
. . .
#pragma omp parallel for
for (j = 0; j < 10000; j++)
{
a[j] = b[j] + c[j];
}
图 1. 在 OpenMP 中通过 Pragma 实现并行化的 for 循环
此 Pragma 会告知编译器生成代码,这些代码将在后台创建一组线程、在线程间分配循环的工作,并在循环结束时管理这些线程。这段代码将针对运行时系统生成"最佳"数目的线程,该数目通常等于可用执行管线的数目。OpenMP 可提供类似 Pragma 来对程序的其他部分进行并行处理。
除了基本的简单易用等特点之外,OpenMP 还具备如下优势:在进行调试时,无须为能够采用单线程模式运行而更改代码。只需禁用 OpenMP pragma,代码即可以单线程模式运行。但如果开发人员希望调试运行有特定数目线程的代码,则这种配置可通过组合使用 API 调用和环境变量进行指定。总而言之,OpenMP 不但易于使用、可以移植,还为调试提供了极大的灵活性。
但是如果要使用 OpenMP,则必须具有支持 OpenMP 的编译器。个人电脑上仅提供有限的几个 OpenMP 编译器。英特尔提供了高级优化的编译器,可支持 Linux(和 Windows)上的 OpenMP(C/C++ 和 FORTRAN 语言)。为了便于集成,C/C++ 编译器的命名行兼容于相应平台上最常用的编译器(Linux 的 gcc,Windows 的 Microsoft Visual C++),且与这些编译器使用相同的二进制格式和调试格式。
尽管 OpenMP 具备诸多优势,但却无法对线程进行精密控制。如果要在较低的级别工作,则 Linux 开发人员应使用上文所述的 Pthreads API。在使用 Pthreads 时,开发人员将会发现英特尔提供的其它线程工具十分有用。这些工具包括程序分析和性能分析产品。
英特尔® 线程检查器 2.1 版
Linux 版英特尔® 线程检查器针对 Pthreads 和 OpenMP 的线程操作提供了有用的数据。英特尔® 线程检查器可检测到困扰执行并行编程的开发人员的典型情况。其中包括:死锁(这种情况下,两个线程相互等待)、竞态条件(两个线程同时访问相同的数据字段)、线程堆栈溢出以及其它难以重构的故障。英特尔® 线程检查器将使用性能装置来搜集 Linux 系统上的线程运行时信息,然后在 Windows 系统上分析并显示数据。对于 Linux 用户,该软件包与将在 Linux 平台上部署的 Windows 产品以及远程数据收集器一同提供。英特尔® 线程检查器可处理由 gcc 或英特尔编译器生成的二进制文件。在英特尔 64 位企业芯片、安腾® 处理器上运行的 Linux 应用程序可使用独立的版本。