Ei au propus să includă în nucleul Linux o implementare de până la 4 ori mai rapidă a memchr

recent a fost lansată o propunere pentru nucleul Linux, în care se propune includerea unui set de plasturi cu a implementare optimizată a funcției memchr(). folosit pentru a căuta un caracter într-o matrice.

Funcția memchr() scanează primii n octeți din zona de memorie indicată de s pentru prima instanță a lui c. Atât c, cât și octeții din zona de memorie indicată de s sunt interpretați ca caractere fără semn.

Propunerea promite fii mai rapid pentru a localiza un personaj într-un bloc de memorie. În testele pentru dezvoltatori, noua implementare poate fi de aproape patru ori mai rapidă la căutări mari

Spre deosebire de versiunea anterioară, care folosea o comparație octet cu octet, implementarea propusă este creată ținând cont de utilizarea deplină a registrelor CPU pe 64 și 32 de biți. În loc de octeți, comparația se face folosind cuvinte mașină, ceea ce permite compararea a cel puțin 4 octeți la un moment dat.

Această serie de patch-uri a optimizat „memchr()” și a adăugat o macrocomandă pentru
„memchr_inv()”, astfel încât ambele funcții să îl poată folosi pentru a genera o mască de biți.

Implementarea originală a „memchr()” se bazează pe compararea octeților,
care nu folosește pe deplin registrul de 64 sau 32 de biți din CPU. Implementăm a
comparație prin cuvinte, astfel încât cel puțin 4 octeți să poată fi comparați cu același
vreme. Memchr() optimizat este de aproape 4 ori mai rapid decât originalul
pentru lanțuri lungi. În Linux Kernel, constatăm că lungimea șirului
căutat de „memchr()” are până la 512 octeți în drivers/misc/lkdtm/heap.c.

Când căutați pe șiruri mari, noua versiune s-a dovedit a fi de aproximativ 4 ori mai rapidă decât cea veche (de exemplu, pentru șiruri de 1000 de caractere). Pentru lanțurile mici, eficiența noii implementări nu este la fel de semnificativă, dar este totuși mai mare decât versiunea originală.

Lucrul interesant la noua propunere este îmbunătățirea pentru lanțurile mari, care îmbunătățește timpii considerabil. Este demn de menționat că în nucleul Linux, dimensiunea șirurilor procesate în memchr() ajunge la 512 octeți. În testele noastre, câștigul de performanță pentru șiruri de 512 octeți, într-o situație în care caracterul de căutare este la sfârșitul șirului, este de 20%.

Merită menționat faptul că versiunea originală a memchr() este implementată cu tehnica de comparare în funcție de octeți, care nu utilizează pe deplin registrele de pe CPU pe 64 de biți sau 32 de biți.

Folosim compararea cuvintelor întregi, astfel încât 8 caractere să poată fi comparate în același timp pe CPU. Acest cod se bazează pe implementarea lui David Light.

Creăm două fișiere pentru a măsura performanța primului fișier care conține în medie 10 caractere înaintea caracterului de destinație. Al doilea fișier conține cel puțin 1000 de caractere înainte de caracterul țintă.

Implementarea noastră a „memchr()” este ușor mai bun la primul test și de aproape 4 ori mai rapid decât originalul implementare în al doilea test.

Testare Kernel 5.18 cu noua variantă „memchr()” pentru arhitecturi pe 32 și 64 de biți nu a dezvăluit nicio problemă.

Ce se întâmplă dacă p nu este aliniat pe 8 (sau 4 pe ținte de 32 de biți) octeți? Nu toate țintele acceptă sarcini nealiniate (eficiente), nu?
 Cred că funcționează dacă p nu este aliniat pe 8 sau 4 octeți. Să presupunem că șirul are 10 octeți. Bucla for de aici va căuta primii 8 octeți. Dacă caracterul destinație se află în ultimii 2 octeți, a doua buclă for îl va găsi. Funcționează astfel și pe mașinile pe 32 de biți.

Câștigul general de performanță nu a fost încă evaluat a subsistemelor kernel atunci când se folosește varianta optimizată „memchr()” și nici nu s-a discutat dacă să se suprascrie implementarea (apelul funcției memchr() are loc de 129 de ori în codul kernelului, inclusiv driverele și sistemele de fișiere).

În cele din urmă Dacă sunteți interesat să aflați mai multe despre asta, puteți verifica detaliile În următorul link.


Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.