Ny optimering av funktionen memset() i glibc

Ingenjören från Intel, Noah Goldstein, har optimerat memset()-funktionen i glibc-biblioteket. Denna optimering ger en prestandaökning på cirka 7,5 % på skrivbordsversioner av processorer med Skylake-X och Ice Lake-arkitektur. För serverversionerna är prestandaökningen något lägre, främst på grund av den lägre totala prestandan hos enskilda kärnor.

I den tidigare implementeringen av memset()-funktionen användes assemblerinstruktionen rep stosb. Fram till nyligen fungerade denna instruktion tillräckligt snabbt tack vare processorns interna optimering zero-over-zero writeback. Men denna optimering visade sig ha en potentiell sårbarhet som kan leda till en sidokanalsattack. Som ett resultat av detta avbröts optimeringen zero-over-zero writeback, vilket ledde till försämrad prestanda för rep stosb. I den nya versionen av memset() används instruktionen rep stosb fortfarande, men under striktare villkor.

Vad som exakt har ändrats kan förstås genom att titta på den följande kommentaren i koden som beskriver detaljerna i implementationsmetoden för memset()

Den tidigare versionen av beskrivningen:

/* 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. */

Den nya versionen av beskrivningen:

/* 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. */

Källa: linux.org.ru

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster