En ingeniør fra Intel, Noah Goldstein, har optimeret memset()-funktionen i glibc-biblioteket. Denne optimering giver en præstationsforøgelse på omkring 7,5% på desktop-versionerne af Skylake-X og Ice Lake-processorarkitekturerne. For serverversionerne er præstationsforøgelsen lidt lavere, primært på grund af den lavere samlede ydelse pr. kerne.
I den tidligere implementering af memset()-funktionen blev assembler-instruktionen rep stosb brugt. Indtil for nylig fungerede denne instruktion hurtigt på grund af den interne processoroptimering zero-over-zero writeback. Dog blev der fundet en potentiel sårbarhed i denne optimering, som kan føre til en sidekanalsangreb. Som et resultat blev optimeringen zero-over-zero writeback annulleret, hvilket førte til en forringelse af præstationen af rep stosb. I den nye version af memset() anvendes instruktionen rep stosb stadig, men under strengere betingelser.
Hvad der præcist er ændret kan forstås ved at se på ændringen i den følgende kommentar i koden, som beskriver detaljer om implementeringen af memset()
Den tidligere version af beskrivelsen:
/* 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. */
Den nye version af beskrivelsen:
/* 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. */
Kilde: linux.org.ru
