2013-09-24 66 views
0

有一个周期:模运算矢量

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++ vectoriation能力(例如SIMD的#pragma或sse-指令)这个周期?

如果我写:

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

然后速度不增加:(

+1

你为什么要将结果转换为“double”? – us2012

+0

该代码不会编译。也许你的意思是'(双)(a [i]%b [i])'? – interjay

+0

@ us2012:这个结果必须是双倍的。示例更正了示例。 –

回答

1

英特尔64和IA-32体系结构不具有量化整数除法或余数/模数指令,所以有没有办法在使用整数运算的时候在硬件中矢量化一般的余数操作

有一些浮点向量除法指令双精度除法(DIVPD)在我检查的处理器中没有真正的向量化,它需要两倍长作为一个单精度分频器,所以硬件通过串行使用一个分频器来实现它(甚至不需要对任何重要程度进行流水线处理)。

如果单精度足够了,您可能能够通过使用单精度矢量分频(DIVPS)获得一些提升,但是您必须处理浮点舍入并注意确保获得所需的值结果。在Newton-Raphson中使用近似互惠指令(RCPPS)可能比使用DIVPS更快,但在设计中需要更多的关注。