Nad tegid ettepaneku lisada Linuxi kernelisse rakendus, mis on memchr-ist kuni 4 korda kiirem

Hiljuti avaldati Linuxi kerneli ettepanek, millesse tehakse ettepanek lisada plaastrite komplekt a funktsiooni memchr() optimeeritud rakendamine kasutatakse massiivist märgi otsimiseks.

Funktsioon memchr() skannib c esimese eksemplari puhul mälupiirkonna eesmisi n baiti, millele osutab s. Nii c kui ka mälualal olevaid baite, millele s osutab, tõlgendatakse märgita märkidena.

Ettepanek lubadusi ole kiirem tegelase asukoha leidmiseks mäluplokis. Arendajatestides võib uus juurutus olla suurte otsingute korral peaaegu neli korda kiirem

Erinevalt eelmisest versioonist, kus kasutati bait-bait-võrdlust, kavandatud teostus luuakse, võttes arvesse 64-bitiste ja 32-bitiste protsessoriregistrite täielikku kasutamist. Baitide asemel toimub võrdlemine masinsõnade abil, mis võimaldab võrrelda korraga vähemalt 4 baiti.

See plaastrite seeria optimeeris "memchr()" ja lisas selle jaoks makro
"memchr_inv()", et mõlemad funktsioonid saaksid seda kasutada bitmaski genereerimiseks.

"memchr()" algne teostus põhineb baitide võrdlusel,
mis ei kasuta täielikult CPU 64- või 32-bitist registrit. Rakendame a
sõnade järgi võrdlemine, et samaga saaks võrrelda vähemalt 4 baiti
ilm. Optimeeritud memchr() on peaaegu 4 korda kiirem kui originaal
pikkade kettide jaoks. Linuxi tuumas leiame, et stringi pikkus
mida otsitakse "memchr()" abil, on failis drivers/misc/lkdtm/heap.c kuni 512 baiti.

Kui otsite suurte stringide järgi, uus versioon osutus umbes 4 korda kiiremaks kui vana (näiteks 1000 tähemärgi pikkuste stringide puhul). Väikeste kettide puhul ei ole uue teostuse efektiivsus nii märkimisväärne, kuid see on siiski kõrgem kui algsel versioonil.

Uue ettepaneku huvitav on suurte kettide täiustamine, mis parandab oluliselt aega. Tasub mainida, et Linuxi tuumas memchr()-s töödeldavate stringide suurus ulatub 512 baiti. Meie testides on 512-baidiste stringide jõudluse kasv olukorras, kus otsingumärk on stringi lõpus, on see 20%.

Tasub mainida, et memchr() algversioon on realiseeritud baidipõhise võrdluse tehnikaga, mis ei kasuta täielikult 64- või 32-bitise protsessori registreid.

Kasutame tervete sõnade võrdlust, et protsessoris saaks korraga võrrelda 8 tähemärki. See kood põhineb David Lighti teostusel.

Esimese faili jõudluse mõõtmiseks loome kaks faili mis sisaldab keskmiselt 10 tähemärki sihtmärgist ees. Teine fail sisaldab vähemalt 1000 tähemärki enne sihtmärk.

Meie "memchr()" rakendamine on veidi parem esimesel katsel ja peaaegu 4 korda kiirem kui originaal rakendamine teises testis.

Kernel 5.18 testimine uue "memchr()" variandiga 32- ja 64-bitiste arhitektuuride jaoks probleeme ei paljastanud.

Mis juhtub, kui p ei ole 8 (või 4-bitiste sihtmärkide puhul 32) baiti joondatud? Mitte kõik sihtmärgid ei toeta joondamata (tõhusaid) koormusi, eks?
 Ma arvan, et see töötab, kui p ei ole joondatud 8 või 4 baiti. Oletame, et string on 10 baiti. Siin olev for-silmus otsib esimesed 8 baiti. Kui sihtmärk on viimase kahe baidi sees, leiab selle teine ​​tsükkel. See töötab nii ka 2-bitistes masinates.

Üldist jõudluse kasvu pole veel hinnatud kerneli alamsüsteemidest optimeeritud "memchr()" variandi kasutamisel, samuti pole arutatud, kas rakendust alistada (funktsiooni kutse memchr() esineb kerneli koodis 129 korda, sealhulgas draiverid ja failisüsteemid).

Lõpuks Kui soovite sellest rohkem teada saada, saate üksikasju kontrollida Järgmisel lingil.


Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutab: Miguel Ángel Gatón
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.