Kon*_*pov 1 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];
}
Run Code Online (Sandbox Code Playgroud)
我如何使用英特尔 C++ 矢量化功能(例如#pragma simd 或 sse- 指令)来实现此周期?
如果我写:
#pragma simd reduction(+:c)
for(int i = 0; i < 32; i ++){
d+= (a[i] % b[i])/c[i];
}
Run Code Online (Sandbox Code Playgroud)
那么速度不会增加:(
Intel 64 和 IA-32 架构没有向量化整数除法或余数/模指令,因此在使用整数算术时无法在硬件中向量化一般余数运算。
有一些浮点向量除法指令。在我检查过的处理器中,双精度除法 (DIVPD) 并未真正矢量化;它需要的时间是单精度除法的两倍,因此硬件通过串行使用一个除法器来实现它(甚至没有任何显着程度的流水线化)。
如果单精度就足够了,您可能可以通过使用单精度向量除法 (DIVPS) 获得一些提升,但您必须处理浮点舍入并注意确保获得所需的结果。将近似倒数指令 (RCPPS) 与 Newton-Raphson 结合使用可能比使用 DIVPS 更快,但在设计时需要更加小心。