Glibc 刪除了各種 SSSE3 優化的程式碼路徑

2022-04-18 09:00:12

最新的 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 程式碼也有所減少。 內容解釋稱:

目標是刪除大多數 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 程式碼路徑。 

展開閱讀全文