ΠΠ½ΠΆΠ΅Π½Π΅Ρ ΠΎΡ 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
