Новая оптимизация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ memset() Π² glibc

Π˜Π½ΠΆΠ΅Π½Π΅Ρ€ ΠΈΠ· Intel, Ноах Π“ΠΎΠ»Π΄ΡˆΡ‚Π΅ΠΉΠ½, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ memset() Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ glibc. Данная оптимизация Π΄Π°Ρ‘Ρ‚ прирост Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ порядка 7.5% Π½Π° дСсктопных вСрсиях процСссоров Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ Skylake-X ΠΈ Ice Lake. Π£ сСрвСрных вСрсий прирост Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ΅, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго ΠΈΠ·-Π·Π° Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠΉ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ ядра.

Π’ ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ memset() использовалась ассСмблСрная инструкция rep stosb. Π”ΠΎ Π½Π΅Π΄Π°Π²Π½Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ эта инструкция Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° достаточно быстро, Π·Π° счёт внутрипроцСссорной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ zero-over-zero writeback. Однако Π² этой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Ρ‹Π»Π° Π½Π°ΠΉΠ΄Π΅Π½Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ, которая ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π°Ρ‚Π°ΠΊΠ΅ ΠΏΠΎ ΠΏΠΎΠ±ΠΎΡ‡Π½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ. Π’ Ρ€Π΅Π·Π°Π»ΡŒΡ‚Π°Ρ‚Π΅ оптимизация zero-over-zero writeback Π±Ρ‹Π»Π° ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½Π°, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ ΡƒΡ…ΡƒΠ΄ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ rep stosb. Π’ Π½ΠΎΠ²ΠΎΠΉ вСрсии memset() инструкция rep stosb всё Π΅Ρ‰Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ строгих условий.

Π§Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ измСнилось ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΠΎ измСнСнию ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ коммСнтария Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт подробности Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ memset()

ΠŸΡ€Π΅ΠΆΠ½ΡΡ вСрсия описания:

/* memset is implemented as: 1. Use overlapping store to avoid branch. 2. If size is less than VEC, use integer register stores. 3. If size is from VEC_SIZE to 2 * VEC_SIZE, use 2 VEC stores. 4. If size is from 2 * VEC_SIZE to 4 * VEC_SIZE, use 4 VEC stores. 5. On machines ERMS feature, if size is greater or equal than __x86_rep_stosb_threshold then REP STOSB will be used. 6. If size is more to 4 * VEC_SIZE, align to 4 * VEC_SIZE with 4 VEC stores and store 4 * VEC at a time until done. */

Новая вСрсия описания:

/* memset is implemented as: 1. Use overlapping store to avoid branch. 2. If size is less than VEC, use integer register stores. 3. If size is from VEC_SIZE to 2 * VEC_SIZE, use 2 VEC stores. 4. If size is from 2 * VEC_SIZE to 4 * VEC_SIZE, use 4 VEC stores. 5. If size is more to 4 * VEC_SIZE, align to 1 * VEC_SIZE with 4 VEC stores and store 4 * VEC at a time until done. 6. On machines ERMS feature, if size is range [__x86_rep_stosb_threshold, __x86_memset_non_temporal_threshold) then REP STOSB will be used. 7. If size >= __x86_memset_non_temporal_threshold, use a non-temporal stores. */

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: linux.org.ru