英特尔® 并行调试器扩展

简介
本指南介绍了面向 Microsoft Visual Studio* 的英特尔® 并行调试器扩展。该组件随面向 Windows* 分发版的英特尔® Parallel Studio 2011、英特尔® Parallel Studio XE 2011 和英特尔® Composer XE 2011 一起提供。借助面向 Microsoft Visual Studio* 的调试器扩展,应用开发人员可以调试今天最为复杂的多核程序。
英特尔® 并行调试器扩展提供了全面集成的 Microsoft Visual Studio* 调试器图形用户界面扩展。它是一款调试解决方案,专门为多线程和多核程序而开发。它的高级特性有助于轻松访问被测试程序的线程特定属性。

关于如何充分利用对英特尔® 并行调试器扩展为 Microsoft Visual Studio* 调试环境提供的并行数据结构的更多见解,本指南提供了详细的技巧和方法。同时,它还高度概括了面向 Microsoft Visual Studio* 的英特尔® 并行调试器扩展以及关键特性。这些特性可以让您更全面、更深入地了解以下内容,增强调试体验:

• 在使用英特尔® C++ 编译器构建的应用中,多条线程之间共享的数据
• 在单指令多数据(SIMD)注册器中处理的矢量化数据流
• 重入函数调用的使用和依赖性
• 活动 OpenMP 任务锁信息和线程队层级结构
• 用 OpenMP* 和英特尔® Cilk™ Plus 创建的应用中的串行与并行执行流
• 英特尔® Cilk™ Plus 线程堆栈视图

数据共享事件检测附带有增强型事件过滤器,允许禁用不需要的事件报告;另外,它还能够将您的数据共享事件分析集中到您感兴趣的专用代码方面。更多详情请见随附的完整指南(ParallelDebuggerExtension2011.pdf)。

动机
越来越多的多核处理器的出现,要求广泛使用并行编程模式,以利用这些系统为程序执行流提供的优势,进而从这些系统中获得出色性能。然而,越来越先进的并行编程技术使跟踪所有活动线程及其可能的数据相互依赖性变得越来越困难。面向 Microsoft Visual Studio* 的英特尔® 并行调试器扩展旨在搭配使用英特尔提供的工具,利用调试扩展开发高度多线程化并行应用,以便支持调试器中同样先进和易于使用的特性。先进的并行编程技术需要先进的并行调试方法,以确保执行流和运行时问题分析顺利进行,及时纠正错误。
本指南介绍了面向 Microsoft Visual Studio* 的英特尔® 并行调试器扩展附带的概念和特性,可用于实现上述目标。

要求
操作系统:Microsoft Windows* XP SP2 or SP3, Microsoft Window* Vista 或 Micrsoft Windows* 7
构建环境:Microsoft Visual Studio* 2005, Microsoft Visual Studio* 2008 或 Microsoft Visual Studio* 2010
硬件平台:英特尔® 32 位架构、英特尔® 64 位架构或兼容架构。

调试器扩展的主要特性
英特尔® 并行调试器扩展是英特尔® Parallel Composer 的一部分,后者是英特尔® Parallel Studio 的组件。另外,它也随以下产品系列提供:面向 Windows* 分发版的英特尔® Parallel Studio XE 和英特尔® Composer XE 2011,以及相应的 Fortran 和 C++。它包含一套可以通过 Visual Studio 调试下拉菜单访问的特性。关于调试代码并行执行的更多见解,请见以下菜单项。

PDEMenus.JPG

线程数据共享检测
如果应用使用英特尔的调试运行时库构建,而且在英特尔® 编译器中设置选项 /debug:parallel,以启用并行调试检查,那么数据共享违规就可被检测到。线程数据共享检测支持使用 Windows* 本地线程或 OpenMP* 指令的应用。有必要设置这两个构建选项,以启用并行语言扩展或 OpenMP* 和 /debug:parallel,因为线程数据共享检测以及函数重入检测不仅需要使用 /debug:parallel 触发的调试信息工具,还需要各个运行时库中的英特尔特定并行语言扩展。通过“启用检测”菜单项,可以开启线程数据共享事件检测功能,除非调试器扩展检测到不同线程之间正在共享数据。

英特尔® 并行调试器扩展可以监控到这种例外情况,并在专用窗口显示数据共享事件。
您可以启用数据共享事件检测,并命令调试器扩展在发生此类事件时中止执行,将其视作等同于中止执行的数据断点的事件。数据共享事件检测附带广泛的过滤功能,因此,仅记录特定内存区域或数据对象中的数据共享违规。抑制过滤器可以让数据共享分析忽略由一个或更多过滤器处理器的被访问数据或代码访问数据。聚焦过滤器可以让数据共享分析忽略未被一个或多个过滤器明确处理的一切数据。最后,但同样重要的是,您可以在专用窗口中监控数据共享事件。
双击线程数据共享事件树状视图窗口中显示的任何数据共享事件,您可以反向链接到相应的源代码或汇编代码。
检测到的数据共享事件并不表示真发生了造成错误程序执行的违规。然而,它的确说明,您可能需要认真分析这些事件,因为它们很可能反映了某个潜在问题。
如果您确定事件没有任何危害,您也可以选择相应的上下文菜单项,阻止将来继续报告该事件。


重入函数调用检测
从 Visual Studio* 调试下拉菜单中,您可以访问一个在多条线程同时调用同一函数时开启重复函数调用检测和命令 Visual Studio* 中断执行的对话。因此,它允许严格调试和监控访问,以便您决定需要采取哪些措施来确保应用执行行为始终一致。启用重入函数调用检测的前提是,您的代码由启用了并行调试检查功能(/debug:parallel)的英特尔® 编译器编译。
为启用检测功能,您可以选择相应的调试下拉菜单项,指定一个可被解析为属于某个特定函数的内存地址。多条线程访问该函数时发生的任何时间冲突都会导致执行中断。

