Nová optimalizace funkce memset() v glibc

Inženýr z Intelu, Noah Goldstein, optimalizoval funkci memset() v knihovně glibc. Tato optimalizace přináší zlepšení výkonu asi o 7,5 % na desktopových verzích procesorů architektur Skylake-X a Ice Lake. U serverových verzí je zlepšení výkonu o něco menší, a to především kvůli nižšímu celkovému výkonu jednotlivého jádra.

Ve staré implementaci funkce memset() byla použita assemblerová instrukce rep stosb. Až do nedávné doby tato instrukce fungovala dostatečně rychle díky vnitroprocesorové optimalizaci zero-over-zero writeback. Nicméně v této optimalizaci byla nalezena potenciální zranitelnost, která může vést k útoku přes boční kanál. V důsledku toho byla optimalizace zero-over-zero writeback zrušena, což vedlo k zhoršení výkonu rep stosb. V nové verzi memset() se instrukce rep stosb stále používá, ale za splnění přísnějších podmínek.

Co se přesně změnilo, lze pochopit podle změny následujícího komentáře v kódu, který popisuje podrobnosti implementace memset()

Předchozí verze popisu:

/* 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á verze popisu:

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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster