外层循环向量化

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

面向英特尔® 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" 仍然是收集。

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

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

  1. 通过将外层循环体导入到 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 的组合将向量化移至外层。

下一步

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

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

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