Internet Windows Android

Și ia în considerare ce se va întâmpla în două cazuri diferite. Clarificarea legăturilor de familie

* întotdeauna întrebări de actualitate, la ce ar trebui să fii atent atunci când alegi un procesor, pentru a nu te înșela.

Scopul nostru din acest articol este de a descrie toți factorii care afectează performanța procesorului și alte caracteristici operaționale.

Cu siguranță nu este un secret pentru nimeni că procesorul este principala unitate de calcul a unui computer. Puteți spune chiar - cea mai importantă parte a computerului.

El este cel care se ocupă cu procesarea aproape tuturor proceselor și sarcinilor care apar în computer.

Fie că vizionează videoclipuri, muzică, navighează pe Internet, scrie și citește în memorie, procesează 3D și video, jocuri. Și mult mai mult.

Prin urmare, la alegere C central NS procesorul trebuie luat cu mare atenție. Se poate dovedi că ați decis să instalați o placă video puternică și un procesor care nu se potrivește cu nivelul său. În acest caz, procesorul nu va dezvălui potențialul plăcii video, ceea ce va încetini funcționarea acesteia. Procesorul va fi încărcat complet și va fierbe literalmente, iar placa video își va aștepta rândul, funcționând la 60-70% din capacitățile sale.

De aceea, atunci când alegeți un computer echilibrat, nu cheltuieli procesor de neglijareîn favoarea unei plăci video puternice. Puterea procesorului trebuie să fie suficientă pentru a elibera potențialul plăcii video, altfel sunt doar bani risipiți.

Intel vs. AMD

* prinde din urmă pentru totdeauna

corporație Intel, are resurse umane uriașe și finanțe aproape inepuizabile. Multe inovații în industria semiconductoarelor și noile tehnologii provin de la această companie. Procesoare și dezvoltări Intel, în medie până la 1-1,5 cu ani înaintea dezvoltărilor inginerilor AMD... Dar, după cum știți, pentru ocazia de a poseda cel mai mult tehnologii moderne- trebuie sa platesti.

Politica de preț a procesorului Intel, se bazează pe ambele numărul de nuclee, cantitatea de cache dar și pe „Prospețimea” arhitecturii, performanță pe cicluwatt,tehnologia cipurilor... Valoarea memoriei cache, „subtilitățile procesului tehnic” și altele caracteristici importante procesorul va fi discutat mai jos. Pentru deținerea unor astfel de tehnologii ca multiplicator de frecvență gratuit, va trebui, de asemenea, să plătiți o sumă suplimentară.

Companie AMD, spre deosebire de companie Intel, urmărește disponibilitatea procesorelor sale pentru utilizatorul final și o politică de preț competentă.

Ai putea spune chiar asta AMD– « Marca oamenilor". În etichetele sale de preț veți găsi ceea ce aveți nevoie la un preț foarte atractiv. De obicei la un an după apariție tehnologie nouă la companie Intel, un analog al tehnologiei din AMD... Dacă nu urmăriți cele mai înalte performanțe și acordați mai multă atenție prețului decât disponibilității tehnologiilor avansate, atunci produsele companiei AMD- doar pentru tine.

Politica de preț AMD, se bazează mai mult pe numărul de nuclee și destul de puțin - pe cantitatea de memorie cache, prezența îmbunătățirilor arhitecturale. În unele cazuri, pentru posibilitatea de a avea o memorie cache de nivel trei, va trebui să plătiți un pic suplimentar ( Fenomen are o memorie cache de 3 niveluri, Athlon conținut cu doar 2 niveluri limitate). Dar cateodata AMD„Pampers” fanii săi capacitatea de a debloca procesoare mai ieftine decât cele mai scumpe. Puteți debloca nucleele sau memoria cache. Îmbunătăţi Athlon inainte de Fenomen... Acest lucru este posibil datorită arhitecturii modulare și a lipsei unor modele mai ieftine, AMD doar dezactivează unele dintre unitățile on-chip mai scumpe (programat).

Miezul- rămân practic neschimbate, doar numărul acestora diferă (valabil pentru procesoare 2006-2011 ani). Datorită modularității procesorelor sale, compania face o treabă excelentă de a vinde cipuri respinse, care, atunci când unele blocuri sunt oprite, devin un procesor dintr-o linie mai puțin productivă.

Compania lucrează la o arhitectură complet nouă de mulți ani sub numele de cod Buldozer, dar în momentul intrării 2011 anul nou, noile procesoare nu au prezentat cele mai bune performanțe. AMD au păcătuit pe sistemele de operare că nu înțelegeau caracteristicile arhitecturale ale nucleelor ​​duale și ale „altor filetări multiple”.

Potrivit reprezentanților companiei, ar trebui să se aștepte ca remedierile și corecțiile speciale să experimenteze performanța completă a acestor procesoare. Cu toate acestea, la început 2012 ani, reprezentanții companiei au amânat lansarea actualizării pentru a sprijini arhitectura Buldozer pentru a doua jumătate a anului.

Frecvența procesorului, numărul de nuclee, multithreading.

În vremuri Pentium 4și înaintea lui - Frecvența procesorului a fost un factor major în performanța procesorului la alegerea unui procesor.

Acest lucru nu este surprinzător, deoarece arhitecturile procesorului au fost special concepute pentru a obține o frecvență ridicată, acest lucru s-a reflectat în mod deosebit în procesor. Pentium 4 pe arhitectură NetBurst... Frecvența înaltă nu a fost eficientă cu conducta lungă utilizată în arhitectură. Chiar Athlon XP frecvență 2 GHz, în termeni de performanță a fost mai mare decât Pentium 4 c 2,4 GHz... Deci a fost un marketing pur. După această eroare, compania Intel mi-am dat seama de greșelile mele și s-a întors de partea binelui a început să lucreze nu la componenta de frecvență, ci la performanța pe ciclu de ceas. Din arhitectură NetBurst A trebuit să refuz.

Ce noi dă multicore?

Procesor quad-core cu frecventa 2,4 GHz, în aplicații multi-thread, teoretic va fi echivalentul aproximativ al unui procesor single-core cu o frecvență 9,6 GHz sau un procesor cu 2 nuclee cu o frecvență 4,8 GHz... Dar asta este doar teoretic. Practic cu toate acestea, două procesoare dual-core dintr-o placă de bază cu două prize vor fi mai rapide decât un procesor cu 4 nuclee la aceeași frecvență de funcționare. Viteza autobuzului și limitările de latență a memoriei sunt evidente.

* sub rezerva acelorași arhitecturi și a cantității de memorie cache

Multi-core, face posibilă executarea instrucțiunilor și calculelor în piese. De exemplu, trebuie să efectuați trei operații aritmetice. Primele două sunt executate pe fiecare dintre nucleele procesorului și rezultatele sunt adăugate în memoria cache, unde următoarea acțiune poate fi efectuată de către oricare dintre nucleele libere. Sistemul este foarte flexibil, dar fără o optimizare adecvată este posibil să nu funcționeze. Prin urmare, este foarte important să optimizați pentru multicore pentru arhitectura procesoarelor din mediul OS.

Aplicații care „adoră” și utilizare multithreading: arhivari, playere video și codificatoare, antivirusuri, programe de defragmentare, editor grafic , browsere, Flash.

De asemenea, pentru „iubitorii” de multi-threading, puteți face referire la astfel de sisteme de operare ca Windows 7și Windows Vista , precum și multe OS bazat pe nucleu Linux care funcționează vizibil mai repede dacă aveți procesor multi-core.

Cel mai jocuri, este destul un procesor cu 2 nuclee pentru frecventa inalta... Acum, însă, sunt lansate tot mai multe jocuri, „ascuțite” pentru multithreading. Luați cel puțin așa SandBox jocuri precum GTA 4 sau Prototip, în care pe un procesor cu 2 nuclee cu o frecvență mai mică 2,6 GHz- nu vă simțiți confortabil, rata cadrelor scade sub 30 de cadre pe secundă. Deși în acest caz, cel mai probabil motivul unor astfel de incidente este optimizarea „slabă” a jocurilor, lipsa de timp sau mâinile „indirecte” ale celor care au transferat jocurile de pe console la PC.

Când cumpărați un nou procesor pentru jocuri, acum ar trebui să acordați atenție procesoarelor cu 4 sau mai multe nuclee. Dar totuși, nu neglijați 2 procesoare nucleare din „categoria de top”. În unele jocuri, aceste procesoare se simt uneori mai bine decât unele multi-core.

Memoria cache a procesorului.

- Aceasta este o zonă dedicată a cristalului procesorului, în care datele intermediare dintre nucleele procesorului, RAM și alte magistrale sunt procesate și stocate.

Funcționează la o viteză de ceas foarte mare (de obicei la frecvența procesorului în sine), are o viteză foarte mare debitși nucleele procesorului funcționează direct cu acesta ( L1).

Din cauza ei lipsuri, procesorul poate rămâne inactiv în activități care consumă mult timp, așteptând să sosească date noi în cache pentru procesare. De asemenea, memoria cache servește pentruÎnregistrări ale datelor repetate frecvent, care pot fi recuperate rapid, dacă este necesar, fără calcule inutile, fără a forța procesorul să piardă din nou timp pe ele.

Performanța este, de asemenea, adăugată de faptul că memoria cache este unificată, iar toate nucleele pot utiliza în mod egal date din ea. Aceasta oferă oportunități suplimentare pentru optimizarea cu mai multe fire.

Această tehnică este acum utilizată pentru Memoria cache de nivelul 3... Procesoare Intel au existat procesoare cu cache L2 partajat ( C2D E 7 ***,E 8 ***), datorită căruia a apărut Pe aici crește performanța multi-thread.

La overclockarea procesorului, memoria cache poate deveni un punct slab, împiedicând procesorul să overclockeze mai mult decât frecvența sa maximă de funcționare fără erori. Cu toate acestea, avantajul este că va rula la aceeași frecvență ca și procesorul overclockat.

În general, cu cât este mai mare memoria cache, cu atât Mai repede CPU. În ce aplicații?

Toate aplicațiile în care sunt utilizate o mulțime de date în virgulă mobilă, instrucțiuni și fluxuri, memoria cache este utilizată în mod activ. Le place foarte mult memoria cache arhivari, codificatoare video, antivirusuriși editor grafic etc.

Favorabil pentru un numar mare cache-urile includ jocuri... Mai ales jocuri de strategie, simulări automate, RPG-uri, SandBox și toate jocurile în care există multe detalii mici, particule, elemente geometrice, fluxuri de informații și efecte fizice.

Memoria cache joacă un rol foarte important în deblocarea potențialului sistemelor cu 2 sau mai multe plăci video. La urma urmei, o parte din sarcină cade pe interacțiunea nucleelor ​​procesorului atât între ele, cât și pentru lucrul cu fluxuri de mai multe cipuri video. În acest caz, organizarea cache-ului este importantă, iar cache-ul L3 de volum mare este foarte util.

Memoria cache, întotdeauna protejată împotriva posibile greșeli (ECC), la detectarea cărora sunt corectate. Acest lucru este foarte important, deoarece o mică eroare în memoria cache, în timpul procesării, se poate transforma într-o eroare continuă gigantică, din care va cădea întregul sistem.

