Nu ești un sclav!
Curs educațional închis pentru copiii de elită: „Adevărata aranjare a lumii”.
http://noslave.org
De la Wikipedia, enciclopedia liberă
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). | ||||||||||||||||||||||||||||||||||||
Tip de | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Autor |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Dezvoltator | ||||||||||||||||||||||||||||||||||||
Dezvoltatori |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Scris in |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Interfață |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Sistem de operare | ||||||||||||||||||||||||||||||||||||
Limbi de interfață |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Prima editie |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Platformă hardware | ||||||||||||||||||||||||||||||||||||
ultima versiune | ||||||||||||||||||||||||||||||||||||
eliberarea candidatului |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
versiune beta |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
versiunea alfa |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Versiune de testare |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Formate de fișiere care pot fi citite |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Formate de fișiere generate |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Stat |
Eroare Lua în Modulul:Wikidata pe linia 170: încercați să indexați câmpul „wikibase” (o valoare zero). |
|||||||||||||||||||||||||||||||||||
Licență |
Caracteristici cheie:
Compilatorul acceptă standardul OpenMP 3.0 pentru scrierea de programe paralele. Conține și o modificare a OpenMP numită Cluster OpenMP, cu care puteți rula aplicații scrise conform OpenMP pe clustere folosind MPI. Compilatorul Intel C++ utilizează o interfață (partea compilatorului care analizează programul compilat) de la Edison Design Group. Aceeași interfață este utilizată de compilatoarele SGI MIPSpro, Comeau C++, Portland Group. Acest compilator este utilizat pe scară largă pentru compilarea benchmark-urilor SPEC CPU. Există 4 serii de produse de la Intel care conțin compilatorul:
Dezavantajele versiunii Linux a compilatorului includ incompatibilitatea parțială cu extensiile GNU ale limbajului C (suportate de compilatorul GCC), care poate cauza probleme la compilarea unor programe.
Variante experimentaleAu fost publicate următoarele versiuni experimentale ale compilatorului:
Steaguri principale
Scrieți o recenzie despre articolul „Compilatorul Intel C++”NoteVezi siLegături
Un fragment care caracterizează compilatorul Intel C++Și totuși, s-a întors pentru a-l vedea pe Magul Alb pentru ultima oară... Soțul și cel mai adevărat prieten, pe care nu l-a putut uita niciodată. În inima ei, ea l-a iertat. Dar, spre marele lui regret, ea nu a putut să-i aducă iertarea Magdalenei... Așadar, după cum vezi, Isidora, marea fabulă creștină despre „iertare” este doar o minciună copilărească pentru credincioșii naivi care să le permită să facă orice. Rău, știind că orice ar face, vor fi în cele din urmă iertați. Dar poți ierta doar ceea ce este cu adevărat demn de iertare. O persoană trebuie să înțeleagă că trebuie să răspundă pentru orice rău făcut... Și nu în fața vreunui Dumnezeu tainic, ci în fața lui însuși, forțându-se să sufere cu cruzime. Magdalena nu l-a iertat pe Vladyka, deși l-a respectat profund și l-a iubit sincer. Așa cum ea nu a reușit să ne ierte pe toți pentru moartea cumplită a lui Radomir. La urma urmei, EA a fost cea care a înțeles cel mai bine - l-am putea ajuta, l-am putea salva de la o moarte cruntă... Dar nu am vrut. Considerând prea crudă vinovăția Magului Alb, ea l-a lăsat să trăiască cu această vinovăție, fără a o uita nicio clipă... Nu a vrut să-i acorde o iertare ușoară. Nu am mai văzut-o. Așa cum nu și-au văzut niciodată copiii. Printr-unul dintre cavalerii Templului ei - vrăjitorul nostru - Magdalena a transmis Domnului răspunsul la cererea sa de a se întoarce la noi: „Soarele nu răsare de două ori într-o singură zi... Bucuria lumii tale (Radomir) nu va răsări niciodată. intoarce-te la tine, asa cum nu ma voi intoarce la tine si eu... Mi-am gasit CREDINTA si ADEVĂRUL, ele sunt VIE, ale tale sunt MORT... Plante-ti fiii - te-au iubit. Nu te voi ierta niciodată pentru moartea lor atâta timp cât voi trăi. Și fie ca vina ta să rămână cu tine. Poate că într-o zi îți va aduce Lumină și Iertare... Dar nu de la mine. Capul magului Ioan nu a fost adus la Meteora din același motiv - niciunul dintre Cavalerii Templului nu a vrut să se întoarcă la noi... I-am pierdut, așa cum i-am pierdut pe mulți alții de mai multe ori, care nu au vrut să înțeleagă și acceptă-ne victimele... Cine este ca tine - au plecat, condamnându-ne.M-am simțit amețit!.. Însetat, satisfacându-mi veșnica foame de cunoaștere, am absorbit cu lăcomie fluxul de informații uimitoare oferite cu generozitate de Nord... Și mi-am dorit mult mai mult!.. Am vrut să știu totul până la capăt. . A fost o gură de apă dulce în deșertul pârjolit de durere și nenorocire! Și nu am putut să beau destul... Am o mie de întrebări! Dar nu mai este timp... Ce ar trebui să fac, Sever? .. - Întrebați, Isidora!.. Întrebați, voi încerca să vă răspund... - Spune-mi, Sever, de ce mi se pare că în această poveste două povești de viață, împletite cu evenimente similare, sunt legate și sunt prezentate ca viața unei singure persoane? Sau gresesc? – Ai perfectă dreptate, Isidora. După cum v-am spus mai devreme, „puternicii acestei lumi”, care au creat o istorie falsă a omenirii, „au îmbrăcat” pe adevărata viață a lui Hristos viața străină a profetului evreu Iosua, care a trăit acum o mie și jumătate de ani. (din povestea Nordului). Și nu numai el însuși, ci și familia lui, rudele și prietenii, prietenii și adepții săi. La urma urmei, era soția profetului Iosua, evreica Maria, care avea o soră Marta și un frate Lazăr, sora mamei sale Maria Yakobe și alții care nu au fost niciodată lângă Radomir și Magdalena. Așa cum nu mai erau alți „apostoli” lângă ei - Pavel, Matei, Petru, Luca și ceilalți... Familia profetului Iosua a fost cea care s-a mutat în urmă cu o mie și jumătate de ani în Provence (care la acea vreme se numea Galia (Galia Transalpină), în orașul grecesc Massalia (azi Marsilia), deoarece Massalia la acea vreme era „poarta” între Europa și Asia și era cea mai ușoară cale pentru toți cei „prigoniți” de a evita persecuția și nenorocirea.
|
Introducere La sfârșitul anului 2003, Intel a introdus versiunea 8.0 a colecției sale de compilatoare. Noile compilatoare sunt concepute pentru a îmbunătăți performanța aplicațiilor care rulează pe servere, computere desktop și sisteme mobile (laptop-uri, telefoane mobile și PDA-uri) bazate pe procesoare Intel. Suntem încântați să observăm că acest produs a fost creat cu participarea activă a angajaților Centrului de dezvoltare software Intel Nizhny Novgorod și a specialiștilor Intel de la Sarov.
Noua serie include compilatoare Intel pentru C++ și Fortran pentru Windows și Linux, precum și compilatoare Intel pentru C++ pentru Windows CE .NET. Compilatoarele vizează sisteme bazate pe următoarele procesoare Intel: Intel Itanium 2, Intel Xeon, Intel Pentium 4, procesoare Intel Personal Internet Client Architecture pentru telefoane mobile și PDA-uri și procesorul Intel Pentium M pentru PC-uri mobile (o componentă a tehnologiei Intel Centrino pentru telefoane mobile).PC).
Intel Visual Fortran Compiler pentru Windows oferă tehnologii de compilare de ultimă generație pentru calcularea de înaltă performanță. Combină funcționalitatea limbajului Compaq Visual Fortran (CVF) cu îmbunătățirile de performanță făcute posibile de tehnologiile Intel de compilare și optimizare pentru generarea de coduri și simplifică sarcina de portare. cod sursa, dezvoltat cu CVF, în mediul Intel Visual Fortran. Acest compilator este primul care implementează funcții CVF atât pentru sistemele Intel pe 32 de biți, cât și pentru sistemele bazate pe familia de procesoare Intel Itanium care rulează în Mediul Windows. În plus, acest compilator vă permite să implementați funcții de limbaj CVF pe sisteme Linux bazate pe procesoare Intel pe 32 de biți și familia de procesoare Intel Itanium. În 2004, este planificată lansarea unei versiuni extinse a acestui compilator - compilatorul Intel Visual Fortran Compiler Professional Edition pentru Windows, care va include biblioteca IMSL Fortran 5.0 dezvoltată de Visual Numerics, Inc.
„Noile compilatoare acceptă și viitoarele procesoare Intel, cu numele de cod Prescott, care oferă noi comenzi pentru a îmbunătăți performanța grafică și video, precum și alte îmbunătățiri ale performanței. tehnologie nouă Mobile MMX(tm), care îmbunătățește în mod similar performanța aplicațiilor grafice, sunet și video pentru telefoane mobile și PDA-uri, - a declarat Alexei Odinokov, co-director al Centrului de dezvoltare software Intel din Nijni Novgorod. - Aceste compilatoare oferă dezvoltatorilor de aplicații un singur set de instrumente pentru construirea de noi aplicații rețele fără fir bazat pe arhitectura Intel. Noile compilatoare Intel acceptă, de asemenea, tehnologia Intel Hyper-Threading și specificația industrială OpenMP 2.0, care definește utilizarea directivelor nivel inalt pentru a controla fluxul de instrucțiuni în aplicații”.
Printre noile instrumente incluse în compilatoare se numără instrumentele Intel Code Coverage și Intel Test Prioritization. Împreună, aceste instrumente ajută la accelerarea dezvoltării aplicațiilor și la îmbunătățirea calității aplicației prin îmbunătățirea procesului de testare. software.
Instrumentul Code Coverage, atunci când testează o aplicație, oferă detalii complete despre utilizarea logicii aplicației și locația zonelor utilizate în codul sursă al aplicației. Dacă se fac modificări în aplicație sau dacă acest test nu permite verificarea părții din aplicație care este de interes pentru dezvoltator, instrumentul de prioritizare a testelor vă permite să verificați funcționarea zonei selectate codul programului.
Noile compilatoare Intel vin într-o varietate de configurații, de la 399 USD la 1499 USD. Ele pot fi achiziționate astăzi de la Intel Corporation sau de la revânzători din întreaga lume, a căror listă se găsește pe site. http://www.intel.com/software/products/reseller.htm#Russia.
Suport pentru procesoare Prescott
Suportul pentru procesorul Intel Pentium 4 (Prescott) în cea de-a opta versiune a compilatorului este după cum urmează:1. Suport pentru comenzi SSE3 (sau PNI, Prescott New Instructions). Există trei moduri de a evidenția aici:
A. Inserții de asamblare (asamblare în linie). De exemplu, compilatorul va recunoaște următoarea utilizare a comenzii SSE3 _asm(addsubpd xmm0, xmm1). Astfel, utilizatorii interesați de optimizarea la nivel scăzut pot accesa direct comenzile de asamblare.
b. În compilatorul C/C++, instrucțiuni noi sunt disponibile de la un nivel mai înalt decât utilizarea inserțiilor de asamblare. Și anume, prin funcții încorporate (funcții intrinseci):
Funcții încorporate
functie incorporata | Comandă generată |
---|---|
_mm_addsub_ps | Addsubps |
_mm_hadd_ps | Haddps |
_mm_hsub_ps | Msubps |
_mm_moveldup_ps | Movsldup |
_mm_movehdup_ps | Movshdup |
_mm_addsub_pd | Addsubpd |
_mm_hadd_pd | Haddpd |
_mm_hsub_pd | hsubpd |
_mm_loaddup_pd | movddup xmm, m64 |
_mm_movedup_pd | movddup reg, reg |
_mm_lddqu_si128 | Lddqu |
Tabelul prezintă funcțiile încorporate și instrucțiunile de asamblare corespunzătoare din setul SSE3. Același suport există și pentru comenzile din seturile MMX\SSE\SSE2. Acest lucru permite programatorului să efectueze optimizarea codului de nivel scăzut fără a recurge la programarea în limbaj de asamblare: compilatorul însuși se ocupă de maparea (matarea „e) a funcțiilor încorporate la instrucțiunile de procesor corespunzătoare și de utilizarea optimă a registrelor. Programatorul poate concentrați-vă pe crearea unui algoritm care utilizează eficient seturi de instrucțiuni noi.
în. Generarea automată de noi comenzi de către compilator. Cele două metode anterioare implică utilizarea de noi comenzi de către programator. Dar compilatorul este, de asemenea, capabil (folosind opțiunile adecvate - vezi secțiunea 3 de mai jos) să genereze automat noi instrucțiuni din setul SSE3 pentru codul C/C++ și Fortran. De exemplu, comanda optimizată de încărcare nealiniată (lddqu), care vă permite să obțineți un câștig de performanță de până la 40% (de exemplu, în sarcinile de codare video și audio). Alte comenzi din setul SSE3 vă permit să obțineți o accelerare semnificativă în sarcinile de grafică 3D sau sarcinile de calcul folosind numere complexe. De exemplu, graficul din secțiunea 3.1 de mai jos arată că pentru aplicația 168.wupwise din suita SPEC CPU2000 FP, accelerarea obținută din generarea automată a instrucțiunilor SSE3 a fost de ~25%. Performanța acestei aplicații depinde în mare măsură de viteza aritmeticii numerelor complexe.
2. Utilizarea avantajelor microarhitecturale ale procesorului Prescott. La generarea codului, compilatorul ia în considerare modificările microarhitecturale din noul procesor. De exemplu, unele operații (cum ar fi deplasări întregi, înmulțiri întregi sau conversii de numere între diferite formate cu virgulă mobilă în SSE2) sunt mai rapide pe noul procesor în comparație cu versiunile anterioare (să zicem, o schimbare a întregului durează acum un ciclu de procesor față de patru pentru versiunea anterioară).Procesor Intel Pentium 4). Utilizarea mai intensă a unor astfel de comenzi vă permite să obțineți o accelerare semnificativă a aplicațiilor.
Un alt exemplu de modificări microarhitecturale este mecanismul îmbunătățit de redirecționare a magazinului (încărcare rapidă a datelor stocate anterior în memorie); salvarea reală nici măcar nu are loc în memoria cache, ci într-un buffer intermediar de salvare, care permite apoi accesul foarte rapid la date. O astfel de caracteristică a arhitecturii face posibilă, de exemplu, realizarea unei vectorizări automate mai agresive a codului programului.
Compilatorul ia în considerare, de asemenea, cantitatea crescută de memorie cache în primul și al doilea nivel.
3. Suport îmbunătățit pentru tehnologia Hyper-Threading. Acest articol poate fi legat de cel anterior - modificările microarhitecturale și utilizarea lor în compilator. De exemplu, o bibliotecă de rulare care acceptă specificația industrială OpenMP a fost optimizată pentru a rula pe noul procesor.
Performanţă
Utilizarea compilatoarelor este o modalitate simplă și eficientă de a profita de arhitecturile procesoarelor Intel. Mai jos sunt evidențiate condiționat (foarte) două moduri de utilizare a compilatoarelor: a) recompilarea programelor cu posibila schimbare setările compilatorului, b) recompilare cu o modificare atât a setărilor compilatorului, cât și a textului sursă, precum și utilizarea diagnosticelor compilatorului pentru optimizările în curs și posibila utilizare a altor instrumente software(de exemplu, profileri).1.1 Optimizarea programelor prin recompilare și modificarea setărilor compilatorului
Adesea, primul pas în migrarea la un nou compilator de optimizare este folosirea acestuia cu setările implicite. Următorul pas logic este utilizarea opțiunilor pentru o optimizare mai agresivă. Figurile 1, 2, 3 și 4 arată efectul trecerii la compilatorul Intel versiunea 8.0 în comparație cu utilizarea altor produse de vârf din industrie (-O2 - setări implicite ale compilatorului, bază - setări pe performanță maximă). Comparația se face pe arhitecturi Intel pe 32 și 64 de biți. Aplicațiile de la SPEC CPU2000 sunt folosite ca set de testare.
Poza 1
Figura 2
Figura 3
Figura 4
Unele dintre opțiuni sunt enumerate mai jos (în continuare, opțiunile sunt pentru familia de sisteme de operare Windows; pentru familia de sisteme de operare Linux, există opțiuni cu același efect, dar numele poate diferi; de exemplu, -Od sau QxK pentru Windows au o efect similar cu -O0 sau respectiv -xK pentru Linux, mai mult informatii detaliate poate fi găsit în manualul compilatorului) suportat de compilatorul Intel.
Controlul nivelurilor de optimizare: Opțiuni -Od (fără optimizări; folosit pentru programe de depanare), -O1 (viteză maximă în timp ce se minimizează dimensiunea codului), -O2 (optimizare pentru viteza de execuție a codului; folosită implicit), -O3 (permite optimizările cele mai agresive pentru execuția codului). viteza ; în unele cazuri poate duce la efectul opus, adică la o încetinire; trebuie remarcat că pe IA-64 utilizarea -O3 duce la accelerare în majoritatea cazurilor, în timp ce efectul pozitiv asupra IA-32 este mai puțin pronunțat ). Exemple de optimizări activate de -O3 sunt schimbul de bucle, fuziunea buclei, distribuția buclei (optimizarea fuziunii în buclă inversă), preluarea prealabilă a datelor prin software. Motivul pentru care este posibilă încetineala atunci când se utilizează -O3 poate fi că compilatorul a folosit o abordare euristică pentru a alege optimizarea agresivă pentru caz concret, fără a avea suficiente informații despre program (de exemplu, au generat instrucțiuni de prefatch pentru datele folosite în buclă, crezând că bucla este executată de un număr mare de ori, când de fapt are doar câteva iterații). Optimizarea profilării interprocedurale, precum și o varietate de „sfaturi” de programare (vezi Secțiunea 3.2) pot ajuta în această situație.
Optimizare interprocedurală: -Qip (într-un singur fișier) și -Qipo (în mai multe sau în toate fișierele de proiect). Include astfel de optimizări, cum ar fi, de exemplu, înlocuirea în linie a codului utilizat frecvent (reducerea costului apelării unei funcții/proceduri). Reprezintă informații pentru alte etape de optimizare - de exemplu, informații despre limita superioară a buclei (de exemplu, dacă este o constantă de timp de compilare definită într-un fișier, dar utilizată în multe) sau informații despre alinierea datelor în memorie (multe MMX Comenzile \SSE\SSE2\SSE3 funcționează mai rapid dacă operanzii sunt aliniați în memorie pe o limită de 8 sau 16 octeți). Analiza procedurilor de alocare a memoriei (implementate/apelate într-unul dintre fișierele de proiect) este trecută acelor funcții/proceduri în care se utilizează această memorie (acest lucru poate ajuta compilatorul să renunțe la presupunerea conservatoare că datele nu sunt aliniate corect în memorie; iar ipoteza ar trebui să fie conservatoare atunci când nu există informații suplimentare). Dezambiguizarea, analiza aliasing-ului de date poate servi ca un alt exemplu: în absența unor informații suplimentare și în imposibilitatea de a dovedi absența intersecțiilor, compilatorul pornește de la ipoteza conservatoare că există intersecții. O astfel de decizie poate afecta negativ calitatea unor astfel de optimizări, cum ar fi, de exemplu, vectorizarea automată pe IA-32 sau pipelining software (software pipelining sau SWP) pe IA-64. Optimizarea interprocedurală poate ajuta la analiza prezenței intersecțiilor de memorie.
Optimizarea profilurilor: Include trei etape. 1) generarea codului instrumentat folosind opțiunea -Qprof_gen. 2) codul rezultat este rulat pe date reprezentative, în timpul rulării, sunt colectate informații despre diferite caracteristici ale execuției codului (de exemplu, probabilitățile de tranziție sau o valoare tipică pentru numărul de iterații buclei). 3) Recopilare cu opțiunea -Qprof_use, care asigură că compilatorul folosește informațiile colectate în pasul anterior. Astfel, compilatorul are capacitatea de a utiliza nu numai estimări statice ale caracteristicilor importante ale programului, ci și date obținute în timpul unei rulări reale a programului. Acest lucru poate ajuta la alegerea ulterioară a anumitor optimizări (de exemplu, o aranjare mai eficientă în memorie a diferitelor ramuri ale programului, bazată pe informații despre ce ramuri au fost executate la ce frecvență; sau aplicarea unei optimizări la o buclă bazată pe informații despre numărul tipic de iterații din acesta) . Optimizarea profilării este utilă în special atunci când este posibil să selectați un set de date mic, dar reprezentativ (pentru pasul #2) care ilustrează bine cele mai tipice cazuri de utilizare viitoare ale programului. În unele domenii, alegerea unui astfel de set reprezentativ este destul de posibilă. De exemplu, optimizarea profilării este utilizată de dezvoltatorii DBMS.
Optimizările enumerate mai sus sunt de tip generic, adică. codul generat va funcționa pe toate procesoarele diferite ale familiei (să zicem, în cazul unei arhitecturi pe 32 de biți, pe toate următoarele procesoare: Intel Pentium-III, Pentium 4, inclusiv nucleul Prescott, Intel Pentium M). Există și optimizări pentru un anumit procesor.
Optimizări specifice procesorului: -QxK (Pentium-III; utilizarea comenzilor SSE, specificul microarhitecturii), -QxW și -QxN (Pentium 4; utilizarea comenzilor SSE și SSE2, specificul microarhitecturii), -QxB (Pentium M; utilizarea comenzilor SSE și SSE2, specificul microarhitecturii) ), QxP (Prescott; utilizarea comenzilor SSE, SSE2 și SSE3, caracteristici de microarhitectură). În acest caz, codul generat folosind aceste opțiuni poate să nu funcționeze pe alți reprezentanți ai familiei de procesoare (de exemplu, codul -QxW poate duce la executarea unei comenzi nevalide dacă este executată pe un sistem bazat pe un Intel Pentium-III procesor). Sau nu lucrați cu eficiență maximă (de exemplu, codul -QxB pe un procesor Pentium 4 din cauza diferențelor de microarhitectură). Cu aceste opțiuni, este, de asemenea, posibil să utilizați biblioteci de rulare optimizate pentru un anumit procesor folosind setul de instrucțiuni al acestuia. Pentru a controla ca codul să fie executat efectiv pe procesorul țintă, este implementat un mecanism de expediere (cpu-dispatch): verificarea procesorului în timpul execuției programului. În diverse situații, acest mecanism poate fi activat sau nu. Expedierea este întotdeauna utilizată dacă este utilizată variația opțiunii -Qax(KWNP). În acest caz, sunt generate două versiuni ale codului: optimizat pentru un anumit procesor și „general” (generic), alegerea are loc în timpul execuției programului. Astfel, prin creșterea dimensiunii codului, se poate realiza execuția programului pe toate procesoarele din linie și execuția optimă pe procesorul țintă. O altă opțiune este să utilizați optimizarea codului pentru reprezentantul anterior al liniei și să utilizați acest cod pe acest procesor și pe procesoarele ulterioare. De exemplu, codul -QxN poate rula pe un Pentium 4 cu nuclee Northwood și Prescott. Nu există o creștere a dimensiunii codului. Cu această abordare, puteți obține performanțe bune, dar încă nu optime pe un sistem cu procesor Prescott (pentru că nu se folosește SSE3 și nu sunt luate în considerare diferențele de microarhitectură) cu performanțe optime pe Northwood. Opțiuni similare există și pentru procesoarele cu arhitectură IA-64. În prezent există două: -G1 (Itanium) și -G2 (Itanium 2; opțiune implicită).
Graficul de mai jos (Figura 5) arată accelerarea (pe baza uneia - fără accelerare) din utilizarea unora dintre optimizările enumerate mai sus (și anume -O3 -Qipo -Qprof_use -Qx(N,P)) pe un procesor Prescott în comparație cu setările implicite (-O2). Utilizarea -QxP ajută, în unele cazuri, să obțineți o accelerare în comparație cu -QxN. Cea mai mare accelerare este atinsă în aplicația 168.wupwise deja menționată în secțiunea anterioară (datorită optimizării intensive a aritmeticii complexe folosind instrucțiunile SSE3).
Figura 5
Figura 6 de mai jos arată raportul (în timp) dintre viteza codului cu setări optime comparativ cu codul complet neoptimizat (-Od) pe procesoarele Pentium 4 și Itanium 2. Se poate observa că Itanium 2 depinde mult mai mult de calitatea optimizării. Acest lucru este deosebit de pronunțat pentru calculele cu virgulă mobilă (FP), unde raportul este de aproximativ 36 de ori. Calculele cu virgulă mobilă sunt punct forte Arhitecturile IA-64, dar trebuie avut grijă să folosiți cele mai eficiente setări ale compilatorului. Câștigul de productivitate rezultat plătește forța de muncă cheltuită pentru găsirea acestora.
Figura 6. Accelerație la utilizarea celor mai bune opțiuni de optimizare SPEC CPU200
Compilatoarele Intel acceptă specificația industrială OpenMP pentru construirea de aplicații multi-threaded. Paralelizarea explicită (opțiunea -Qopenmp) și automată (-Qparallel) sunt acceptate. În cazul modului explicit, programatorul este responsabil pentru utilizarea corectă și eficientă a standardului OpenMP. În cazul paralelizării automate, compilatorul are o sarcină suplimentară asociată cu analiza codului programului. Din acest motiv, în prezent, paralelizarea automată funcționează eficient doar pe coduri destul de simple.
Graficul din Figura 7 arată accelerația de la utilizarea paralelizării explicite pe un sistem de probă de inginerie (pre-producție) bazat pe un procesor Intel Pentium 4 (Prescott) cu suport pentru tehnologie Hyper-Threading: 2,8 GHz, 2 GB RAM, 8K L1-Cache, 512K L2-Cache . SPEC OMPM2001 este folosit ca suită de testare. Acest set se concentrează pe sisteme SMP mici și medii, consumul de memorie este de până la doi gigaocteți. Aplicațiile au fost compilate folosind Intel 8.0 C/C++ și Fortran cu două seturi de opțiuni: -Qopenmp -Qipo -O3 -QxN și -Qopenmp -Qipo -O3 -QxP, cu fiecare dintre acestea aplicațiile pornind cu Hyper-Threading activat și dezactivat . Valorile accelerației de pe grafic sunt normalizate la performanța versiunii cu un singur thread cu Hyper-Threading dezactivat.
Figura 7: Aplicații din suita SPEC OMPM2001 pe un procesor Prescott
Se poate observa că în 9 din 11 cazuri, utilizarea paralelizării explicite folosind OpenMP oferă o creștere a performanței atunci când tehnologia Hyper-Threading este activată. O aplicație (312.swim) se confruntă cu încetiniri. Acesta este un fapt cunoscut: aceasta aplicație caracterizat printr-un grad ridicat de dependenţă de lățime de bandă memorie. Ca și în cazul SPEC CPU2000, wupwise beneficiază foarte mult de optimizările Prescott (-QxP).
1.2 Optimizarea programelor cu modificări ale codului sursă și utilizarea diagnosticelor compilatorului
În secțiunile anterioare, am luat în considerare influența compilatorului (și a setărilor acestuia) asupra vitezei de execuție a codului. În același timp, compilatoarele Intel oferă mai multe oportunități de optimizare a codului decât doar schimbarea setărilor. În special, compilatoarele permit programatorului să facă „hints” în codul programului, care permit generarea unui cod mai eficient din punct de vedere al performanței. Mai jos sunt câteva exemple pentru limbajul C/C++ (există instrumente similare pentru limbajul Fortran, care diferă doar prin sintaxă).
#pragma ivdep (unde ivdep înseamnă ignorarea dependențelor vectoriale) este folosit înainte de buclele programului pentru a spune compilatorului că nu există dependențe de date în interior. Acest indiciu funcționează atunci când compilatorul (pe baza analizei) presupune în mod conservator că astfel de dependențe pot exista (dacă compilatorul poate dovedi că dependența există ca urmare a analizei, atunci „hint” nu are efect), în timp ce autorul codului știe că astfel de dependențe nu pot apărea. Cu acest indiciu, compilatorul poate genera cod mai eficient: vectorizare automată pentru IA-32 (folosind instrucțiuni vectoriale din seturile MMX\SSE\SSE2\SSE3 pentru buclele de program C/C++ și Fortran; puteți afla mai multe despre această tehnică, pentru exemplu, în continuare articol în Intel Technology Journal), pipeline software (SWP) pentru IA-64.
#pragma vector este întotdeauna folosit pentru a forța compilatorul să schimbe decizia cu privire la ineficiența vectorizării buclei (atât automată pentru IA-32, cât și SWP pentru IA-64), pe baza unei analize a caracteristicilor cantitative și calitative ale lucrării la fiecare repetare.
#pragma novector face întotdeauna opusul #pragma vector.
#pragma vector aligned este folosit pentru a spune compilatorului că datele utilizate în buclă sunt aliniate pe o limită de 16 octeți. Acest lucru vă permite să generați cod mai eficient și/sau compact (din cauza lipsei verificărilor de rulare).
#pragma vector unaligned face opusul #pragma aligned. Este greu să vorbim despre câștiguri de performanță în acest caz, dar poți conta pe un cod mai compact.
Punctul de distribuție #pragma este folosit în bucla programului, astfel încât compilatorul să poată împărți bucla de distribuție în acest punct în câteva mai mici. De exemplu, un astfel de „hint” poate fi folosit atunci când compilatorul nu reușește să vectorizeze automat bucla sursă (de exemplu, din cauza unei dependențe de date care nu poate fi ignorată nici măcar cu #pragma ivdep), în timp ce fiecare (sau o parte) din noua ciclurile formate pot fi vectorizate eficient.
#pragma loop count (N) este folosit pentru a-i spune compilatorului că cea mai probabilă valoare pentru numărul de iterații ale buclei va fi N. Aceste informații vă ajută să decideți cu privire la cea mai eficientă optimizare pentru această buclă (de exemplu, dacă să derulați , dacă să faceți SWP sau vectorizare automată, dacă să utilizați comenzile de preluare preliminară a datelor software, ...)
„Hint” _assume_aligned(p, base) este folosit pentru a spune compilatorului că regiunea de memorie asociată cu pointerul p este aliniată pe o limită de bază = 2^n octeți.
Acest lucru este departe de lista plina diverse „sfaturi” pentru compilator, care pot afecta semnificativ eficiența codului generat. Poate apărea întrebarea cum să determinați că compilatorul are nevoie de un indiciu.
În primul rând, puteți utiliza diagnosticarea compilatorului sub formă de rapoarte pe care le oferă programatorului. De exemplu, folosind opțiunea -Qvec_reportN (unde N variază de la 0 la 3 și reprezintă nivelul de detaliu) puteți obține un raport de vectorizare automată. Programatorul va avea acces la informații despre ce bucle au fost vectorizate și care nu. În caz contrar, compilatorul raportează motivele pentru care vectorizarea a eșuat. Să presupunem că cauza a fost o dependență presupusă conservator de date. În acest caz, dacă programatorul este sigur că dependența nu poate apărea, atunci poate fi folosit #pragma ivdep. Compilatorul oferă capabilități similare (comparând cu Qvec_reportN pentru IA-32) pe IA-64 pentru a controla prezența și eficacitatea SWP. În general, compilatoarele Intel oferă oportunități ample pentru diagnosticarea optimizărilor.
În al doilea rând, alte produse software (cum ar fi Intel VTune profiler) pot fi folosite pentru a găsi blocaje de performanță în cod. Rezultatele analizei pot ajuta programatorul să facă modificările necesare.
De asemenea, puteți utiliza lista de cod de asamblare generată de compilator pentru analiză.
Figura 8
Figura 8 de mai sus arată procesul pas cu pas de optimizare a unei aplicații folosind un compilator (și altele produse software) Intel în limbajul Fortran pentru arhitectura IA-64. De exemplu, este luată în considerare o schemă de prognoză regională non-adiabatică pentru 48 de ore a Roshydrometcenter (puteți citi despre aceasta, de exemplu, în acest articol. Articolul vorbește despre timpul de calcul de aproximativ 25 de minute, dar au avut loc modificări semnificative de când a fost scris.Performanța codului este luată ca punct de plecare pe un sistem Cray-YMP Codul nemodificat cu opțiuni implicite de compilare (-O2) a arătat un câștig de performanță de 20% pe un sistem cu 4 căi bazat pe un Intel Itanium 2 900 MHz procesor Aplicarea unei optimizări mai agresive (-O3) a dus la o accelerare de ~2,5 ori fără modificarea codului, în principal din cauza SWP și a preluării datelor. Analiza folosind diagnosticarea compilatorului și profilul Intel VTune a dezvăluit unele blocaje. De exemplu, compilatorul nu a canalizat programatic mai multe performanțe- bucle critice, raportând în raport că sugerează dependența de date. Mici modificări ale codului (directiva ivdep) au ajutat la obținerea efectului transport activ. Folosind VTune profiler, s-a constatat (și raportul compilatorului a confirmat acest lucru) că compilatorul nu a schimbat ordinea buclelor imbricate (loop interchange) pentru o utilizare mai eficientă a memoriei cache. Motivul au fost din nou ipotezele conservatoare cu privire la dependența de date. Au fost făcute modificări în codul sursă al programului. Drept urmare, am reușit să obținem o accelerație de 4 ori în raport cu versiunea inițială. Folosind paralelizarea explicită cu directivele OpenMP și apoi trecerea la un sistem cu mai mult de frecventa inalta a permis reducerea timpului de calcul la mai puțin de 8 minute, ceea ce a dat o accelerare de peste 16 ori mai mare decât versiunea inițială.
Intel Visual Fortran
Intel Visual Fortran 8.0 folosește front-end (parte a compilatorului responsabilă pentru conversia programului din text în limbajul de programare în reprezentarea internă a compilatorului, care este în mare parte independentă fie de limbajul de programare, fie de mașina țintă), compilatorul CVF tehnologii și componente ale compilatorului Intel, responsabile de un set de optimizări și generare de cod.Figura 9
Figura 10
Figurile 9 și 10 prezintă grafice de comparație Performanță Intel Visual Fortran 8.0 cu versiunea anterioară a Intel Fortran 7.1 și cu alți compilatoare renumiți din acest limbaj care rulează sub sistemul de operare Familiile de ferestreși Linux. Pentru comparație, s-au folosit teste ale căror texte sursă, îndeplinesc standardele F77 și F90, sunt disponibile la http://www.polyhedron.com/. Pe același site, sunt disponibile informații mai detaliate despre compararea performanței compilatorului (Comparații compilatorului Win32 -> Fortran (77, 90) Benchmarks timp de execuție și comparații compilatoare Linux -> Fortran (77, 90) Benchmarks timp de execuție): sunt mai multe compilatoare diferite. este prezentată, iar media geometrică este dată împreună cu rezultatele individuale pentru fiecare test.
În numărul precedent al revistei, am discutat despre produse din familia Intel VTune Performance Analyzer - instrumente de analiză a performanței care sunt binemeritat populare în rândul dezvoltatorilor de aplicații și vă permit să detectați comenzi în codul aplicației care consumă prea multe resurse de procesor, ceea ce oferă dezvoltatorilor oportunitatea de a identifica și elimina potențiale blocaje asociate cu secțiuni similare de cod, accelerând astfel procesul de dezvoltare a aplicațiilor. Rețineți, totuși, că performanța aplicațiilor depinde în mare măsură de cât de eficiente sunt compilatoarele utilizate în dezvoltarea lor și de ce caracteristici hardware folosesc atunci când generează codul mașinii.
Cele mai recente compilatoare Intel C++ și Intel Fortran pentru Windows și Linux oferă câștiguri de performanță de până la 40% în performanța aplicațiilor pentru sistemele bazate pe procesoare Intel Itanium 2, Intel Xeon și Intel Pentium 4 față de compilatoarele existente de la alți furnizori, prin utilizarea acestor caracteristici ale acestora. procesoare, cum ar fi tehnologia Hyper-Threading.
Diferențele asociate cu optimizarea codului de către această familie de compilatoare includ utilizarea unei stive pentru a efectua operațiuni în virgulă mobilă, optimizarea interprocedurală (Interprocedural Optimization, IPO), optimizarea în conformitate cu profilul aplicației (Profile Guided Optimization, PGO), preîncărcarea datelor în memoria cache (Data prefetching), care evită întârzierea asociată accesului la memorie, suport pentru caracteristici caracteristice procesoarelor Intel (de exemplu, extensii pentru procesarea datelor în flux Intel Streaming SIMD Extensions 2, specifice Intel Pentium 4), paralelizarea automată a execuției codului , crearea de aplicații, rularea pe multiple tipuri diferite procesoare la optimizarea pentru unul dintre ele, mijloace de „predicție” a codului ulterior (predicția de ramuri), suport extins pentru lucrul cu fire de execuție.
Rețineți că compilatoarele Intel sunt utilizate în companii cunoscute precum Alias/Wavefront, Oracle, Fujitsu Siemens, ABAQUS, Silicon Graphics, IBM. Pe baza testelor independente efectuate de un număr de companii, performanța compilatoarelor Intel depășește semnificativ compilatoarele de la alți producători (a se vedea, de exemplu, http://intel.com/software/products/compilers/techtopics/compiler_gnu_perf.pdf).
Mai jos vom analiza câteva dintre caracteristici ultimele versiuni Compilatoare Intel pentru desktop și server sisteme de operare.
Compilatoare pentru platforma Microsoft Windows
Intel C++ Compiler 7.1 pentru Windows
Intel C++ Compiler 7.1 este un compilator lansat la începutul acestui an care atinge un grad ridicat de optimizare a codului pentru procesoarele Intel Itanium, Intel Itanium 2, Intel Pentium 4 și Intel Xeon, precum și pentru procesorul Intel Pentium M folosind Tehnologia Intel Centrino și conceput pentru utilizarea pe dispozitive mobile.
Compilatorul specificat este pe deplin compatibil cu instrumentele de dezvoltare Microsoft Visual C++ 6.0 și Microsoft Visual Studio .NET: Poate fi construit în medii de dezvoltare adecvate.
Acest compilator acceptă standardele ANSI și ISO C/C++.
Intel Fortran Compiler 7.1 pentru Windows
Intel Fortran Compiler 7.1 pentru Windows, lansat și la începutul acestui an, vă permite să creați cod optimizat pentru procesoarele Intel Itanium, Intel Itanium 2, Intel Pentium 4 și Intel Xeon, Intel Pentium M.
Acest compilator este pe deplin compatibil cu instrumentele de dezvoltare Microsoft Visual C++ 6.0 și Microsoft Visual Studio .NET, adică poate fi integrat în mediile de dezvoltare corespunzătoare. În plus, acest compilator vă permite să dezvoltați aplicații pe 64 de biți pentru sistemele de operare care rulează pe procesoare Itanium / Itanium 2, cu ajutor de la Microsoft Visual Studio pe un procesor Pentium pe 32 de biți folosind compilatorul Intel Fortran pe 64 de biți. Când depanați codul, acest compilator vă permite să utilizați depanatorul pentru platforma Microsoft .NET.
Dacă aveți instalat Compaq Visual Fortran 6.6, puteți utiliza Intel Fortran Compiler 7.1 în loc de compilatorul original, deoarece aceste compilatoare sunt compatibile la nivel de cod sursă.
Intel Fortran Compiler 7.1 pentru Windows este pe deplin compatibil cu standardul ISO Fortran 95 și acceptă crearea și depanarea aplicațiilor bilingve C și Fortran.
Compilatoare pentru platforma Linux
Intel C++ Compiler 7.1 pentru Linux
Un alt compilator care a fost lansat la începutul anului, Intel C++ Compiler 7.1 pentru Linux, vă permite să obțineți un grad ridicat de optimizare a codului pentru procesoarele Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Acest compilator este complet compatibil cu compilatorul GNU C la nivel de cod sursă și module obiect, permițând migrarea la acesta fără costuri suplimentare aplicațiilor construite cu GNU C.sisteme de operare SCO, versiuni timpurii ale Sun Solaris etc.), ceea ce înseamnă compatibilitate deplină cu compilatorul gcc 3.2 la nivel binar. În cele din urmă, cu Intel C++ Compiler 7.1 pentru Linux, puteți chiar să recompilați nucleul Linux cu câteva modificări minore la codul sursă.
Intel Fortran Compiler 7.1 pentru Linux
Compilatorul Intel Fortran Compiler 7.1 pentru Linux vă permite să creați cod optimizat pentru procesoarele Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Acest compilator este pe deplin compatibil cu compilatorul Compaq Visual Fortran 6.6 la nivel de cod sursă, permițând să recompilați aplicațiile cu acesta create cu Compaq Visual Fortran, îmbunătățindu-le astfel performanța.
În plus, compilatorul specificat este compatibil cu utilitățile utilizate de dezvoltatori, cum ar fi editorul emacs, depanatorul gdb și utilitarul make application build.
La fel ca versiunea Windows a acestui compilator, Intel Fortran Compiler 7.1 pentru Linux este pe deplin compatibil cu standardul ISO Fortran 95 și acceptă crearea și depanarea aplicațiilor care conțin cod în două limbi C și Fortran.
Trebuie subliniat faptul că o contribuție semnificativă la crearea compilatoarelor Intel enumerate a fost adusă de specialiștii de la Centrul rus Intel pentru Dezvoltare Software din Nijni Novgorod. Mai multe informații despre compilatoarele Intel pot fi găsite pe site-ul Web Intel la: www.intel.com/software/products/ .
A doua parte a acestui articol va fi dedicată compilatoarelor Intel care creează aplicații pentru dispozitive mobile.