遊戲開發者有福了:VS2019優化了浮點操作

漫漫開發路 發佈 2020-03-02T19:15:21+00:00

在VisualStudio 2019 v16.5版本中,我們改進了SSA優化器,用來檢測可以使用AVX2指令的使用場景,並且改進了有關向量操作的常量傳播,其中包括shuffle操作。但是,由於在FMA常量傳播原始實現中有一些排序的問題,Shuffle操作阻止了FMA的常量傳播。

為什麼浮點優化這麼重要?

為了藉助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操作。這意味著一個標準化一個向量的平方根反轉在編譯期可以被優化為一個常量,如果輸入在編譯期是可知的話。如下圖所示:

總結

浮點操作優化對於遊戲開發者來說,是一個很好的機會,誰不想玩一個爽爽的遊戲呢?

另外,我不玩遊戲。

關鍵字: