外层循环向量化

Vectorization Essentials, Outer Loop Vectorization

Krishnaiyer, Rakesh4400.00000000000

向量化要素,外层循环向量化

Krishnaiyer, Rakesh4400.00000000000

 

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

向量化要素外层循环向量化

概述

外层循环向量化是一种用于增强性能的技术。默认情况下,编译器会对嵌套循环结构中最内层的循环进行向量化处理。但在某些情况下,最内层循环中的迭代数量较小。此时,对最内层循环进行向量化有些得不偿失。但是如果外层循环中具有更多的工作则可以使用一个基本函数组合strip-mining和编译指示/指令 SIMD在外层循环强制执行向量化操作以实现更好的效果。

主题

下面展示了外层循环向量化示例。

循环嵌套示例:

如果您具备下面的稀疏矩阵向量

for(LocalOrdinalType row=ib*BLOCKSIZE; row<top; ++row) {

    local_y[row]=0.0;

    for(LocalOrdinalType i=Arowoffsets[row]; i<Arowoffsets[row+1]; ++i) {

      local_y[row] += Acoefs[i]*local_x[Acols[i]];

    }

}

内层循环向量化与外层循环向量化对比

您可以对内层 i-循环进行向量化处理。如果您执行该默认的向量化操作则可以得到面向数组 "Acoefs" "Acols" 的单位步长并收集数组 "local_x" 的元素。"local_y" 存储访问从循环中删除,编译器将 eduction-temp 引入向量化循环中。

作为备选方案您可以对外层循环进行向量化处理使用基本函数):对于内存循环体来说编译器将针对 "local_y" 生成单位步长加载/存储"Acoefs" "Acols" 加载变为收集"local_x" 仍然是收集。

为何能够提供帮助如果平均的内层循环数较少不足以填充整个向量),而外层循环数较多那么您可以获得更高的向量化效率。其它考虑因素包括:由于外层循环向量化,外层循环中是否有昂贵的操作(比如划分)现在得到了向量化。必须比较额外收集/分散操作的成本和内存循环向量化,以权衡潜在收益(指定对齐对于外层循环向量化来说更加困难)。

如何执行外层循环向量化:

通过将外层循环体导入到 vector-elemental 函数中并使用 simd 编译指示直接在外层循环进行向量化处理

2) Strip-mine 外层循环迭代并更改循环体中的每个语句以便在步长上运行。英特尔® Cilk™ Plus 数组符号扩展可帮助编程人员自然地表达第二种方法

3) 通过向外层循环添加simd 编译指示带有正确的语句),编译器可能能够对其中的一部分进行向量化处理。 如果可能我们建议针对这些情况使用上述两种方法中的一种因为这有可能会改进编译器执行向量化的效果。

对于上面的示例可使用第一种方法对外层循环进行向量化处理如下所示

#pragma simd

    for(LocalOrdinalType row=ib*BLOCKSIZE; row<top; ++row) {

       local_y[row]=0.0;

       Inner_loop_elem_function(local_y, row, Acoefs, local_x, Acols, Arowoffsets);

   }

__declspec(vector(uniform(Arowoffsets, Acoefs, local_x, Acols, local_y), linear(row))))

Inner_loop_elem_function(float *local_y, int row, float *Acoefs, float *local_x, int *Acols, int *Arowoffsets)

{

             for(LocalOrdinalType i=Arowoffsets[row]; i<Arowoffsets[row+1]; ++i) {

                  local_y[row] += Acoefs[i]*local_x[Acols[i]];

             }

}

下面的文章提供了关于外层循环向量化的更多示例。

ISCA 2012 论文:《传统编程是否能缩小并行计算应用的 Ninja 性能差距2012 6

要点

默认情况下编译器会对嵌套循环结构中最内层的循环进行向量化处理。如果该最内层循环中没有足够的迭代数,那么对于编译器来说,执行向量化操作有些得不偿失。但是,如果外层循环上具有更多的迭代,那么在外层执行向量化会带来更好的效果。要实现这一点,可以使用基本函数和编译指示/指令 SIMD 的组合将向量化移至外层。

下一步

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

返回到主章节“向量化要素”。

 

有关编译器优化的更完整信息,请参阅优化通知