4.6 Viteză de execuție: hardware

Puterea de calcul crește atât de rapid, încât orice carte pe această temă va fi depășită înainte de a fi publicată. Este un coșmar al autorului! PC-ul original IBM a fost introdus în 1981, bazat pe microprocesorul 8088 cu un ceas de 4,77 MHz și o magistrală de date de 8 biți. Aceasta a fost urmată de o nouă generație de calculatoare personale introduse la fiecare 3-4 ani: 8088 → 80286 → 80386 → 80486 → 80586 (Pentium). Fiecare dintre aceste noi sisteme a stimulat viteza de calcul cu un factor de aproximativ cinci față de tehnologia anterioară. Până în 1996, viteza ceasului a crescut la 200 MHz, iar magistrala de date la 32 de biți. Cu alte îmbunătățiri, aceasta a dus la o creștere a puterii de calcul de aproape o mie de ori în numai 15 ani! Ar trebui să te aștepți la alt factor de o mie în următorii 15 ani.

Singura modalitate de a obține informații actualizate în acest domeniu care se schimbă rapid este direct de la producători: anunțuri, fișe de specificații, liste de prețuri etc. Uitați cărțile pentru date despre performanță, uitați-vă în reviste și ziarul dvs. zilnic. Așteptați că viteza de calcul brut va depăși dublu la doi ani. Învățarea despre starea actuală de putere a computerului nu este suficientă; trebuie să înțelegeți și să urmăriți evoluția acesteia.

Ținând cont de acest lucru, putem trece într-o prezentare generală a modului în care viteza de execuție este limitată de hardware-ul calculatorului. Deoarece computerele sunt compuse din mai multe subsisteme, timpul necesar pentru a executa o anumită sarcină va depinde de doi factori primari: (1) viteza subsistemelor individuale și (2) timpul necesar pentru a transfera date între aceste blocuri. Figura 4-5 prezintă o diagramă simplificată a celor mai importante componente de limitare a vitezei într-un calculator tipic personal. Unitatea centrală de procesare (CPU) este inima sistemului. Așa cum a fost descris mai sus, ea constă dintr-o duzină de registre, fiecare capabil să dețină 32 de biți (în PC de generație prezentă). De asemenea, în CPU sunt incluse elementele electronice digitale necesare operațiilor rudimentare, cum ar fi biții în mișcare și aritmetica virgulei fixe.

Matematica mai implicată este tratată prin transferul datelor către un circuit hardware special numit coprocesor matematic (denumit și unitate logică aritmetică sau ALU). Coprocesorul matematic poate fi conținut în același chip ca CPU-ul sau poate fi un dispozitiv electronic separat. De exemplu, adunarea a două numere în virgulă mobilă ar necesita transferarea de către procesor a 8 octeți (4 pentru fiecare număr) coprocesorului matematic și a câtorva octeți care descriu ce să facă cu datele. După un timp de calcul scurt, coprocesorul matematic ar trece patru octeți înapoi la CPU, conținând numărul în virgulă mobilă care este suma. Sistemele computerizate cele mai ieftine nu au coprocesor matematic sau le oferă doar ca opțiune. De exemplu, microprocesorul 80486DX are un coprocesor matematic intern, în timp ce 80486SX nu are. Aceste sisteme de performanță mai joasă înlocuiesc hardware cu software. Fiecare dintre funcțiile matematice este împărțită în operații binare elementare care pot fi gestionate direct în CPU. În timp ce acest lucru oferă același rezultat, timpul de execuție este mult mai lent, să zicem, un factor de la 10 la 20.

Figura 4-5 Arhitectura unui sistem tipic de computer.

Viteza de calcul este limitată de: (1) viteza subsistemelor individuale și (2) rata la care datele pot fi transferate între aceste subsisteme.

