.NET中的SIMD
英文原文:SIMD Support in .NET
在 Mono 六年之后,微軟的 CLR 實現最終通過 RyuJIT 提供了對 SIMD 的支持。RyuJIT 目前仍處在社區預覽階段,它是下一代的 .NET JIT 編譯器。
SIMD 代表的是單指令流多數據流(Single Instruction,Multiple Data)。它是一組特殊的 CPU 指令集,其中的指令可以對包含在大小為2、4、8 或 16 的數組中的每個元素同時執行同一操作。在 2008 年 Mono 宣布對 SIMD 的支持時,我們曾報道過。
性能收益非常顯著。執行 Spring-Gravity 算法,原生 C++ 程序用了 9.5 秒。比較而言,將其逐行轉換到 Mono 中,執行用了 17.7 秒。而再將其從標準操作符轉換為 SIMD 函數,運行 Mono 的時間下降到 1.7 秒。
</blockquote>很明顯這種特性可以應用于游戲物理引擎和科學研究中,還可以應用于在一系列股票和基金上執行同樣計算的金融應用中。
在 .NET 中開啟 SIMD,不僅需要安裝 RyuJIT 并使用正確的向量類型。微軟的 Kevin Frei 列出了一些步驟:
- 下載并安裝 RyuJIT CTP3(同以前一樣,需要 x64 Windows 8.1 或 Window Server 2012R2)
- 設置“use RyuJIT”環境變量:set COMPLUS_AltJit=*
- 現在請注意,下面和以前有點區別了:
- 設置一個新的(而且是臨時的)“enable SIMD stuff”環境變量:set COMPLUS_FeatureSIMD=1
- 把 Microsoft.Bcl.Simd NuGet 包添加到你的項目中(必須選擇“include Prerelease”或使用–Pre 選項)
- 在 RyuJIT 最終配置好之前還有一些必須處理的麻煩事:對于你編寫的會使用新的 Vector 類型的方法,請將一個對 Microsoft.Numerics.Vectors.Vector<T>的引用添加到會在該方法調用之前調用的某個類的構造器中。我建議 就把它放在你的程序的入口類的類構造器中。它必須出現在類的構造器,而不是實例構造器中。
- 確保應用確實運行在 x64 上。如果沒有看到你的進程中加載了 protojit.dll(通過 tasklist /M protojit.dll 查看),那應該是遺漏了上面的某些東西。
</ol>應該注意的是,可用的 SIMD 不止一類。Kevin 寫道,
對那些想直接嘗試這一特性的人而言,我們可以快速地看一個細節:在 AVX 代碼應該會比 SSE2 更好的硬件上,我們打算(而且我們已經開發了原型)讓 Vector<T>自動使用 AVX SIMD 類型。然而要想正確處理,還需要對 .NET 運行時做些修改。因為這一限制(時間也不允許),CTP 版本只能支持 SSE2。
</blockquote>RyuJIT 本身主要是為改進應用在 64 位機器上的啟動時間而設計的。以前微軟假定消費者使用的是 x86,而 x64 僅被用于運行服務器的 IT 部門手中,所以啟動時間并不是很嚴重的問題。這使他們可以選擇面向 x86 的快速 JIT 編譯器,面向 x64 的則是慢一些、但更高效的 JIT 編譯器。快進了大約十年,情況已經發生了變化。
2013 年 9 月的 .NET 框架博客上曾經介紹:
.NET 代碼生成團隊一直在為一個新的下一代 x64 編譯器而努力工作,該編譯器代號為 RyuJIT。這一新的 JIT 編譯器是原來的兩倍快,使用它編譯的應用,啟動時間最多可以減少 30%(花在 JIT 編譯器上的時間只是啟動時間的一部分,所以應用啟動時間并不會隨著 JIT 性能加倍而減半)。此外,新的 JIT 編譯器仍然會生成極好的代碼,可以在服務器進程長期運行的過程中高效執行。
</blockquote>來自: InfoQ<span id="shareA4" class="fl"> </span>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!