Tehnologii proprietare.

(hiper-threading, HT)–

pentru prima dată tehnologia a fost aplicată în procesoare Pentium 4, dar nu a funcționat întotdeauna corect și adesea a încetinit procesorul mai mult decât l-a accelerat. Motivul a fost o conductă prea lungă și un sistem incomplet de predicție a ramurilor. Aplicat de companie Intel, nu există încă analogi ai tehnologiei, cu excepția unui analog atunci? ce au implementat inginerii companiei AMDîn arhitectură Buldozer.

Principiul sistemului este astfel încât pentru fiecare nucleu fizic, a două fire de calculîn loc de unul. Adică, dacă aveți un procesor cu 4 nuclee cu HT (Core i 7), atunci aveți fire virtuale 8 .

Câștigul de performanță se realizează datorită faptului că datele pot intra în conductă deja în mijlocul acesteia și nu neapărat mai întâi. Dacă unele unități de procesor capabile să efectueze această acțiune sunt inactive, vor primi o sarcină pentru executare. Câștigul de performanță nu este același ca în nucleele fizice reale, ci comparabil (~ 50-75%, în funcție de tipul de aplicație). Rareori se întâmplă ca în unele aplicații, HT afectează negativ pe performanță. Acest lucru se datorează optimizării slabe a aplicațiilor pentru această tehnologie, incapacității de a înțelege că există fire „virtuale” și absenței limitatorilor pentru încărcarea firelor în mod uniform.

TurboBoost Este o tehnologie foarte utilă, care crește frecvența de funcționare a celor mai utilizate nuclee de procesor, în funcție de nivelul sarcinii lor de lucru. Este foarte util atunci când aplicația nu știe să folosească toate cele 4 nuclee și încarcă doar unul sau două, în timp ce frecvența lor de operare crește, ceea ce compensează parțial performanța. Un analog al acestei tehnologii pentru companie AMD este tehnologia Turbo Core.

, 3 acum! instrucțiuni... Conceput pentru a accelera procesorul multimedia calcule (video, muzică, grafică 2D / 3D etc.), precum și accelerarea activității unor astfel de programe precum arhivare, programe de lucru cu imagini și video (cu sprijinul instrucțiunilor acestor programe).

3acum! - tehnologie destul de veche AMD care contine instructiuni aditionale procesarea conținutului multimedia, pe lângă SSE prima versiune.

* Și anume, capacitatea de a transmite în flux procesarea numerelor reale de o singură precizie.

Prezența celor mai versiune noua- este un mare plus, procesorul începe să îndeplinească anumite sarcini mai eficient cu o optimizare corectă a software-ului. Procesoare AMD au nume similare, dar ușor diferite.

* Exemplu - SSE 4.1 (Intel) - SSE 4A (AMD).

În plus, aceste seturi de instrucțiuni nu sunt identice. Acestea sunt analogi în care există ușoare diferențe.

Cool'n'Quiet, SpeedStep, CoolCore, Încântat Jumătate Stat (C1E) șiT... d.

Aceste tehnologii, la sarcină redusă, reduc frecvența procesorului prin reducerea multiplicatorului și a tensiunii de pe miez, dezactivarea unei părți din cache etc. Acest lucru permite procesorului să se încălzească mult mai puțin și să consume mai puțină energie și să facă mai puțin zgomot. Dacă este nevoie de alimentare, procesorul va reveni la starea sa normală într-o fracțiune de secundă. Pe setări standard Bios aproape întotdeauna activate, dacă se dorește, pot fi dezactivate pentru a reduce posibilele „blocări” la trecerea la jocuri 3D.

Unele dintre aceste tehnologii controlează viteza ventilatoarelor din sistem. De exemplu, dacă procesorul nu are nevoie de o disipare a căldurii crescută și nu este încărcat, viteza ventilatorului procesorului scade ( AMD Cool'n'Quiet, Intel Speed ​​Step).

Tehnologie de virtualizare Intelși Virtualizare AMD.

Aceste tehnologii hardware permit utilizarea programelor speciale pentru a rula mai multe sisteme de operare simultan, fără pierderi semnificative de performanță. De asemenea, este folosit pentru muncă corectă servere, deoarece de multe ori au instalate mai multe sisteme de operare.

A executa Dezactivează PicșiNu. a executa Pic tehnologie concepută pentru a vă proteja computerul împotriva atacurilor de viruși și erori de software care poate bloca sistemul depășire tampon.

Intel 64 , AMD 64 , EM 64 T - această tehnologie permite procesorului să funcționeze atât într-un sistem de operare cu o arhitectură pe 32 de biți, cât și într-un sistem de operare cu unul pe 64 de biți. Sistem 64 de biți- din punct de vedere al beneficiilor, pentru un utilizator obișnuit diferă prin faptul că mai mult de 3,25 GB pot fi utilizați în acest sistem memorie cu acces aleator... Pe sistemele pe 32 de biți, utilizați b O Nu este posibilă o cantitate mai mare de RAM din cauza cantității limitate de memorie adresabilă *.

Majoritatea aplicațiilor cu arhitectură pe 32 de biți pot fi rulate pe un sistem cu sistem de operare pe 64 de biți.

* Ce poți face dacă în 1985, nimeni nu s-ar putea gândi la astfel de gigant, după standardele de atunci, volume de RAM.

În plus.

Câteva cuvinte despre.

Acest punct merită să fie atent. Cu cât este mai subțire procesul tehnic, cu atât procesor mai mic consumă energie și, ca urmare, se încălzește mai puțin. Și, printre altele, are o marjă mai mare de siguranță pentru overclocking.

Cu cât procesul tehnic este mai bun, cu atât poți „înfășura” mai mult într-un cip (și nu numai) și crește capacitățile procesorului. În același timp, disiparea căldurii și consumul de energie sunt, de asemenea, reduse proporțional, din cauza pierderilor de curent mai mici și a scăderii zonei centrale. Puteți observa o tendință că, cu fiecare nouă generație a aceleiași arhitecturi pe un nou proces tehnic, crește și consumul de energie, dar nu este așa. Doar că producătorii merg spre performanțe și mai mari și trec peste linia de disipare a căldurii din generația anterioară de procesoare datorită creșterii numărului de tranzistoare, care nu este proporțională cu scăderea procesului tehnic.

Încorporat în procesor.

Dacă nu aveți nevoie de un nucleu video integrat, atunci nu ar trebui să cumpărați un procesor cu acesta. Veți obține doar o disipare a căldurii mai gravă, exces de căldură (nu întotdeauna), potențial de overclocking mai rău (nu întotdeauna) și bani plătiți în exces.

În plus, nucleele care sunt încorporate în procesor sunt potrivite numai pentru încărcarea sistemului de operare, navigarea pe Internet și vizionarea videoclipurilor (și chiar și atunci nu de nicio calitate).

Tendințele pieței se schimbă și oportunitatea de a cumpăra un procesor productiv de la Intel fără un kernel video, acesta scade din ce în ce mai puțin. Politica de a forța impunerea unui nucleu video încorporat, a apărut cu procesoare Intel denumit în cod Podul cu nisip, principala inovație a fost un nucleu încorporat bazat pe același proces tehnic. Miezul video este situat de comun acord cu procesor pe un cristal, și nu la fel de simplu ca în generațiile anterioare de procesoare Intel... Pentru cei care nu îl utilizează, există dezavantaje sub forma unei anumite plăți în plus pentru procesor, deplasarea sursei de încălzire față de centrul capacului de distribuție a căldurii. Cu toate acestea, există și plusuri. Nucleul video dezactivat, poate fi utilizat pentru codificarea video foarte rapidă folosind tehnologia Sincronizare rapidăîmpreună cu un software special care sprijină această tehnologie. In viitor, Intel promite să extindă orizonturile utilizării nucleului video încorporat pentru calcul paralel.

Socluri pentru procesor. Durata de viață a platformei.


Intel are o politică dură pentru platformele lor. Durata de viață a fiecăruia (perioada pentru începutul și sfârșitul vânzărilor de procesoare pentru acesta) nu depășește de obicei 1,5 - 2 ani. În plus, compania are mai multe platforme în curs de dezvoltare.

Companie AMD, are politica de compatibilitate opusă. Pe platforma ei AM 3, se va potrivi tuturor generațiilor viitoare de procesoare care acceptă DDR3... Chiar și atunci când platforma iese AM 3+și mai târziu, fie noi procesoare pentru AM 3, sau noile procesoare vor fi compatibile cu plăcile de bază vechi și va fi posibil să efectuați o actualizare nedureroasă pentru portofel prin schimbarea doar a procesorului (fără schimbarea plăcii de bază, a RAM-ului etc.) și intermitentul plăcii de bază. Singurele nuanțe de incompatibilitate pot fi la schimbarea tipului, deoarece va fi necesar un alt controler de memorie încorporat în procesor. Deci, compatibilitatea este limitată și nu este acceptată de toate plăcile de bază. Dar, în general, pentru un utilizator economic sau pentru cei care nu sunt obișnuiți să schimbe complet platforma la fiecare 2 ani - alegerea producătorului procesorului este clară - aceasta este AMD.

Răcirea procesorului.

În mod standard, procesorul vine cu CUTIE- un nou cooler care va face față sarcinii sale. Este o bucată de aluminiu cu o zonă de dispersie nu foarte mare. Răcitoarele eficiente bazate pe conducte termice și aripioare fixe sunt proiectate pentru o disipare a căldurii extrem de eficientă. Dacă nu doriți să auziți zgomot inutil de la ventilator, atunci ar trebui să cumpărați un răcitor alternativ, mai eficient, cu conducte de căldură sau un sistem de răcire cu lichid în buclă închisă sau în buclă deschisă. Astfel de sisteme de răcire vor oferi în plus capacitate de overclocking pentru procesor.

Concluzie.

Au fost luate în considerare toate aspectele importante care afectează performanța și performanța procesorului. Să repetăm ​​la ce ar trebui să acordați atenție:

  • Selectați producătorul
  • Arhitectura procesorului
  • Proces tehnic
  • Frecvența procesorului
  • Numărul de nuclee de procesor
  • Dimensiunea și tipul cache-ului procesorului
  • Suport tehnologic și de instruire
  • Răcire de calitate

Sperăm că acest material vă va ajuta să înțelegeți și să decideți alegerea unui procesor care să vă satisfacă așteptările.

saul 9 septembrie 2015 la 13:38

Implementarea unei arhitecturi de jocuri multi-threaded

  • Blogul Intel,
  • Dezvoltarea jocului,
  • Programare paralelă,
  • Dezvoltarea site-ului web
  • Traducere

Odată cu apariția procesoarelor multi-core, a devenit necesar să se creeze un motor de joc bazat pe o arhitectură paralelă. Utilizarea tuturor procesoarelor din sistem - atât grafică (GPU), cât și centrală (CPU) - deschide mult mai multe posibilități decât un motor cu un singur fir bazat doar pe GPU. De exemplu, utilizarea mai multor nuclee CPU se poate îmbunătăți efecte vizuale prin creșterea numărului de obiecte fizice folosite în joc, precum și realizarea unui comportament mai realist al personajului prin implementarea inteligenței artificiale avansate (AI).
Să luăm în considerare caracteristicile implementării arhitecturii multi-thread a motorului de joc.

