我正在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一次。这将有利于使编译器使用证的指示?

谢谢!

有帮助吗?

解决方案

  

我现在在Visual Studio 2008中,并在项目设置我看到选项“启用扩展指令集”,我可以设置为无,SSE SSE2或工作

     

因此,编译器将尝试批量指令结合,以使使用SIMD指令?

没有,编译器不会对自己使用向量指令。它将使用标量SSE指令代替的x87的。

你描述的被称为“自动向量化”。微软编译器不这样做,英特尔编译做。

在微软编译器可以使用内在以执行手动SSE优化

其他提示

三点意见。

  1. 最好加速未来优化,但是从 好的算法.所以确保你得到的那部分权第一。通常这意味着仅仅使用正确的图书馆为你的特定领域。

  2. 一旦你得到你的算法权利是时候 测量.经常有80/20规则的工作。20%的代码将把80%的执行时间。但为了找到那部分你需要一个良好的分析器。 英特尔的摄像头 可以给你抽样简介,从每一个功能和很好的报告,查明能杀手。另一个替代方案是免费的 AMD CodeAnalyst 如果你有一个AMD CPU。

  3. 编译器,自动向量化得到能力不是一种"银弹"。尽管它会尝试真的很难(特别是 英特尔C++)你将经常需要的帮助,它通过改写的算法中的矢量形式。你可以经常获得更好的结果,通过手工制作的一小部分瓶颈代码使用单指令的指令。你可以这样做,在C码(见VJo的链接上)使用内部函数或者使用内联件。

当然部分2和3的形式一个迭代的过程。如果你是很严重的关于这个然后有一些很好的关于这一主题的书籍,通过英特尔的人如 该软件的优化本食谱 与处理参考手册。

,编译器是不是所有的强大的,它有一定的局限性。如果可以(如果右旗传递给它),它会使用SSE指令。看看它做的唯一的方法是检查由编译器生成的汇编代码。

另一种选择是用C SSE / SSE2指令。对于windows,你可以在这里找到它们:

http://msdn.microsoft.com/ EN-US /库/ y0dh78ez%28VS.80%29.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top