Viņi ierosināja iekļaut Linux kodolā ieviešanu, kas ir līdz pat 4 reizēm ātrāka par memchr

Nesen tika izlaists priekšlikums par Linux kodolu, kurā ir ierosināts iekļaut ielāpu komplektu ar a optimizēta funkcijas memchr() ieviešana izmanto, lai meklētu rakstzīmi masīvā.

Funkcija memchr () skenē atmiņas apgabala galvenos n baitus, uz kuriem norāda s, pirmajai c instancei. Gan c, gan baiti atmiņas apgabalā, uz kuriem norāda s, tiek interpretēti kā neparakstītas rakstzīmes.

Priekšlikums sola esi ātrāks lai atmiņas blokā atrastu rakstzīmi. Izstrādātāju testos jaunā ieviešana var būt gandrīz četras reizes ātrāka lielos meklējumos

Atšķirībā no iepriekšējās versijas, kurā tika izmantots salīdzinājums pa baitiem, piedāvātā ieviešana ir izveidota, ņemot vērā 64 bitu un 32 bitu CPU reģistru pilnu izmantošanu. Baitu vietā salīdzināšana tiek veikta, izmantojot mašīnvārdus, kas ļauj vienā reizē salīdzināt vismaz 4 baitus.

Šī ielāpu sērija optimizēja "memchr()" un pievienoja makro
"memchr_inv()", lai abas funkcijas to varētu izmantot bitmaskas ģenerēšanai.

Sākotnējā "memchr()" ieviešana ir balstīta uz baitu salīdzinājumu,
kas pilnībā neizmanto 64 vai 32 bitu reģistru CPU. Mēs īstenojam a
salīdzinājums ar vārdiem, lai vismaz 4 baitus varētu salīdzināt ar to pašu
laikapstākļi. Optimizētais memchr () ir gandrīz 4 reizes ātrāks nekā oriģināls
garajām ķēdēm. Linux kodolā mēs atklājam, ka virknes garums
meklētais ar "memchr()" ir līdz 512 baitiem mapē drivers/misc/lkdtm/heap.c.

Meklējot lielās virknēs, jaunā versija izrādījās apmēram 4 reizes ātrāka nekā vecā (piemēram, 1000 rakstzīmju virknēm). Mazām ķēdēm jaunās ieviešanas efektivitāte nav tik nozīmīga, taču tā joprojām ir augstāka nekā sākotnējā versija.

Jaunajā priekšlikumā interesanti ir lielo ķēžu uzlabojumi, kas ievērojami uzlabo laiku. Ir vērts pieminēt, ka Linux kodolā, memchr() apstrādāto virkņu izmērs sasniedz 512 baitus. Mūsu testos veiktspējas pieaugums 512 baitu virknēm situācijā, kad meklēšanas rakstzīme ir virknes beigās, tas ir 20%.

Ir vērts pieminēt, ka sākotnējā memchr () versija ir ieviesta ar baitu salīdzināšanas paņēmienu, kas pilnībā neizmanto 64 bitu vai 32 bitu CPU reģistrus.

Mēs izmantojam visu vārdu salīdzināšanu, lai CPU vienlaicīgi varētu salīdzināt 8 rakstzīmes. Šis kods ir balstīts uz David Light ieviešanu.

Mēs izveidojam divus failus, lai novērtētu pirmā faila veiktspēju kas satur vidēji 10 rakstzīmes pirms mērķa rakstzīmes. Otrajā failā ir vismaz 1000 rakstzīmes pirms mērķa raksturs.

Mūsu "memchr()" ieviešana ir neliela labāk pirmajā testā un gandrīz 4 reizes ātrāk nekā oriģināls īstenošana otrajā testā.

Kodola 5.18 testēšana ar jaunu "memchr()" variantu 32 bitu un 64 bitu arhitektūrām neatklāja nekādas problēmas.

Kas notiek, ja p nav izlīdzināts ar 8 (vai 4 uz 32 bitu mērķiem) baitu? Ne visi mērķi atbalsta nesaskaņotas (efektīvas) slodzes, vai ne?
 Es domāju, ka tas darbojas, ja p nav izlīdzināts ar 8 vai 4 baitiem. Pieņemsim, ka virkne ir 10 baiti. For cilpa šeit meklēs pirmos 8 baitus. Ja mērķa rakstzīme atrodas pēdējos 2 baitos, otrā for cilpa to atradīs. Tas darbojas šādi arī 32 bitu iekārtās.

Kopējais veiktspējas pieaugums vēl nav novērtēts no kodola apakšsistēmām, izmantojot optimizēto "memchr()" variantu, kā arī nav apspriests, vai ignorēt ieviešanu (funkcijas memchr() izsaukums kodola kodā notiek 129 reizes, ieskaitot draiverus un failu sistēmas).

Beidzot Ja jūs interesē uzzināt vairāk par to, jūs varat pārbaudīt informāciju Šajā saitē.


Atstājiet savu komentāru

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti ar *

*

*

  1. Atbildīgais par datiem: Migels Ángels Gatóns
  2. Datu mērķis: SPAM kontrole, komentāru pārvaldība.
  3. Legitimācija: jūsu piekrišana
  4. Datu paziņošana: Dati netiks paziņoti trešām personām, izņemot juridiskus pienākumus.
  5. Datu glabāšana: datu bāze, ko mitina Occentus Networks (ES)
  6. Tiesības: jebkurā laikā varat ierobežot, atjaunot un dzēst savu informāciju.