2013-03-22 26 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