研究文章|开放获取
新民田,Hideki齐藤,Serguei诉价格,埃里克·n·加西亚Sergey Kozhukhov,马特·马斯腾空间,阿列克谢g . Cherkasov Nikolay Panchenko, ”有效的SIMD向量化Intel Xeonφ协处理器”,科学的规划, 卷。2015年, 文章的ID269764年, 14 页面, 2015年。 https://doi.org/10.1155/2015/269764
有效的SIMD向量化Intel Xeonφ协处理器
文摘
有效地利用SIMD向量单位是最重要的一个方面在实现高性能的Intel Xeonφ协处理器上运行的应用程序代码。在本文中,我们提出一些有效的SIMD向量化技术如less-than-full-vector循环向量化,英特尔麦克风特定的调整优化,和小矩阵转置/乘法实现2 d向量化生产英特尔C / c++和Fortran编译器为Intel Xeonφ协处理器。一组工作负载从多个应用程序域是用来进行性能研究的SIMD向量化技术。性能结果表明,我们取得了12.5 x在Intel Xeonφ协处理器性能。我们也证明2000 x的性能加速SIMD向量化的无缝集成和并行化。
1。介绍
Intel Xeonφ协处理器是基于英特尔集成许多核心(英特尔麦克风)体系结构,它由许多小的功率效率,按次序的核心,每一个都有一个强大的512位向量处理单元(SIMD单位)1]。它被设计为高度并行的应用程序的需要,充分利用SIMD向量的操作,或者是内存带宽。因此,它是针对高度并行,高性能计算(HPC)工作负载(2等)在不同的领域计算物理,化学,生物学,和金融服务3]。Intel Xeonφ协处理器5110 p有以下主要规格:(我)60核心,240个线程(4线程/核心),(2)1.053 GHz,(3)1 TeraFLOP双精度理论峰值性能,(iv)8 GB内存和320 GB / s带宽,(v)512位宽的SIMD向量引擎,(vi)32 KB L1, 512 KB L2高速缓存/核心,(七)延时(FMA)支持。
一个Teraflop理论峰值性能计算如下:1.053 GHz×60核心SIMD向量×2×8双精度元素失败/菲利普-马萨。因此,任何绑定应用程序试图实现高性能计算在Intel Xeonφ协处理器需要利用高度的并行性和广泛的SIMD向量。使用一个512位的单位向量,16个单精度或8双精度浮点(FP)操作可以执行作为一个单独的向量操作。的帮助下延时(FMA)指令,多达32 FP操作可以执行在每个核心在每个周期。相比当前偏南约128位和256位AVX矢量扩展,这个新协处理器可以打包8 x和4 x数量到一个单一的操作指令,分别。
更广泛的SIMD向量单位不能有效地利用简单地扩展vectorizer英特尔上交所和英特尔AVX架构。考虑以下简单的例子。存在一个标量循环执行N迭代。使用六世的向量长度,一个向量环路将执行地板(N/六世)全矢量迭代紧随其后N国防部六世标量剩余的迭代。除非是足够大于六世,执行N国防部仍然可以很大一部分重要的标量迭代向量执行这样的循环。接下来,我们将讨论两种方法在处理此类“less-than-full-vector”情况:第一种方法是戴面具的向量化和第二个技术是小矩阵优化和二维(2 d)向量化。
此外,建筑或microarchitectural Intel Xeonφ协处理器和英特尔至强处理器之间的差异需要新的编译器技术被开发。本文在三个SIMD向量化技术,使下面的贡献。(我)我们提出一个扩展编译器方案短trip-count循环和剥落和剩余循环进行向量化,分为“less-than-full-vector”情况下,与英特尔麦克风架构支持的屏蔽功能。(2)我们描述特定数据的对齐策略通过向量化实现最优性能,随着英特尔麦克风架构更要求比英特尔AVX架构(内存对齐4]。(3)我们描述二维向量化方法已经超出了传统的循环向量化为小型矩阵转置和乘法操作,充分利用长SIMD向量单位,狂饮,洗牌,掩蔽支持英特尔麦克风架构。
本文的其余部分组织如下:部分2提供了一个高层次的概述英特尔C / c++和Fortran编译器。节3,编译器的细节“less-than-full-vector”循环向量化描述和讨论。具体数据对齐策略英特尔至强φ协处理器和执行数据对准优化的方案讨论了部分4。部分5介绍了二维向量化方法对小矩阵转置和乘法。部分6讨论相关工作。部分7提供一系列的工作负载的性能结果和微基准测试。部分8总结了纸。
2。编译器架构向量化
本节描述英特尔C / c++和Fortran编译器支持Intel Xeonφ协处理器在一个较高的水平环向量化和SIMD的翻译和优化向量扩展(5- - - - - -7]。编译器将串行C / c++和Fortran代码通过自动循环分析或基于注释使用SIMD编译指示和向量属性成SIMD指令序列。编译过程服从等优化循环并行化,内存位置优化,经典的循环转换和优化,消除冗余,死代码消除循环/函数前后向量化。图1描绘了SIMD编译基础设施的英特尔C / c++和Fortran编译器自动循环向量化和编译SIMD编译指示,向量函数注释和相关条款。这个框架由四个主要部分组成。(我)执行自动循环分析和识别和分析程序员注释功能和循环通过解析和收集功能和循环向量属性。此外,我们的编译器框架可以应用过程间分析和优化分析和自动向量化函数调用图的创建。(2)生成矢量化功能变体通过克隆和向量函数与正确构造签名签名的一代。(3)Vectorize SIMD for循环所确定的编译器或注释使用SIMD扩展(# pragma SIMD可以使用外循环)进行向量化和克隆向量函数的身体和所有参数利用和扩展我们的自动循环vectorizer。(iv)使古典标量、内存和有效循环优化和并行化,循环和函数之前或之后向量化,实现良好的性能。
3所示。与屏蔽Less-than-Full-Vector循环向量化
Intel Xeonφ协处理器提供长(512位)的硬件支持SIMD向量利用vector-level并行性。长SIMD向量单位对包装的要求更多的标量循环迭代到一个向量循环迭代,这也导致了更多的迭代中剥落的循环,在循环剩余的其余部分和/或nonvectorized,因为他们不能构成完整的SIMD向量(或less-than-full-vector)单位英特尔麦克风架构。例如,考虑所示的短trip-count循环算法1。
|
||||||||
当循环是矢量化的英特尔SSE2向量长度= 4(128位),其余循环将有3个迭代。当循环是英特尔麦克风架构与矢量化向量长度= 16(512位),其余循环将有15个迭代。在另一种情况,如果循环展开的16,然后其余循环将有15个迭代,留下剩下的15个迭代执行一个标量形式。因此,vectorizing剥落和剩余循环(即。,short trip-count loop in general) is very important for the Intel MIC architecture. This section describes how to apply vectorization, with masking support, to peeling and remainder loops (i.e., short trip-count loop) with special guarding masks to prevent the SIMD code from exceeding original loop and memory access boundaries. At a high level, the following steps describe our vectorization scheme without vectorization of peeling and remainder loops.(我)s0:选择对齐、向量长度和展开的因素。(2)s1:生成对齐设置代码。(3)s2:计算剥落的旅行计数循环。(iv)s3:排放标量剥落的循环。(v)s4:生成向量循环初始化代码。(vi)s5:发射主向量循环。(七)s6:计算其余的旅行计数循环。(八)s7:排放标量剩余循环。
由于算法简单的例子所示2,循环trip-count”“指针””(&[0])有一个内存对齐,在编译时是未知的。
|
||||||||||||||
在英特尔麦克风架构向量长度为512位,这需要64字节对齐的高效的内存访问。达到64字节对齐的内存加载/存储,我们需要包16浮动(32位)为每一个向量迭代元素并生成一个剥循环。伪代码1显示了矢量化循环的基础上向量化的步骤上面所描述的。“less-than-full-vector”循环,脱皮和剩余循环,不是矢量化。
|
||||||||||||||||||||||||||||||||||||||||||
注意,我们执行主矢量化循环循环展开,它允许硬件问题更多的指令周期通过隐藏内存访问延迟和减少分支。使“less-than-full-vector”(即。,peeling loop, remainder loop, or short trip-count loop) vectorization, the loop vectorization scheme is extended as below.(我)s0:选择对齐,向量长度和展开的因素。(2)s1:生成对齐设置代码。(3)s2:计算出旅行的剥落的循环计数。(一)创建一个向量的16个元素的值。(b)创建一个向量的16个元素的值。(iv)s3:发射矢量化剥离与屏蔽操作循环。(v)s4:生成主向量循环初始化代码。(vi)s5:发射主向量循环。(七)s6:计算其余的旅行计数循环。(一)创建一个向量的16个元素的值。(b)创建一个向量的16个元素的值。(八)s7:排放掩蔽的矢量化剩余循环操作。
伪代码2显示了矢量化循环的基础上扩展向量化方案如上描述。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
的短trip-count循环向量化的剥落和剩余循环运行时trip-count和一致性检查,尽可能有效地循环是矢量化。这些循环矢量化与最优向量长度和最佳的盈利展开无论一个已知的循环计数。这提供了更好的利用SIMD向量硬件不牺牲短期循环的性能。这个计划使我们能够完全消除标量执行循环的蒙面SIMD向量生成代码。面具的特殊性质是在大多数情况下用于匹配揭露了代码生成。例如,蒙面标量内存负载下可以不安全的一个空面具余数面具下被认为是安全的,因为它从来都不是空的。
没有添加短trip-count循环向量化的能力,ConvolutionFFT2D基准和7中的循环迭代和双精度数据类型执行最终将作为全标量。与屏蔽应用向量化,这些短trip-count循环导致x ~ 2 ~ 5 x加速7-iteration短trip-count(或less-than-full-vector)循环在英特尔麦克风ConvolutionFFT2D基准架构。
4所示。定位策略和优化
Intel Xeonφ协处理器更敏感比Intel Xeon E5处理器数据对齐,所以开发一个面向英特尔麦克风的对齐策略和优化方案是实现最优性能的关键因素之一。(我)类似于英特尔SSE4.2 SIMD负载+ op指令需要矢量大小排列,这是英特尔64字节对齐麦克风架构。然而,简单的加载/存储指令要求对齐信息在编译时是已知的Intel Xeonφ协处理器。(2)不同于之前英特尔SIMD扩展,所有SIMD加载/存储指令包括收集/散射至少需要元素大小排列。不一致的元素会导致一个错误。这需要英特尔麦克风架构ABI (8)要求所有内存访问elementwise对齐。(3)没有特别的对齐加载/存储指令在英特尔最初许多核心指令(英特尔儿童疾病综合管理)。这是克服使用开箱加载和包装存储能够处理对齐的内存位置(element-aligned)。由于包装拆包和自然,这些指令不能直接用于蒙面加载/存储,除非在特殊情况下。(iv)蒙面的断层性质内存访问指令在英特尔儿童疾病综合管理增加了额外的复杂性之外的那些指令寻址数据分页内存,可能会失败,即使实际数据访问是蒙面。例外是收集/散射指令。
因此,编译器积极执行数据对准优化使用传统技术如剥落和对齐多版本保持一致。
对齐剥意味着建立一个执行的preloop几个迭代非对齐数据以达到一个内存地址保持一致。因此,大多数这些迭代使用对齐SIMD操作执行。preloop可以与掩蔽节中描述矢量化2。不幸的是,这个方案只适用于一套coaligned内存地址,和其他人都认为是对齐的。此外,我们的多版本优化可以应用于第二组coaligned动态位置通过检查他们。一致或未对齐操作使用基于考试的结果。
揭露了对齐(element-aligned)向量加载和存储,编译器使用开箱/包装加载和存储指令。他们是安全的在这种情况下,执行比收集/分散指令。如果编译器无法证明安全的整个地址范围的一个特定的内存访问,它插入一个zero-mask检查以避免内存故障。所有指令相同的面具下发出一个空的面具下检查,以避免执行和消除多个检查相同的条件。
拆包和包装指令可能会导致故障时使用面具,因为它们可能地址masked-out无效的内存。动态数据转换可能导致故障,即使没有屏蔽。因此,对于未对齐蒙面和/或转换加载/存储,编译器使用收集/分散指令而不是安全,即使这降解性能。如果每个内存访问内存错误永远不会发生至少有一个向量(64字节)的内存分页后最初的地址。这可以通过填充程序中的每个数据部分和每个动态分配的对象64字节。开发人员愿意做填充来实现最优性能的蒙面的代码,编译器引入了knob-opt-assume-safe-padding。在这个旋钮,对齐蒙面和/或转换加载/存储操作发出打开加载/包装存储。(我)在揭露了转换的情况下,以及例皮/剩余面具,编译器发出直接加载/存储。面具在这种情况下将因为它是密集的工作。(2)对于任意屏蔽场景,一个不戴面具的负载使用解压缩指令,它是安全的因为填充的假设,紧随其后的是一个蒙面的举动(混合)。“nonempty-mask”检查64字节填充总是保证足够的安全;中,至少有一项向量加载。因此,内存访问的尾端从有意义的数据在64字节。
safe-padding优化提供了显著的改进的基准,例如,10%的涨幅BlackScholes和选定的分子动力学内核。
5。小矩阵运算2 d向量化
经常出现在HPC工作量,操作小矩阵是一个增长,盈利的计算在Intel Xeonφ协处理器向量化。在更广泛的SIMD单位支持下,英特尔C / c++和Fortran编译器增强共同进行向量化操作小沿二维矩阵。小矩阵是矩阵的数据完全可以驻留在一个或两个512位的SIMD寄存器。考虑示例Fortran循环嵌套与32位浮点数(或实际)式所示的算法3。
|
||||||||||||||||||||||||
与nonunit大步在算法的内在循环引用3,传统的内循环向量化不会提供最有效的向量化的循环嵌套。外循环向量化面临着类似的问题。英特尔C / c++和Fortran编译器使用的更广泛的SIMD向量单位英特尔架构和vectorizes麦克风这个示例循环在所有三个循环嵌套的水平,命名为二维(2 d)向量化小矩阵。
下面详细的向量化方法与向量内在的伪代码。对于可视化,表1- - - - - -13描述各种矢量单元内容的快照后相应的指令。表1- - - - - -13表示一个向量单位,他的名字是在最左边的列和其内容在最右边的四列。最右边的四列,最低的解决元素是在左上角和每个连续元素遵循行处理订单。
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
||||||
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
|
||||||
首先,数据被加载到一个矢量单元数组。与更广泛的SIMD向量单位,编译器能够加载整个a和B矩阵每到一个单位向量。
(一)矩阵a和B是加载到两个SIMD寄存器:/ /矩阵从内存加载到向量寄存器,A_v512 =〈(1][[1]1][(2),……,4][[3]4][4)〉。更多细节见表1。/ / B矩阵从内存加载到向量寄存器,B_v512 =〈B (1][1)、B (1][2],……,B (4][3)、B (4][4)〉。更多细节见表2。
接下来,编译器优化矩阵A和B之间的乘法操作,通过一系列的数据布局转换和向量乘法和加法操作。编译器识别矩阵乘法在这个循环和排列元素矩阵和矩阵B建立简单的向量乘法和添加。
(b)我们可以简化乘法需要通过换位的元素,紧随其后的是乘法和添加b和每一行每一行的转置我们先移调的元素。/ /首先,创建一个向量单位零。一个′_v512 = _mm512_setzero ()更多细节见表3。
转置操作,我们使用一组新的英特尔麦克风_mm512_mask_shuf128×32()内在调用。同样在古典建筑,这个洗牌内在是受四个128位“道”在每个向量寄存器。因此,这个内在包含理由排列模式的四个128位的车道,以及置换模式的四个32位边界内每一个车道。的参数如下:
_m512 res = _mm512_mask_shuf128×32 (_m512 v1, (I16) vmask _m512 v2 (SI32) perm128 (SI32) perm32),(我)res:结果向量单位,(2)“v1: blend-to-vector单位;这个向量中的值的单位将混合重组元素v2,根据写面具,(3)vmask:写面具;写面具有点向量指定哪些元素覆盖在v1洗牌v2的元素,(iv)v2:输入数据向量单位;这个向量单位持有的元素将被打乱,(v)perm128: 128位巷排列;这个值指定的排列顺序向量单位的128位的车道,(vi)perm32: elementwise排列;这个值指定的排列顺序的四个32位边界在每个128位巷,/ /开始转置操作通过元素/ /期望的秩序。洗牌用来插入矩阵对角线/ /转置的结果向量单位,一个′_v512 = _mm512_mask_shuf128×32 (′_v512, 0×8421, A_v512, _MM_PERM_DCBA, _MM_PERM_DCBA)。更多细节见表4。/ /调整接下来的四元素和融入/ /元素从先前的洗牌,写一个”_v512 = _mm512_mask_shuf128×32 (′_v512, 0×4218, A_v512, _MM_PERM_CBAD, _MM_PERM_ADCB)。更多细节见表5。/ /调整接下来的四元素和融入/ /元素从先前的洗牌,写一个′_v512 = _mm512_mask_shuf128×32 (′_v512, 0×2184, A_v512, _MM_PERM_BADC, _MM_PERM_BADC)。更多细节见表6。/ /调整最后的四个元素和融入/ /元素从先前的洗牌获取书面/ /完成转置,一个′_v512 = _mm512_mask_shuf128×32 (′_v512, 0×1842, A_v512, _MM_PERM_ADCB, _MM_PERM_CBAD)。更多细节见表7。
矩阵的元素排列后通过换位,每个元素A和B的现在在正确的位置在每个矢量单位向量积,导致相同的行为为行和列的点积。
(c)接下来,我们执行乘法的每一行每一行的转置一个B,保持产品行,行之和:/ /加载的第一行′_v512和广播这一行/ /剩余的三行t1_v512 = _mm512_extload_ps (A′_v5120:4],_MM_FULLUPC_NONE _MM_BROADCAST_4×16日0)。更多细节见表8。
另一个有用的内在中使用这种优化是英特尔麦克风_mm512_swizzle_ps()内在。这种内在的类似于上面的洗牌的除了它只排列每128位巷而不是每个32边界在这些车道。的参数如下:
_m512 res = _mm512_swizzle_ps (_mm512 v1, SI32烫)(我)res:结果向量单位,(2)“v1:输入数据向量单位排列,(3)烫:排列模式为每个128位巷,/ /加载B_v512和广播这一行的第一行/ /剩余的三行t2_v512 = _mm512_swizzle_ps (B_v512 _MM_SWIZ_REG_AAAA)。更多细节见表9。/ /乘t1_v512的每个元素的每个元素/ /在C_v512 t2_v512并存储结果C_v512 = _mm512_mul_ps (t1_v512 t2_v512)。更多细节见表10。/ /加载的第二行′_v512和广播这一行/ /剩余的三行t1_v512 = _mm512_extload_ps (A′_v5124:8],_MM_FULLUPC_NONE _MM_BROADCAST_4×16日0)/ /加载B_v512和广播这一行的第二行/ /剩余的三行t2_v512 = _mm512_swizzle_ps (B_v512 _MM_SWIZ_REG_BBBB)。
每个后续的乘法都必须为每一行积累。这些乘法和加法中相应的行和列的点积矩阵乘法,但是因为之前的转置,不需要进一步的排列:/ /添加C_v512的现有价值的产品/ / t1_v512导致C_v512 t2_v512和商店C_v512 = _mm512_madd213_ps (t2_v512 t1_v512 C_v512)/ /加载的第三行′_v512和广播这一行/ /剩余的三行t1_v512 = _mm512_extload_ps (A′_v5128:12),_MM_FULLUPC_NONE _MM_BROADCAST_ 4×16日0)/ /加载B_v512和广播这一行的第三行/ /剩余的三行t2_v512 = _m512_swizzle_ps (B_v512 _MM_SWIZ_REG_CCCC)/ /添加C_v512的现有价值的产品/ / t1_v512导致C_v512 t2_v512和商店C_v512 = _mm512_madd213_ps (t2_v512 t1_v512 C_v512)/ /加载的第四行′_v512和广播这一行/ /剩余的三行t1_v512 = _mm512_extload_ps (A′_v51212:16)、_MM_FULLUPC_NONE _MM_BROADCAST_4×16日0)。更多细节见表11。/ /加载B_v512第四行和广播这一行/ /剩余的三行t2_v512 = _mm512_swizzle_ps (B_v512 _MM_SWIZ_REG_DDDD)。更多细节见表12。/ /添加C_v512的现有价值的产品/ / t1_v512导致C_v512 t2_v512和商店C_v512 = _mm512_madd213_ps (t2_v512 t1_v512 C_v512)。更多细节见表13。
简化后的矩阵乘法,循环进一步要求结果存储在C矩阵。与所有元素正确计算和居住在向量生成单元只有一个存储操作。
(d)最后,结果向量存储的值的单位C数组:/ /然后C_v512向量寄存器存储的元素/ /内存等等(1][1]〈C (1][1],明目的功效1][[2],C…[4][3],明目的功效4][4)〉= C_v512。
512位长SIMD向量英特尔麦克风的架构支持消费的单位矩阵维度为2 d向量化,整个小矩阵拟合(4×4浮子式)到一个512位的SIMD向量寄存器。这使得更有效灵活的向量化和优化小型矩阵运算。例如,单精度的标量版本4×4矩阵乘法计算天真地执行128内存负载,64乘以64的增加,16记忆存储。小矩阵二维向量化减少指令2向量从内存加载,4次乘法,4打乱,4狂饮,3添加,1向量存储内存减少大约15 x数量的指示。
6。绩效评估
本节介绍了性能结果以Intel Xeonφ协处理器系统使用一组工作负载和微基准测试。
6.1。工作负载
我们选择一组工作负载来演示的性能优势和重要性SIMD向量化的英特尔麦克风架构。这些工作负载展览范围广泛的应用程序行为,可以发现在高性能计算等领域,金融服务、数据库、图像处理、搜索和其他领域。这些工作包括以下。
但是。NBody
NBody计算用于天体物理学等科学应用(9)和统计学习算法(10]。主要计算包括两个循环遍历的身体和计算两两之间的相互作用。
6.1.2。2 d 5×5卷积
卷积是一种常见的图像滤波计算用于应用模糊和锐化等作用。对于一个给定的2 d图像和5×5包含权重的空间滤波器,这种卷积计算加权和附近的5×5组像素。
6.1.3。背投影
背投影通常用于执行cone-beam图像重建CT投影值(11]。输入由一组二维图像“back-projected”到一个3 d体积为了构建一个三维网格的密度值。
6.1.4。雷达(1 d卷积)
一维卷积是广泛应用在雷达跟踪等应用程序、图形和图像处理。
6.1.5。树搜索
在内存中树结构索引搜索是一种常用的操作数据库应用程序。这个基准测试包含多个并行搜索树不同的查询,通过树的路径在哪里决定基于查询结果的比较,在每个树节点值水平。
6.2。系统配置
的详细信息的配置英特尔至强φ协处理器的性能研究和用于评估的有效性SIMD向量化技术提供了表14。
|
||||||||||||||||||||||||||||||||
6.3。性能结果
所有基准被编译为本地可执行使用英特尔产品编译器和运行13.0英特尔至强φ协处理器系统中指定的表14。演示性能通过SIMD向量化,为每个工作负载生成二进制文件的两个版本。基线版本只使用OpenMP并行化编译(-mmic OpenMP -novec);向量化的矢量化版本编译(违约)和OpenMP并行化(-mmic OpenMP)。
性能扩展来源于OpenMP-only与512位执行和OpenMP SIMD向量Intel Xeonφ协处理器系统上执行,我们描述了在这一节的开始。即当负载包含32位单精度计算,16路向量化可能实现。当工作负载包含64位双精度计算,8路向量化。
图2显示了规范化SIMD五工作负载的性能加速。这些工作负载的SIMD代码生成实现SIMD加速从2.25 x 12.45 x。除了这些经典HPC应用程序与普通数组访问和计算,工作量与大量的分支代码,如树搜索中使用的数据库应用程序,达到2.25倍加速以及基于掩蔽支持SIMD向量化的英特尔麦克风架构。
6.3.1。Less-than-Full-Vector循环向量化的影响
检查less-than-full-vector循环向量化的影响,一个简单的微基准测试是用三个小核函数:intAdd,floatAdd,doubleAdd。他们每个人有一个短trip-count循环需要3数组,a, b, c的大小31日,elementwise除了对int,浮动,和双数据类型。向量的长度是16迭代的循环intAdd和floatAdd内核和8迭代的循环doubleAdd内核函数。这个实验装置保证了intAdd和floatAdd循环包含15-iteration余数循环,doubleAdd循环包含7-iteration剩余循环可以矢量化的“less-than-full-vector“循环SIMD向量化技术使用掩蔽支持部分中描述2。
图3显示了向量化性能没有“less-than-full-vector“循环向量化和”less-than-full-vector“三短trip-count循环循环向量化intAdd,floatAdd,和doubleAdd内核函数。这些循环的生成的SIMD代码实现加速从2.89 x 3.32 x没有”less-than-full-vector“循环向量化。以“less-than-full-vector“循环向量化,加速性能明显改善,范围从3.28 x 7.68 x。注意,在这个测量,所有数据是64字节对齐的,没有剥落循环生成,对齐内存加载/存储指令等vmovaps和vmovapd(1生成)达到最优性能。下一小节将演示数据对齐影响英特尔麦克风架构。
再。影响数据的对齐
这些内核循环中使用的部分6.3.1这个测量是重用。在这项研究中,不同之处在于,我们不提供定位信息的数组一个,b,c。不一致信息,因为这些循环短trip-count循环常数访问计数,编译器生成SIMD指令:(我)vloadunpackld和vloadunpackhd从对齐内存位置和加载数据vpackstoreld和vpackstorehd(1)来存储数据对齐的内存位置矢量化主循环,(2)vgatherdps和vscatterdps指令(1)加载和存储的矢量化剩余循环带写面具。
如图4数据对齐信息,性能的SIMD执行1.45倍,1.41倍和1.32倍比对齐情况下对int,浮动,双类型的三个内核函数。调整优化中所描述的部分3实现最优性能的关键是英特尔麦克风架构。
6.3.3。影响小矩阵的二维矢量
加法和乘法等小矩阵运算担任许多HPC应用程序的重要部分。等一系列经典的编译器优化循环完整的展开,部分冗余消除(前),标量替代,和部分求和开发向量执行性能达到最优。传统的内部或外部循环向量化为三层循环巢4×4矩阵运算不是Intel Xeonφ协处理器由于表现良好(我)少有效使用512位长SIMD单元,例如,对于32位浮点数据类型,当内循环或外循环是矢量化。在这种情况下使用4路向量化而不是16路向量化,(2)副作用在经典的优化,例如,部分冗余消除,部分求和,和运营商强度降低,当循环是矢量化。
如图5,该公约循环向量化在小矩阵(4×4)操作会导致性能下降。这两种情况下的单精度和双精度矩阵乘法(4×4),性能下降~ 50%当比较反对情况下没有向量化,这被用作基线性能。成对的矩阵乘法,矩阵有两个(4×4)乘法做窝在一个循环,并为计算B矩阵转置苏梅(更多细节见算法4)。
|
||||||||||||||||||||||||
经典的循环优化单一矩阵乘法不那么有效的转置操作矩阵B和配对矩阵乘法的循环。因此,性能与传统循环实现优化与应用传统循环向量化,相提并论,没有观察到显著的性能差异,如图5。不靠谱的是,应用小矩阵二维向量化我们提出了部分4,我们实现一个性能加速1.15倍/ 1.04倍单矩阵(4×4 /双浮动类型)乘法和加速5.42倍/ 4.18倍配对矩阵(4×4 /双浮动类型)转置和乘法,这表明小矩阵2 d的有效性向量化使用长SIMD向量单位支持Intel Xeonφ协处理器。
7所示。无缝集成与线程
有效地利用协处理器的力量像Xeonφ要求线程和vector-level并行性剥削。而并行化主题超出了本文的范围,我们仍然要强调SIMD向量扩展系统可以无缝集成OpenM等线程模型4.0英特尔支持的编译器。鉴于曼德布洛特曼德布洛特例子计算图形图像代表了曼德尔勃特集合的一个子集(一个著名的二维分形形状)的一系列复杂的数字。它输出的数量分内部和外部。
在曼德布洛特工作负载,函数”曼德尔“在曼德布洛特程序是一个热功能和候选人SIMD向量化,所以我们可以用注释# pragma omp SIMD申报。在调用者网站,热循环是一个嵌套的两倍为循环,外为与“omp并行循环断言”线程,和内循环断言“omp SIMD”向量化算法所示5。注意,“引导”调度类型是用于实现负载平衡,因为每个调用“曼德尔”功能不同数量的工作执行时间而言,由于“打破”退出循环。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
图6仅显示SIMD向量化提供了~ 16 x加速,用选项-mmic openmp化c99-O3串行执行。OpenMP并行化提供了62.09倍加速超了,61个线程使用61核加速131.54 x 244个线程(61芯超线程,4 HT每核心线程)在串行执行。OMP并行和SIMD执行提供一个OMP PAR + SIMD加速2067.9 x 244个线程,Intel Xeonφ系统上运行,61 -核心芯片和超线程。从1线程性能扩展到61个线程接近线性的。此外,超线程支持提供x ~ 2性能获得通过比较与61 - 244 -线程加速线程加速,比著名的20% - -30%的预期性能获得超线程技术由于计算资源争用的少的本质工作负载,和4忙HT线程并隐藏延迟。细节参见系统信息6.2。
8。相关工作
编译器向量化技术(12)的一个关键循环转换了传统向量机几十年前。然而,最近越来越多的现代SIMD架构(1,4)提出了新的约束如数据对齐、屏蔽控制流,nonunit大步进入内存,和SIMD向量的固定长度的自然需求更先进的向量化技术和向量化友好的编程语言扩展(7]。
在过去3 +年,富人的SIMD向量化功能整合在许多工业和研究编译器(5,6,12- - - - - -16]。这些包括作品基于ICC(英特尔编译器)5,6),XLC编译器(IBM) [13,16,巨大的17],GCC [18,19],无噪音编译器(20.]。然而,有许多未知的程序等因素循环计数,内存访问步伐和模式,对齐,和控制流的复杂性现代优化编译器在编译时,构成挑战的能力应用先进和实用的向量化技术和实现应用程序之间的语义鸿沟,现代处理器如Intel Xeonφ协处理器利用其计算能力。
相比传统的环向量化(5,12,20.),“less-than-full-vector”向量化技术带来额外的性能优势对于那些vectorizable短trip-count循环,特别是当处理器提供长SIMD单元屏蔽功能像英特尔至强φ协处理器。我们调整优化是建立在现有的动态调整优化了(5,6]。然而,本文中描述的对齐策略旨在满足英特尔麦克风架构的要求与最优SIMD指令选择和面具利用安全最优性能。除了传统的单一循环向量化(5,12,16,18,19,21),小的2 d向量化矩阵运算增加vector-parallelism和提高利用效率的SIMD向量单位,狂饮,洗牌,广播,和面具支持英特尔麦克风架构明显。
此外,OpenM等编程语言扩展SIMD扩展(22,23+ Cilk]和[3,7]功能向量化和环向量化通过编译器已经铺平了道路,使更有效vector-level并行性(7,22在C / c++和Fortran编程语言。来支持这些SIMD向量有效地在Intel Xeonφ协处理器编程模型,本文中描述的实用、有效的向量化技术是至关重要的实现最优性能,确保SIMD代码执行安全Intel Xeonφ协处理器系统。
9。结论
由英特尔至强的日益流行的SIMD架构φ协处理器,我们提出并实现了新的向量化技术探索的有效使用长SIMD单位。本文提出了一些实用SIMD向量化技术如less-than-full-vector循环向量化,英特尔麦克风特定数据对准优化,和小矩阵运算为Intel Xeonφ2 d矢量协处理器。一组工作负载从几个领域来评估我们的SIMD向量化技术的好处。结果表明,我们取得了12.5 x在Intel Xeonφ协处理器性能。曼德布洛特负载了SIMD向量的无缝集成扩展与线程和显示2067.91倍的性能加速OpenMP的结合使用“平行”和“SIMD结构使用英特尔C / c++编译器在Intel Xeonφ协处理器系统。
英特尔C / c++和Fortran编译器高度增强为程序员利用英特尔至强φ协处理器的计算能力为加速高度并行应用程序中发现的化学、视觉计算、计算物理、生物学、金融服务、像素、多媒体、图形和HPC应用程序通过有效利用英特尔麦克风的使用架构SIMD向量单位除了传统循环SIMD向量化。
利益冲突
作者宣称没有利益冲突有关的出版。
引用
- 英特尔公司,”英特尔至强φ协处理器系统软件开发人员指南,”2012年,http://software.intel.com/en-us/mic-developer。视图:谷歌学术搜索
- j . n . Satish c . Kim Chhugani et al .,“传统的编程桥可以并行计算应用程序的忍者性能差距?“在学报》第39届国际研讨会计算机体系结构(ISCA 12)2012年6月,页440 - 451。视图:出版商的网站|谷歌学术搜索
- j . Reinders”概述为英特尔至强处理器的编程和英特尔至强φ协处理器,”2012年。视图:谷歌学术搜索
- 英特尔公司,英特尔高级向量扩展编程参考文件编号319433 - 011年,英特尔公司,2011年版。
- a . j . c . Bik m . Girkar p . m .灰色和x田,“intra-register自动向量化的英特尔架构,”国际期刊的并行编程,30卷,不。2、65 - 98年,2002页。视图:出版商的网站|谷歌学术搜索
- A . j . c . Bik d l . Kreitzer和x田”,一个案例研究在编译器优化英特尔核心TM2双核处理器。”国际期刊的并行编程,36卷,不。6,571 - 591年,2008页。视图:出版商的网站|谷歌学术搜索
- x, h .齐藤m . Girkar et al .,“编译C / c++ SIMD功能扩展和循环vectorizaion multicore-SIMD处理器,”《IEEE 26日国际并行和分布式处理研讨会研讨会(IPDPSW 12)2012年5月,页2349 - 2358。视图:出版商的网站|谷歌学术搜索
- h . j ., m . Garkar m . Matz j . Hubicka a . Jaeger和m·米切尔“System V应用程序二进制接口K1OM架构处理器补充,“1.0版本,2012年,http://software.intel.com/en-us/forums/topic/278102。视图:谷歌学术搜索
- s . j . Aarseth引力体模拟:工具和算法、剑桥专著数学物理,剑桥大学出版社,2003年,英国剑桥。视图:出版商的网站|MathSciNet
- a·g·格雷和a·w·摩尔:“‘体’统计学习中存在的问题,”先进的神经信息处理系统(少量),第527 - 521页,2000年。视图:谷歌学术搜索
- m . Kachelrieb m . Knaup, o . Bockenbach“超高速cone-beam反向投影角度来看,”IEEE核科学学报》研讨会会议记录2006年11月,页1679 - 1683。视图:出版商的网站|谷歌学术搜索
- r·艾伦和k·肯尼迪,“FORTRAN程序自动翻译的向量形式。”ACM事务编程语言和系统,9卷,不。4、491 - 542年,1987页。视图:出版商的网站|谷歌学术搜索
- a . e . Eichenberger k . O ' brien吴p . et al .,“CELL处理器的优化编译器,”学报》第14届国际会议上并行体系结构和编译技术(协议' 05)IEEE,页161 - 172年,圣路易斯,密苏里州,美国,2005年9月。视图:出版商的网站|谷歌学术搜索
- r . Karrenberg和美国黑客”,整体功能向量化,”第九届国际年度IEEE / ACM学报》研讨会上代码生成和优化Charmonix,页141 - 150年,法国,2011年4月。视图:谷歌学术搜索
- 拉森和s .编写“与多媒体指令集,利用superword级并行性”程序的编程语言设计和实现SIGPLAN会议(PLDI ' 00)2000年6月,页145 - 156。视图:谷歌学术搜索
- a . e . p . Wu Eichenberger, a .王”高效的SIMD代码生成运行时对齐和长度转换”程序的代码生成和优化国际研讨会(CGO ' 05)2005年3月,页153 - 164。视图:出版商的网站|谷歌学术搜索
- 月牙湾的软件,VAST-F / AltiVec:自动Fortran Vectorizer PowerPC向量单位,2004年。
- d . Nuzman和a . zak”和简称vectorization-revisited SIMD架构,”学报17并行体系结构和编译技术国际会议(协议' 08),页2 - 11,多伦多,加拿大,2008年10月。视图:出版商的网站|谷歌学术搜索
- d . Nuzman r·亨德森,“多平台自动向量化,”诉讼的第四届国际研讨会代码生成和优化(CGO 06年),页281 - 294,纽约,纽约,美国,2006年3月。视图:出版商的网站|谷歌学术搜索
- g .畅和m . s . Lam“多媒体指令集的优化器,”第二届无噪音编译器车间,1997年8月。视图:谷歌学术搜索
- m . j . Shin大厅,j . Chame”Superword-level并行控制流的存在,”程序的代码生成和优化国际研讨会(CGO ' 05),页165 - 175,IEEE计算机协会,2005年3月。视图:出版商的网站|谷歌学术搜索
- m·克莱姆杜兰,x, h .齐藤d .绅士和x Martorell扩展OpenMP*随着现代多核SIMD向量构造架构,”OpenMP在异构的世界:8日国际研讨会OpenMP IWOMP 2012年,罗马,意大利,2012年6月11 - 13日,。诉讼课堂讲稿,在计算机科学中,页59 - 72,施普林格,柏林,德国,2012年。视图:出版商的网站|谷歌学术搜索
- OpenMP架构评审委员会”,OpenMP应用程序界面,”4.0版(发行候选版RC1), 2012年。视图:谷歌学术搜索
版权
版权©2015新民田等。这是一个开放的分布式下文章知识共享归属许可,它允许无限制的使用、分配和复制在任何媒介,提供最初的工作是正确引用。