Un ingénieur d'Intel, Noah Goldstein, a optimisé la fonction memset() dans la bibliothèque glibc. Cette optimisation offre un gain de performance d'environ 7,5 % sur les versions de bureau des processeurs des architectures Skylake-X et Ice Lake. Pour les versions serveurs, le gain de performance est légèrement inférieur, principalement en raison de la performance globale plus faible d'un seul cœur.
Dans l'ancienne implémentation de la fonction memset(), l'instruction assembleur rep stosb était utilisée. Jusqu'à récemment, cette instruction fonctionnait assez rapidement, grâce à l'optimisation intra-processeur zero-over-zero writeback. Cependant, une vulnérabilité potentielle a été identifiée dans cette optimisation, pouvant conduire à une attaque par canal auxiliaire. En conséquence, l'optimisation zero-over-zero writeback a été annulée, ce qui a entraîné une dégradation des performances de rep stosb. Dans la nouvelle version de memset(), l'instruction rep stosb est toujours utilisée, mais avec des conditions d'exécution plus strictes.
Ce qui a changé peut être compris par la modification du commentaire suivant dans le code, qui décrit les détails de l'implémentation de memset()
Ancienne version de la description :
/* 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. */
Nouvelle version de la description :
/* 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. */
Source : linux.org.ru
