這就是我對 SIMD 的了解。單指令多資料是一種處理資料的方法,它在多個值的向量上執行相同的指令。SIMD 根據機器的處理器(SSE、SSE2、NEON...)在不同的級別實作,并且每個級別提供不同的指令集。
我們可以通過包含immintrin.h. 我還沒有真正理解的是:在實際使用 SIMD 開發某些東西時,我們是否應該關心檢查支持哪些指令集?開發此類程式時的最佳實踐是什么?例如,如果不支持指令集,我們應該怎么做;我們應該提供非 SIMD 替代方案還是編譯器為我們取消向量化整個程序?
uj5u.com熱心網友回復:
當然,我們需要注意支持哪種 ISA,因為如果我們使用未知指令,那么程式將被不支持的指令信號殺死。此外,它允許我們針對每種架構進行優化,例如在帶有 AVX-512 的 CPU 上,我們可以使用 AVX-512 以獲得更好的性能,但是如果在較舊的 CPU 上,那么我們可以回退到該架構的適當版本
開發此類程式時的最佳實踐是什么?
沒有通用的最佳實踐。這取決于每種情況,因為每個編譯器對此都有不同的工具
- 如果您的編譯器不支持動態調度,那么您需要為每個 ISA 撰寫單獨的代碼并呼叫當前平臺的相應版本
- 一些編譯器會自動分派到針對運行平臺優化的版本,例如 ICC 可以編譯一個熱回圈來分離 SSE/AVX/AVX-512 的版本,并跳轉到正確的版本以獲得最佳性能。
- 其他一些編譯器支持編譯為單個函式的單獨版本并自動分派,但您需要指定要優化的函式。例如在 GCC、Clang 和 ICC 中,您可以使用屬性
target和target_clones. 請參閱使用更新的 CPU 指令支持構建向后兼容的二進制檔案
uj5u.com熱心網友回復:
我們應該關心檢查支持哪些指令集嗎?
通常是的,但并非總是如此。如果您為 PC 編譯 64 位代碼,則保證有 SSE1 和 SSE2,這兩個是 AMD64 指令集的一部分,保證得到支持。
開發此類程式時的最佳實踐是什么?
與人們協商您正在開發的軟體的最低硬體要求。如果您沒有老板、客戶或用戶,請查找一些統計資料并嘗試做出有根據的猜測。Steam為安裝了軟體的PC 游戲玩家提供了一個很好的統計資料,展開“其他設定”,您將看到具有特定指令集的全球用戶百分比。
就我個人而言,我認為現在在 2021 年通常可以要求 SSE 達到并包括 SSE 4.1,如果不支持則在啟動時失敗。假設您優雅地這樣做,即在硬體要求中寫入該內容,并在運行時向最終用戶顯示有關不受支持的 CPU 的可理解錯誤訊息。
我們是否應該提供非 SIMD 替代方案
過去十年中銷售的 99% 的新計算機至少具有 4GB 記憶體和 64 位作業系統。我認為對于大多數專案來說,只提供 64 位二進制文??件是可以的,這給了你 SSE 1 和 2,不需要標量替代品。
有時,當我需要支持僅 SSE 的 CPU 但 AVX 在性能方面帶來太多利潤時,我確實實作了幾個替代方案和運行時調度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386841.html
