模运算矢量化

时间:2013-09-24 10:16:18

标签: c intel vectorization

有一个周期:

 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- instructions)实现此循环?

如果我写:

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

然后速度不会增加:(

1 个答案:

答案 0 :(得分:2)

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

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

如果单精度就足够了,你可以通过使用单精度向量除法(DIVPS)获得一些提升,但你必须处理浮点舍入并注意确保你得到了预期的结果。使用Newton-Raphson的近似倒数指令(RCPPS)可能比使用DIVPS更快,但在设计中需要更加小心。