面向英特尔® MIC 架构进行应用的适用性分析

面向英特尔® MIC 架构的编译器方法

面向英特尔® MIC 架构进行应用的适用性分析

英特尔® 集成众核架构(英特尔® MIC 架构)提供的产品家族已面向高度并行化应用或应用内的高度并行化内核进行了优化。英特尔® 至强融核协处理器便是其中一款产品。

概述

本章描述了适合在高度并行化和高度矢量化架构(如英特尔® 至强融核协处理器)上运行的应用所具备的特性。

找到适合您应用的最佳架构

许多应用依赖于处理器的减速措施进行优化,无需对编码方法和实践进行基础性的更改。英特尔® 至强TM 处理器和英特尔® 编译器经过多年的不断演变,目前可支持广泛应用实现出色的性能。那么您的应用能够在英特尔® MIC 架构上实现最佳性能吗?像重新编译一样简单?不一定。并不是所有的应用都能在英特尔® 至强融核协处理器上实现最佳性能。有些应用可能能够在英特尔® MIC 架构上实现出色的性能,在应用创建过程中几乎无需更改编码,只需重新编译,以及几个额外或新的编译选项。有些应用可能需要一些小规模的额外返工,比如为编码添加编译指令或指示,并使用专为英特尔® MIC 架构设计的编译选项。还有些应用可能需要算法或高层次的返工,比如将结构数组 (AoS) 改为数组结构 (SoA),或去掉过多的指针跟踪,或对齐主要数据结构以获得最佳性能。最后,您可能会发现有些应用在当前形式下可能无需更改应用编码便可在通用处理器上实现最佳性能,比如 Genuine 英特尔® 至强处理器。

在将应用移植到英特尔® 至强融核协处理器之前,您首先应该考虑您应用的 CPU 处理器特性以及其是否能在英特尔® 至强融核协处理器上高效运行。虽然大多数应用都能够移植到英特尔® 至强融核协处理器上,然而要想实现高效、快速的运行,应用必须是高度并行化且高度矢量化的。英特尔编译器可以帮您实现最佳应用性能,同时无需更改当前状态,但是它也不是一个神奇的工具,在没有用户协助的情况下,无法在英特尔® 至强融核协处理器上将低性能 CPU 代码转化为高性能代码。这就带来了首先需要考虑的一系列问题: 

    "在基于通用CPU 处理器的主机上运行时,我的应用在当前状态下是否是高度并行化高度矢量化?"

如果答案是否定的,或者您不太清楚的话,下一个问题是

    "在将应用迁移至英特尔® MIC 架构之前,是否应提高应用的并行性和矢量化程度?"

以及

    "要使应用在英特尔® MIC 架构上获得最佳性能,需要做出多少努力?"

大部分应用可以通过初步再审查、性能分析和一些调试获得性能提升。通过在这个过程中的一些更改,可以在英特尔® 至强处理器和英特尔® 至强融核协处理器上提升应用性能。经过分析后,您可能会确定您的应用适合在英特尔® MIC 架构上运行。或者,您可能会发现该特定应用在通用处理器(如Genuine 英特尔® 至强处理器)上可实现最佳性能。不管哪种情况,英特尔都为您提供解决方案,使您获得最佳应用性能。

初步工作找到适合您应用的最佳目标平台

下一步是要确定运行在主机CPU 系统上的应用在当前形式下所具备的并行性和矢量化程度。如欲了解在选择英特尔® 至强架构处理器或英特尔® 至强融核协处理器时的架构考虑事项,请参阅本篇 James Reinders 撰写的文章

我的应用是否高度并行化?

希望您能毫不犹豫地给出肯定的答案。如果您的应用使用线程并行方案,如 OpenMP*、英特尔® 线程构建模块、英特尔® Cilk™ Plus spawn/synch、英特尔编译器的自动并行化,应用可能几乎线性扩展到服务器中的所有物理内核(8 个内核或更多)。如果是这样的话,请跳到下一问题。同时,如果您的应用使用 MPI* 并具备出色的扩展性能的话,也请跳到下一个问题。

