Der Ingenieur von Intel, Noah Goldstein, hat die Funktion memset() in der glibc-Bibliothek optimiert. Diese Optimierung bringt einen Leistungsschub von etwa 7,5 % bei Desktop-Versionen der Skylake-X- und Ice-Lake-Prozessorarchitekturen. Bei den Serverversionen ist der Leistungsspielraum etwas geringer, hauptsächlich aufgrund der insgesamt niedrigeren Einzelkernleistung.
In der vorherigen Implementierung der Funktion memset() wurde die Assemblieranweisung rep stosb verwendet. Bis vor kurzem arbeitete diese Anweisung recht schnell, dank der intra-Prozessor-Optimierung zero-over-zero writeback. Allerdings wurde in dieser Optimierung eine potenzielle Schwachstelle gefunden, die zu einem Seitenkanalangriff führen kann. Infolgedessen wurde die Optimierung zero-over-zero writeback zurückgenommen, was zu einer Verschlechterung der Leistung von rep stosb führte. In der neuen Version von memset() wird die Anweisung rep stosb weiterhin verwendet, jedoch unter strengeren Bedingungen.
Was genau sich geändert hat, lässt sich anhand der folgenden Kommentaranpassung im Code erkennen, die die Details der Implementierung von memset() beschreibt.
Frühere Beschreibung:
/* 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. */
Neue Beschreibung:
/* 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. */
Quelle: linux.org.ru
