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

问题描述 投票:4回答:2

[我注意到,当对C程序中的循环进行矢量化处理时,与使用double操作数相比,使用float类型的操作数所实现的加速要大得多。

示例:

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

[当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用常量值填充。
c++ c gcc openmp
2个回答
1
投票

通过许多这些操作,SIMD(单指令,多个数据)指令开始起作用。浮点数是双精度浮点数的一半,因此在单个指令中可以处理两倍的浮点数。但是,令我惊讶的是使用浮点数的速度是三倍,而不是简单的两倍。我怀疑,但不确定,这是因为浮子更容易操作-实际的尾数提取等。


0
投票

您是否尝试过使用-ffast-math选项?这可能会影响您需要考虑的其他副作用(例如,潜在的精度损失)。

© www.soinside.com 2019 - 2024. All rights reserved.