“We are drowning in information but starved for knowledge.” – John Naisbitt
Astazi debuteaza o noua sectiune a site-ului nostru, o sectiune bazata strict pe dialog. Vom incerca sa abordam subiecte cat se poate de interesante sau actuale, si aceasta impreuna cu voci din IT (si nu numai), oameni implicati si cu o mare experienta in domeniul in care activeaza, oameni pasionati de la care mereu putem afla ceva nou, interesant si util. Pentru primele articole l-am invitat la o discutie informala pe Mihai Voicu, actualmente specialist in software development & integration dar cu radacini adanci si in administrarea retelelor si a sistemelor Linux.
Techtorials: Mihai, pentru primele noastre intalniri, ne-am gandit sa acoperim putin domeniul hardware (privit mai ales prin ochii unui software developer) si dezvoltarea sa actuala. In episoade viitoare vom continua cu o discutie asupra starii actualei piete de software precum si a viitorului software-ului asa cum se intrezareste el acum. Dar intai, spune-ne putin despre tine si activitatea ta actuala.
Mihai: Salut. Ma numesc Mihai Voicu, si actualmente sunt angajat al unei firme care produce software utilizat de operatori de telefonie.
Pot spune ca programez de 14 ani (din liceu), chiar daca am lucrat o buna perioada de timp in domeniul Networking/Internet, fara a pierde insa legatura cu programarea. Programarea a fost mereu o pasiune pentru mine, care a crescut in fiecare an. Am prins anii in care hardware-ul era o resursa atat de limitata incat programatorii trebuiau sa pretuiasca fiecare octet si tact de procesor. Memoria totala pe Z80 era de doar 48-64KB iar acum folosim curent memorii de ordinul GB, de sute de mii de ori mai mult. Am fost apoi martor la ascensiunea Internet, intai ca un lux, la facultate, cu viteze de ordinul 64 Kbits/secunda, pana in ziua de astazi in care discutam de zeci de Megabiti pe secunda pentru utilizatorul casnic si chiar zeci de Gigabiti pe secunda la nivel de “Internet Service Providers”.
In acest moment sunt martorul reasezarii paradigmelor hardware si mai ales software, pentru ca deja tehnologia a atins cateva limite naturale, fiind necesare noi abordari pentru continuarea cresterii performantei.
Techtorials: Cum vezi tu relatia dintre hardware si software ? Cand softul functioneaza prea lent trebuie cumparat un hardware mai puternic sau trebuie optimizat softul ?
Mihai: Cresterea exponentiala a performantei hardware la pret mai mic, impreuna cu costul relativ mare (si constant) al crearii/modificarii software-ului a facut ca de multe ori sa se considere ca solutia “upgrade hardware” este mai ieftina decat optimizarea software-ului. Firmele de software au incercat sa reduca costul de creare si mentenanta software neglijand economia de resurse hardware, astfel ca fiecare noua versiune de software necesita un hardware mai puternic.
Totusi exista probleme la care cresterea performantei hardware nu poate tine pasul cu cresterea volumului de date. Sa luam de exemplu un algoritm care pentru N date de intrare face N*N operatii. Timpul de executie al unei operatii este foarte scurt de ordinul fractiunilor de secunda (sa zicem 1/1.000.000 secunda). Totusi, pentru N=1.000.000, algoritmul va dura 1.000.000 secunde, adica aproximativ 11.5 zile. Acesta este cazul aproximativ al sortarii in ordine crescatoare a pensiilor a 1.000.000 cetateni, folosing un algoritm corect dar ineficient. Daca se foloseste un algoritm mai eficient care foloseste N* logaritm2(N), atunci sortarea dureaza doar 1.000 secunde, adica doar cateva ore. Ar trebui sa treaca ani de progres tehnologic hardware pentru a realiza un asemenea salt in performanta. Pentru sortare exista deja algoritmi predefiniti foarte buni, dar exista multe alte probleme la care prima implementare este departe de optimul posibil.
Techtorials: Cand este totusi upgrade-ul hardware singura solutie ?
Mihai: Eu sunt un fan al optimizarii software. Optimizarile software pot obtine (atunci cand sunt posibile) cresteri de performanta de 10, 100, 1000 ori. Daca este nevoie doar de cresterea de cateva ori a performantei, probabil upgrade-ul hardware este o solutie. Daca insa cu fiecare crestere mica a volumului de date hardware-ul nu mai este suficient trebuie cautata o solutie software.
a) Upgrade RAM
In primul rand daca memoria RAM nu este suficienta si este necesar sa se foloseasca “swap” pe disk, performanta se poate deprecia semnficativ. In mod normal sistemul nu ar trebui sa aibe nevoie de swap pentru datele programului critic ca performanta. Daca programul nu poate fi optimizat ca memorie, atunci upgrade-ul de RAM este cea mai buna situatie. Cresterea de memorie poate optimiza de asemenea accesul la disk, deoarece datele se pot pre-incarca in memorie de unde sunt accesate de sute de ori mai rapid. Aplicatiile care fac multe calcule nu se pot optimiza astfel.b) Upgrade procesor
Exista situatii in care cei mai buni algoritmi existenti au nevoie de un anumit numar minim de operatii pentru a gasi solutia. Pentru problema clasica a sortarii folosind comparatii, numarul minim teoretic este de logaritm2(N!), apropiat ca ordin de marime de N * logaritm2(N) obtinut in cazul general de algortmii cei mai eficienti. Daca volumul datelor cere mai multe operatii pe secunda, atunci trebuie gasit un hardware mai puternic.O situatie foarte dificila este atunci cand cel mai puternic hardware disponibil nu este suficient pentru rezolvarea problemei la o viteza acceptabila. Atunci se poate incerca distribuirea pe mai multe unitati hardware, dar nu toate problemele se pot imparti usor in subprobleme independente. Pentru unii algoritmi, timpul de comunicare intre sisteme este mai mare decat timpul economisit delegand anumite operatii. Ajungem atunci din nou la necesitatea optimizarii la maxim a software-ului.
Techtorials: Care sunt limitarile hardware si software in cresterea performantei programelor ?
Mihai: Am observat in ultimul timp o plafonare a cresterii frecventei procesoarelor. E foarte probabil sa se fi atins o limitare fizica importanta, data de raportul dintre viteza luminii (de fapt a campului magnetic) si dimensiunea legaturilor electrice. La 300 000 000 m/s, 30 cm de fir se parcurg in 0.3m/300.000.000m/s = 1/1.000.000.000 s. Daca fiecare cerere depinde de rezultatul celei anterioare, iar legatura dus-intors ar avea 30 cm, atunci nu se pot face mai mult de 1.000.000.000 cereri/secunda (frecventa de 1Ghz). 3Ghz corepunde la 10cm, ceea ce este destul de putin ca dimensiune de aglomerare a diverselor subansamble.
Producatorii de procesoare au schimbat deja directia spre crearea de procesoare multi-core, care sa creasca performanta prin paralelizarea operatiilor pe mai multe procesoare incorporate. Paralelizarea automata este destul de limitata daca se ruleaza un singur program, iar acesta nu este conceput sa functioneze pe mai multe fire de executie independente. In general fiecare pas foloseste rezultatul procesarii anterioare, deci un procesor/core ar trebui sa astepte oricum terminarea procesarii pe celalalt procesor. Chiar atunci cand programele folosesc mai multe fire de executie, ele au momente de concurenta, in care logica programului cere ca o operatie sa se efectueze cu blocarea executiei celorlalte fire de executie (threaduri). De exemplu obtinerea accesului exclusiv la o variabila comuna blocheaza executia tuturor firelor de executie pe perioada executarii operatiei. Astfel, doua procesoare nu aduc decat rareori dublul performantei, mai ales ca exista si alti factori: viteza de acces la memorie, la hard disk, etc.
Noua directie hardware face o presiune teribila asupra tehnologiei software care a fost obisnuita sa foloseasca algoritmi iterativi, neparalelizabili. Programarea multi-threading este inca complexa si produce mult mai multe erori de programare decat programarea cu un singur fir de executie. Totusi, singura solutie pentru folosirea eficienta a procesoarelor multi-core (care ajung pana la zeci de unitati-procesor deja) este gasirea unor algoritmi/arhitecturi care sa foloseasca multe fire paralele de executie (threads).
Pe de alta parte, hardware-ul va trebui sa rezolve niste probleme complexe de scalabilitate, oferind software-ului un suport mai extins pentru operatii de paralelizare. In primul rand este problema accesului la memorie, care devine punct de congestie pentru procesoare. Exista solutia distribuirii memoriei per procesoare, dar aceasta ridica alte probleme de concurenta in conditiile in care programele distribuite pe procesoare au si parti de memorie comuna.
Ma astept in viitorul apropiat la aparitia unei evolutii importante si comune hardware si software pentru a surmonta aceste dificultati si a mentine cresterea performantei aplicatiilor software pe trendul crescator de pana acum.
<va urma>