Visual Studio中强制的CPU架构

时间:2015-08-31 12:56:53

标签: visual-studio-2010 assembly sse

在Visual Studio中(我使用2010年),您可以使用例如指定 CPU架构。的 /拱:SSE2

查看生成的汇编代码以进行简单的 sin(x)计算,它确实使用了SSE,但编译器还插入了运行时检查后备如果CPU不支持SSE,请使用 x87 指令。此运行时检查可能会非常频繁地执行,会降低性能

是否有任何标记或设置省略此运行时检查并使程序崩溃"非法指令"代替?

1 个答案:

答案 0 :(得分:3)

正如stgatilov所怀疑的那样,sin的实现是C运行时库的一部分,并且不受/arch选项的直接影响。但是,您可以使用几个选项来强制使用特定的实现。

如果将/fp:fast选项与/arch:SSE2标志一起使用,则将使用SSE特定的C运行时库函数。使用/fp:fast的缺点是生成的浮点代码变得不那么符合整个翻译单元,而不仅仅是对sin的调用。

另一个更有针对性的替代方法是/Qfast_transcendentals,这将使编译器始终内联x87 fsin指令。这样做的缺点是sin不符合要求,但只有sin和任何其他具有x87等效指令的超越函数可能正在使用。 fsin指令的一个值得注意的限制是它只适用于-2 ^ 63到+ 2 ^ 63范围内的源操作数。

我应该指出"运行时检查"对于SSE2 CPU支持具有不显着的性能影响。它只是一个比较和分支。由于比较总是以相同的方式解析,因此总是会正确预测分支,因此只需花费几个周期。与计算正弦的成本相比,这没什么。

最后,另一种可能的解决方案是升级您的编译器。默认情况下,使用sin时,Visual Studio 2015会调用/arch:SSE2的SSE2特定实现(这也是默认设置)。