Нова оптимизация на функцията memset() в glibc

Инженер от 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster