Nieuwe optimalisatie van de memset() functie in glibc

Een ingenieur van Intel, Noah Goldstein, heeft de memset()-functie in de glibc-bibliotheek geoptimaliseerd. Deze optimalisatie zorgt voor een prestatieverbetering van ongeveer 7,5% op desktopversies van processors met Skylake-X en Ice Lake-architecturen. Voor serverversies is de prestatieverbetering iets lager, vooral vanwege de lagere algehele prestaties van een enkel core.

In de eerdere implementatie van de memset()-functie werd de assemblerinstructie rep stosb gebruikt. Tot voor kort werkte deze instructie behoorlijk snel, dankzij de intra-processor optimalisatie zero-over-zero writeback. Echter, in deze optimalisatie werd een potentiƫle kwetsbaarheid gevonden, die kan leiden tot een side-channel aanval. Als gevolg hiervan werd de optimalisatie zero-over-zero writeback ingetrokken, wat leidde tot een verslechtering van de prestaties van rep stosb. In de nieuwe versie van memset() wordt de instructie rep stosb nog steeds gebruikt, maar onder strengere voorwaarden.

Wat er precies veranderd is, kan worden begrepen aan de hand van de wijziging in de volgende opmerking in de code, die de details van de memset()-implementatie beschrijft.

Eerdere versie van de beschrijving:

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

Nieuwe versie van de beschrijving:

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

Bron: linux.org.ru

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster