C - 模运算矢量化



有一个循环:

 long a* = new long[32];
 long b* = new long[32];
 double c* = new double[32];
 double d = 3.14159268;
  //set a, b and c arrays
  //.....
  for(int i = 0; i < 32; i ++){
    d+= (a[i] % b[i])/c[i];
  }

如何使用英特尔C++矢量化功能(例如 #pragma SIMD 或 SSE 指令)实现此循环?

如果我写:

  #pragma simd reduction(+:c)
  for(int i = 0; i < 32; i ++){
    d+= (a[i] % b[i])/c[i];
  }

那么速度不会增加:(

Intel 64 和 IA-32 架构没有矢量化整数除法或余数/模指令,因此在使用整数算术时无法对硬件中的一般余数运算进行矢量化。

有一些浮点向量除法指令。双精度除法 (DIVPD) 在我检查的处理器中没有真正矢量化;它花费的时间是单精度除法的两倍,因此硬件通过串行使用一个除法器来实现它(甚至没有流水线到任何显着程度)。

如果单精度

就足够了,您可能能够从使用单精度矢量除法 (DIVPS) 中获得一些提升,但您必须处理浮点舍入并注意确保获得所需的结果。使用牛顿-拉夫森近似倒易指令(RCPPS)可能比使用DIPPS更快,但在设计中需要更加小心。

最新更新