c ++如何编写代码编译器可以轻松优化SIMD?

Mat*_*Mat 7 c++ compiler-construction simd

我在Visual Studio 2008中工作,在项目设置中,我看到"激活扩展指令集"的选项,我可以将其设置为None,SSE或SSE2

那么编译器会尝试将指令一起批处理以便使用SIMD指令吗?

是否有任何规则可以遵循如何优化代码,以便编译器可以使用这些扩展使高效的汇编程序?

例如,目前我正在研究光线跟踪器.着色器接受一些输入并从输入计算输出颜色,如下所示:

PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y);
Color col = shadePixel(data);
Run Code Online (Sandbox Code Playgroud)

例如,编写着色器代码是否有利于它会在一个指令调用中遮蔽4个不同的像素?这样的事情:

PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y);
...
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out);
Run Code Online (Sandbox Code Playgroud)

一次处理多个数据单元.这有利于使编译器使用SSE指令吗?

谢谢!

Sum*_*uma 5

我在Visual Studio 2008中工作,在项目设置中,我看到"激活扩展指令集"的选项,我可以将其设置为None,SSE或SSE2

那么编译器会尝试将指令一起批处理以便使用SIMD指令吗?

不,编译器不会自己使用向量指令.它将使用标量SSE指令而不是x87指令.

您描述的内容称为"自动矢量化".英特尔编译器会这样做,微软编译器不这样做.

在Microsoft编译器上,您可以使用内在函数来执行手动SSE优化.

  • 这个答案当然对VS 2008完全有效,但值得注意的是,MS Visual Studio到目前为止支持VS 2012的自动矢量化. (3认同)