Intel'i insener Noah Goldstein optimeeris memset() funktsiooni glibc teegis. See optimeerimine annab umbes 7,5% jõudluse kasvu Skylake-X ja Ice Lake arhitektuuri lauaarvutite versioonides. Serveriversioonide jõudluse kasv on veidi madalam, eelkõige üksiktuuma üldise madalama jõudluse tõttu.
Varasem versioon memset() funktsioonist kasutas assemblerikäsu rep stosb. Siiani töötas see käsk piisavalt kiirelt tänu protsessori seesamise optimeerimisele zero-over-zero writeback. Siiski leiti sellest optimeerimisest potentsiaalne haavatavus, mis võib viia kõrvalkanali rünnakuni. Seetõttu tühistati zero-over-zero writeback optimeerimine, mis põhjustas rep stosb jõudluse halvenemist. Uue versiooniga memset() kasutatakse rep stosb käsku endiselt, kuid selle täitmine toimub rangemate tingimuste alusel.
Mida täpselt muudetud on, saab aru koodis oleva järgmise kommentaari muutmisest, mis kirjeldab memset() rakendamise üksikasju.
Varasem kirjeldus:
/* 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. */
Uus kirjeldus:
/* 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. */
Allikas: linux.org.ru
