Neue Optimierung der memset()-Funktion in glibc

Der Ingenieur von Intel, Noah Goldstein, hat die Funktion memset() in der glibc-Bibliothek optimiert. Diese Optimierung bietet eine Leistungssteigerung von etwa 7,5 % auf Desktop-Versionen der Skylake-X- und Ice-Lake-Prozessorarchitekturen. Bei den Serverversionen ist die Leistungssteigerung etwas geringer, hauptsächlich aufgrund der niedrigeren Gesamtleistung eines einzelnen Kerns.

In der vorherigen Implementierung der Funktion memset() wurde die Assemblersprache-Anweisung rep stosb verwendet. Bis vor kurzem arbeitete diese Anweisung aufgrund der internen Prozessoptimierung für Zero-over-Zero-Writeback recht schnell. Allerdings wurde in dieser Optimierung eine potenzielle Schwachstelle gefunden, die zu einem Seitenkanalangriff führen könnte. Infolgedessen wurde die Optimierung für Zero-over-Zero-Writeback aufgehoben, was zu einer Verringerung 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 geändert wurde, kann man anhand des folgenden Kommentars im Code erkennen, der die Details der Implementierung von memset() beschreibt.

Vorherige Version der 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 Version der 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

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Servern 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Servern | ProHoster