c++如何编写代码编译器可以轻松地优化用于单指令?
-
26-09-2019 - |
题
我正在Visual Studio2008年和在项目设置我看到的选择"激活长指示设置"我可以定为"无"、SSE或SSE2
因此编译器会试图批说明一起,以便使用单指令的指令?
是否有任何规则可以遵循在如何优化这样的代码,编译器可以使effiecient汇编使用这些扩展?
例如,目前我工作的一个光线跟踪.着色器需要某些输入以及计算从输入输出色,像这样:
PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y);
Color col = shadePixel(data);
它将例如是有益的写shadercode这样,这将树荫下4种不同的素内的一个指令的电话?事情是这样的:
PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y);
...
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out);
处理多个dataunits一次。这将有利于使编译器使用证的指示?
谢谢!
其他提示
三点意见。
最好加速未来优化,但是从 好的算法.所以确保你得到的那部分权第一。通常这意味着仅仅使用正确的图书馆为你的特定领域。
一旦你得到你的算法权利是时候 测量.经常有80/20规则的工作。20%的代码将把80%的执行时间。但为了找到那部分你需要一个良好的分析器。 英特尔的摄像头 可以给你抽样简介,从每一个功能和很好的报告,查明能杀手。另一个替代方案是免费的 AMD CodeAnalyst 如果你有一个AMD CPU。
编译器,自动向量化得到能力不是一种"银弹"。尽管它会尝试真的很难(特别是 英特尔C++)你将经常需要的帮助,它通过改写的算法中的矢量形式。你可以经常获得更好的结果,通过手工制作的一小部分瓶颈代码使用单指令的指令。你可以这样做,在C码(见VJo的链接上)使用内部函数或者使用内联件。
当然部分2和3的形式一个迭代的过程。如果你是很严重的关于这个然后有一些很好的关于这一主题的书籍,通过英特尔的人如 该软件的优化本食谱 与处理参考手册。
,编译器是不是所有的强大的,它有一定的局限性。如果可以(如果右旗传递给它),它会使用SSE指令。看看它做的唯一的方法是检查由编译器生成的汇编代码。
另一种选择是用C SSE / SSE2指令。对于windows,你可以在这里找到它们:
http://msdn.microsoft.com/ EN-US /库/ y0dh78ez%28VS.80%29.aspx