-Ïîèñê ïî äíåâíèêó

Ïîèñê ñîîáùåíèé â rss_rss_linux_org_ru

 -Ïîäïèñêà ïî e-mail

 

 -Ïîñòîÿííûå ÷èòàòåëè

 -Ñòàòèñòèêà

Ñòàòèñòèêà LiveInternet.ru: ïîêàçàíî êîëè÷åñòâî õèòîâ è ïîñåòèòåëåé
Ñîçäàí: 24.08.2007
Çàïèñåé: 8221
Êîììåíòàðèåâ: 1
Íàïèñàíî: 1


Íîâàÿ îïòèìèçàöèÿ ôóíêöèè memset() â glibc

Âîñêðåñåíüå, 02 Èþíÿ 2024 ã. 14:46 + â öèòàòíèê

Èíæåíåð èç 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.  */

, , ,

https://www.linux.org.ru/news/gnu/17635504


 

Äîáàâèòü êîììåíòàðèé:
Òåêñò êîììåíòàðèÿ: ñìàéëèêè

Ïðîâåðêà îðôîãðàôèè: (íàéòè îøèáêè)

Ïðèêðåïèòü êàðòèíêó:

 Ïåðåâîäèòü URL â ññûëêó
 Ïîäïèñàòüñÿ íà êîììåíòàðèè
 Ïîäïèñàòü êàðòèíêó