2013-03-22 24 views
4

我試圖理解爲什麼的Visual Studio 2012(64)不希望矢量從short轉換到float。有沒有人有理由或解決方法?矢量化短浮動轉換?

//unsigned short* __restrict A,B,C,D  
for (int j = 0; j < H*W;j++) 
{ 
    float Gs = D[j]-B[j]; 
    float Gc = A[j]-C[j]; 
    in[j]=atan2f(Gs,Gc); 
} 

信息C5002:循環不矢量由於原因 '1101' 使用的短褲,而不是向量化

解決方案

運行時間約爲800ms

運行時轉換爲所有整數和自動矢量化大約是140ms(!!!)

+2

一種方法是使用SSE4.1轉換'short' - >'int'。然後使用'int' - >'float'轉換內在。 – Mysticial 2013-03-22 04:21:15

回答

2

this page,似乎你的「環路含有非矢量化轉換操作(可以是隱含的)」。您已嘗試第一轉換的類型是相同的寬度爲float(如int)?

對於更具體的原因,見here。顯然,有在SSE沒有直接的方法來轉換的SSE寄存器由短褲到浮子的一個矢量的矢量,然而存在着32位整數轉換成浮點數的指令。

+1

使用中間體如'INT富= d [J] -B [j]的'似乎並沒有幫助它沿着。我想我可能需要將所有短褲改爲漂浮物。 – Mikhail 2013-03-22 04:17:51

+0

你應該在減法之前投下整數,而不是之後。這樣,減法本身可以寫成整數的矢量運算,然後進行矢量化。此外,你不應該需要將所有的短褲改爲浮動;只需將它們更改爲整數。 – 2013-03-22 04:19:08