如果您的应用未实现并行化或具备较差的扩展能力,请暂停并更改您的应用,然后再迁移至英特尔® 集成众核架构(英特尔® MIC 架构)。一款非高度并行化的应用在高并行化架构上无法实现最佳性能。这时应该更改应用代码来提高其并行性和可扩展性。我们为您提供了以下资源。

·         英特尔Parallel Universe 杂志提供了丰富的并行技术信息

·         英特尔® 软件网提供了许多并行技术方面的视频

·         英特尔® 线程构建模块 (英特尔® TBB),对于习惯使用模板库的 C++ 程序员而言是一款理想的解决方案。

·         英特尔® Cilk Plus™ 是对 C 语言和 C++ 的扩展,可轻松、快捷、可靠地在多核处理器上提升程序性能。 

·         OpenMP* 是英特尔® C/C++ 和英特尔® Fortran 编译器支持的开放标准。此处是英特尔的 OpenMP* 入门指南和 OpenMP* 规范网站。您的编译器配有 OpenMP* 文档,并在产品示例/目录中提供示例代码。

·         MPI*,消息传递接口*是分布式内存并行 API英特尔® MPI 为英特尔® 至强融核协处理器提供支持。

我的应用是否已被矢量化?

矢量化是由英特尔® 架构平台提供的数据并行化 (SIMD) 形式。默认情况下,优化级别 -O2 和更高级别支持矢量化。编译器选项 -x[arch] -ax[arch] 在至强处理器上控制矢量化。如欲禁用矢量化,请使用编译器选项 "-no-vec -no-simd"-no-vec 选项可禁用所有自动矢量化,包括阵列符号语句的矢量化。-no-simd 选项可禁用包含 SIMD 编译指示的循环的矢量化。

首先,请在您的 CPU 主机服务器上使用 -xhost 或适当的 –x 选项,以及其它所有在 -O2 -O3 级别上构建您的应用时用到的选项来编译您的应用。运行应用的串行版本(单进程,单线程)。接下来,移除 -xhost -x[arch] 选项并添加 -no-vec -no-simd。在您的至强主机上再次运行您的单进程、单线程应用。比较矢量化和非矢量化案例的时间。矢量化是否提升了您的应用性能?如果应用性能得到了大幅提升,则说明您的应用充分利用了矢量化的优势。如果不是,也不要担心:本指南中对提高矢量化进行了整章阐述。

另一个测试是在 -O2 或更高级别将 -xhost -x[arch] 添加到您的模型中,同时也添加 -vec-report3 选项。由 -vec-report3 生成的报告是否显示关键循环正在实现矢量化?这也能表明编译器能够自动对您的代码进行矢量化处理。本指南中提供了大量关于矢量化的建议和材料,以帮助您更好地实现应用的矢量化。

如果您不了解矢量化,请点击下面的网络研讨会和工具包链接,熟悉相关概念:

·         矢量化让您的应用性能满足未来要求网络研讨会视频,其提供的资源和示例都可通过矢量化工具包获得。

讯息

本章介绍了适合在高并行化高矢量化架构(如英特尔® 至强融核协处理器)上运行的应用所具备的特性。只有高并行化高矢量化应用才适合在英特尔® MIC 架构上运行。如果您的应用不具备这两个特性,那么它在该架构上可能不会实现最佳性能。在这种情况下,您应在将应用迁移至英特尔® 集成众核架构(英特尔® MIC 架构)之前对应用进行调试。

下一步

要在英特尔® 至强融核协处理器上成功调试您的应用,请务必通读此指南,并点击文中的超链接查看相关内容。本指南提供了实现最佳应用性能所要执行的步骤。

返回为英特尔® 集成众核架构做好准备

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