从过去的一周开始,我正在研究 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 开关的测试代码 ==> 速度是 1X。
2) 没有矢量化编译/Arch:SSE2
==> 速度是 10X。
3) 成功自动矢量化所有代码, /Arch:SSE2
==> 速度为 10.5X
第二个副本只是通过启用 SSE2 指令集进行编译,代码根本没有向量化。仅使用 SSE2 开关,性能如何提高 10 倍?没有任何矢量化
注意:我在 Intel I3 上进行了 4 GB 内存和 windows 7 32 位操作系统的测试,我也在 64 位 windows 上测试了代码,结果相似。