2013-09-24 83 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更快,但在設計中需要更多的關注。