致游戏开发者:VS2019对浮点操作的性能改进

致游戏开发者:VS2019对浮点操作的性能改进

作者:BlogUpdater |  时间:2020-03-02 |  浏览:2274 |  评论已关闭 条评论

为什么浮点优化这么重要?
为了借助AVX2指令集来优化浮点操作,Visual Studio 2019开发团队一直在努力地工作。下面我们将会简单介绍我们目前已经完成的工作和在Visual Studio v16.5版本中的一些功能改进。

浮点操作的速度直接影响到游戏的帧率。新一代的x86和x64处理器已经添加了FMA(Fused Multiply Add)指令集,用来优化和并行化浮点操作。从Visual Studio 2019开始,编译器将会执行更加激进的浮点优化措施,具体来说,就是当使用了[/fp:fast]编译开关时,编译器将会在适合的情况下使用新的浮点指令并对这些指令执行常量传播[constant propagation]。

在Visual Studio 2019 v16.2版本中,我们改进了向量化浮点操作的启发机制,并且我们将一些浮点操作可以被缩减为一个常量。在之前的一篇有关游戏性能优化的文章中,描述了上面描述的优化的细节信息。

在Visual Studio 2019 v16.5版本中,我们改进了SSA优化器,用来检测可以使用AVX2指令的使用场景,并且改进了有关向量操作的常量传播,其中包括shuffle操作。

下面的所有例子程序,都是编译为x64平台并使用到了[/arch:AVX2 /O2 /fp:fast /c /Fa]编译开关。

乘法的常量传播
从Visual Studio 2019 v16.2开始,如果初始化向量在编译器是可以预知的情况下,一些浮点向量操作可以被缩减为一个常量。下面是一个平方根反转的函数:

从Visual Studio v16.2开始,函数[ReturnInvSqrt]可以被优化为一个常量,如下图所示:

Shuffle的常量传播
另外一个常用的向量操作的是创建一个标准形式的向量,这样这个向量的长度为1。一个向量的长度是它的数量积的平方根。计算数量积的最简单的方法是使用Shuffle操作。

即使是在Visual Studio v16.0中,优化器都可以通过Shuffle操作来进行常量传播优化。但是,由于在FMA常量传播原始实现中有一些排序的问题,Shuffle操作阻止了FMA的常量传播。

从Visual Studio v16.5开始,常量传播可以同时处理Shuffle操作和FMA操作。这意味着一个标准化一个向量的平方根反转在编译期可以被优化为一个常量,如果输入在编译期是可知的话。
如下图所示:

总结
浮点操作优化对于游戏开发者来说,是一个很好的机会,谁不想玩一个爽爽的游戏呢?
另外,我不玩游戏。

标签:

评论已关闭。