Új optimalizálás a memset() funkcióhoz a glibc-ben

Az Intel mérnöke, Noah Goldstein, optimalizálta a memset() függvényt a glibc könyvtárban. Ez az optimalizálás körülbelül 7,5%-os teljesítménynövekedést biztosít a Skylake-X és Ice Lake architektúrájú asztali processzorok esetében. A szerververziók esetében a teljesítménynövekedés valamivel alacsonyabb, főként az egyes magok összteljesítményének alacsony volta miatt.

A memset() függvény korábbi megvalósításában az rep stosb assembler utasítást használták. Eddig ez az utasítás elég gyorsan működött, a processzoron belüli zero-over-zero writeback optimalizáció révén. Azonban ebben az optimalizációban potenciális sebezhetőséget fedeztek fel, amely oldalsó csatornás támadásra vezethetett. Ennek következtében a zero-over-zero writeback optimalizálás megszűnt, ami a rep stosb teljesítményének csökkenését eredményezte. Az új memset() verzióban az rep stosb utasítást továbbra is használják, de szigorúbb feltételek mellett.

Hogy pontosan mi változott, azt a következő kommentár kódváltozásából érthetjük meg, amely a memset() megvalósításának részleteit írja le.

A korábbi verzió leírása:

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

Az új verzió leírása:

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

Forrás: linux.org.ru

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster