为 Intel® Xeon Phi™ 处理器现代化您的代码
新款 Intel® Xeon Phi™ 处理器(代号 Knights Landing,或 KNL)是 Intel 首款集加速器性能与标准 CPU 常见优势于一体的处理器。
点击此处注册并下载免费的 Intel® Parallel Studio XE 30天试用版.
未来已至——至少在 Intel 的下一代硬件方面是这样。硬件加速器长期以来一直被誉为高性能计算领域的下一个重大突破,许多供应商都提供了相关产品和服务。然而,充分利用加速器所需的编程模型学习曲线相当陡峭,并且往往会导致程序员被锁定在专有代码中。
为了解决这些问题,新款 Intel® Xeon Phi™ 处理器(代号 Knights Landing,或 KNL)应运而生,这是 Intel 首款将加速器性能与标准 CPU 常见优势相结合的处理器。Intel Xeon Phi 处理器无需显式编程,也不需要代码卸载。这样,您的程序——无论您是否已在使用标准 OpenMP*——都可以无缝运行在新硬件上。Intel 强大的软件开发工具(作为 Intel® Parallel Studio XE 2017 套件的一部分)可以帮助您 现代化代码并利用多级可扩展并行性能。
此外,由于 Intel Xeon Phi 处理器与 Intel® Xeon® 处理器二进制兼容,您今天在 x86 架构上运行的任何工作负载都可以进行调整和优化,以充分发挥 Intel Xeon Phi 处理器的高并行性。
代码现代化快速入门
Intel Xeon Phi 处理器支持高级向量扩展 (AVX-512),程序可以使用它将八个双精度或 16 个单精度浮点数打包到 512 位向量中。总的来说,512 位向量扩展提供了比 AVX 和 AVX2 指令系列更全面的功能和更高的性能。高效地打包向量以最小化浪费说起来容易做起来难。除了向量指令,运行时环境还提供了多个线程,允许另一个级别的并行性。这会使事情变得复杂。现代化代码设计会考虑不同级别的并行性。
- 向量并行性:在核心内,对不同数据块执行相同的计算——即所谓的 SIMD(单指令多数据)向量化。代码的标量和并行部分都将受益于 SIMD 向量化的有效利用。
- 线程并行性:多个线程通过共享内存进行通信,并共同协作完成给定任务。
幸运的是,最新的 OpenMP 标准(4.0 及更高版本)提供了易于使用的构造,可为您的 C/C++ 和 Fortran 代码添加显式的 SIMD 向量化和线程并行功能。Intel® 编译器包含对 OpenMP 的支持。
正确使用时,SIMD 向量化和多线程可带来巨大的潜在加速。图 1 显示了在最新 Intel Xeon 处理器上,与串行代码相比,性能最高可提升 179 倍。在 Intel Xeon Phi 处理器上也可获得类似的性能提升。
Intel Parallel Studio XE 和代码现代化过程
代码现代化优化框架已 得到充分记录,它是一种系统性的应用程序性能改进方法。该框架同样适用于 Intel Xeon Phi 处理器,它将应用程序经过各种优化阶段,每个阶段都迭代地改进应用程序性能。
- 分析当前代码和工作负载:使用 Intel® VTune™ Amplifier 识别热点,并使用 Intel® Advisor 识别向量化和多线程机会及潜力。然后,Intel® 编译器生成最优代码,并应用 Intel® Math Kernel Library (Intel® MKL)、Intel® Threading Building Blocks (Intel® TBB) 和 Intel® Integrated Performance Primitives (Intel® IPP) 等优化库。
- 优化标量代码:确定您使用的是否是正确的数据类型精度,是否使用适当的函数,以及在编译期间是否设置了精度标志。
- 显式 SIMD 向量化代码:利用基于 OpenMP 的 SIMD 向量化功能,并结合数据布局优化。应用正确的数据结构,并将 C++ 代码从结构数组转换为数组结构,方法是使用 Intel® SIMD 数据布局模板(请参阅 《Parallel Universe》杂志第 24 期)。
- 多线程代码:使用 OpenMP 和可用的环境变量将线程正确地分配到核心。使用 Intel® Inspector 进行调试,并确保没有线程错误导致扩展问题,这些问题通常是线程同步或内存利用效率低下造成的。
Intel Parallel Studio XE 的各种组件——编译器、优化库和性能分析器/剖析器——有助于现代化代码,从而充分发挥 Intel Xeon Phi 处理器的全部潜力。图 2 详细介绍了 Intel Xeon Phi 处理器上的代码现代化过程,并展示了这些 Intel 工具如何帮助您实现目标。没有使用集群?只需忽略顶部两个框,然后从“有效的多线程”开始。
Intel 编译器支持 Intel Xeon 和 Xeon Phi 处理器上的最新 AVX-512 指令。编译器还支持最新的 C++ 和 Fortran 标准,并向后兼容。此外,OpenMP 4 和 4.5 使您能够通过显式 SIMD 向量化和多线程(图 1)实现超强的性能。(本文后面将详细介绍 Intel Xeon Phi 处理器的编译器具体信息。)
Intel VTune Amplifier 2017 提供了对 Intel Xeon Phi 处理器至关重要的多项优化。您需要决定如何最好地利用 MCDRAM——这是 Xeon Phi 处理器的关键特性。Intel VTune Amplifier 的流水线/缓存、内存分析和可扩展性分析可以帮助您:
- 决定将哪些数据结构放入 MCDRAM
- 通过内存层次结构发现性能问题
- 测量 DRAM 和 MCDRAM 的带宽
此外,您还可以通过测量串行与并行时间来解决 OpenMP 可扩展性问题,并检测不平衡和开销。最后,Intel VTune Amplifier 可以通过查看代码在核心流水线中的效率,来揭示 Intel Xeon Phi 处理器微架构的效率。
Intel Advisor 是代码现代化的核心支柱。您需要 Intel Advisor 来轻松识别潜力,然后针对 Intel Xeon Phi 处理器特有的 AVX-512 指令进行优化。例如,Intel Advisor 在实际工作负载上针对 Intel Xeon Phi 的摘要(图 3)表明,许多内核已向量化,但仍有巨大的改进空间。
Intel MKL 为 Intel Xeon 和 Xeon Phi 处理器提供加速的数学功能,是实现从单核(显式向量化)到多核(多线程)的自动性能扩展的不可或缺的工具——这是代码现代化的关键组成部分。此外,新的 **Intel® Distribution for Python*** 在底层使用了 Intel MKL 进行优化。如果您运行的是主机卸载模型,Intel MKL 可以确定主机 CPU 和 Intel Xeon Phi 协处理器之间的最佳负载平衡。(查看 Intel Distribution for Python 的详细介绍。)
Intel TBB 现已成为行业内公认的优秀库,已拥有 10 年行业经验,是用于创建高性能、可扩展并行应用程序的广泛使用的、屡获殊荣的 C++ 库。(您可以在《Parallel Universe》杂志的 特刊 中找到 Intel TBB 提供的许多优化。)
Intel IPP 提供现成的、经过处理器优化的构建块,用于加速图像、信号和数据处理以及加密计算任务。这些例程针对最新的指令集(包括 AVX-512)进行了优化,使您能够获得比仅使用 Intel Xeon Phi 处理器优化编译器产生的性能更高的性能。
Intel 编译器 17.0 在 Intel Xeon Phi 处理器上的支持
现在,我们将对 Intel 编译器提供的向量化机会进行更深入的分析和介绍。特别针对 Intel Xeon Phi 处理器,Intel 编译器的通用功能适用于标准的 C/C++ 和 Fortran 语言应用程序。主要的增强功能在于 Intel Xeon Phi 处理器上的扩展 AVX-512 指令集。
Intel 编译器 17.0 通过以下增强功能扩展了其对向量化的支持:
- 间接向量函数调用,包括虚函数(请参阅《Parallel Universe》杂志的 第 25 期)。
- OpenMP 4.5 对数组和数组分段上的归约运算提供支持。
- 对间接内存引用的预取。
Intel 编译器 17.0 还通过编译器选项 ` -xMIC-AVX512` 增强了其对 Intel Xeon Phi 处理器上 AVX-512 的现有支持。
AVX-512 向量化
512 位 SIMD 指令扩展的基础是 Intel AVX-512 Foundation 指令。它们包括 AVX 和 AVX2 系列 SIMD 指令的扩展,但使用新的编码方案进行编码,支持 512 位向量寄存器,在 64 位模式下最多支持 32 个向量寄存器,并使用操作掩码寄存器进行条件处理。
Intel AVX-512 系列提供了几个附加的 512 位扩展,这些扩展按指令组进行划分,针对特定的应用程序领域:
- Intel AVX-512 指数和倒数指令 (Intel AVX-512ER),用于某些超越数学计算。
- Intel AVX-512 预取指令,用于特定的预取操作 (Intel AVX-512PR)。
- 其他指令,面向 SHA、MPX 等。
如图 4 所示,其中一些指令支持最新的 Intel Xeon Phi 处理器(从 KNL 开始),而另一些则将由未来的 Intel Xeon 处理器支持。
1. Intel AVX-512
Foundation 指令是 AVX 和 AVX2 的自然扩展。它们支持在 512 位向量上操作的指令集,以及使用 EVEX 前缀编码方案编码以操作小于 512 位向量长度的指令集扩展。因此,先前在 Intel Xeon 处理器上向量化的循环将在 Intel Xeon Phi 处理器上自然向量化。向量长度可能会根据循环计数和数组长度而延长。
要使现有的 Intel Xeon 处理器应用程序在支持 AVX-512 的 Intel Xeon Phi 处理器上运行,只需使用选项 `–xMIC-AVX512` 进行编译,然后将生成的二进制文件复制到基于 Intel Xeon Phi 处理器的系统上。
2. AVX-512PR
AVX-512PR 和 AVX-512ER 是仅在 Intel Xeon Phi 处理器上提供的独特指令集。AVX-512PR 是一组新的预取指令,用于收集/散布和 PREFETCHWT1。要使用 Intel 编译器 17.0 启用此功能,您需要以下选项组合:
-O3 -xmic-avx512 -qopt-prefetch=<n>
- 如果省略 `-qopt-prefetch` 选项,则 `n=0` 是默认值(不发出预取)。
- 如果您只指定 `-qopt-prefetch` 而不显式指定“n”参数,则 `n=2` 是默认值。这将仅为编译器认为硬件预取器可能不适用的直接引用插入预取。
- `n=3` 将打开所有直接内存引用的预取,而不考虑硬件预取器。
- `n=5` 将打开所有直接和间接预取的预取。间接预取将使用 AVX512-PF 收集/散布预取指令。
您还可以使用 `#pragma prefetch var:hint:distance` 形式的 pragmas 来强制编译器为特定的内存引用发出预取。这将为 pragma 指定的直接或间接引用发出预取,即使在 `-qopt-prefetch=2` 或 `3` 设置下也是如此。
例如,我们使用 ` -O3 -xmic-avx512 -qoptprefetch= 5 –qopt-report5` 编译以下 C++ 循环:
//pragma_prefetch var:hint:distance #pragma prefetch A:1:3 #pragma vector aligned #pragma simd for(int i=0; i<n; i++) { C[i] = A[B[i]]; }
您将收到关于为间接内存引用生成收集/散布预取的 remark,类似于图 5。
3. AVX-512ERM
AVX-512ER 提供用于指数、倒数和倒数平方根函数的快速高精度近似指令。用于指数指令(VEXP*)的 AVX-512 是对打包的双精度或单精度浮点值(2^x)的近似,相对误差小于 2^-23。这些指令仅适用于 Intel Xeon Phi 处理器。
目前,这些指令仅支持 ZMM 寄存器,其长度为 512 位。这需要超过八个双精度或 16 个单精度浮点数来计算 exp 函数,以便填充长向量。否则,将调用小型向量数学库 (SVML) 版本的 exp。例如,如果 `arrayB(i)` 是单精度,则图 6 所示的 Fortran 循环将不会生成 VEXP 指令。
do i =1,8 arrayC(i) = arrayA(i)*exp(arrayB(i)) end do
为了克服这一限制,我们将具有相似 exp 调用的小数组合并到一个更大的数组中。在图 7 中,可以为 ZMM 向量扩展循环计数,向量化将从 VEXP 指令的硬件实现中受益,这些指令在 Intel Xeon Phi 处理器上效率更高。图 7 展示了一个 Fortran 示例。
Module testER implicit none real, parameter, dimension(8) :: arrayA1 = (/2.0,1.5,1.37,2.4,3.3,4.9,5. 1,0.0/) real, parameter, dimension(8) :: arrayA2 = (/0.3,7.1,4.1,3.8,9.1,0.5,0.0 ,1.2/) real, parameter, dimension(8) :: arrayB1 = (/8.0,1.2,1.4,1.7,2.58,3.4,5. 0,7.1/) real, parameter, dimension(8) :: arrayB2 = (/0.6,1.3,2.8,9.6,2.3,1.5,0.2 ,0.3/) real, parameter, dimension(16) :: arrayA = & (/2.0,1.5,1.37,2.4,3.3,4.9,5.1,0.0,0.3,7.1,4.1,3.8,9.1,0.5,0.0,1.2/) real, parameter, dimension(16) :: arrayB = & (/8.0,1.2,1.4,1.7,2.8,3.4,5.0,7.1,0.6,1.3,2.8,9.6,2.3,1.5,0.2,0.3/) !DIR$ ATTRIBUTES ALIGN : 64 :: arrayA, arrayB, arrayA2, arrayB2 contains subroutine cal_exp_16(arrayC) real, dimension(16) :: arrayC integer i !DIR$ VECTOR ALIGNED do i=1,16 arrayC(i) = exp(arrayA(i))*arrayB(i) enddo end subroutine subroutine cal_exp_2x8(arrayC) real, dimension(16) :: arrayC integer i !DIR$ VECTOR ALIGNED do i=1,8 arrayC(i) = exp(arrayA1(i))*arrayB1(i) end do do i=1,8 arrayC(i+8) = exp(arrayA2(i))*arrayB2(i) enddo end subroutine end module
数组 `arrayA` 是 `arrayA1` 和 `arrayA2` 的组合。例程 `cal_exp_16` 用于计算 `arrayA` 中 16 个单精度数字的 `exp`,并将结果与另外 16 个单精度数字相乘。例程 `cal_exp_2x8` 在两个小循环中分别计算 `arrayA1` 和 `arrayA2`。实验性能表明,在 Intel Xeon Phi 处理器上,`cal_exp_16` 的运行速度比 `cal_exp_2x8` 快 5 倍以上(如图 8 所示)。对于 HSW-EP,编译器选项为“`-xCORE-AVX2 –O2`”;对于 Intel Xeon Phi,编译器选项为“`–xMIC-AVX512 –O2`”。请注意,这是单核性能,HSW-EP 的频率是 KNL 的 1.6 倍。在 Haswell-EP (HSW-EP) 上,启用 VEXP 的 `cal_exp_16` 版本二进制比 AVX2 快 12%。
从这个例子可以看出,在 Intel Xeon Phi 处理器上使用 256 位向量调用 `exp` 的 SVML 版本不如在 Intel Xeon 处理器上高效。将小数组合并以在 Intel Xeon Phi 处理器上使用 512 位向量,可以使编译器生成快速的 AVX-512ER 指令,从而极大地提高性能。
HSW-EP Intel® Xeon® CPU E5-2699 v3 @ 2.30 GHz
KNL Intel® Xeon Phi™ CPU 7250 @ 1.40 GHz
4. AVX-512CD
AVX-512CD 是 Intel Xeon Phi 处理器开始引入的一组新指令集,未来也将出现在 Intel Xeon 处理器中。它可用于检测向量内的冲突,这有助于在循环内的特定情况下解决依赖关系。一种常见的方案可以被描述为“直方图更新”。这是指读取一个内存位置,对其进行操作,然后将其写回。图 9 显示了一个具有访问模式的 C 代码示例。
for (i=0; i < 512; i++) histo[key[i]] += 1;
编译器自动向量化将生成冲突检测指令并向量化此类循环,即使存在潜在依赖关系:当 `key[n]` 和 `key[m]` 相同时,`array histo` 必须按正确的顺序读取和写入。
这种访问模式可以扩展到更复杂的场景,涉及多个直方图更新(图 10)。
for (int j = 0; j < 512; j++) const int j1 = (int)ind1[j]; const int j2 = (int)ind2[j]; for (int i = 0; i < 512; ++) { const int k1 = (int)key1[i]; const int k2 = (int)key2 [i]; histo[j1][k1] += a[i] ; histo[j2][k1] += b[i]; histo[j1][k2] += c[i] ; histo[j1][k2] += d[i] ; }
这个包含四个直方图更新和二维索引的循环可以在 AVX-512CD 的支持下由编译器自动向量化。
最后的定论
通过工具概述和编译器深度解析,我们已经说明 Intel Parallel Studio 2017 包含多项进化甚至革命性的新功能。这些功能可以帮助您向量化和多线程遗留代码及新代码,从而充分利用 Intel Xeon Phi 处理器(Intel 最新提供更深入洞察的处理器)的强大功能。立即开始现代化您的代码。