Software engineering deep level optimization - I deo

Nedavno sam se vratio na tehnologiju software-skog inženjerstva (u pravom smislu te reči, pošto i Kendo UI, i slične stvari stavljaju u isti koš, pa i to smatraju inženjeringom - NE!) koju sam ranije radio i imao dosta iskustva sa istim, te se proteklih dana prisećam nekih stvari. Odlučio sam da napišem nekolicinu blog postova o takozvanoj deep level optimizaciji i šta zapravo ista nosi sa sobom kao jednoj od najtežiš grana softwareskog inženjerstva.

Deep level optimizacija je tehnika opitimizovanja software-a kako bi se postigli što bolji rezultati po pitanju brzine izvršavanja i maksimalnog iskorišćenja potencijala mikroprocesora kao i računarskog sistema. Samim tim ovo znači da pored Any CPU/x86 buildovanja software-a, kako bi se isti mogao izvršavati na bilo kom PC računarskom sistemu, bez obzira da li je AMD CPU, Intel CPU ili bilo koji drugi mikroprocesor namenjen za PC tržište, postoji i nešto drugo. To drugo zahteva razumevanje više stvari, arhitekturu mikroprocesora, kako se isti proizvode, razumevanje programskih jezika, kompajlera i na koji način se deep level optimizacija radi. Morate imati jasan koncept deep level optimizacije ukoliko radite ovakve stvari jer se ova grana softwareskog inženjerstva bazira na čitanju i razumevanju specifikacije/dokumentacije proizvođača mikroprocesora i kompajlera. Sam postupak rada je samim tim složen, jer tehničke informacije ovoga tipa nije moguće držati u glavi napamet već se morate snalaziti sa ozbiljnom tehničkom dokumentacijom kako bi se postigao željeni nivo deep level optmizacije. Ovo je samo uvod, ali ići ću polako kako bih dočarao o čemu se radi, naravno kada uhvatim slobodno vreme za isto.

Uvodne reči o mikroprocesorima

Proizvođač mikroprocesora procesor namenjuje za određeno tržište, recimo PC računari, i samim tim to znači da isti mora biti izrađen po standardu x86 seta instrukcija (sve iz seta instrukcija koliko ih ima) kako bi isti mogao da izvršava PC software koji se buildovao sa Any CPU/x86 target platformom. Ovde je bitno da se razume koncept. Proizvođač procesora na standardni set PC instrukcija propisane standardom, često zna da doda svoje ekstenzije kao što su MMX, XMM, SSE itd. radi poboljšanja performansi računarskog sistema, te se istim setovima instrukcija zapravo bore kako bi dobili primat na tržištu. Ali ovde leži jedno veliko ALI!. Često sam slušao, u situacijama kada ljudi kupuju računar i gledaju koji mikroprocesor da pazare, govore sledeće: "e ovaj ima SSE2 a čitao sam u magazinu namenjenom PC računarima da je to set instrukcija koji poboljšava brzinu obrade podataka". Da to je tačno, ali ako software koji izvršavate nije DEEP LEVEL optimizovan za SSE2 već je rađen build na Any CPU target platformu to znači da SSE2 instrukcije procesora, kojeg ste kupili isključivo hvataju prašinu u okviru istog i nikada se neće primeniti. SSE2, MMX ili bilo koje instrukcije EKSTENZIJE koje nisu standardizovane (mada se i one vremenom proglašavaju standardom, to znači da AMD nema potrebu da ima iste instrukcije koje ima Intel osim naravno standardnih koje moraju da imaju svi procesori za PC tržište) će se izvšavati AKO I SAMO AKO JE SOFTWARE PISAN DA SE KORISTI SSE2, MMX, XMM i NIKAD VIŠE. Ako se u okviru vašeg software-a koristi SSE2 može se reći automatski da je vaš software DEEP LEVEL optimizovan i da isti niste pisali isključivo za standardni set PC instrukcija ili ti Any CPU kako to developeri znaju da kažu. Znači, nemojte previše da gledate set instrukcija kada kupujete novi mikroprocesor je vi zapravo ne znate koji je software deep level optimizovan osim ukoliko proizvođač istog ne navede na web sajtu prodaje da jeste, radi reklame.

Uvodne reči o programskim jezicima / kompajleri

