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