【问题标题】:What does vectorization mean?矢量化是什么意思?
【发布时间】:2010-12-03 17:59:40
【问题描述】:

矢量化代码是个好主意吗?在什么时候做这件事上有什么好的做法?下面会发生什么?

【问题讨论】:

标签: c++ c gcc compiler-construction vectorization


【解决方案1】:

向量化意味着编译器检测到你的独立指令可以作为一条SIMD指令执行。通常的例子是,如果你做类似的事情

for(i=0; i<N; i++){
  a[i] = a[i] + b[i];
}

它将被矢量化为(使用矢量符号)

for (i=0; i<(N-N%VF); i+=VF){
  a[i:i+VF] = a[i:i+VF] + b[i:i+VF];
}

基本上,编译器会选择一个可以同时对数组的 VF 元素执行的操作,然后执行 N/VF 次,而不是执行单个操作 N 次。

它提高了性能,但对架构提出了更高的要求。

【讨论】:

  • 那么程序员可以做些什么来确保矢量化(除了打开优化)?
  • 据我所知,编译器在自动矢量化方面是有限的,所以最好的办法是让你的代码尽可能的简单。您还可以检查生成的汇编代码以查看编译器是否矢量化。
  • @jacob:你不能真正“确保”它,你可能想看看openmp.org 的明确告诉编译器向量化的方法。
  • 向量化并不意味着编译器会这样做,只是使用了 SIMD 指令。当编译器生成 SIMD 代码时,通常称为自动矢量化。
【解决方案2】:

如上所述,向量化用于利用 SIMD 指令,该指令可以对打包到大寄存器中的不同数据执行相同的操作。

使编译器能够自动向量化循环的一般准则是确保在循环的不同迭代中没有流依赖和反依赖 b/w 数据元素。

http://en.wikipedia.org/wiki/Data_dependency

英特尔 C++/Fortran 编译器等一些编译器能够自动矢量化代码。如果它无法向量化循环,英特尔编译器能够报告它为什么不能这样做。有报告可用于修改代码,使其变得可矢量化(假设它是可能的)

“为现代架构优化编译器:基于依赖的方法”一书中深入介绍了依赖关系

【讨论】:

    【解决方案3】:

    向量化不必局限于可以保存大数据的单个寄存器。就像使用“128”位寄存器来保存“4 x 32”位数据一样。这取决于架构限制。一些架构有不同的执行单元,它们有自己的寄存器。在这种情况下,可以将部分数据馈送到该执行单元,并且可以从对应于该执行单元的寄存器中获取结果。

    例如,考虑以下情况。

    for(i=0; i {
    a[i] = a[i] + b[i];
    }



    如果我正在研究具有两个执行单元的架构,那么我的向量大小定义为两个。上面提到的循环将被重新定义为

    for(i=0; i {
    a[i] = a[i] + b[i] ;


    a[i+1] = a[i+1] + b[i+1];
    }

    注意:for 语句中的 2 是从向量大小得出的。

    由于我有两个执行单元,循环内的两个语句将被输入到两个执行单元中。总和将分别在执行单元中累加。最后将执行累加值的总和(来自两个执行单元)。

    好的做法是
    1. 在对循环进行矢量化之前,需要检查依赖关系等约束(循环的不同迭代之间)。
    2. 需要防止函数调用。
    3. 指针访问会产生别名,需要防止。

    【讨论】:

      【解决方案4】:

      这是 SSE 代码生成。

      您有一个循环,其中包含浮点矩阵代码 matrix1[i][j] + matrix2[i][j],编译器生成 SSE 代码。

      【讨论】:

      • SEE 不是唯一的向量指令集。 PPC 有 Altivec,其他架构也有自己的向量指令。
      【解决方案5】:

      也许还可以看看 libSIMDx86(源代码)。

      一个很好解释的例子是:

      Choosing to Avoid Branches: A Small Altivec Example

      【讨论】:

        猜你喜欢
        • 2012-11-10
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 2019-07-16
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多