Majoritatea software de PC pot fi utilizate cu sau fără coprocesor matematic. Acest lucru se realizează prin faptul că compilatorul generează cod mașină pentru a gestiona ambele cazuri, toate stocate în programul executabil final. Dacă este prezent un coprocesor matematic pe computerul utilizat, se va executa o secțiune a codului. Dacă nu este prezent un coprocesor matematic, va fi utilizată cealaltă secțiune a codului. Compilatorul poate fi, de asemenea, direcționat să genereze cod numai pentru una dintre aceste situații. De exemplu, veți găsi ocazional un program care necesită existența unui coprocesor matematică și nu va rula dacă se execută pe un computer care nu are unul. Aplicații, cum ar fi procesarea de cuvinte, de obicei nu beneficiază de un coprocesor matematic. Acest lucru se datorează faptului că implică mutarea datelor în memorie, nu calculul expresiilor matematice. De asemenea, calculele care implică variabilele în virgulă fixă (întregi) nu sunt afectate de prezența unui coprocesor matematic, deoarece acestea sunt manipulate în CPU. Pe de altă parte, viteza de execuție a DSP și a altor programe computaționale care utilizează calcule în virgulă mobilă poate fi un ordin de mărime diferit cu și fără un coprocesor matematic.

CPU-ul și memoria principală sunt conținute în cipuri separate în majoritatea sistemelor informatice. Din motive evidente, doriți ca memoria principală să fie foarte mare și foarte rapidă. Din păcate, acest lucru face memoria foarte scumpă. Transferul de date între memoria principală și CPU reprezintă un obstacol foarte comun pentru viteză. CPU-ul solicită memoria principală pentru informațiile binare la o anumită adresă de memorie și apoi trebuie să aștepte să primească informațiile. O tehnică comună pentru a rezolva această problemă este utilizarea unei memorii cache. Aceasta este o cantitate mică de memorie foarte rapidă utilizată ca tampon între CPU și memoria principală. Sunt tipic câteva sute de kilobyte. Când CPU cere memoriei principale pentru a furniza datele binare la o anumită adresă, electronica digitală de mare viteză copiază o secțiune din memoria principală din jurul acestei adrese în memoria cache. Data viitoare când CPU cere informații de memorie, este foarte probabil că aceasta va fi deja conținută în memoria cache, făcând recuperarea foarte rapidă. Acest lucru se bazează pe faptul că programele tind să acceseze locațiile de memorie care sunt din vecinătatea datelor deja accesate. În aplicațiile tipice ale PC, adăugarea unei memorii cache poate îmbunătăți viteza generală de mai multe ori. Memoria cache poate fi în același cip cu CPU-ul sau poate fi un dispozitiv electronic extern.

Rata la care datele pot fi transferate între subsisteme depinde de numărul de linii de date paralele furnizate și de rata maximă la care pot fi transmite semnalele digitale de-a lungul fiecărei linii. Datele digitale pot fi, în general, transferate la o rată mult mai mare într-un singur cip, în comparație cu transferul de date între cipuri. De asemenea, căile de date care trebuie să treacă prin conectorii electrici către alte plăci cu circuite imprimate (adică o structură a magistralei) vor fi mai lente. Aceasta este o motivație puternică pentru introducerea cât mai multor electronice în interiorul CPU.

O problemă deosebit de urâtă pentru viteza calculatorului este backward compatibility. Când o companie de computere introduce un nou produs, o placă de achiziție de date sau un program software, doresc să o vândă pe cea mai mare piață posibilă. Aceasta înseamnă că acesta trebuie să fie compatibile cu majoritatea computerelor utilizate în prezent, care ar putea să acopere mai multe generații de tehnologii. Acest lucru limitează frecvent performanța hardware-ului sau a software-ului la sistemele mult mai vechi. De exemplu, să presupunem că vă cumpărați o placă I/O care se conectează la magistrala PC Pentium 200 MHz, oferindu-vă opt linii digitale care pot transmite și recepționa date câte un byte la un moment dat. Apoi, scrieți un program de asamblare pentru a transfera rapid date între computer și un dispozitiv extern, cum ar fi un experiment științific sau alt computer. Spre surprinderea dvs., rata maximă de transfer de date este de numai aproximativ 100.000 octeți pe secundă, de o mie de ori mai lentă decât rata de ceas a microprocesorului! Ticălosul este magistrala ISA, o tehnologie care este backward compatible cu computerele de înaintea anului 1980.

