Nová optimalizácia funkcie memset() v glibc

Inžinier z Intelu, Noah Goldstein, optimalizoval funkciu memset() v knižnici glibc. Táto optimalizácia poskytuje nárast výkonu okolo 7.5% na desktopových verziách procesorov architektúry Skylake-X a Ice Lake. U serverových verzií je nárast výkonu o niečo nižší, predovšetkým kvôli nižšiemu celkovému výkonu jedného jadra.

V predchádzajúcej implementácii funkcie memset() sa používala assemblerová inštrukcia rep stosb. Do nedávna táto inštrukcia fungovala dostatočne rýchlo vďaka vnútropočítačovej optimalizácii zero-over-zero writeback. Avšak v tejto optimalizácii bola nájdená potenciálna zraniteľnosť, ktorá by mohla viesť k útoku cez bočný kanál. V dôsledku toho bola optimalizácia zero-over-zero writeback zrušená, čo viedlo k zhoršeniu výkonu inštrukcie rep stosb. V novej verzii memset() sa inštrukcia rep stosb stále používa, ale pri splnení prísnejších podmienok.

To, čo sa presne zmenilo, je možné pochopiť z nasledujúcej zmeny v komentári v kóde, ktorý popisuje podrobnosti implementácie memset()

Predchádzajúca verzia opisu:

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

Nová verzia opisu:

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

Zdroj: linux.org.ru

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster