Nouă optimizare a funcției memset() în glibc

Inginerul de la Intel, Noah Goldstein, a optimizat funcția memset() din biblioteca glibc. Această optimizare oferă un câștig de performanță de aproximativ 7,5% pe versiunile desktop ale procesoarelor din arhitecturile Skylake-X și Ice Lake. Pentru versiunile server, câștigul de performanță este ușor mai mic, în principal din cauza performanței generale mai reduse a unui singur nucleu.

În implementarea anterioară a funcției memset() a fost folosită instrucțiunea de asamblare rep stosb. Până de curând, această instrucțiune a funcționat suficient de repede, datorită optimizării interne zero-over-zero writeback. Totuși, în această optimizare a fost descoperită o potențială vulnerabilitate, care poate conduce la un atac prin canale laterale. Ca urmare, optimizarea zero-over-zero writeback a fost anulată, ceea ce a dus la o deteriorare a performanței rep stosb. În noua versiune a memset(), instrucțiunea rep stosb este folosită în continuare, dar sub condiții mai stricte.

Ceea ce s-a schimbat poate fi înțeles prin modificarea următorului comentariu din cod, care descrie detaliile implementării memset()

Versiunea anterioară a descrierii:

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

Noua versiune a descrierii:

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

Sursa: linux.org.ru

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster