Glibc 刪除了各種 SSSE3 優化的代碼路徑
最新的 GNU C Library (Glibc) 開發代碼已經開始丟棄各種 SSSE3 優化代碼路徑。其中包括刪除 mem{move| cpy }-ssse3-back、str{p}{n}cpy-ssse3、str{n}cat-ssse3、str{n}{case}cmp-ssse3 和 {w }memcmp-ssse3 代碼路徑。
根據介紹,Supplemental Streaming SIMD Extensions 3 (SSSE3) 可以追溯到十多年前的 Intel Xeon 5100 / Core 2 days 或 AMD Bobcat/Bulldozer,彼時的設想是作為 SSE 的一個迭代。但是由于 Glibc 也攜帶了與 SSSE3 差不多時間的舊版 SSE2 或 SSE4.1 的優化代碼路徑,加上用于較新的 Intel/AMD CPU 的 AVX2 和 EVEX 代碼路徑,SSSE3 代碼路徑正在被逐步淘汰。
考慮到 SSE2/SSE4.1/AVX2/EVEX 代碼路徑的存在,Glibc 開發人員認為不再值得提供 SSSE3 優化的代碼路徑;因為已經很少有 Intel/AMD CPU 留給 SSSE3 路徑,且在代碼中提供 SSSE3 支持需要的成本并不低。從上周開始,開發人員已經開始著手移除它。
圍繞 memmove/mempcpy/memcpy 的 SSSE3 代碼也有所減少。commit 內容解釋稱:
目標是刪除大多數 SSSE3 function,因為 SSE4、AVX2 和 EVEX 通常更可取。memcpy/memmove 是一個例外,對于某些目標來說,用`palignr`避免無符號負載很重要。
此 commit 用一個更好的優化和更低的代碼占用率的版本替換了 memmove-ssse3,同時它還將 memcpy 別名為 memmove。
除此之外,所有其他 SSSE3 functions 都應該可以安全刪除。性能并沒有發生太大變化,盡管顯示了整體改進而沒有任何重大的 regressions 或 gains。
- bench-memcpy geometric_mean(N=50) New / Original: 0.957
- bench-memcpy-random geometric_mean(N=50) New / Original: 0.912
- bench-memcpy-large geometric_mean(N=50) New / Original: 0.892
- Benchmarks where run on Zhaoxin KX-6840@2000MHz
完整的在 Zhaoxin KX-6840@2000MHz 上運行的基準測試結果可見附件。
更重要的是,此舉在 memmove 中節省了 7246 個字節的代碼大小,通過將 memmove 代碼重新用于 memcpy 又節省了10741個字節(總共節省了 17987 個字節)。還有一個額外的 896 字節的 jump table entries 的rodata。
Glibc 2.36 版本正在逐步淘汰相關的 SSSE3 代碼路徑。
本文轉自OSCHINA
本文標題:Glibc 刪除了各種 SSSE3 優化的代碼路徑
本文地址:https://www.oschina.net/news/191709/glibc-dropping-ssse3-paths