Tabelul 4-6 oferă timpii de execuție pentru mai multe generații de computere. Evident, ar trebui să tratați aceste lucruri ca aproximații foarte grosolane. Dacă doriți să înțelegeți sistemul dvs., efectuați măsurători pe sistemul dvs. Este destul de ușor; scrieți o buclă care execută un milion de operații și folosiți-vă ceasul cât timp durează. Primele trei sisteme, 80286, 80486 și Pentium, sunt computerele desktop standard de birou din 1986, 1993 și 1996, respectiv. Cel de-al patrulea este un microprocesor din 1994 proiectat special pentru sarcinile DSP, Texas Instruments TMS320C40.

Tabelul 4-6 Timpii de execuție (microsec.) măsurați pentru diferite computere.

80286, 80486 și Pentium sunt trei generații de PC, în timp ce TMS 320C40 este un microprocesor destinat specific pentru sarcini DSP. Toate PC includ un co-procesor matematic. Utilizați acești timpi numai ca o estimare generală.

Pentiumul este mai rapid decât sistemul 80286 din patru motive: (1) viteza mai mare a ceasului, (2) mai multe linii în magistrala de date, (3) adăugarea unei memorii cache și (4) o proiectare internă mai eficientă, necesitând mai puține cicluri de ceas pe instrucțiune.

Dacă Pentium era un Cadillac, TMS320C40 ar fi un Ferrari: mai puțin confort, dar viteză orbitoare. Acest cip este reprezentativ pentru mai multe micro-procesoare concepute special pentru a reduce timpul de execuție al algoritmilor DSP. Alții din această categorie sunt Intel i860, AT&T DSP3210, Motorola DSP96002 și Analog Devices ADSP-2171. Acestea merg adesea după nume: microprocesor DSP sau RISC (Calculator cu set de instrucțiuni reduse). Această ultimă denumire reflectă faptul că viteza crescută rezultă din mai puține instrucțiunile la nivel de asamblare puse la dispoziția programatorului. În comparație, microprocesoarele tradiționale, cum ar fi Pentium, se numesc CISC (Complex Instruction Set Computer).

Microprocesoarele DSP sunt utilizate în două moduri: ca module slave aflate sub controlul unui computer mai conven-țional sau ca procesor încorporat într-o aplicație dedicată, cum ar fi un telefon celular. Unele modele gestionează numai numere în virgulă fixă, în timp ce altele pot lucra cu virgulă mobilă. Arhitectura internă folosită pentru a obține viteza crescută include: (1) o mulțime de memorii cache foarte rapide conținute în cip, (2) magistrale separate pentru program și date, permițând celor două să fie accesate simultan (numită Harvard Architecture) (3) hardware rapid pentru calculele matematice conținute direct în microprocesor și (4) un proiect de pipeline.

O arhitectură pipeline sparge hardware necesar pentru o anumită sarcină în mai multe etaje succesive. De exemplu, adunarea a două numere poate fi făcută în trei etaje pipeline. Primul etaj de pipeline nu face decât să preia numerele care urmează să fie adunate din memorie. Singura sarcină a etajului doi este de a aduna cele două numere împreună. Al treilea etaj nu face decât să stocheze rezultatul în memorie. Dacă fiecare etaj își poate îndeplini sarcina într-un singur ciclu de ceas, întreaga procedură va dura trei cicluri de ceas pentru a fi executată. Caracteristica cheie a structurii pipeline este aceea că o altă sarcină poate fi pornită înainte ca sarcina precedentă să fie finalizată. În acest exemplu, am putea începe adunarea altor două numere, de îndată ce primul etaj este inactiv, la sfârșitul primului ciclu de ceas. Pentru un număr mare de operații, viteza sistemului va fi cotată ca un plus pe fiecare ciclu de ceas, chiar dacă adăugarea a două numere necesită trei cicluri de ceas pentru a finaliza. Pipeline sunt mari pentru viteză, dar ele pot fi dificil de programat. Algoritmul trebuie să permită începerea unui nou calcul, chiar dacă rezultatele calculelor anterioare nu sunt disponibile (deoarece sunt încă în pipeline).

Secțiunea următoare: Viteză de execuție: Sfaturi de programare