El ingeniero de Intel, Noah Goldstein, ha optimizado la función memset() en la biblioteca glibc. Esta optimización proporciona un aumento en el rendimiento de aproximadamente el 7.5% en las versiones de escritorio de los procesadores de las arquitecturas Skylake-X e Ice Lake. En las versiones de servidor, el aumento en el rendimiento es ligeramente menor, principalmente debido a la menor capacidad de rendimiento de un solo núcleo.
En la implementación anterior de la función memset() se utilizaba la instrucción ensambladora rep stosb. Hasta hace poco, esta instrucción funcionaba lo suficientemente rápido, gracias a la optimización interna del procesador zero-over-zero writeback. Sin embargo, se encontró una vulnerabilidad potencial en esta optimización que podría llevar a un ataque por canal lateral. Como resultado, se canceló la optimización zero-over-zero writeback, lo que llevó a un deterioro en el rendimiento de rep stosb. En la nueva versión de memset(), la instrucción rep stosb todavía se utiliza, pero bajo condiciones mucho más estrictas.
Lo que ha cambiado se puede entender a través de la modificación del siguiente comentario en el código, que describe los detalles de la implementación de memset()
Versión anterior de la descripción:
/* 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. */
Nueva versión de la descripción:
/* 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. */
Fuente: linux.org.ru
