为整个开发周期带来全面的并行性产品简介英特尔® Parallel Studio
Eric Rosier工程副总裁
Envivio 公司
英特尔® Parallel Studio
英特尔® Parallel Studio 为 Microsoft Visual Studio* C/C++ 应用程序的开
发带来了全面的并行性。英特尔® Parallel Studio 专为软件行业的领先
者和开发者而设计,直接解决他们所关注的问题。这些产品协同工
作覆盖整个开发周期,使程序并行性变得前所未有的简单可行。这
些工具不仅为刚接触并行化的新手而设计,让他们能够边学边用,
同时也能使经验丰富的并行程序员更有效、更自信地工作。英特尔®
Parallel Studio 可与常见的并行编程库和 API 标准(如英特尔® 线程构
建模块和 OpenMP*)实现互操作性,并为实现多核平台的性能优势
提供了迅捷的机会。
“英特尔® Parallel Studio 中新的分析和评测工具使得开发新的Envivio
4Caster* 系列代码转换器变得更快更有效。尤其是通过使用英特尔®
Parallel Inspector 和英特尔® Parallel Amplifier,提高了代码的可靠性
及其在多核多线程环境下的性能,从而缩短了总体开发周期。在合格
性检查阶段,由于安全性提高,减少了紊乱代码的数量,错误跟踪也
变得更容易。英特尔® Parallel Studio 全面优化了我们的软件产品,并
缩短了上市周期。”
英特尔® Parallel Studio 工具集
英特尔® Parallel Amplifier:
找到应用程序热点(hotspots)并追踪至源代码•
使用并发性分析,调优并行应用程序以获得性能提升•
使用锁定和等待分析来查找限制并行性能的关键等待•
对比结果以快速找到更改之处,比较新代码的性能•
英特尔® Parallel Composer:使用 C/C++ 编译器和高级线程库开发高效的应用程序。
•
•
•
•
英特尔® Parallel Inspector:
查找线程相关的错误,如死锁和数据竞争•
查找内存错误,如内存泄漏和内存崩溃•
图 1. 英特尔® Parallel Studio 工作流
a.
b.
c.
d.
英特尔® Parallel Studio 正是用于解决上述问题的。
英特尔® Parallel Inspector
英特尔® Parallel Amplifier
查找热点
快速找到瓶颈并调优并行应用程序,充分利用多核性能以获
得最大性能提升。
使用面向 32 位处理器的英特尔® C++ 编译器构建,它是
一个可在 32 位系统上创建 64 位应用程序的交叉编译
器,并且是本机 64 位编译器
使用英特尔® 集成性能基元(英特尔® IPP)创建代码,
它是一个用于工程、金融、数字媒体、数据处理和数学
运算方面的线程应用程序的基础构建模块。英特尔® IPP 也可与 Microsoft Visual C++ 编译器一起使用
使用与 Microsoft Visual Studio 调试器集成的英特尔® Parallel Debugger Extension 进行调试
使用英特尔® 线程构建模块(英特尔® TBB)创建代码,
它是一个屡获殊荣的 C++ 模板库,它可将线程提取到
任务,以创建可靠、可移植及可扩展的并行应用程序。
英特尔® TBB 也可与 Microsoft Visual C++ 编译器一起使
用
通过预先进行的并行内存和线程错误检查来确保应用程序
的可靠性。
利用英特尔® Parallel Composer 进行编码、调试和编译
利用英特尔® Parallel Inspector 进行验证
利用英特尔® Parallel Amplifier 进行调优
要充分利用英特尔® 多核处理器的能力并在多核架构上实现最
佳的应用程序性能,必须有效使用线程来划分软件工作负载。
在为代码添加线程创建高效的并行应用程序时,将会遇到下列
常见问题:
应用程序的哪些部分最适合并行化来获得最佳性能并避免内
存冲突?
哪种编程模型和具体的线程技术最适合您的应用程序?
如何检测并修复线程与内存错误呢?基于线程的软件是以非
确定性的方式在运行,其执行顺序取决于不同的运行情况,
因此其错误难以复现。
如何在多核处理器上提升多线程应用程序的性能?如何通过
额外的核心提升性能?
下表列出了英特尔® Parallel Studio 的工具,并提供了这些工具如
何解决上述问题的相关简要介绍。
英特尔®Parallel Composer
包括英特尔包括英特尔® C++ ® C++ 编译器以及综合线程库和编译器以及综合线程库和
调试器扩展,用于帮助您在调试器扩展,用于帮助您在 Microsoft Visual Microsoft Visual Studio* Studio* 开发环境中快速创建和调试多线程开发环境中快速创建和调试多线程
C/C++ C/C++ 应用程序。此工具能够帮您选择最适应用程序。此工具能够帮您选择最适
合您应用程序的并行编程模型。合您应用程序的并行编程模型。
设计用于多线程应用程序开发,通过简化调设计用于多线程应用程序开发,通过简化调
试、测试和验证促进向多线程的转换。试、测试和验证促进向多线程的转换。
并行应用程序的性能分析和调优工具,用于并行应用程序的性能分析和调优工具,用于
优化在多核平台上的性能。优化在多核平台上的性能。
解决问题解决问题
B B 和和 C C。。
解决问题解决问题 CC。。
解决问题解决问题 A A 和和 D D。。
图2. 热点分析:应用程序将时间耗费在哪里?
图3. 热点分析视图识别出占用 CPU 时间最长的函数。
选择分析类型
自底向上或自顶向下查看调用栈
选定函数的调用栈
热点函数的 CPU 时间
总体占用时间和 CPU 时间
筛选结果
可从查找应用程序中最耗费时间的函数开始。这是调优程序或添加并行性以提高程序运行速度的地方。英特尔® Parallel Amplifier 还显示了调用栈,使您能够了解函数的调用情况。对于具有多个调用序列的函数,会显示出一个调用栈是否比另外的调用栈更值得关
注。
下面的工作流程图描述了一个涉及英特尔® Parallel Studio 所有工具的典型使用模型。若您正准备为应用程序添加并行性,那么找出
热点将是最重要的第一步。如果您已经添加了一些并行性,或者应用程序已经优化,可通过验证错误代码或调优程序开始着手。
void SerialApplyFoo( float a[], size_t n ) { for( size_t i=0; i!=n; ++i ) Foo(a[i]);}
图 5A. 串行代码示例
英特尔® C++ 编译器:
英特尔® Parallel Studio 的全部特性都可以无缝集成到 Microsoft Visual Studio 2005* 和 2008 开发环境中。
英特尔® 线程构建模块:用于可扩展并行性的 C++ 库
集成在 Microsoft Visual Studio* 环境中,与 Microsoft Visual C++ 兼容,支持各种并行编程 API(应用程序编
程接口)
图4. 英特尔® Parallel Composer 集成至 Visual Studio* 开发环境中。屏幕上的解决方案显示了如何切换至英特尔® C++ 编译器。可从 Project 菜单或通
过右键单击解决方案或者项目名称轻松地切换至 Visual C++。
英特尔® 线程构建模块(英特尔® TBB)为 C++ 编程提供了丰富
的并行化方法。英特尔® TBB 包含在英特尔® Parallel Studio 中,
可以与英特尔® C++ 编译器或 Microsoft Visual C++ 一起使用。英
特尔® TBB 是一个充分利用较高级别的、基于任务的并行性的
库,它从性能和可扩展性方面提取平台细节和线程详细信息。
采用了一种基于运行库的编程模型,并提供了基于类似 STL 的模板库的并行算法。
英特尔® TBB 任务调度程序为您实现负载平衡。在进行基于线
程的编程时,经常会遇到负载平衡问题,并难于解决。在将程
序分解为若干个任务后,英特尔® TBB 调度程序以平均分配工
作负载的方式为线程分配任务,以获得最佳扩展性。英特尔® TBB 扩展了 C++ 的使用方法,以实现简单的并行化概念。英特
尔® TBB 提供了多个函数和模板,
如 parallel_for、parallel_while、parallel_reduce、pipeline、parallel_sort 和 parallel_scan,还有一些并发容器,以便在开发并行性代码的同
时帮助提高工作效率。
class ApplyFoo { float *const my_a;public: ApplyFoo( float *a ) : my_a(a) {} void operator()( const blocked_range<size_t>& range ) const { float *a = my_a; for( size_t i=range.begin(); i!=range.end(); ++i ) Foo(a[i]); }};
void ParallelApplyFoo( float a[], size_t n ) { parallel_for( blocked_range<size_t>( 0, n ),
ApplyFoo(a), auto_partitioner());
void ParallelApplyFoo(float a[], size_t n ) {parallel_for( blocked_range<size_t>( 0, n ),
[=](const blocked_range<size_t>& range) { for( int i= range.begin(); i!=range.end(); ++i )
Foo(a[i]);},
auto_partitioner() );}
图 5B. 使用英特尔® TBB 之后的并行版本
图6. lambda 函数源代码示例
支持 lambda 函数 OpenMP 3.0*
循环体作为函数对象
并行算法
迭代区域
划分线索
英特尔®编译器是第一个可以实现支持下一代 C++ 标准 C++0x 工作草案的 lambda 函数的 C++ 编译器。lambda 结构与 C++ 中的函
数对象或 C 中的函数指针几乎相同。它们将代码与作用域结合
起来,因此代表一个强大的新概念。例如,如果您有一个使用
迭代器进行循环的 C++ 应用程序,那么支持 lambda 的英特尔® TBB 可帮助实现模板化的循环模式。
图 6 中的源代码是一个使用 lambda 表达式创建的函数对象的示
例。更紧密的 C++ 与 Intel® TBB 集成允许通过使用 lambda 函数和
闭包将代码作为参数传递,从而简化了函数对象 operator() 的概
念。
OpenMP 是一个用于可移植多线程应用程序开发的行业标准。它
在细粒度(循环级)和粗粒度(函数级)线程中发挥作用。
OpenMP 3.0 采用一种指令方法同时支持数据和任务的并行性,为
串行应用程序转换成并行应用程序提供了简单而强大的方法,可
从多核和对称多处理器系统的并行执行中获得潜在的性能收益。
使用 OpenMP 编写和构建的应用程序在单一处理器系统上运行时
其效果等同于修改前的源代码。虽然开始方式不同,但获得的结
果与修改前的串行执行代码一致。不过,这将使改变增加的代码
变得简单,同时还能维持串行一致性。由于仅将指令插入代码中
因此当软件运行在只有一个处理器的系统上时,既可改变增加的
代码,同时仍维持一个通用的代码库。
OpenMP 是一个独立的源代码解决方案,支持多种平台和操作系
统。完全无需在应用程序中“硬编码”处理器核心数目,因为 OpenMP 运行库将自动做出正确的选择。
,
,
void solve() { __par for(int i=0; i<size; i++) { // try all positions in first row // create separate array for each recursion // started here setQueen(new int[size], 0, i);
}}
#pragma omp parallel#pragma omp single{for(int i=0; i<size; i++) {
// try all positions in first row // create separate array for each recursion // started here#pragma omp task setQueen(new int[size], 0, i);
}}
简单的并发函数OpenMP* 3.0 任务队列
图 7. OpenMP 3.0 任务队列示例
有些程序带有不规则模式的动态数据或复杂控制结构(如递
归),很难有效地并行化。OpenMP 3.0 中的工作队列模型使
您能够采用不规则的并行机制,这是使用 OpenMP 2.0 或 2.5 无法实现的。
pragma 任务指定了运行环境,在此环境中将执行封闭的工作
(任务)单元。当遇到一个 pragma 任务时,任务块中的代
码总体上进入与任务相关的队列中。若要保持连续语义,则
在完成任务后有一个隐含的屏障(barrier)。开发人员应该
确保任务块之间(或一个任务块中的代码与该任务块之外的
其他任务块中的代码之间)不存在依赖关系,或此依赖关系
已恰当地同步。在图 7 中给出了一个示例。
英特尔® Parallel Composer 提供了四个关键字来帮助简化使用 OpenMP 进行并行编程:__taskcomplete、__task、__par 和__critical。为使应用程序从这些关键字带来的并行性中获益,可
指定 /Qopenmp 编译器选项并重新编译,这将连接至适当的运行
时支持库,后者管理着实际的并行化程度。这些新的关键字使
用 OpenMP 3.0 运行库来实现并行化,将您从使用 OpenMP pragma 和指令语法中解脱出来。它还使得用 C/C++ 编写的代码
更加自然。
上面提到的关键字用作语句前缀。例如,我们可以使用__par 将函数 solve() 并行化。假定参数之间没有重叠,solve() 函数将修
改为添加__par 关键字。在不改变函数调用方式的情况下,计算
变为并行化。在下面的图 8 中提供了一个示例。
在上面图 7 所示的例子中,只需要一个任务队列。因此仅需
要通过只调用一个线程 (omp single) 来建立队列。setQueen 调用(The setQueen calls)相互独立,因此它们非常符合任务概
念。您可能还想了解英特尔® Parallel Debugger Extension,它
使得在专用窗口中检查 OpenMP 程序中任务、小组、锁定、
屏蔽或任务等待的状态变得简单。
图 8. __par 示例,它是 4 个简单的并发函数之一,新出现在英特尔® Parallel Studio 的英特尔® C++ 编译器中
优化高度并行的循环英特尔® 集成性能基元(英特尔® IPP)
valarray<float> vf(size), vfr(size);vector<float> vecf(size), vecfr(size);
//log function, vector, explicit loopfor (int j = 0; j < size-1; j++) {vecfr[j]=log(vecf[j]);
}
//log function, valarray, explicit loopfor (int j = 0; j < size-1; j++) {vfr[j]=log(vf[j]);
}
//log function, valarray, implicit loopvfr=log(vf);
英特尔® Parallel Composer 包含英特尔® IPP,这是一个面向多核
且高度优化的软件函数扩展库,用于多媒体、数据处理和通信
应用程序。它提供了上千个经过优化的函数,包括在视频编码
信号处理、音频编码、图像处理、语音处理、JPEG 编码、语音
识别、计算机视觉、数据压缩、图像颜色转换、密码/CAVP 验证、字符串处理/正则表达式和向量/矩阵数学中常用的基本算
法。
英特尔® IPP 函数是完全线程安全的,并且其中很多是内部线程
可帮助您在当今的多核处理器上获得最大的性能收益。
利用独立迭代显示数据并行性的算法适合于需要“高度并行
(embarrassingly parallel)”编码的循环。英特尔® Parallel Composer 支持三种技术:自动向量化,使用英特尔优化的 valarray 容器,
自动并行化,以轻松获得此类循环的最大性能。英特尔® Parallel Composer 能够自动检测适合于自动向量化的循环。这其中包括
具有静态或动态数组、向量和 valarray 容器的显式 for 循环,或
带有显式循环的用户定义的 C++ 类。作为特例,隐式 valarray 循环既可自动向量化,也可直接调用优化的英特尔性能基元库的
基元。自动向量化和使用优化的 valarray 能够优化应用程序的性
能,并可充分利用支持SSE指令集的处理器。
稍后将探讨如何启用英特尔优化的valarray。首先看一下图10,图中给出了一个显式 valarray、向量循环和一个隐式 valarray 循环的例子。
、
,
图 9. 英特尔® 集成性能基元包含在英特尔® Parallel Composer 中,是英
特尔® Parallel Studio 的一个组成部分,它拥有许多领域的线程和线程安
全库函数。
图10. 上面的源代码给出了显式 valarray、向量循环和隐式 valarray 循环的例子。
要使用优化的 valarray ,需要指定用作 Build Component Selection 的英特尔®集成性能基元,并设置一个命令行选项。要完成这项任
务,首先将项目加载至 Visual Studio 中,打开项目属性的弹出窗
口。在“Additional Options”框中,只需添加“/Quse-intel-optimized-headers”,然后单击“OK”即可。
图12. 告知 Visual Studio* 使用英特尔® IPP
英特尔® Parallel Debugger Extension
图11. 添加命令,以便在 Visual C++ 中的命令行使用优化的头文件
接下来,在 Project 菜单中,打开 Build Component Selection 弹出窗
口。在“Intel Integrated Performance Primitives”右边的框中,选择
“Common”,然后单击“OK”。如图 12 所示。完成以后,可以
重新构建应用程序,并按以往更改应用程序的方式检查其性能和
行为。
英特尔® Parallel Composer 包括英特尔® Parallel Debugger Extension,在安装完毕后可通过 Visual Studio Debug 下拉菜单访问英特尔® Parallel Debugger Extension(参见图 13)。
图 13. 英特尔® Parallel Debugger Extension 可从 Microsoft Visual Studio* 的 Debug 下拉菜单访问
图14. 之前和之后的英特尔® Parallel Inspector 视图
(内存访问错误和内存泄漏修复后)
英特尔® Parallel Debugger Extension 提供了对应用程序中共享数据和数据依赖关系的附加了解和访问。这有助于缩短开发周期和及早
发现可能造成严重运行问题的潜在数据访问冲突。在安装英特尔® Parallel Composer 并启动 Visual Studio 后,可在应用程序利用单指
令多数据 (SIMD) 执行时使用英特尔® Parallel Debugger Extension,并可在并行化应用程序使用 OpenMP 线程时获得对执行流和潜在运
行冲突的额外了解。
要利用英特尔® Parallel Debugger Extension 的高级特性,如共享数据事件检测、函数重入检测和 OpenMP 识别(包括串行执行并行代
码),应选择英特尔® Compiler 编译代码并使用 / debug:parallel 选项获取调试信息。
如需了解更多信息,请参阅“Intel® Parallel Debugger Extension”白皮书,网址为 http://software.intel.com/en-us/articles/parallel-debugger-extension/。此白皮书介绍了更多详细信息和 Debugger Extension 可带给您的好处,以及如何最充分地利用它。
英特尔® Parallel Inspector
查找内存和线程错误
图 15. 查找内存错误
图 18. 配置分析深度
简单的分析配置使开发人员能够通过调节执行时间来控制分析深度。
图 20. 结果删除
结果删除可减少必须通过删除无关结果来进行分析的信息。
图 16. 查找数据竞争
图 19. 映射到源代码的错误识别
图 17. 直观地分组
快速查找内存错误,包括单线程和多线程应用程序的内存泄漏和破坏。
在应用程序发布之前找出内存错误有助于降低技术支持成本。
准确地指出潜在的线程错误,包括死锁和数据竞争,有助于降低由于未
被调试器和其他工具发现的常规错误所带来的延迟和崩溃。
通过对相关问题统一分组,为开发人员带来直观体验。当您修复一个问
题后,英特尔® Parallel Inspector 将向您显示需要应用相同修复的所有相
关位置。
单击找到的问题,即可直接指向导致问题的源代码,以便快速做出修改。
图 21. 并发性分析:什么时候核心空闲?
图 22. 锁定和等待分析:哪些是糟糕的等待?
英特尔® Parallel Amplifier
充分利用多核,获得最佳性能
调优核心利用率
绿色 = 理想 红色 = 不足
平均 CPU 利用率
大部分时间此应用程序仅使用一个核心
调用栈信息可用(未显示)
色条的长度代表时间,当函数运行时
颜色表示利用率
同热点分析一样,并发性分析也能找到耗费时间最长的函数。但它还能显示多核的利用率。颜色代表函数运行时的核心(core)利
用率。绿色条表示所有的核心都在工作。红色条表示核心未被充分利用。当出现红色条时,则需要添加并行性,使所有核心都为您
工作。这有助于确保应用程序性能随着核心数的增加而提升。
在锁定时等待过长是导致性能问题的一个常见根源。当所有核心都处于忙碌状态时(绿色),等待是合理的。当有未使用的核心时,
等待则是糟糕的(红色)。
色条长度代表等待时间,颜色表示
等待时利用的核心数
让未被充分利用的核心处于等待状
态会影响性能
等待计数有助于识别不必要的等待
图 23. 源视图:在源代码上查看结果。
图 24. 对比结果:快速查看更改
源代码视图显示了源代码上的精确位置。仅需在任意分析视图中的函数名上双击即可打开源代码视图。
它提供了一种在调优时快速查看进度的方法,也是一种简便的分析性能下降的方法。
单击转到此函数中的下一个最热点
比较任意两个以前的结果
查看每个函数的时间和不同之处
使用以前的任意结果
变更摘要
单击此处打开编辑器
双击任意分析视图中的某个函数时,将打开最热点的源代码
获益
完全集成在 Microsoft Visual Studio* 中•
支持最新的 OpenMP* 规范•
•
保护在源代码和开发环境中的投资-
充分利用快速增长的多核系统 -
•
内含指导和建议,可访问包含数千代码选项的线程库•
•
•
系统需求
Microsoft Visual Studio •
如需查看最新系统需求,请访问:•
www.intel.com/software/products/systemrequirements/
支持
欲了解更多信息,请访问:
http://software.intel.com/sites/support/
Beta 版本已经推出
在用户论坛上注册并下载:www.intel.com/software/ParallelStudioBeta/
专为当今的应用程序和未来的软件创新而设计。如需
设计和构建并行程序,一切尽在 Visual Studio*。
让传统串行应用程序和新的并行应用程序最大程度的利用多核技术,并准备扩展至更多核心。
英特尔® Parallel Studio 工具可用于软件开发生命周期的各个阶段,从设计辅助到编码和调试,再到验证无错代码和调优
简化线程并提供减少缺陷和系统性能问题的能力,帮助您将性能更好、功能更丰富的产品快速推向市场
专为架构师和开发人员设计,集英特尔数十年软件开发产品的经验,帮助实现专业应用程序、数据库、计算密集型应用程序,以及用于高性能计算 (HPC) 的多线程应用程序。
英特尔® Parallel Studio 产品包含对社区论坛和知识库的访问
权,可满足您的任何技术支持需要,包括技术要点、应用
程序要点、文档和所有的产品更新。
© 2009,英特尔公司。保留所有权利。英特尔、Intel 标识、英特尔酷睿是英特尔公司在美国和其他国家(地区)的商标。
*其他名称和商标可能属于其他权利人所有。
0209/BLA/CMD/PDF 321552-001