65.9K
CodeProject 正在变化。 阅读更多。
Home

Intel® Advisor 评测

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2017年2月27日

CPOL

6分钟阅读

viewsIcon

8271

为了充分利用并行化功能,开发人员需要改变他们的编码方式。但通过英特尔的并行化工具 Intel Advisor,可以实现大量的优化。

长期以来,英特尔一直是处理器技术的领导者,并将处理器推向了物理极限,达到了其能达到的最快速度。但是,为了跟上应用程序日益增长的需求,英特尔在研发方面投入了数十亿美元,以从每一个 CPU 周期中榨取尽可能多的计算能力,而他们正是通过并行化来实现这一点的。历史上,CPU 每个 CPU 周期只能执行一个线程的操作。很快,工程师们就开始想办法使用多个线程并行执行任务。多线程最初是通过多个 CPU 进入处理器,然后通过超线程 CPU,最后发展到 CPU 上的多个超线程核心。由于超线程技术,英特尔 CPU 上的线程数通常是 CPU 核心数的两倍。例如,Intel® Core 处理器 i7 6700HQ 是一款四核 CPU,因此它有八个线程。

除了多线程,英特尔还增加了向量化。向量化是另一种形式的并行,它允许单个指令对多个数据项执行操作——单指令多数据 (SIMD)。向量化最早由英特尔于 1995 年通过 MMX 指令实现,随后在 1999 年通过流式 SIMD 扩展 (SSE) 持续扩展,2011 年的 AVX (高级向量扩展),2013 年的 AVX2,以及 2015 年的 AVX-512。每一次进步都增加了新的指令,但基本原理是相同的。英特尔声称,向量并行和线程并行的综合影响可以在某些算法上将性能提高多达 187 倍。这比单独的线程或向量化要高出一个数量级。

为了充分利用并行化功能,开发人员需要改变他们的编码方式。但通过英特尔的并行化工具 Intel® Advisor,可以实现大量的优化。Intel Advisor 的设计初衷是分析应用程序的运行情况,寻找应用程序中可以同时从线程化和向量化中获益的区域,但这里主要关注的是向量化。

向量化通常在处理数据数组的循环上进行。向量化通过在 CPU 周期内对数据执行一系列操作来工作。例如,如果一个循环正在迭代一个整数数组,并将某个值加到数组的每个元素上,那么循环将首先递增数组索引,然后对该索引对应的元素执行加法。

for(i = 0; i < 1000; i++){
	arrayA[i] = arrayA[i] + 2;
}

向量化后,索引会更快地递增,并且会对数组进行并行操作。循环将被“展开”,看起来会像这样:

for(i = 0; i < 1000; i = i + 4){
	arrayA[i] = arrayA[i] + 2;
	arrayA[i + 1] = arrayA[i + 1] + 2;
	arrayA[i + 2] = arrayA[i + 2] + 2;
	arrayA[i + 3] = arrayA[i + 3] + 2;
}

请注意,现在它正在将数组索引增加四。向量化形式看起来会像这样:

for(i = 0; i < 1000; i = i + 4){
	addNumberToFourElementsInASingleCycle(a[i], 2);
}

这更像是伪代码,但它在功能上会执行与第一个标量版本和展开版本相同的任务,但耗费的周期大约是四分之一。为了使向量化生效,不能存在任何数据依赖性,否则并行函数会产生意外的结果。理解这一点很重要,因为并非程序中的每个循环都能从向量化中获益,甚至并非所有循环都能使用向量化。因此,尽管该工具有一些丰富的功能,但该工具的价值,至少对于向量化而言,在某种程度上仅限于特定类型的应用程序。

使用该工具有三种方式:通过英特尔提供的 GUI,通过安装的 Intel Visual Studio 集成,或者通过命令行(在 Linux 上非常流行)。它还允许用户方便地在随软件包安装的 Intel C++ 编译器和 Microsoft Visual C++ 编译器之间切换。Intel Advisor 中的工具可以分析两个编译器的输出,但使用 Intel Compiler 时,它可以显示比 MSVS/GCC 更多的建议。

通过比较向量优化循环和未优化循环,可以轻松测试向量化的结果。Intel Advisor 内置的分析工具提供了此功能。实施和测试向量化建议相当直接。输出表明,并行化优化应在编译器设置和代码中进行。

第一次使用分析工具时,在没有开启任何并行化建议的情况下,该工具显示了应用程序运行时的结果。应用程序需要有足够长的运行时间,以便分析器能够捕获应用程序运行时的遥测数据。分析器运行后,它会生成一个图表,显示应用程序内部循环的遥测数据结果。

第二次测试实现了建议。对于这个特定的例子,它是在编译器中开启了向量化选项,并添加了两个 #pragma 标签。由此产生的收益体现在优化代码的效率方面。

有趣的是,在运行了几次应用程序后,实际计算时间似乎没有任何收益。这可能是因为该应用程序相对较小,执行速度很快。

向量化在处理数组缓冲区时效果很好,这就是为什么它被宣传为英特尔 SSE 下的多媒体加速。多媒体通常通过读取字节流并使用数据无关的索引对该字节流进行操作。最能从这类优化中获益的应用程序是那些处理可预测数据集的应用程序,其中对这些数据集的操作和索引独立于数据本身。一些例子包括媒体流应用程序、处理位图(如图形操作)的应用程序以及使用渲染引擎(如游戏)的应用程序。因此,所有这些类型的应用程序也都是计算密集型的。然而,在业务线应用程序上运行向量分析工具可能不会带来很多好处;但是,该工具的线程分析绝对是物超所值,因为业务线应用程序通常是需要多线程的多用户或多租户应用程序。

Intel Advisor 2017 是 Intel® Parallel Studio XE 的一部分,这是一个包含优化编译器、性能库和其他分析工具(如其性能分析器 Intel® VTune™ Amplifier)的捆绑包。Parallel Studio 的零售价为 1,599 美元。Intel Parallel Studio XE 软件包是一个相当大的下载,超过 3 GB,但它提供了两个直接的选项:一个全包下载或一个仅安装所需功能的模块化下载。本次评测使用了 Windows 10 64 位上的 Intel Visual Studio 2015 Community Edition 和 Intel Advisor 2017。总的来说,该应用程序是稳定的,没有崩溃或故障,但在一些非常先进的硬件上感觉有些迟钝。同样,很明显英特尔没有花太多时间去使应用程序的用户体验现代化,因为它感觉更像是一个为 Windows 98 PC 编写的应用程序。虽然它可以在 UI/UX 领域有所改进,但该应用程序的重点不在于流畅的 UI/UX,而在于提高应用程序性能——大部分工作都集中在看不见的部分。然而,真正的收益是为编写复杂、CPU 密集型应用程序的开发人员准备的。花费 1,599 美元购买该应用程序是物有所值,如果这意味着您不必手动筛选数千行代码来寻找优化的话。Intel Advisor 可以自动完成这项工作,而且结果确实不言而喻。

© . All rights reserved.