SSE 注册器窗口
Visual Studio* 调试下拉菜单可以让您访问英特尔® SIMD 流指令扩展,以及通常用于数据矢量化和单指令多数据(SIMD)处理的 MMX、SSE、SSE2、SSE3、SSE4 注册器。它可以在表中将矢量显示为行(或栏)。因此,SSE 注册器窗口用于显示表达式,不是单个值,而是值的矢量。它可以让您通过多种方式更改数据在 SEE 注册器中的表达。这些注册器会在被调试的应用以及映射到更加透明的基础硬件的实际数据中得到利用。

OpenMP* 调试支持
从调试下拉菜单和英特尔® 并行调试扩展图标栏,您可以访问关于 OpenMP* 数据结构的信息。该菜单项可用和不可用的前提是,您的应用使用 OpenMP 运行时库构建,这意味着应用要求使用编译器选项/Qopenmp 集编译。

您可以直接访问的 OpenMP* 数据结构包括任务、任务等待列表、任务生成树、障碍、锁和线程队。


串行化并行区域
对于基于 OpenMP*、CilK Plus 和英特尔并行线程扩展的代码,您可以通过实施串行执行,分析和更好地了解并行化代码区域可能存在的时间问题。

这样,您可以确定执行流正确性问题是否由并行性造成的,或者是否有更基本的代码编译错误也会出现在串行执行中。

您可以动态修改程序执行行为,因此,对于在进一步调查问题之前检查基本代码正确性,它可以提供非常有用的特性。

英特尔® Cilk™ Plus 线程堆栈视图
英特尔 Cilk Plus 辅助线程的调用堆栈可以是非单调的,因为英特尔 Cilk Plus 线程有能力重新使用其它线程完成的工作。该调用堆栈查看器有助于展开线程调用堆栈,同时充分考虑 Cilk Plus 线程实施的具体特性。
Cilk Plus 线程堆栈窗口可以显示辅助线程的纹理调用堆栈列表,它自己的专用窗口与常见调用堆栈窗口支持相同的函数,同时确保正确的线程特定依赖性感知。

结论
借助面向 Microsoft Visual Studio* 的英特尔® 并行调试器扩展,您可以更深入地了解和访问并行应用中的共享数据和数据依赖性,进而缩短开发周期,尽早检测导致严重运行时问题的潜在数据访问冲突。无论您何时使用本地 OS 线程、Cilk Plus 或 OpenMP 利用单指令多数据执行和/或并行化代码,都建议您使用面向Microsoft Visual Studio* 的英特尔® 并行调试扩展。结合用于优化线程和线程正确性的英特尔® Inspector,英特尔® 并行调试器扩展可以提供代码正确性调试功能,增加对并行化代码和数据的感知。详情请见 http://software.intel.com/zh-cn/articles/intel-parallel-studio-home。

附件
请不要忘记阅读完整指南,深入了解英特尔® 并行调试器扩展使用案例。完整指南作为本文(ParallelDebuggerExtension2011.pdf)的附件提供。


如何获得英特尔® 并行调试器扩展
英特尔® 并行调试器扩展是面向 Windows* 的英特尔® Composer XE 2011 的组件,是英特尔® Parallel Studio XE 2011 的一部分。您可以从英特尔® 软件网络(http://software.intel.com/zh-cn)购买该产品,或者下载评估版。
在该网页上,您还可以查找软件产品信息、用户论坛、博客、知识库文章以及产品支持获取方式。

优化通知

英特尔® 编译器、相关库和相关开发工具可能包含或使用针对英特尔® 和非英特尔微处理器中都存在的指令集(例如 SIMD 指令集)实现优化的选项,不过面向非英特尔微处理器的优化程度可能稍差一些。此外,部分面向英特尔编译器的编译器选项(包括并非英特尔微架构专用的选项)也为英特尔微处理器保留了下来。如欲获得有关英特尔编译器选项,包括指令集和相关特定微处理器的详细说明,请参阅“编译器选项”下的《英特尔® 编译器用户和参考指南》。英特尔® 编译器产品中的大多数库例程面向英特尔微处理器的优化程度要高于其它微处理器。英特尔® 编译器产品中的编译器和库可为英特尔和英特尔兼容微处理器提供优化特性,具体取决于您所选择的选项以及代码和其它因素。您将能够在英特尔微处理器上获得额外性能。

英特尔® 编译器、相关库和相关开发工具针对非英特尔微处理器的优化程度可能与英特尔微处理器相同或不同。这些优化特性包括英特尔® SIMD 流指令扩展 2(英特尔® SSE2)、英特尔® SIMD 流指令扩展 3(英特尔® SSE3)和追加 SIMD 流指令扩展 3(英特尔® SSSE3)指令集以及其它优化性能。对于在非英特尔制造的微处理器上进行的优化,英特尔不对相应的可用性、功能或有效性提供担保。该产品中依赖于处理器的优化仅适用于英特尔微处理器。

虽然英特尔坚信我们的编译器和库是帮助您在英特尔® 和非英特尔微处理器上获得最佳性能的理想选择,不过仍建议您对其它编译器和库进行评估,从而选出最符合您要求的解决方案。我们希望通过致力于最大限度提升所有编译器或库的性能来赢得您的青睐,如果您发现我们存在不足之处,欢迎您指正。

Pour de plus amples informations sur les optimisations de compilation, consultez notre Avertissement concernant les optimisations.