Inżynier z Intelem, Noah Goldstein, zoptymalizował funkcję memset() w bibliotece glibc. Ta optymalizacja daje wzrost wydajności na poziomie 7,5% w wersjach desktopowych procesorów architektur Skylake-X i Ice Lake. W przypadku wersji serwerowych wzrost wydajności jest nieco niższy, przede wszystkim z powodu niższej ogólnej wydajności pojedynczego rdzenia.
W poprzedniej implementacji funkcji memset() używana była instrukcja assemblerowa rep stosb. Do niedawna instrukcja ta działała wystarczająco szybko dzięki wewnętrznej optymalizacji zero-over-zero writeback. Jednak w tej optymalizacji odkryto potencjalną lukę, która może prowadzić do ataku bocznego kanału. W rezultacie optymalizacja zero-over-zero writeback została wycofana, co spowodowało pogorszenie wydajności rep stosb. W nowej wersji memset() instrukcja rep stosb nadal jest używana, ale w bardziej rygorystycznych warunkach.
Co dokładnie zmieniło się, można zrozumieć po zmianie następującego komentarza w kodzie, który opisuje szczegóły implementacji memset()
Poprzednia wersja 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. */
Nowa wersja 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. */
Źródło: linux.org.ru
