0

从过去的一周开始,我正在研究 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 上测试了代码,结果相似。

4

0 回答 0