Íîâàÿ îïòèìèçàöèÿ ôóíêöèè memset() â glibc |
Èíæåíåð èç Intel, Íîàõ Ãîëäøòåéí, îïòèìèçèðîâàë ôóíêöèþ memset() â áèáëèîòåêå glibc. Äàííàÿ îïòèìèçàöèÿ äà¸ò ïðèðîñò â ïðîèçâîäèòåëüíîñòè ïîðÿäêà 7.5% íà äåñêòîïíûõ âåðñèÿõ ïðîöåññîðîâ àðõèòåêòóð Skylake-X è Ice Lake. Ó ñåðâåðíûõ âåðñèé ïðèðîñò â ïðîèçâîäèòåëüíîñòè íåìíîãî íèæå, ïðåæäå âñåãî èç-çà áîëåå íèçêîé îáùåé ïðîèçâîäèòåëüíîñòè îäèíî÷íîãî ÿäðà.
 ïðåæíåé ðåàëèçàöèè ôóíêöèè memset() èñïîëüçîâàëàñü àññåìáëåðíàÿ èíñòðóêöèÿ rep stosb. Äî íåäàâíåãî âðåìåíè ýòà èíñòðóêöèÿ ðàáîòàëà äîñòàòî÷íî áûñòðî, çà ñ÷¸ò âíóòðèïðîöåññîðíîé îïòèìèçàöèè zero-over-zero writeback. Îäíàêî â ýòîé îïòèìèçàöèè áûëà íàéäåíà ïîòåíöèàëüíàÿ óÿçâèìîñòü, êîòîðàÿ ìîæåò ïðèâåñòè ê àòàêå ïî ïîáî÷íîìó êàíàëó.  ðåçóëüòàòå îïòèìèçàöèÿ zero-over-zero writeback áûëà îòìåíåíà, ÷òî è ïðèâåëî ê óõóäøåíèþ ïðîèçâîäèòåëüíîñòè rep stosb.  íîâîé âåðñèè memset() èíñòðóêöèÿ rep stosb âñ¸ åù¸ èñïîëüçóåòñÿ, íî ïðè âûïîëíåíèè áîëåå ñòðîãèõ óñëîâèé.
×òî èìåííî èçìåíèëîñü, ìîæíî ïîíÿòü ïî èçìåíåíèþ ñëåäóþùåãî êîììåíòàðèÿ â êîäå, êîòîðûé îïèñûâàåò ïîäðîáíîñòè ðåàëèçàöèè memset()
Ïðåæíÿÿ âåðñèÿ îïèñàíèÿ:
/* 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. */
Íîâàÿ âåðñèÿ îïèñàíèÿ:
/* 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. */
| Êîììåíòèðîâàòü | « Ïðåä. çàïèñü — Ê äíåâíèêó — Ñëåä. çàïèñü » | Ñòðàíèöû: [1] [Íîâûå] |