【问题标题】:Vectorize short to float conversion?向量化短到浮点转换?
【发布时间】:2013-03-22 04:08:08
【问题描述】:

我试图理解为什么 Visual Studio 2012 (x64) 不想将转换从 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 (!!!)

【问题讨论】:

  • 一种方法是使用SSE4.1转换short -> int。然后使用int -> float 转换内在函数。

标签: c++ visual-studio-2012 vectorization


【解决方案1】:

this page 看来,您的“循环包含不可矢量化的转换操作(可能是隐式的)”。您是否尝试过先转换为与float 宽度相同的类型(例如int)?

有关更具体的原因,请参阅here。显然,在 SSE 中没有直接的方法将由 short 向量组成的 SSE 寄存器转换为浮点向量,但是有一条指令可以将 32 位整数转换为浮点数。

【讨论】:

  • 使用诸如int foo = D[j]-B[j] 之类的中间体似乎并没有帮助。我想我可能需要把我所有的短裤都换成花车了。
  • 你应该在减法之前转换成整数,而不是之后。这样,减法本身可以写成整数上的向量运算,然后被向量化。另外,你不需要把所有的短裤都换成花车;只需将它们更改为整数即可。
猜你喜欢
  • 2019-09-09
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2023-03-17
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
相关资源
最近更新 更多