Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么浮动的矢量化比双精度的矢量化更有效?_C++_C_Gcc_Openmp - Fatal编程技术网

C++ 为什么浮动的矢量化比双精度的矢量化更有效?

C++ 为什么浮动的矢量化比双精度的矢量化更有效?,c++,c,gcc,openmp,C++,C,Gcc,Openmp,我注意到,在C程序中对循环进行矢量化时,与双操作数相比,使用浮点型操作数实现的加速比要大得多 例如: for (int i = 0; i < N; i++) { a[i] += b[i] * c[i]; } for(int i=0;i

我注意到,在C程序中对循环进行矢量化时,与双操作数相比,使用浮点型操作数实现的加速比要大得多

例如:

for (int i = 0; i < N; i++) {
    a[i] += b[i] * c[i];
}    
for(int i=0;i
当a、b和c阵列的大小分别为20000和1000000时,我重复此循环:

  • 在没有矢量化的情况下,浮动和双浮动大约需要24秒

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

  • OpenMP(#pramga omp simd)与上述要点类似

    这可能是什么原因

编辑: 进一步资料:

  • 处理器:英特尔Core i7-2677M处理器@1.80GHz
  • 周围的代码只是数组分配(使用calloc)和一个循环,其中数组b和c用常量值填充

  • 随着这些操作的进行,SIMD(单指令多数据)指令开始发挥作用。浮点数是double的一半大小,因此在一条指令中可以处理的浮点数是double的两倍。然而,我感到惊讶的是,使用浮动的速度是原来的三倍,而不是一倍。我怀疑,但不确定,这是因为浮动更容易操作-实际尾数提取等。

    您是否尝试过使用
    -ffast math
    选项?这可能会产生其他副作用,您必须研究这些副作用(例如,精度的潜在损失)。

    什么处理器?它有哪些SIMD功能?它的性能特点是什么?最有可能的是,它的
    float
    SIMD指令对每条指令的元素数是它的
    double
    SIMD指令的两倍。记忆有多快?编译器是否知道
    a
    b
    c
    是否会重叠?谢谢。我补充了一些进一步的信息,恐怕我不知道如何找到所有问题的答案;i、 如果CPU花费90%的时间等待从RAM中获取两个值,那么CPU将两个值相乘的速度有多快无关紧要。一个双精度浮点数组是等效浮点数组的两倍大,因此可能需要从RAM中获取更多数据(而不是从CPU的本地缓存中已经存在所需的数据)。由20000个元素组成的三个
    float
    数组总共需要234kib,适合单核的二级数据缓存。三个
    double
    数组占用469kib,这不适合二级数据缓存。另外,使用
    float
    时,向量寄存器中有8个元素,而使用
    double
    将其减半,因此只能得到一半的触发器。谢谢您的建议。我只是在使用double时尝试了一下,在这种情况下,计算时间没有改变。它看起来是适用的,特别是“并非所有运算符都支持32位的部分,这意味着除非使用较小的操作数,否则某些源代码将无法矢量化。”我想我明白你的意思了,但是如果没有矢量化的应用,这难道不应该对计算时间产生重大影响吗?