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