1. Introducere

1.1. Prezentare generală

Arhitectura multi-threaded a motorului de joc vă permite să utilizați la maximum capacitățile tuturor procesoarelor de pe platformă. Acesta presupune executarea paralelă a diferitelor blocuri funcționale pe toate procesoarele disponibile. Cu toate acestea, se dovedește a nu fi atât de ușor de implementat o astfel de schemă. Elemente individuale motoarele de joc interacționează adesea între ele, ceea ce poate duce la erori atunci când sunt executate simultan. Pentru a gestiona astfel de scenarii, motorul oferă mecanisme speciale pentru sincronizarea datelor, care exclud posibilele blocări. De asemenea, implementează metode pentru sincronizarea datelor în același timp, reducând astfel timpul de execuție.

Pentru a înțelege materialele prezentate, trebuie să fiți bine versat în metodele moderne de creație jocuri pe calculator, suport multithreading pentru motoarele de joc sau pentru a îmbunătăți performanța aplicației în general.

2. Stare de execuție paralelă

Starea concurenței este un concept cheie în multithreading. Numai prin împărțirea motorului de joc în sisteme separate, fiecare funcționând în modul propriu și practic interacționând cu restul motorului, putem obține cea mai mare eficiență a calculului paralel și putem reduce timpul necesar sincronizării. Nu este posibilă izolarea completă a părților individuale ale motorului prin excluderea tuturor resurselor partajate. Cu toate acestea, pentru operațiuni precum obținerea de date despre poziția sau orientarea obiectelor, sistemele individuale pot utiliza copii locale ale datelor, mai degrabă decât resurse partajate. Acest lucru vă permite să minimizați dependența de date în diferite părți ale motorului. Modificările aduse datelor partajate efectuate de un sistem individual sunt notificate managerului de stat, care le pune în coadă. Aceasta se numește modul de mesagerie. Acest mod presupune că la finalizarea sarcinilor, sistemele motorului primesc notificări de modificare și își actualizează datele interne în consecință. Acest mecanism poate reduce semnificativ timpul de sincronizare și dependența sistemelor unul de celălalt.

2.1 Stări de execuție

Pentru ca managerul de stare de execuție să funcționeze eficient, se recomandă sincronizarea operațiilor cu un anumit ceas. Aceasta permite tuturor sistemelor să ruleze în același timp. În acest caz, rata de ceas nu trebuie să corespundă ratei de cadre. Și durata ciclurilor de ceas poate să nu depindă de frecvență. Poate fi selectat astfel încât un ciclu de ceas să corespundă cu timpul necesar transmiterii unui cadru (indiferent de dimensiunea acestuia). Cu alte cuvinte, frecvența sau durata căpușelor este determinată de implementarea specifică a managerului de stat. Figura 1 prezintă un mod de operare „gratuit” pas cu pas, care nu necesită ca toate sistemele să finalizeze o operațiune în același ciclu de ceas. Modul în care toate sistemele finalizează executarea operațiunilor într-un singur ciclu de ceas se numește modul pas "greu". Este prezentat schematic în Figura 2.


Figura 1. Starea de execuție în modul gratuit pas cu pas

2.1.1. Mod pas cu pas gratuit
În modul gratuit pas cu pas, toate sistemele funcționează continuu pentru o perioadă de timp prestabilită necesară pentru a finaliza următoarea porțiune de calcule. Cu toate acestea, numele „liber” nu ar trebui să fie luat la propriu: sistemele nu sunt sincronizate într-un moment arbitrar în timp, sunt doar „libere” în alegerea numărului de cicluri de ceas necesare pentru a finaliza etapa următoare.
De obicei, în acest mod, nu este suficient să trimiteți o simplă notificare a unei modificări de stare către managerul de stat. De asemenea, trebuie trimise datele actualizate. Acest lucru se datorează faptului că sistemul care a schimbat datele partajate ar putea fi în stare de funcționare, în timp ce un alt sistem care așteaptă datele respective este pe cale să se actualizeze. În acest caz, este necesară mai multă memorie, deoarece trebuie făcute mai multe copii ale datelor. Prin urmare, regimul „liber” nu poate fi considerat o soluție universală pentru toate ocaziile.
2.1.2. Mod pas greu
În acest mod, executarea sarcinilor pe toate sistemele este finalizată într-un singur ciclu de ceas. Acest mecanism este mai simplu de implementat și nu necesită transferul de date actualizate împreună cu notificarea. Într-adevăr, dacă este necesar, un sistem poate solicita pur și simplu noi valori de la alt sistem (desigur, la sfârșitul ciclului de rulare).
În modul hard, puteți implementa un mod de funcționare pseudo-liber prin distribuirea calculelor între pași diferiți. În special, acest lucru poate fi necesar pentru calculele AI, unde un „obiectiv comun” inițial este calculat în primul ciclu de ceas, care este rafinat treptat în etapele următoare.


Figura 2. Starea de execuție în modul greu pas cu pas

2.2. Sincronizare date

Modificările aduse datelor partajate de mai multe sisteme pot duce la un conflict de modificări. În acest caz, sistemul de mesagerie trebuie să furnizeze un algoritm pentru alegerea valorii totale corecte. Există două abordări principale bazate pe următoarele criterii.
  • Timp: Valoarea finală este ultima modificare făcută.
  • Prioritate: Totalul este modificarea făcută de sistemul cu cea mai mare prioritate. Dacă prioritatea sistemelor este aceeași, puteți lua în considerare și momentul schimbării.
Toate datele învechite (pentru oricare dintre criterii) pot fi pur și simplu suprascrise sau excluse din coada de notificare.
Deoarece totalul poate varia în funcție de ordinea în care sunt efectuate modificările, poate fi foarte dificil să se utilizeze valorile relative ale datelor totale. În astfel de cazuri, ar trebui folosite valori absolute. Apoi, la actualizarea datelor locale, sistemele pot înlocui pur și simplu vechile valori cu altele noi. Soluția optimă este de a alege valori absolute sau relative în funcție de situația specifică. De exemplu, datele generale, cum ar fi poziția și orientarea, trebuie să fie absolute, deoarece ordinea în care sunt făcute modificările este importantă. Valorile relative pot fi utilizate, de exemplu, pentru un sistem de generare a particulelor, deoarece toate informațiile despre particule sunt stocate numai în el.

3. Motor

La dezvoltarea motorului, accentul este pus pe flexibilitatea necesară pentru a-și extinde funcționalitatea. Acest lucru îl va optimiza pentru utilizare sub anumite constrângeri (de ex. Memorie).
Motorul poate fi aproximativ împărțit în două părți: cadru și manageri. Cadrul (vezi secțiunea 3.1) include părți ale jocului care sunt reproduse în timpul rulării, adică există în mai multe instanțe. De asemenea, include elementele implicate în execuția buclei principale a jocului. Managerii (vezi secțiunea 3.2) sunt obiecte Singleton care sunt responsabile de executarea logicii jocului.
Mai jos este o diagramă a motorului de joc.


Figura 3. Arhitectura generală a motorului

Rețineți că modulele sau sistemele de joc funcționale nu fac parte din motor. Motorul le unește doar, acționând ca un element de legătură. Această organizare modulară face posibilă încărcarea și descărcarea sistemelor după cum este necesar.

Interacțiunea motorului și a sistemelor se realizează folosind interfețe. Acestea sunt implementate în așa fel încât să ofere motorului acces la funcțiile sistemului și la sisteme - managerilor de motoare.
O diagramă detaliată a motorului este furnizată în Anexa A, Diagrama motorului.

Practic toate sistemele sunt independente unele de altele (a se vedea secțiunea 2, „Starea de execuție concurentă”), adică pot efectua acțiuni în paralel fără a afecta funcționarea altor sisteme. Cu toate acestea, orice modificare a datelor va atrage anumite dificultăți, deoarece sistemele vor trebui să interacționeze între ele. Schimbul de informații între sisteme este necesar în următoarele cazuri:

  • să informeze un alt sistem despre o modificare a datelor generale (de exemplu, poziția sau orientarea obiectelor);
  • pentru a efectua funcții care nu sunt disponibile pentru acest sistem (de exemplu, sistemul AI apelează la sistem pentru calcularea proprietăților geometrice sau fizice ale unui obiect pentru a efectua un test de intersecție a razelor).
În primul caz, managerul de stat descris în secțiunea anterioară poate fi utilizat pentru a controla schimbul de informații. (Pentru mai multe informații despre managerul de stat, consultați secțiunea 3.2.2, „Managerul de stat”.)
În al doilea caz, este necesar să se implementeze un mecanism special care să furnizeze serviciile unui sistem pentru utilizarea altui sistem. Descriere completa acest mecanism este descris în secțiunea 3.2.3, „Manager de servicii”.

3.1. Cadru

Cadrul este folosit pentru a combina toate elementele motorului. Aici este inițializat motorul, cu excepția managerilor, care sunt instanțați la nivel global. De asemenea, stochează informații despre scenă. Pentru a obține o mai mare flexibilitate, scena este implementată ca o așa-numită scenă generică care conține obiecte generice. Sunt containere care combină diferitele părți funcționale ale scenei. Pentru detalii, a se vedea secțiunea 3.1.2.
Bucla principală a jocului este, de asemenea, implementată în cadrul. Poate fi reprezentat schematic după cum urmează.


Figura 4. Bucla principală a jocului

Motorul funcționează într-un mediu cu ferestre, astfel încât primul pas în bucla de joc trebuie să proceseze orice mesaje în așteptare din ferestrele sistemului de operare. Dacă acest lucru nu se face, motorul nu va răspunde la mesajele sistemului de operare. În al doilea pas, planificatorul atribuie sarcini folosind managerul de activități. Acest proces este detaliat în secțiunea 3.1.1 de mai jos. După aceea, managerul de stat (a se vedea secțiunea 3.2.2) trimite informații despre modificările aduse sistemelor motorului, a căror activitate le poate afecta. La ultimul pas, în funcție de starea de execuție, cadrul determină dacă se termină sau se continuă motorul, de exemplu, pentru a trece la următoarea scenă. Informațiile despre starea motorului sunt stocate de managerul de mediu. Vezi secțiunea 3.2.4 pentru detalii.

3.1.1. Programator
Planificatorul generează un ceas de referință de execuție la o rată specificată. Dacă modul de referință necesită ca următoarea operație să înceapă imediat după finalizarea celei anterioare, fără a aștepta sfârșitul ceasului, frecvența poate fi nelimitată.
Pe un semnal de ceas, programatorul folosește managerul de activități pentru a pune sistemele în modul de rulare. În modul pas liber (Secțiunea 2.1.1), programatorul interogă sistemele pentru a determina câte cicluri de ceas vor avea nevoie pentru a finaliza sarcina. Pe baza rezultatelor sondajului, programatorul determină ce sisteme sunt pregătite pentru execuție și care dintre ele își vor finaliza activitatea la un anumit pas de timp. Planificatorul poate modifica numărul de bifări dacă un sistem durează mai mult să se execute. În modul hard stepping (Secțiunea 2.1.2), toate sistemele pornesc și se termină în același ciclu de ceas, astfel încât programatorul așteaptă ca toate sistemele să se termine de executare.
3.1.2. Scenă și obiecte versatile
Scena și obiectele generice sunt containere pentru funcționalitatea implementată în alte sisteme. Acestea sunt destinate exclusiv interacțiunii cu motorul și nu îndeplinesc nicio altă funcție. Cu toate acestea, ele pot fi extinse pentru a profita de funcțiile disponibile altor sisteme. Acest lucru permite cuplarea liberă. Într-adevăr, o scenă și obiecte universale pot folosi proprietățile altor sisteme fără a fi legate de ele. Această proprietate exclude dependența sistemelor una de cealaltă și le permite să funcționeze simultan.
Diagrama de mai jos prezintă o extensie a unei scene și a unui obiect universal.


