在 Visual Studio 中实施 CPU 架构

Enforced CPU architecture in Visual Studio

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

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

是否有任何标志或设置可以忽略此 运行 时间检查 并让程序崩溃 "illegal instruction"?

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

如果您使用带有 /arch:SSE2 标志的 /fp:fast 选项,则将使用 SSE 特定的 C 运行时库函数。使用 /fp:fast 的缺点是生成的浮点代码对整个翻译单元的一致性降低,而不仅仅是对 sin.

的调用

另一个更有针对性的替代方案是/Qfast_transcendentals,这将导致编译器始终内联x87 fsin 指令。这样做的缺点是 sin 不太符合,但只有 sin 和任何其他具有您可能正在使用的 x87 等效指令的先验函数。 fsin 指令的一个显着限制是它仅适用于 −2^63 到 +2^63 范围内的源操作数。

我应该指出,但是 "runtime check" 对 SSE2 CPU 的支持对性能影响不大。这只是一个比较和分支。由于比较将始终以相同的方式解决,分支将始终被正确预测,因此只会花费几个周期。与计算正弦的成本相比,这不算什么。

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