Programski jezik je slovo na papiru koje se standardizuje tj. proglase ga standardom. Programski jezik se implementira kroz kompajler, pri čemu isti može da generiše binarije za više target platformi. Ako kompajler koji ste odabrali da koristite nema podršku za deep level optimizaciju u smislu kompajlerskih naredbi/direktiva (koje nemaju veze sa programskim jezikom već se to isključivo odnosi na kompajler) džaba što vaš procesor ima SSE2 kada kompajler ima ograničenje samo na x86/Any CPU. Kao što sam već napisao, radi se o dosta složenoj tehnici optimizacije software-a, gde jasno morate da znate za koje procesore je namenjen vaš software jer može da se desi da radi na AMD-u (zato što su inženjeri tako odlučili) ali nikako na Intelu i obrnuto. Jedan primer deep level opzimizacije jeste SQL Server DB Engine kao i game engine-i koji se koriste za 3D igre itd. Ovo je samo uvodni deo o programskim jezicima i kompajlerima, neke tekstove sam i ranije pisao ali obzirom da sam se vratio što se tiče posla na neke stare stvari, dosta sam razmišljao o ovome, te da napišem isto u nekoliko blog postova.

CPU Z

CPU Z je dobro poznat programčić koji vam daje info o resursima računarskog sistema i mikroprocesora kojeg imate u okviru vašeg računara. CPU Z naime ispod haube koristi mikroprocesorsku instrukciju koja se zove CPU ID i koja kada se izvrši vrati sve detalje o mikroprocesoru. CPU ID je ključ deep level optimizacije i to je prva stvar koja se izvšava kada je software deep level optimizovan. Ideja je da se proveri prvo šta od instrukcija ima mikroprocesor. Recimo, da je ustanovljeno, analizom da je najbolja optimizacija korišćenjem SSE3 instrukcija, ali vi ne znate da li svaki procesor ima implementiran SSE3 obzirom da su to ekstenzije. CPU ID instrukcija vaća informaciju o tome. Primera radi recimo da je SSE3 target instrukcijski set za najbolje performanse software-a. CPU ID vrati info, vi sa x86/Any CPU proverite da li ima implementiran SSE3, ako ima setujete fleg koji vas vodi na switch da se koristi kod koji je pisan sa SSE3 setom instrukcija. Ako CPU ID vrati da imate MMX ali nemate SSE3, ali vi znate analizom da MMX opet daje bolje rezultate od x86 seta, u tom slučaju setujete fleg da gađa MMX switch case koji je implementiran MMX-om. Ako CPU ID vrati da CPU nema ni SSE3 ni MMX onda to znači da se setuje fleg koji gađa x86/AnyCPU granu izvšavanja. Sve tri grane impelentiraju isti algoritam obrade podataka ali je razlika u tome što je implementacija odrađena drugačijim setom instrukcija. Ovo se radi kako bi se obezbedilo da software radi na bilo kom PC procesoru koji implementira Intel x86 standard ali ako imamo SSE3 a isto daje najbolje performanse onda ćemo ipak izvšavati SSE3 granu. Dole je naveden pseudo kod kako deep level optimizacija započinje.

Ovo je primer CPU procesora kojeg imam u desktop računaru sa setovima instrukcija koje podržava



Pseudo kod:

Pročitaj CPU ID.

Setuje fleg = MMX

SWITCH(fleg)
{
     CASE SSE3:
         kod pisan SSE3 instrukcijama
     CASE MMX:
         kod pisan MMX instrukcijama
     CASE x86 (default / Any CPU):
         kod pisan standardnim setom instrukcija koje moraju da se izvršavaju na svakom procesoru
}

Sva tri switch case-a implementiraju isti algoritam obrade podataka, osim što je razlika u implemntaciji praćena drugačijim setom instrukcija.

Nekada se dešava da jednostavno proizvođač software-a navede da vam isključivo treba procesor sa SSE3 instrukcijama. Ako CPU ID vrati da CPU nema implementiran SSE3 set dobićete Message Box sa porukom da procesor nije dovoljno dobar da izvršava software i da morate da imate isti sa podrškom SSE3 seta. Kao što sam naveo, nema potrebe da se bavite time, ako ste standardni korisnik PC računara, koje instrukcije ima procesor koji hoćete da kupite, jer mnogi imaju instrukcije koje Intel uvodi a za koje ne postoji ni podrška kroz kompajler da se koriste a kamoli da je bilo šta optimizovano za isto, te možete i uštedeti. U većini slučajeva to je marketing gde se standarni koristnik informiše da će mu računar brže raditi a zapravo ništa od toga neće biti korišćeno jer software nije optimizovan za isto ili kompajler uopšte nema podršku za isto. Tako da imamo više situacija, Intel izbaci novi set ekstenzije instrukcija implemnetira ih za isto, ali proizvođači kompajlera nemaju podršku za isto, te samim tim ni software nije optimizovan za isto. Tek kada kompajler doda podršku za dati set, developeri inženjeri mogu da koriste isto radi potrebe optimizovanja software-a. O svemu više reči u blogovima koji selde kada uhvatim vreme za isto.

Autor:
Vladimir Savić
zilsel-invent



Comments

Popular posts from this blog

Electrolytic capacitors and design rules

Fake VC830L digital multimeter

How to design LM324 Astable Multivibrator