Figura 5. Extinderea scenei și obiectului universal

Să vedem cum funcționează extensiile în exemplul următor. Să presupunem că extensia scenei universale este executată, scena este extinsă pentru a utiliza proprietățile grafice, fizice și de altă natură. În acest caz, partea „grafică” a extensiei va fi responsabilă pentru inițializarea afișajului, iar partea „fizică” a acesteia va fi responsabilă pentru implementarea legilor fizice pentru solide, de exemplu, forța de greutate. Scenele conțin obiecte, deci o scenă generică va include și mai multe obiecte generice. Obiectele generice pot fi, de asemenea, extinse și pot fi extinse pentru a utiliza proprietăți grafice, fizice și de altă natură. De exemplu, desenul unui obiect pe ecran va fi implementat prin funcții de expansiune grafică, iar calculul interacțiunii solidelor va fi implementat de cele fizice.

O diagramă detaliată a interacțiunii motorului și sistemelor este prezentată în Anexa B, „Schema interacțiunii motorului și sistemelor”.
Trebuie remarcat faptul că scena generică și obiectul generic sunt responsabile pentru înregistrarea tuturor „extensiilor” lor în managerul de stat, astfel încât toate extensiile să poată fi notificate despre modificările făcute de alte extensii (adică de alte sisteme). Un exemplu este o extensie grafică înregistrată pentru a primi notificări privind modificările de poziție și orientare făcute de extensia fizică.
Pentru detalii despre componentele sistemului, consultați Secțiunea 5.2, Componente sistem.

3.2. Managerii

Managerii controlează activitatea motorului. Sunt obiecte Singleton, adică fiecare tip de manager este disponibil într-o singură instanță. Acest lucru este necesar, deoarece duplicarea resurselor managerului va duce inevitabil la redundanță și va avea un impact negativ asupra performanței. În plus, managerii sunt responsabili de implementarea funcțiilor comune pentru toate sistemele.
3.2.1. Gestionar de sarcini
Managerul de sarcini este responsabil pentru gestionarea activităților de sistem din grupul de fire. Grupul de fire creează câte un fir pentru fiecare procesor pentru a asigura o scalare optimă n-fold și pentru a preveni atribuirea de fire inutile, eliminând comutarea inutilă a sarcinii în sistemul de operare.

Planificatorul trimite managerului de sarcini o listă de sarcini de finalizat, precum și informații despre sarcinile de așteptat pentru finalizare. El primește aceste date de la diferite sisteme... Fiecare sistem primește doar o singură sarcină. Această metodă se numește descompunere funcțională. Cu toate acestea, pentru prelucrarea datelor, fiecare astfel de sarcină poate fi împărțită într-un număr arbitrar de subtaskuri (descompunerea datelor).
Mai jos este un exemplu de distribuire a sarcinilor între fire pentru un sistem quad-core.


Figura 6. Exemplu de grup de fire utilizat de un manager de sarcini

În plus față de procesarea cererilor de planificare pentru acces la principalele sarcini, managerul de activități poate lucra în modul de inițializare. Interogă secvențial sistemele din fiecare fir, astfel încât să poată inițializa stocurile de date locale necesare pentru funcționare.
Sfaturi pentru implementarea unui manager de sarcini sunt date în Anexa D, Sfaturi pentru implementarea sarcinilor.

3.2.2. Manager de stat
Managerul de stat face parte din motorul de mesagerie. Urmărește modificările și trimite notificări despre acestea către toate sistemele care pot fi afectate de aceste modificări. Pentru a nu trimite notificări inutile, managerul de stat stochează informații despre sistemele pe care trebuie să le notifice într-un anumit caz. Acest mecanism este implementat folosind modelul Observer (vezi Anexa C, Observer (Modelul de proiectare)). În scurt, șablon dat implică utilizarea unui „observator” care monitorizează orice schimbare a subiectului, în timp ce rolul unui intermediar între ei este jucat de controlorul de schimbare.

Mecanismul funcționează după cum urmează. 1. Observatorul spune controlerului de schimbare (sau managerului de stat) ce entități dorește să urmărească pentru modificări. 2. Subiectul notifică operatorul toate modificările sale. 3. La un semnal din cadru, controlorul notifică observatorul despre modificările subiectului. 4. Observatorul trimite subiectului o cerere de a primi date actualizate.

În modul de pas gratuit (a se vedea secțiunea 2.1.1), implementarea acestui mecanism devine oarecum mai complicată. În primul rând, datele actualizate vor trebui trimise împreună cu notificarea de modificare. În acest mod, trimiterea la cerere nu este aplicabilă. Într-adevăr, dacă în momentul primirii cererii, sistemul responsabil pentru modificări nu este încă finalizat de executat, nu va putea furniza date actualizate. În al doilea rând, dacă un sistem nu este încă pregătit să primească modificări la sfârșitul unui ciclu de ceas, managerul de stat va trebui să se mențină la datele modificate până când toate sistemele înregistrate pentru a le primi sunt gata.

Cadrul oferă doi manageri de stat pentru acest lucru: pentru procesarea modificărilor la nivelul scenei și la nivelul obiectului. De obicei, mesajele pentru scene și obiecte sunt independente una de cealaltă, astfel încât utilizarea a doi manageri separați elimină necesitatea procesării datelor inutile. Dar dacă scena trebuie să țină cont de starea unui obiect, îl puteți înregistra pentru a primi notificări despre modificările sale.

Pentru a evita sincronizarea inutilă, managerul de stat generează o coadă de notificare a modificărilor separat pentru fiecare fir creat de managerul de activități. Prin urmare, nu este necesară sincronizarea la accesarea cozii. Secțiunea 2.2 descrie o metodă care poate fi utilizată pentru a îmbina cozile după executare.


Figura 7. Notificarea modificărilor interne la un obiect generic

Notificările de modificare nu trebuie trimise secvențial. Există o modalitate de a le trimite în paralel. La efectuarea unei sarcini, sistemul funcționează cu toate obiectele sale. De exemplu, întrucât obiectele fizice interacționează între ele, sistemul fizic controlează mișcarea lor, calculul coliziunilor, forțelor noi de acționare etc. Atunci când primește notificări, obiectul sistemului nu interacționează cu alte obiecte din sistemul său. Acesta interacționează cu extensiile sale de obiecte generice asociate. Aceasta înseamnă că obiectele generice sunt acum independente unele de altele și pot fi actualizate în același timp. Această abordare nu exclude cazurile marginale care ar trebui luate în considerare în timpul procesului de sincronizare. Cu toate acestea, permite utilizarea modului de execuție paralel atunci când părea că puteți acționa doar secvențial.

3.2.3. Manager de servicii
Managerul de servicii oferă sisteme cu acces la caracteristici ale altor sisteme care altfel nu le-ar fi fost disponibile. Este important să înțelegem că funcțiile sunt accesate prin interfețe, nu direct. Informațiile despre interfețele de sistem sunt stocate și în managerul de servicii.
Pentru a elimina dependența sistemelor unul de celălalt, fiecare dintre ele are doar un set mic de servicii. În plus, capacitatea de a utiliza un anumit serviciu nu este determinată de sistem în sine, ci de managerul de servicii.


Figura 8. Exemplu de manager de servicii

Managerul de servicii are și o altă funcție. Oferă sisteme cu acces la proprietățile altor sisteme. Proprietățile sunt valori specifice sistemului, care nu sunt comunicate în sistemul de mesagerie. Aceasta poate fi o extindere a rezoluției ecranului într-un sistem grafic sau magnitudinea gravitației într-un sistem fizic. Managerul de servicii pune aceste date la dispoziția sistemelor, dar nu le controlează direct. Pune modificările proprietății într-o coadă specială și le publică numai după executarea secvențială. Vă rugăm să rețineți că accesul la proprietățile unui alt sistem este rar necesar și nu trebuie abuzat. De exemplu, este posibil să aveți nevoie de acesta pentru a activa sau a dezactiva modul wireframe în sistemul grafic din fereastra consolei sau pentru a modifica rezoluția ecranului la cererea playerului din interfața utilizatorului. Această ocazie folosit în principal pentru a seta parametri care nu se schimbă de la cadru la cadru.

3.2.4. Manager de mediu
  • Managerul de mediu asigură mediul de rulare al motorului. Funcțiile sale pot fi împărțite condiționat în următoarele grupuri.
  • Variabile: numele și valorile variabilelor comune utilizate de toate părțile motorului. De obicei, valorile variabilelor sunt determinate atunci când scena este încărcată sau sigură setari personalizate... Motorul și diverse sisteme le pot accesa prin trimiterea unei cereri.
  • Executare: date de execuție, cum ar fi finalizarea unei scene sau a unui program de execuție. Acești parametri pot fi setați și solicitați atât de sistemele în sine, cât și de motor.
3.2.5. Manager platformă
Managerul platformei implementează o abstractizare pentru apelurile sistemului de operare și oferă, de asemenea, funcționalități suplimentare dincolo de simpla abstractizare. Avantajul acestei abordări este că încapsulează mai multe funcții tipice într-un singur apel. Adică, nu trebuie să fie implementate separat pentru fiecare apelant, supraîncărcându-l cu detalii despre apelurile sistemului de operare.
Luați în considerare, de exemplu, apelarea managerului de platformă pentru a încărca o bibliotecă dinamică a sistemului. Nu numai că încarcă sistemul, ci și obține punctele de intrare a funcției și apelează funcția de inițializare a bibliotecii. Managerul stochează, de asemenea, descriptorul bibliotecii și îl descarcă după ce motorul este terminat.

Managerul platformei este, de asemenea, responsabil pentru furnizarea de informații despre procesor, cum ar fi instrucțiunile SIMD acceptate, și pentru inițializarea unui mod specific de operare pentru procese. Sistemele nu pot utiliza alte funcții pentru a genera interogări.

4. Interfețe

Interfețele sunt mijloacele de comunicare între cadru, manageri și sisteme. Cadrul și managerii fac parte din motor, astfel încât să poată interacționa între ei direct. Sistemele nu aparțin motorului. Mai mult, toate îndeplinesc funcții diferite, ceea ce duce la necesitatea de a crea o singură metodă de interacțiune cu ei. Deoarece sistemele nu pot interacționa direct cu managerii, trebuie să ofere un mod diferit de acces. Cu toate acestea, nu toate funcțiile managerilor ar trebui să fie deschise sistemelor. Unele dintre ele sunt disponibile doar pentru cadru.

Interfețele definesc setul de funcții necesare pentru a fi utilizate metoda standard acces. Acest lucru elimină necesitatea ca cadrul să cunoască detaliile de implementare a unor sisteme specifice, deoarece acesta poate interacționa cu acestea numai printr-un set specific de apeluri.

4.1. Interfețe subiect și observator

Scopul principal al subiectului și al interfețelor de observator este de a înregistra despre care observatori trebuie să trimită notificări și să trimită astfel de notificări. Înregistrarea și deconectarea cu observatorul sunt funcții standard pentru toți subiecții, incluși în implementarea interfeței lor.

4.2. Interfețe manager

Managerii, deși sunt obiecte Singleton, sunt direct accesibile doar cadrului. Alte sisteme pot accesa managerii numai prin interfețe care reprezintă doar o fracțiune din funcționalitatea lor generală. După inițializare, interfața este transmisă sistemului, care o folosește pentru a lucra cu anumite funcții de manager.
Nu există o interfață unică pentru toți managerii. Fiecare dintre ele are propria interfață separată.

4.3. Interfețe de sistem

Pentru ca cadrul să poată accesa componentele sistemului, acesta are nevoie de interfețe. Fără ele, sprijinul tuturor nou sistem motorul ar trebui implementat separat.
Fiecare sistem include patru componente, deci ar trebui să existe patru interfețe. Și anume: sistem, scenă, obiect și sarcină. Descriere detaliata vezi Secțiunea 5, Sisteme. Interfețele sunt mijloacele de accesare a componentelor. Interfețele de sistem vă permit să creați și să ștergeți scene. Interfețele de scenă, la rândul lor, vă permit să creați și să distrugeți obiecte, precum și să solicitați informații despre sarcina principală a sistemului. Interfața de activități este utilizată în principal de managerul de activități la setarea activităților în grupul de fire.
Deoarece scena și obiectul, ca părți ale sistemului, trebuie să interacționeze între ele și cu scena universală și obiectul de care sunt atașate, interfețele lor sunt create și pe baza interfețelor subiectului și a observatorului.

4.4. Schimbați interfețele

Aceste interfețe sunt utilizate pentru a transfera date între sisteme. Toate sistemele care efectuează modificări de un anumit tip trebuie să implementeze o astfel de interfață. Geometria este un exemplu. Interfața de geometrie include metode pentru determinarea poziției, orientării și scării unui element. Orice sistem care aduce modificări geometriei trebuie să implementeze o astfel de interfață, astfel încât informațiile despre alte sisteme să nu fie necesare pentru a accesa datele modificate.

5. Sisteme

Sistemele sunt partea motorului care este responsabilă de implementarea funcționalității jocului. Ei îndeplinesc toate sarcinile de bază fără de care motorul nu ar avea sens. Interacțiunea dintre motor și sisteme se realizează folosind interfețe (a se vedea secțiunea 4.3, „Interfețe de sistem”). Acest lucru este necesar pentru a nu suprasolicita motorul cu informații despre diferite tipuri de sisteme. Interfețele facilitează adăugarea unui nou sistem, deoarece motorul nu trebuie să ia în considerare toate detaliile de implementare.

5.1. Tipuri

Sistemele motorului pot fi împărțite aproximativ în mai multe categorii predefinite corespunzătoare componente standard jocuri. De exemplu: geometrie, grafică, fizică (coliziune solidă), sunet, procesare de intrare, AI și animație.
Sistemele cu funcții nestandardizate se încadrează într-o categorie separată. Este important să înțelegem că orice sistem care modifică datele pentru o anumită categorie trebuie să cunoască interfața categoriei respective, deoarece motorul nu furnizează astfel de informații.

5.2. Componentele sistemului

Mai multe componente trebuie implementate pentru fiecare sistem. Unele dintre ele sunt: ​​sistem, scenă, obiect și sarcină. Toate aceste componente sunt utilizate pentru a interacționa cu diferite părți ale motorului.
Diagrama de mai jos prezintă interacțiunile dintre diferitele componente.


Figura 9. Componentele sistemului

O diagramă detaliată a conexiunilor dintre sistemele motorului este prezentată în Anexa B, „Schema de interacțiune între motor și sisteme”.

5.2.1. Sistem
Componenta „sistem”, sau pur și simplu sistemul, este responsabilă pentru inițializarea resurselor sistemului, care practic nu se vor schimba în timpul funcționării motorului. De exemplu, sistemul grafic analizează adresele resurselor pentru a determina unde sunt localizate și pentru a accelera încărcarea atunci când se utilizează resursa. De asemenea, setează rezoluția ecranului.
Sistemul este principalul punct de intrare pentru cadru. Oferă informații despre sine (de exemplu, tipul de sistem), precum și metode pentru crearea și ștergerea scenelor.
5.2.2. Scenă
Componenta scenei, sau scena sistemului, este responsabilă de gestionarea resurselor asociate scenei curente. Scena generică folosește scene de sistem pentru a extinde funcționalitatea prin valorificarea funcționalității acestora. Un exemplu este o scenă fizică care este utilizată pentru a crea o nouă lume de joc și, la inițializarea scenei, determină forțele de greutate din ea.
Scenele oferă metode pentru crearea și distrugerea obiectelor, precum și o componentă „task” pentru procesarea scenei și o metodă pentru accesarea acesteia.
5.2.3. Un obiect
Componenta obiect, sau obiect sistem, aparține scenei și este de obicei asociată cu ceea ce utilizatorul vede pe ecran. Un obiect generic folosește un obiect de sistem pentru a extinde funcționalitatea prin expunerea proprietăților sale ca fiind proprii.
Un exemplu este extensia geometrică, grafică și fizică a unui obiect generic pentru a afișa o grindă de lemn pe un ecran. Proprietățile geometrice vor include poziția, orientarea și scala obiectului. Sistemul grafic va utiliza o grilă specială pentru ao afișa. Iar sistemul fizic îl va înzestra cu proprietățile unui corp rigid pentru calcularea interacțiunilor cu alte corpuri și a forțelor de greutate care acționează.

În anumite cazuri, un obiect de sistem trebuie să țină cont de modificările aduse unui obiect generic sau uneia dintre extensiile sale. În acest scop, puteți crea o relație specială care va urmări modificările care au fost făcute.

5.2.4. Sarcină
Componenta sarcinii sau sarcina de sistem este utilizată pentru a procesa scena. Activitatea primește o comandă pentru actualizarea scenei de la managerul de activități. Acesta este un semnal pentru a rula funcțiile de sistem pe obiecte de scenă.
Executarea unei sarcini poate fi împărțită în subtaskuri, distribuindu-le folosind și managerul de sarcini la un număr și mai mare de fire. aceasta mod convenabil scalarea motorului la mai multe procesoare. Această metodă se numește descompunerea datelor.
Informațiile despre modificările obiectelor în procesul de actualizare a sarcinilor de scenă sunt transmise managerului de stat. Pentru detalii despre administratorul de stat, consultați secțiunea 3.2.2.

6. Combinarea tuturor componentelor

Toate elementele descrise mai sus sunt legate între ele și fac parte dintr-un întreg. Lucrarea motorului poate fi aproximativ împărțită în mai multe etape, descrise în secțiunile următoare.

6.1. Faza de inițializare

Motorul pornește cu inițializarea managerilor și a cadrului.
  • Cadrul apelează încărcătorul de scenă.
  • După ce a stabilit ce sisteme va folosi scena, încărcătorul apelează managerul platformei pentru a încărca modulele corespunzătoare.
  • Managerul platformei încarcă modulele corespunzătoare și le transmite managerului de interfață, apoi le apelează pentru a crea un sistem nou.
  • Modulul returnează un indicator către instanța de sistem care implementează interfața de sistem către încărcător.
  • Managerul de servicii înregistrează toate serviciile furnizate de modulul de sistem.


Figura 10. Inițializarea managerilor și a sistemelor de motoare

6.2. Etapa de încărcare a scenei

Controlul este returnat încărcătorului, care încarcă scena.
  • Încărcătorul creează o scenă generică. Pentru a crea scene de sistem, apelează interfețele de sistem, extinzând funcționalitatea scenei generice.
  • Scena universală determină ce date poate schimba fiecare scenă a sistemului și notificările despre modificările pe care ar trebui să le primească.
  • Prin potrivirea scenelor care fac anumite modificări și doresc să fie notificate despre ele, scena generică transmite aceste informații managerului de stat.
  • Pentru fiecare obiect din scenă, încărcătorul creează un obiect generic, apoi determină ce sisteme vor extinde obiectul generic. Corespondența dintre obiectele sistemului este determinată în același mod în care este folosit pentru scene. Se transmite și managerului de stat.
  • Încărcătorul folosește interfețele de scenă rezultate pentru a instanția obiecte de sistem și le folosește pentru a extinde obiecte generice.
  • Planificatorul interogă interfețele de scenă pentru sarcinile lor principale, astfel încât să poată transmite aceste informații managerului de activități în timpul rulării.


Figura 11. Inițializarea scenei și obiectului universal

6.3. Etapa ciclului jocului

  • Managerul platformei este utilizat pentru a procesa mesajele ferestrei și alte elemente necesare pentru ca platforma actuală să funcționeze.
  • Apoi controlul trece la planificator, care așteaptă sfârșitul ceasului să continue să funcționeze.
  • La sfârșitul ceasului, într-un mod gratuit pas cu pas, programatorul verifică ce sarcini au fost finalizate. Toate sarcinile finalizate (adică gata de rulare) sunt transferate către managerul de sarcini.
  • Planificatorul determină ce sarcini vor fi finalizate în bifa curentă și așteaptă ca acestea să fie finalizate.
  • În modul cu pas greu, aceste operații se repetă la fiecare măsură. Programatorul trimite toate sarcinile către manager și așteaptă să fie finalizate.
6.3.1. Finalizarea sarcinii
Controlul este transferat către managerul de sarcini.
  • Formează o coadă a tuturor sarcinilor primite, apoi, pe măsură ce apar firele libere, începe executarea lor. (Procesul de executare a sarcinilor diferă în funcție de sisteme. Sistemele pot funcționa cu o singură sarcină sau pot procesa mai multe sarcini din coadă în același timp, realizând astfel o execuție paralelă.)
  • În cursul execuției, sarcinile pot funcționa cu întreaga scenă sau numai cu anumite obiecte, schimbându-și datele interne.
  • Sistemele ar trebui să fie notificate cu privire la orice modificare a datelor generale (de exemplu, poziția sau orientarea). Prin urmare, atunci când sarcina este executată, scena sau obiectul sistemului informează observatorul cu privire la orice modificări. În acest caz, observatorul acționează de fapt ca un controler de schimbare, care face parte din managerul de stat.
  • Controlerul de schimbare generează o coadă de notificări de modificare pentru procesare ulterioară. Acesta ignoră modificările care nu afectează observatorul dat.
  • Pentru a utiliza anumite servicii, o sarcină contactează managerul de servicii. Managerul de servicii vă permite, de asemenea, să modificați proprietățile altor sisteme care nu sunt disponibile pentru transmisie în motorul de mesagerie (de exemplu, sistemul de introducere a datelor modifică extensia ecranului - o proprietate a sistemului grafic).
  • Sarcinile pot contacta, de asemenea, managerul de mediu pentru a obține variabile de mediu și pentru a modifica starea de execuție (întrerupeți executarea, mergeți la scena următoare etc.).


Figura 12. Manager sarcini și sarcini

6.3.2. Actualizarea datelor
După finalizarea tuturor sarcinilor pentru bifarea curentă, bucla principală a jocului apelează managerul de stat pentru a începe faza de actualizare a datelor.
  • Managerul de stat apelează pe rând fiecare controler de schimbare pentru a trimite notificările acumulate. Controlorul verifică către care observatori trebuie să trimită notificări de modificare pentru fiecare subiect.
  • Apelează apoi pe observatorul dorit și îl informează cu privire la schimbare (notificarea include și un indicator către interfața subiectului). În modul de pas gratuit, observatorul primește date modificate de la controlerul de schimbare, dar în modul de pas intens, trebuie să le solicite de la subiectul însuși.
  • De obicei, observatorii interesați să primească notificări de modificare a obiectelor de sistem sunt alte obiecte de sistem asociate cu același obiect generic. Acest lucru vă permite să împărțiți procesul de a face modificări în mai multe sarcini care pot fi efectuate în paralel. Pentru a simplifica procesul de sincronizare, puteți combina toate extensiile de obiecte generice aferente într-o singură sarcină.
6.3.3. Verificarea progresului și ieșirea
Ultimul pas în bucla jocului este verificarea stării runtime-ului. Există mai multe astfel de stări: rulare, întrerupere, următoarea scenă etc. Dacă este selectată starea „rulare”, va începe următoarea iterație a buclei. Starea de ieșire înseamnă sfârșitul buclei, eliberarea resurselor și ieșirea din aplicație. Pot fi implementate și alte stări, de exemplu, „pauză”, „scenă următoare” etc.

7. Concluzie

Ideea principală a acestui articol este prezentată în secțiunea 2, „Statul de execuție paralelă”. Datorită descompunerii funcționale și descompunerii datelor, este posibilă implementarea nu numai a multiprocesării motorului, ci și a scalabilității acestuia la un număr și mai mare de nuclee în viitor. Pentru a elimina cheltuielile generale de sincronizare, menținând în același timp datele dvs. actualizate, utilizați administratorii de stare pe lângă mesaje.

Modelul Observator este o funcție a motorului de mesagerie. Este important să înțelegem bine cum funcționează pentru a alege cel mai bun mod de a-l implementa pentru motor. De fapt, este un mecanism de interacțiune între diferite sisteme, care asigură sincronizarea datelor comune.

Gestionarea sarcinilor joacă un rol important în echilibrarea sarcinii. Anexa D oferă sfaturi pentru crearea unui manager de sarcini eficient pentru un motor de joc.

După cum puteți vedea, multithreading-ul motorului de joc este posibil datorită unei structuri bine definite și a unui mecanism de mesagerie. Poate îmbunătăți semnificativ performanța procesorelor actuale și viitoare.

Anexa A. Schema motorului

Procesarea este începută de la bucla principală a jocului (vezi Fig. 4, „Bucla principală a jocului”).


Anexa B. Schema de interacțiune între motor și sisteme


Anexa C. Observator (model de proiectare)

Modelul observator este descris în detaliu în cartea Tehnici de proiectare orientate pe obiecte. Design Patterns ", E. Gamma, R. Helm, R. Johnson, J. Vlissides (" Design Patterns: Elements of Reusable Object-Oriented Software ", Gamma E., Helm R., Johnson R., Vlissides J.). Pe limba engleză a fost publicat pentru prima dată în 1995 de Addison-Wesley.

Ideea principală a acestui model este după cum urmează: dacă unele elemente trebuie notificate cu privire la modificările aduse altor elemente, acestea nu trebuie să caute prin lista tuturor modificărilor posibile, încercând să găsească datele necesare în acesta. Modelul presupune prezența unui actor și a unui observator, care sunt folosite pentru a trimite notificări de modificări. Observatorul monitorizează orice modificare a subiectului. Controlerul de schimbare acționează ca un intermediar între aceste două componente. Următoarea diagramă ilustrează această relație.


Figura 13. Șablon observator

Procesul de utilizare a acestui model este descris mai jos.

  1. Controlorul de schimbare înregistrează observatorul și subiectul pentru care dorește să fie notificat.
  2. Controlerul de schimbare este de fapt un observator. În loc de observator, împreună cu subiectul, se înregistrează. Controlorul de schimbare își menține, de asemenea, propria listă de observatori și subiecți înregistrați la aceștia.
  3. O entitate adaugă un observator (adică un controler de schimbare) la lista sa de observatori care doresc să fie anunțați despre modificările sale. Uneori este indicat suplimentar tipul de schimbare, care determină ce schimbări sunt interesate de observator. Acest lucru vă permite să eficientizați procesul de trimitere a notificărilor de modificare.
  4. La schimbarea datelor sau a stării, subiectul notifică observatorul printr-un mecanism de apel invers și comunică informații despre tipurile modificate.
  5. Controlerul de schimbare generează o coadă de notificări despre modificări și așteaptă un semnal pentru a le distribui către obiecte și sisteme.
  6. În timpul distribuției, controlerul de schimbare vorbește cu observatori reali.
  7. Observatorii solicită informații despre datele sau starea modificată de la subiect (sau le primesc împreună cu notificări).
  8. Înainte de a șterge un observator sau dacă nu mai trebuie să fie notificat despre un subiect, elimină abonamentul la acel subiect din controlerul de schimbare.
Există multe căi diferite implementați distribuirea sarcinilor. Cu toate acestea, cel mai bine este să păstrați numărul de fire de lucru egal cu numărul de procesoare logice de platformă disponibile. Încercați să nu legați sarcinile de un anumit fir. Timpul de executare a sarcinilor diferitelor sisteme nu coincide întotdeauna. Acest lucru poate duce la o distribuție inegală a sarcinilor de lucru între firele lucrătorilor și poate afecta eficiența. Pentru a face acest proces mai ușor, utilizați biblioteci de gestionare a sarcinilor, cum ar fi

După ce ne-am ocupat de teoria multithreadingului, să luăm în considerare un exemplu practic - Pentium 4. Deja în stadiul dezvoltării acestui procesor, inginerii Intel au continuat să lucreze la creșterea performanței sale, fără a introduce modificări la interfața de programare. Au fost luate în considerare cinci moduri simple:
1. Măriți frecvența ceasului.
2. Amplasarea a două procesoare pe un microcircuit.
3. Introducerea de noi blocuri funcționale.
1. Extinderea transportorului.
2. Folosirea multithreading-ului.
Cel mai evident mod de a îmbunătăți performanța este de a crește viteza ceasului fără a modifica alți parametri. De regulă, fiecare model de procesor ulterior are o viteză de ceas ceva mai mare decât precedentul. Din păcate, cu o creștere liniară a frecvenței ceasului, dezvoltatorii se confruntă cu două probleme: o creștere a consumului de energie (care este importantă pentru computerele portabile și alte dispozitive de calcul care funcționează cu baterii) și supraîncălzirea (care necesită crearea unei călduri mai eficiente chiuvete).
A doua metodă - plasarea a două procesoare pe un microcircuit - este relativ simplă, dar implică dublarea suprafeței ocupate de microcircuit. Dacă fiecare procesor este furnizat cu propria memorie cache, numărul de jetoane de pe platou se reduce la jumătate, dar aceasta înseamnă și o dublare a costurilor de producție. Prin furnizarea unei cache partajate pentru ambele procesoare, se poate evita o creștere semnificativă a amprentei, dar în acest caz apare o altă problemă - cantitatea de memorie cache pe procesor este redusă la jumătate și acest lucru afectează inevitabil performanța. În plus, în timp ce aplicațiile server profesionale sunt capabile să utilizeze pe deplin resursele mai multor procesoare, în programele desktop obișnuite, paralelismul intern este mult mai puțin dezvoltat.
Introducerea de noi blocuri funcționale nu este, de asemenea, dificilă, dar este important să găsim un echilibru aici. Ce rost are o duzină de blocuri ALU dacă microcircuitul nu poate emite comenzi către transportor la o viteză atât de mare încât să poată fi încărcate toate aceste blocuri?
Un transportor cu un număr crescut de trepte, capabil să împartă sarcinile în segmente mai mici și să le proceseze în perioade scurte de timp, pe de o parte, crește productivitatea, pe de altă parte, mărește consecințele negative ale tranzițiilor nepredictite, pierderile din cache, întreruperile și alte evenimente care perturbă comenzile normale de procesare a fluxului în procesor. În plus, pentru a realiza pe deplin capabilitățile conductei extinse, este necesar să creșteți frecvența ceasului, iar acest lucru, după cum știm, duce la un consum crescut de energie și la disiparea căldurii.
În cele din urmă, puteți implementa multithreading. Avantajul acestei tehnologii este că introduce un fir software suplimentar pentru a aduce resurse hardware care altfel ar fi inactive. Pe baza rezultatelor studiilor experimentale, dezvoltatorii Intel au descoperit că o creștere de 5% a suprafeței cipurilor atunci când implementează multithreading pentru multe aplicații are ca rezultat un câștig de performanță de 25%. Primul procesor Intel care a acceptat multithreading a fost Xeon din 2002. Ulterior, începând de la 3,06 GHz, multithreading-ul a fost introdus în linia Pentium 4. Intel solicită implementarea multithreading-ului în Pentium 4 hyperthreading.
Principiul de bază al hiper-threading-ului este executarea simultană a două fire de software (sau procese - procesorul nu face distincție între procese și fire de software). Sistemul de operare are în vedere hiper-threading Procesor Pentium 4 ca un complex cu procesor dual cu cache-uri partajate și memorie principală. Sistemul de operare efectuează planificarea separat pentru fiecare fir de program. Astfel, două aplicații pot rula în același timp. De exemplu, program de mail poate trimite sau primi mesaje în fundalîn timp ce utilizatorul interacționează cu aplicația interactivă - adică daemonul și programul utilizatorului rulează concomitent, ca și cum ar exista două procesoare disponibile pentru sistem.
Programele de aplicații care pot rula sub mai multe fire de program pot folosi ambele „procesoare virtuale”. De exemplu, programele de editare video permit de obicei utilizatorilor să aplice filtre tuturor cadrelor. Aceste filtre reglează luminozitatea, contrastul, echilibrul culorilor și alte proprietăți ale cadrelor. Într-o astfel de situație, programul poate atribui un procesor virtual pentru procesarea cadrelor pare și altul pentru procesarea cadrelor impare. În acest caz, cele două procesoare vor funcționa complet independent unul de celălalt.
Deoarece firele software accesează aceleași resurse hardware, este necesară coordonarea acestor fire. În contextul hiperthreading-ului, Intel a identificat patru strategii utile pentru gestionarea partajării resurselor: duplicarea resurselor și partajarea dură, prag și resursă completă. Să aruncăm o privire asupra acestor strategii.
Să începem cu duplicarea resurselor. După cum știți, unele resurse sunt duplicate în scopul organizării fluxurilor de programe. De exemplu, deoarece fiecare fir de program are nevoie de control individual, este necesar un al doilea contor de instrucțiuni. În plus, este necesar să introduceți un al doilea tabel pentru maparea registrelor arhitecturale (EAX, EBX etc.) la registrele fizice; În mod similar, controlerul de întrerupere este duplicat, deoarece gestionarea întreruperilor pentru fiecare fir se face individual.
Următoarea este tehnica divizare grea resurse (partajarea resurselor partiționate) între fluxurile de programe. De exemplu, dacă procesorul oferă o coadă între două etape funcționale ale conductei, atunci jumătate din sloturi pot fi date la firul 1, cealaltă jumătate la firul 2. Partajarea resurselor este ușor de implementat, nu duce la dezechilibru și asigură independența completă a firelor de programe unul față de celălalt. Cu partajarea completă a tuturor resurselor, un procesor se transformă de fapt în două. Pe de altă parte, poate apărea o situație în care un fir de program nu utilizează resurse care ar putea fi utile celui de-al doilea fir, dar pentru care nu are autorizare de acces. Ca urmare, resursele care altfel ar putea fi utilizate sunt inactive.
Opusul partajării dificile este partajarea completă a resurselor. În această schemă, orice fir de program poate accesa resursele necesare și sunt deservite în ordinea în care sunt primite cererile de acces. Luați în considerare o situație în care un flux rapid, constând în principal din operațiuni de adunare și scădere, coexista cu un flux lent care implementează operații de multiplicare și divizare. Dacă instrucțiunile sunt apelate din memorie mai repede decât se efectuează operațiile de multiplicare și divizare, numărul instrucțiunilor apelate în firul lent și în coadă la conductă va crește treptat. În cele din urmă, aceste comenzi vor umple coada, ca urmare, fluxul rapid se va opri din cauza lipsei de spațiu. Partajarea completă a resurselor rezolvă problema utilizării non-optime a resurselor comune, dar creează un dezechilibru în consumul lor - un fir poate încetini sau opri altul.
Schema intermediară este implementată în cadrul partajării resurselor prag. Conform acestei scheme, orice fir de program poate primi dinamic o anumită cantitate (limitată) de resurse. Atunci când este aplicată resurselor replicate, această abordare oferă flexibilitate fără amenințarea timpului de nefuncționare pentru unul dintre firele de program datorită incapacității de a obține resurse. Dacă, de exemplu, interziceți fiecărui fir să ocupe mai mult de 3/4 din coada de comandă, consumul crescut de resurse al unui fir lent nu va împiedica executarea unuia rapid.
Modelul Pentium 4 hyper-threading combină diferite strategii de partajare a resurselor. Astfel, se încearcă rezolvarea tuturor problemelor asociate fiecărei strategii. Duplicarea este implementată în legătură cu resursele care sunt solicitate în mod constant de ambele fire de program (în special, în legătură cu contorul de instrucțiuni, tabelul de mapare a registrului și controlerul de întrerupere). Duplicarea acestor resurse mărește suprafața microcircuitului cu doar 5% - de acord, un preț destul de rezonabil pentru multithreading. Resursele disponibile într-un astfel de volum încât este practic imposibil ca acestea să fie capturate de un fir (de exemplu, liniile cache) sunt alocate dinamic. Accesul la resursele care controlează funcționarea conductei (în special, numeroasele sale cozi) este împărțit - jumătate din sloturi sunt alocate fiecărui fir de program. Principala conductă a arhitecturii Pentium 4 Netburst este prezentată în Fig. 8,7; zonele albe și gri din această ilustrație reprezintă mecanismul de alocare a resurselor între fluxurile de programe albe și gri.
După cum puteți vedea, toate cozile din această ilustrație sunt separate - jumătate din sloturi sunt alocate fiecărui fir de program. Niciun fir nu poate restricționa munca celuilalt. Blocul de distribuție și substituție este, de asemenea, împărțit. Resursele planificatorului sunt partajate dinamic, dar pe baza unui anumit prag, astfel încât niciun fir nu poate ocupa toate sloturile din coadă. Pentru toate celelalte etape ale transportorului, are loc o separare completă.
Cu toate acestea, multithreading-ul nu este atât de simplu. Chiar și această tehnică progresivă are dezavantaje. Partajarea rigidă a resurselor nu vine cu cheltuieli generale semnificative, dar partiționarea dinamică, în special în ceea ce privește pragurile, necesită urmărirea consumului de resurse în timpul rulării. În plus, în unele cazuri, programele au performanțe semnificativ mai bune fără multithreading decât cu acesta. Să presupunem, de exemplu, că dacă aveți două fire, fiecare dintre ele necesită 3/4 din cache pentru a funcționa corect. Dacă ar fi executate la rândul lor, fiecare ar arăta o eficiență suficientă cu un număr mic de rate de cache (după cum știți, asociate cu costuri suplimentare). În cazul execuției paralele, fiecare ar avea semnificativ mai multe rate de cache, iar rezultatul final ar fi mai rău decât fără multithreading.
Mai multe informații despre mecanismul multithreading al RepPit 4 pot fi găsite în.

După ce ne-am ocupat de teoria multithreadingului, să luăm în considerare un exemplu practic - Pentium 4. Deja în stadiul dezvoltării acestui procesor, inginerii Intel au continuat să lucreze la creșterea performanței sale, fără a introduce modificări la interfața de programare. Au fost luate în considerare cinci moduri simple:

Creșterea frecvenței ceasului;

Amplasarea a două procesoare pe un microcircuit;

Introducerea de noi blocuri funcționale;

Extinderea transportorului;

Folosind multithreading.

Cel mai evident mod de a îmbunătăți performanța este de a crește viteza ceasului fără a modifica alți parametri. De regulă, fiecare model de procesor ulterior are o viteză de ceas ceva mai mare decât precedentul. Din păcate, cu o creștere liniară a frecvenței ceasului, dezvoltatorii se confruntă cu două probleme: o creștere a consumului de energie (care este importantă pentru computerele portabile și alte dispozitive de calcul care funcționează cu baterii) și supraîncălzirea (care necesită crearea unei călduri mai eficiente chiuvete).

A doua metodă - plasarea a două procesoare pe un microcircuit - este relativ simplă, dar implică dublarea suprafeței ocupate de microcircuit. Dacă fiecare procesor este furnizat cu propria memorie cache, numărul de jetoane de pe platou se reduce la jumătate, dar aceasta înseamnă și o dublare a costurilor de producție. Prin furnizarea unei cache partajate pentru ambele procesoare, se poate evita o creștere semnificativă a amprentei, dar în acest caz apare o altă problemă - cantitatea de memorie cache pe procesor este redusă la jumătate și acest lucru afectează inevitabil performanța. În plus, în timp ce aplicațiile server profesionale sunt capabile să utilizeze pe deplin resursele mai multor procesoare, în programele desktop obișnuite, paralelismul intern este mult mai puțin dezvoltat.

Introducerea de noi blocuri funcționale nu este, de asemenea, dificilă, dar este important să găsim un echilibru aici. Ce rost are o duzină de blocuri ALU dacă microcircuitul nu poate emite comenzi către transportor la o viteză atât de mare încât să poată fi încărcate toate aceste blocuri?

Un transportor cu un număr crescut de trepte, capabil să împartă sarcinile în segmente mai mici și să le proceseze în perioade scurte de timp, pe de o parte, crește productivitatea, pe de altă parte, mărește consecințele negative ale tranzițiilor nepredictite, pierderile din cache, întreruperile și alte evenimente care perturbă comenzile normale de procesare a fluxului în procesor. În plus, pentru a realiza pe deplin capabilitățile conductei extinse, este necesar să creșteți frecvența ceasului, iar acest lucru, după cum știm, duce la un consum crescut de energie și la disiparea căldurii.

În cele din urmă, puteți implementa multithreading. Avantajul acestei tehnologii este că introduce un fir software suplimentar pentru a aduce resurse hardware care altfel ar fi inactive. Pe baza rezultatelor studiilor experimentale, dezvoltatorii Intel au descoperit că o creștere cu 5% a suprafeței cipurilor atunci când implementează multithreading pentru multe aplicații are ca rezultat un câștig de performanță de 25%. Primul procesor Intel care a acceptat multithreading a fost Heon din 2002. Ulterior, începând de la 3,06 GHz, multithreading-ul a fost introdus în linia Pentium 4. Intel solicită implementarea multithreading-ului în Pentium 4 hyperthreading.

Introducere. Tehnologia computerelor se dezvoltă rapid. Dispozitivele de calcul devin mai puternice, mai compacte și mai convenabile, dar recent, îmbunătățirea performanței dispozitivelor a devenit o mare problemă. În 1965, Gordon Moore (unul dintre fondatorii Intel) a concluzionat că „numărul de tranzistoare plasate pe un cip de circuit integrat se dublează la fiecare 24 de luni”.

Primele dezvoltări în domeniul creării sistemelor multiprocesor au început în anii '70. Pentru o lungă perioadă de timp, performanța procesoarelor convenționale single-core a crescut prin creșterea frecvenței ceasului (până la 80% din performanță a fost determinată doar de frecvența ceasului), cu o creștere simultană a numărului de tranzistoare pe cip. Legile fundamentale ale fizicii au oprit acest proces: cipurile au început să se supraîncălzească, cel tehnologic a început să se apropie de dimensiunea atomilor de siliciu. Toți acești factori au condus la faptul că:

  • curenții de scurgere au crescut, în urma cărora a crescut generarea de căldură și consumul de energie.
  • procesorul a devenit mult mai "rapid" decât memoria. Performanță degradată din cauza latenței în accesarea RAM și încărcarea datelor în cache.
  • există așa ceva ca „gâtul de sticlă al lui von Neumann”. Înseamnă ineficiența arhitecturii procesorului atunci când executați un program.

Sistemele multiprocesor (ca una dintre modalitățile de a rezolva problema) nu au fost utilizate pe scară largă, deoarece au necesitat sisteme multiprocesor costisitoare și dificil de fabricat. plăci de bază... Pe baza acestui fapt, productivitatea a crescut în alte moduri. Conceptul de multithreading sa dovedit a fi eficient - procesarea simultană a mai multor fluxuri de comenzi.

Tehnologia Hyper-Threading (HTT) sau Tehnologia Hyper-Threading, care permite unui procesor să execute mai multe fire de execuție pe un singur nucleu. Este HTT care, potrivit multor experți, a devenit o condiție prealabilă pentru crearea de procesoare multi-core. Executarea mai multor fire de către un procesor în același timp se numește paralelism la nivel de fir (TLP - paralelism la nivel de fir).

Pentru a elibera potențialul unui procesor multicore, un program executabil trebuie să utilizeze toate nucleele de calcul, ceea ce nu este întotdeauna realizabil. Vechile programe secvențiale care pot utiliza un singur nucleu nu vor mai rula mai repede pe noua generație de procesoare, astfel încât programatorii sunt din ce în ce mai implicați în dezvoltarea de noi microprocesoare.

1. Concepte generale

Arhitectura în sensul cel mai larg este o descriere a unui sistem complex format din mai multe elemente.

În procesul de dezvoltare, structurile semiconductoare (microcircuite) evoluează, prin urmare, principiile procesorilor de construcție, numărul de elemente din compoziția lor, modul în care interacțiunea lor este organizată, se schimbă constant. Astfel, procesoarele cu aceleași principii de proiectare de bază sunt denumite de obicei procesoare de aceeași arhitectură. Și aceste principii în sine sunt numite arhitectură de procesor (sau microarhitectură).

Un microprocesor (sau procesor) este componenta principală a unui computer. Procesează informații, execută programe și controlează alte dispozitive din sistem. Cât de repede vor rula programele depinde de puterea procesorului.

Nucleul este coloana vertebrală a oricărui microprocesor. Este format din milioane de tranzistoare situate pe un cip de siliciu. Microprocesorul este împărțit în celule speciale numite registre scop general(RON) Lucrarea procesorului în general constă în recuperarea instrucțiunilor și a datelor din memorie într-o anumită succesiune și executarea acestora. În plus, pentru a crește viteza computerului, microprocesorul este echipat cu o memorie cache internă. Memoria cache este memoria interioară procesor folosit ca tampon (pentru a proteja împotriva întreruperilor în comunicarea cu RAM).

Procesoarele Intel utilizate în computerele compatibile IBM au mai mult de o mie de instrucțiuni și sunt denumite procesoare cu set de instrucțiuni extinse - procesoare CISC (CISC - Complex Instruction Set Computing).

1.1 Calcul de înaltă performanță. Paralelism

Ritmul de dezvoltare a tehnologiei de calcul este ușor de urmărit: de la ENIAC (primul computer digital electronic de uz general) cu o performanță de câteva mii de operații pe secundă la supercomputerul Tianhe-2 (1000 trilioane de operații în virgulă mobilă pe secundă). Aceasta înseamnă că viteza de calcul a crescut de un trilion de ori în 60 de ani. Crearea sistemelor de calcul performante este una dintre cele mai dificile probleme științifice și tehnice. Având în vedere că viteza calculelor mijloace tehnice a crescut doar de câteva milioane de ori, viteza generală de calcul a crescut de miliarde de ori. Acest efect se realizează datorită utilizării paralelismului în toate etapele de calcul. Calculul paralel necesită o căutare a alocării raționale a memoriei, metode fiabile de transfer de informații și coordonarea proceselor de calcul.

1.2 Multiprocesare simetrică

Multiprocesarea simetrică (prescurtată SMP) sau multiprocesarea simetrică este o arhitectură specială a sistemelor multiprocesor în care mai multe procesoare au acces la memoria partajată. Aceasta este o arhitectură foarte comună care a fost utilizată destul de mult în ultima vreme.

Atunci când utilizați SMP, mai multe procesoare funcționează simultan pe un computer, fiecare având propria sarcină. Un sistem SMP cu un sistem de operare de înaltă calitate distribuie rațional sarcinile între procesoare, oferind o sarcină uniformă pe fiecare dintre ele. Cu toate acestea, există o problemă cu accesul la memorie, deoarece chiar și sistemele uniprocesor necesită un timp relativ mare pentru a face acest lucru. Astfel, accesul la RAM în SMP are loc secvențial: mai întâi un procesor, apoi al doilea.

Datorită caracteristicilor enumerate mai sus, sistemele SMP sunt utilizate exclusiv în domeniul științific, industrie, afaceri și extrem de rar în birourile de lucru. În plus față de costul ridicat al implementării hardware, astfel de sisteme necesită software foarte scump și de înaltă calitate, care să asigure executarea multithread a sarcinilor. Programe regulate (jocuri, editori de text) nu va funcționa eficient în sistemele SMP, deoarece acestea nu prevăd acest grad de paralelism. Dacă adaptați orice program pentru un sistem SMP, atunci va deveni extrem de ineficient să lucrați pe sisteme uniprocesor, ceea ce duce la necesitatea creării mai multor versiuni ale aceluiași program pentru sisteme diferite. O excepție este, de exemplu, programul ABLETON LIVE (conceput pentru a crea muzică și a pregăti DJ-seturi), care are suport pentru sistemele multiprocesor. Dacă rulați un program obișnuit pe un sistem multiprocesor, acesta va rula încă puțin mai repede decât pe un sistem uniprocesor. Acest lucru se datorează așa-numitei întreruperi hardware (oprirea programului pentru procesare de către nucleu), care se execută pe un alt procesor gratuit.

Un sistem SMP (ca orice alt sistem bazat pe calcul paralel) impune cerințe sporite unui astfel de parametru de memorie precum lățimea de bandă a magistralei de memorie. Acest lucru limitează adesea numărul de procesoare din sistem (sistemele SMP moderne funcționează eficient până la 16 procesoare).

Deoarece procesoarele au memorie partajată, este nevoie de o utilizare rațională și de coordonarea datelor. Într-un sistem multiprocesor, se dovedește că mai multe cache funcționează pentru o resursă de memorie partajată. Coerența cache-ului este o proprietate cache care asigură integritatea datelor stocate în cache-urile individuale pentru o resursă partajată. Acest concept- un caz special al conceptului de coerență a memoriei, în care mai multe nuclee au acces la memoria partajată (omniprezentă în sistemele multicore moderne). Dacă descriem aceste concepte în termeni generali, imaginea va fi după cum urmează: același bloc de date poate fi încărcat în cache diferite, unde datele sunt procesate în moduri diferite.

Neutilizarea notificărilor privind modificarea datelor va duce la o eroare. Coerența cache-ului este concepută pentru a rezolva astfel de conflicte și pentru a menține coerența datelor în cache.

Sistemele SMP sunt un subgrup de MIMD (multi in-struction multi data) din clasificarea Flynn a sistemelor de calcul (profesor la Universitatea Stanford, cofondator al Palyn Associates). Conform acestei clasificări, aproape toate tipurile de sisteme paralele pot fi clasificate ca MIMD.

Împărțirea sistemelor multiprocesor în tipuri are loc pe baza împărțirii în conformitate cu principiul utilizării memoriei. Această abordare a făcut posibilă distincția între următoarele tipuri importante

sisteme multiprocesor - multiprocesoare (sisteme multiprocesor cu memorie partajată partajată) și multicomputere (sisteme cu memorie separată). Datele partajate utilizate în calcul paralel necesită sincronizare. Sarcina de sincronizare a datelor este una dintre cele mai importante probleme și soluția sa în dezvoltarea multiprocesorului și a multicorei și, în consecință, necesarul software este o prioritate pentru ingineri și programatori. Partajarea datelor se poate face prin alocarea fizică a memoriei. Această abordare se numește acces neuniform la memorie (NUMA).

Aceste sisteme includ:

  • Sisteme în care sunt utilizate numai cache-uri individuale ale procesorului pentru prezentarea datelor (arhitectură de memorie numai cache).
  • Sisteme cu furnizarea de coerență a cache-urilor locale pentru diferite procesoare (NUMA coerente în cache).
  • Sisteme cu acces partajat la memoria procesorului individual fără coerență cache bazată pe hardware (NUMA non-cache coerent).

Simplificarea problemei creării sistemelor multiprocesor se realizează prin utilizarea memoriei partajate distribuite, dar această metodă duce la o creștere vizibilă a complexității programării paralele.

1.3 Multithreading simultan

Pe baza tuturor dezavantajelor de mai sus ale multiprocesării simetrice, are sens să dezvoltăm și să dezvoltăm alte modalități de îmbunătățire a performanței. Dacă analizați activitatea fiecărui tranzistor individual din procesor, puteți acorda atenție unui foarte fapt interesant- la efectuarea majorității operațiilor de calcul, nu sunt implicate toate componentele procesorului (conform studiilor recente, aproximativ 30% din toate tranzistoarele). Astfel, dacă procesorul efectuează, să zicem, o operație aritmetică simplă, atunci cea mai mare parte a procesorului este inactivă, prin urmare, poate fi folosit pentru alte calcule. Deci, dacă în acest moment procesorul efectuează operații reale, atunci o operație aritmetică întreagă poate fi încărcată în partea liberă. Pentru a crește sarcina pe procesor, puteți crea execuția speculativă (sau anticipativă) a operațiilor, care necesită multă complexitate în logica hardware a procesorului. Dacă definiți în avans fire (secvențe de comenzi) în program care pot fi executate independent unul de celălalt, atunci acest lucru va simplifica semnificativ sarcina (această metodă este ușor de implementat la nivel hardware). Această idee, care aparține lui Dean Tulsen (dezvoltată de el în 1955 la Universitatea din Washington), se numește multithreading simultan. Ulterior a fost dezvoltat de Intel sub denumirea de hyper threading. Astfel, un procesor care execută mai multe fire este perceput de sistemul de operare. Sistem Windows ca mai multe procesoare. Utilizarea acestei tehnologii necesită din nou un nivel adecvat de software. Efectul maxim al utilizării tehnologiei multithreading este de aproximativ 30%.

1.4 Multicore

Tehnologia Multithreading este o implementare software a multicore. Creșterea suplimentară a performanței, ca întotdeauna, necesită modificări ale hardware-ului procesorului. Complicația sistemelor și arhitecturilor nu este întotdeauna eficientă. Există o părere opusă: „totul ingenios este simplu!”. Într-adevăr, pentru a crește performanța unui procesor, nu este deloc necesar să-i creșteți frecvența de ceas, să complicați componentele logice și hardware, deoarece este suficient doar să raționalizați și să rafinați tehnologia existentă. Această metodă este foarte benefică - nu este necesar să se rezolve problema creșterii disipării căldurii procesorului, dezvoltarea de noi echipamente scumpe pentru producerea de microcircuite. Această abordare a fost implementată în cadrul tehnologiei multicore - implementarea mai multor nuclee de calcul pe un singur cristal. Dacă luăm procesorul original și comparăm câștigurile de performanță atunci când implementăm mai multe metode de creștere a performanței, atunci este evident că utilizarea tehnologiei multicore este cea mai bună opțiune.

Dacă comparăm arhitecturile unui multiprocesor simetric și a unui multicore, acestea se vor dovedi aproape identice. Memoria cache de bază poate fi pe mai multe niveluri (locală și partajată, iar datele din RAM pot fi încărcate direct în memoria cache L2). Pe baza avantajelor considerate ale arhitecturii procesorului multi-core, producătorii se concentrează asupra acesteia. Această tehnologie sa dovedit a fi destul de ieftin de implementat și universal, ceea ce a făcut posibilă aducerea acestuia pe o piață largă. În plus, această arhitectură și-a făcut propriile ajustări la legea lui Moore: „numărul de nuclee de calcul dintr-un procesor se va dubla la fiecare 18 luni”.

Dacă vă uitați la piața modernă a hardware-ului computerului, puteți vedea că dispozitivele cu procesoare cu patru și opt nuclee domină. În plus, producătorii de procesoare susțin că în curând vor fi pe piață procesoare cu sute de nuclee de procesare. Așa cum s-a spus de multe ori înainte, întregul potențial al unei arhitecturi multicore este dezvăluit numai cu software de înaltă calitate. Astfel, sfera producției de hardware și software pentru computer este foarte strâns legată.