Predložili su da se u Linux kernel uključi do 4 puta brža implementacija memchr-a

nedavno objavljen je prijedlog za Linux kernel, u koji se predlaže uključivanje skupa zakrpa s a optimizirana implementacija funkcije memchr(). koristi se za traženje znaka u nizu.

Funkcija memchr() skenira vodećih n bajtova memorijskog područja na koje ukazuje s za prvu instancu c. I c i bajtovi u memorijskom području na koje ukazuje s tumače se kao nepredpisani znakovi.

Prijedlog obećanja biti brži locirati znak unutar bloka memorije. U testovima razvojnih programera, nova implementacija može biti gotovo četiri puta brža pri velikim pretraživanjima

Za razliku od prethodne verzije, koja je koristila usporedbu bajt po bajt, predložena implementacija stvorena je uzimajući u obzir punu upotrebu 64-bitnih i 32-bitnih CPU registara. Umjesto bajtova, usporedba se vrši korištenjem strojnih riječi, što omogućuje usporedbu najmanje 4 bajta odjednom.

Ova serija zakrpa optimizirala je "memchr()" i dodala makro za
"memchr_inv()" tako da ga obje funkcije mogu koristiti za generiranje bitmaske.

Izvorna implementacija "memchr()" temelji se na usporedbi bajtova,
koji ne koristi u potpunosti 64 ili 32 bitni registar u CPU-u. Implementiramo a
usporedba po riječima tako da se barem 4 bajta mogu usporediti s istom
vrijeme. Optimizirani memchr() gotovo je 4 puta brži od originala
za duge lance. U Linux kernelu nalazimo da je duljina niza
pretraživan pomoću "memchr()" je do 512 bajtova u drivers/misc/lkdtm/heap.c.

Prilikom pretraživanja na velikim nizovima, pokazalo se da je nova verzija oko 4 puta brža od stare (na primjer, za nizove od 1000 znakova). Za male lance učinkovitost nove implementacije nije tako značajna, ali je još uvijek veća od izvorne verzije.

Zanimljivost novog prijedloga je poboljšanje za velike lance, što znatno popravlja vremena. Vrijedno je spomenuti da u Linux kernelu, veličina nizova obrađenih u memchr() doseže 512 bajtova. U našim testovima, dobitak performansi za nizove od 512 bajta, u situaciji kada znak za pretraživanje je na kraju niza, to je 20%.

Vrijedno je spomenuti da je originalna verzija memchr() implementirana tehnikom usporedbe po bajtovima, koja ne koristi u potpunosti registre na 64-bitnom ili 32-bitnom CPU-u.

Koristimo usporedbu cijele riječi tako da se 8 znakova može usporediti u isto vrijeme na CPU-u. Ovaj se kôd temelji na implementaciji Davida Lighta.

Stvaramo dvije datoteke za mjerenje performansi prve datoteke koji sadrži prosječno 10 znakova ispred odredišnog znaka. Druga datoteka sadrži najmanje 1000 znakova prije ciljni lik.

Naša implementacija "memchr()" je malo bolji na prvom testu i gotovo 4 puta brži od originala implementacija u drugom testu.

Testiranje kernela 5.18 s novom varijantom "memchr()" za 32-bitnu i 64-bitnu arhitekturu nije otkrio nikakve probleme.

Što se događa ako p nije poravnat s 8 (ili 4 na 32-bitnim ciljevima) bajta? Ne podržavaju svi ciljevi neusklađena (učinkovita) opterećenja, zar ne?
 Mislim da radi ako p nije poravnat s 8 ili 4 bajta. Recimo da niz ima 10 bajtova. Ovdje će for petlja tražiti prvih 8 bajtova. Ako je odredišni znak u zadnja 2 bajta, druga for petlja će ga pronaći. Također radi ovako na 32-bitnim strojevima.

Ukupni dobitak izvedbe još nije procijenjen podsustava jezgre pri korištenju optimizirane varijante "memchr()", niti se raspravlja o tome hoće li se nadjačati implementacija (poziv funkcije memchr() pojavljuje se 129 puta u kodu jezgre, uključujući upravljačke programe i sustave datoteka).

Konačno Ako vas zanima više o tome, možete provjeriti detalje U sljedećem linku.


Ostavite svoj komentar

Vaša email adresa neće biti objavljen. Obavezna polja su označena s *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obvezi.
  5. Pohrana podataka: Baza podataka koju hostira Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.