为什么矢量化使用浮点数比使用双数更有效?

Dre*_*ana 5 c c++ gcc openmp

我注意到在 C 程序中向量化循环时,与双操作数相比,使用 float 类型的操作数时实现的加速要大得多。

例子:

for (int i = 0; i < N; i++) {
    a[i] += b[i] * c[i];
}    
Run Code Online (Sandbox Code Playgroud)

当 a、b 和 c 数组的大小分别为 20,000 并且我重复此循环 1,000,000 时:

  • 如果没有矢量化,浮点数和双精度数大约需要 24 秒

  • 使用自动矢量化(使用 -O1 -ftree-vectorize 编译),浮点数需要 7 秒,双精度数需要 21 秒

  • 使用 OpenMP (#pramga omp simd),它类似于上面的要点。

    这可能是什么原因?

编辑:更多信息:

  1. 处理器:Intel Core i7-2677M CPU @ 1.80GHz
  2. 周围的代码只不过是数组分配(使用 calloc)和一个循环,其中数组 b 和 c 填充了常量值。

Sor*_*tir 1

SIMD(单指令、多数据)指令在许多此类操作中发挥作用。浮点型的大小是双精度型的一半,因此单条指令可以处理的浮点数是双精度型的两倍。然而,令我惊讶的是,使用浮点数的速度是原来的三倍,而不是简单地增加了一倍。我怀疑,但不确定,这是因为浮点数更容易操作 - 实际的尾数提取等。