矢量化要点

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

矢量化要点

概述

本章节涵盖了关于矢量化的一些课题。矢量化是一种数据并行编程形式。处理器在矢量的 N 个数据元素上同时执行相同的操作(标量数据对象的一维数组,如浮点对象、整数或双精度浮点对象)。

要想在英特尔® 集成众核架构(英特尔® MIC 架构),如英特尔® 至强融核协处理器上实现性能提升,矢量化技能和知识至关重要。理想状态下,应用的矢量化可在英特尔® 至强融核协处理器上实现 8 倍(双精度)或 16 倍(单精度)的性能提升。您的应用可能无法实现上述加速,但是有一点可以确定:如果您的代码未实现矢量化,将无法在英特尔® 集成众核架构(英特尔® MIC 架构)上高效运行。

目标

第一步,首先要了解矢量化——什么是矢量化以及如何使用 -vec-report 来确定编译器从何处能够对您的应用进行矢量化处理。了解编译器无法对哪部分代码进行矢量化处理及原因也很重要。

编译器无法完成所有矢量化工作,因此您需要掌握编译指示和指令,帮助编译器实现矢量化。数据对齐是一种有助于实现高效矢量化的关键技术。本章节描述了如何控制数据对齐,及如何帮助编译器识别对齐数据。

C/C++ 用户要考虑添加英特尔® Cilk™ Plus 提供的数组矢量语义,帮助编译器识别矢量化语句(与 Fortran 数组语句相似)。同时,本章节还讨论了指针别名及其对性能优化和矢量化的影响,通过这种方式可以告诉编译器指针参数没有别名。

最后,本章还介绍了实现外层循环矢量化的新方法。

主题

以下子章节提供了更多关于矢量化主题的信息。点击下列链接访问这些主题。

·         需要阅读以下主题:

o    C 语言或 C++ 用户可借助英特尔® Cilk™ Plus 阵列标记和基本函数实现矢量化

o    引导自动并行化 (GAP)

o    Fortran 阵列数据、参数和矢量化

o    矢量化和优化报告

o    数据对齐有助于实现矢量化

o    指针别名与矢量化

·         以下主题展示了一些可选技术,可将矢量化提升到全新水平。

o    外层循环矢量化

o    通过英特尔® Cilk™ Plus 阵列标记(面向 C/C++ 用户)实现外层循环矢量化

o    权衡阵列标记长矢量和短矢量编码 (面向 C/C++ 用户)

o    使用全矢量

o    使用随机数实现循环的矢量化

o    避免人工循环展开

o    其它常见的矢量化技巧

要点

本章介绍了各种矢量化方法和优化措施。如果不实现出色的矢量化,您将无法在英特尔® 集成众核架构(英特尔® MIC 架构),如英特尔® 至强融核协处理器上获得出色的应用性能。您必须要了解以下几点:

·         编译器选项 -vec-report 用于确定应用的哪些部分实现了矢量化,哪些没有实现矢量化,以及为什么没有实现矢量化。

·         您需要掌握数据对齐对矢量化的重要性以及如何实现数据对齐。

·         指针别名以及如何告诉编译器多个指针没有指向相同的数据。

·         基础函数及其如何有助于实现矢量化,以及英特尔® Cilk™ Plus 阵列符号如何有助于实现矢量化。

此外,本章节还介绍了一些可选技术,涉及到外层循环优化、矢量化随机数生成,及长矢量和短矢量编码之间的权衡。

下一步

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

下一章,高级 MIC 优化,将介绍一些高级优化措施,以在英特尔® 集成众核架构(英特尔® MIC 架构)上获得最高性能。

 

Para obter informações mais completas sobre otimizações do compilador, consulte nosso aviso de otimização.