我注意到在 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),它类似于上面的要点。
这可能是什么原因?
编辑:更多信息:
SIMD(单指令、多数据)指令在许多此类操作中发挥作用。浮点型的大小是双精度型的一半,因此单条指令可以处理的浮点数是双精度型的两倍。然而,令我惊讶的是,使用浮点数的速度是原来的三倍,而不是简单地增加了一倍。我怀疑,但不确定,这是因为浮点数更容易操作 - 实际的尾数提取等。
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |