从过去的一周开始,我正在研究SSE指令和自动矢量化。我有用C编写的代码,其中包含长时间运行的循环,在非常大的图像上执行插值。下面是骨架代码。
void Interpolate()
{
for (unsigned int y = 0; y < dstRegionHeight; ++y)
{
//Some code to access pixel from bitmap structure.
for (unsigned int x = 0; x < dstRegionWidth; ++x)
{
//Some code to access pixel from bitmap structure.
for (register unsigned int i = 0; i < 4; ++i)
{
//Interpolation arithmetic
}
}
}
}
我编写了上面的代码,以便VS 2015成功自动矢量化,但我在矢量化后没有得到任何性能差异。 (由于上述代码的内存访问模式和较少的算术,这是预期的。) 我创建了上面代码的3组编译副本,并测试了相同数据的执行速度。以下是结果。
1)没有矢量化且没有SSE开关的测试代码==&gt;速度是1X
2)没有使用/Arch:SSE2
编译矢量化==&gt;速度是10X
3)成功自动向量化所有代码并/Arch:SSE2
==&gt;速度为10.5X
第二个副本只是通过启用SSE2指令集进行编译,代码根本无法进行矢量化。 仅使用SSE2交换机,性能如何提高10倍?没有任何矢量化
注意:我在Intel I3上用4 GB ram和windows 7 32位OS进行了测试,我还在64位窗口上测试了代码,结果很相似。