A opta versiune a compilatoarelor Intel. Compilatoare pentru platforma Microsoft Windows

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ă

Compilator Intel C++
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:

  • Vectorizare pentru SSE, SSE2, SSE3, SSE4

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:

  • Intel C++ Compiler Professional Edition
  • Intel Cluster Toolkit (Compiler Edition)

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 experimentale

Au fost publicate următoarele versiuni experimentale ale compilatorului:

  • Intel STM Compiler Prototype Edition din 17 septembrie 2007. Suport pentru memoria tranzacțională software (STM). Lansat numai pentru Linux și Windows, IA-32 (procesoare x86);
  • Intel Concurrent Collections pentru C/C++ 0.3, septembrie 2008. Conține mecanisme care facilitează scrierea de programe paralele C++.

Steaguri principale

Windows Linux, Mac OSX Descriere
/od -O0 Dezactivați optimizările
/O1 -O1 Optimizați pentru a minimiza dimensiunea fișierului executabil
/O2 -O2 Optimizați pentru viteză. Unele optimizări incluse
/O3 -O3 Activați toate optimizările din O2. Efectuați, de asemenea, optimizări intensive ale buclei
/Oip -Oip Activați optimizarea interprocedurală per fișier
/Oipo -Oipo Activați optimizarea inter-procedurală globală
/QxO -xO Permite utilizarea extensiilor SSE3, SSE2 și SSE pentru procesoarele fabricate de orice companie
/rapid -rapid „Mod rapid”. Echivalent cu „/O3 /Qipo /QxHost /no-prec-div” pe Windows și „-O3 -ipo -static -xHOST -no-prec-div” pe Linux. Rețineți că flagul „-xHOST” înseamnă optimizare pentru procesorul pe care rulează compilatorul.
/Qprof-gen -prof_gen Creați o versiune instrumentată a programului care va asambla profilul de execuție
/Qprof-utilizare -prof_use Profitați de informațiile de profil din lansările de programe compilate cu steag prof_gen.

Scrieți o recenzie despre articolul „Compilatorul Intel C++”

Note

Vezi si

Legă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 incorporataComandă generată
_mm_addsub_psAddsubps
_mm_hadd_psHaddps
_mm_hsub_psMsubps
_mm_moveldup_psMovsldup
_mm_movehdup_psMovshdup
_mm_addsub_pdAddsubpd
_mm_hadd_pdHaddpd
_mm_hsub_pdhsubpd
_mm_loaddup_pdmovddup xmm, m64
_mm_movedup_pdmovddup reg, reg
_mm_lddqu_si128Lddqu

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.

Exemple de hack-uri reale: Intel C++ 7.0 Compiler — Arhiva WASM.RU

…compilatorul Intel C++ 7.0 a fost descărcat noaptea târziu, în jurul orei 5:00 dimineața. Îmi doream să dorm incredibil, dar curiozitatea: dacă protecția a fost întărită sau nu, s-a sfâșiat și ea. Hotărând că până nu mă ocup de protecție, tot nu voi adormi, eu, după ce am deschis noua consola, și reinstalând variabilele de sistem TEMP și TMP în directorul C:\TEMP, a tastat în grabă numele de instalare indecent lung W_CC_P_7.0.073.exe pe linia de comandă (necesitatea de a seta variabilele TEMP și TMP este explicată prin faptul că în Windows 2000 indică un director imbricat foarte adânc, iar programul de instalare Intel C++ - și nu numai acesta - nu acceptă astfel de căi uriașe).

Imediat a devenit clar că politica de protecție a fost revizuită radical și acum prezența unei licențe a fost verificată deja în etapa de instalare a programului (în versiunea 5.x, instalarea a fost efectuată fără probleme). OK, dăm comanda dir și ne uităm la conținutul a ceea ce trebuie să luptăm acum:

    Conținutul folderului C:\TMP\IntelC++Compiler70

    17.03.2003 05:10

    html

    17.03.2003 05:11

    x86

    17.03.2003 05:11

    Itanium

    17.03.2003 05:11

    note

    06/05/2002 10:35 45 056 AutoRun.exe

    07/10/2001 12:56 27 autorun.inf

    29.10.2002 11:25 2.831 ccompindex.htm

    24.10.2002 08:12 126 976 ChkLic.dll

    18.10.2002 10:37 552 960 chklic.exe

    17.10.2002 16:29 28.663 CLicense.rtf

    17.10.2002 16:35 386 creditt.txt

    16.10.2002 17:02 34 136 Crelnotes.htm

    19.03.2002 14:28 4.635 PLSuite.htm

    21.02.2002 12:39 2 478 register.htm

    02.10.2002 14:51 40 960 Setup.exe

    02.10.2002 10:40 151 Setup.ini

    10.07.2001 12:56 184 setup.mwg

    19 fișiere 2.519.238 octeți

    6 foldere 886 571 008 octeți liberi

Aha! Programul de instalare setup.exe durează doar patruzeci și ceva de kiloocteți. Foarte bine! Cu greu puteți ascunde o protecție serioasă într-un astfel de volum și, chiar dacă da, acest fișier minuscul nu costă nimic de analizat în întregime - până la ultimul octet al listei de dezasamblare. Cu toate acestea, nu este un fapt că codul de securitate se află exact în setup.exe, acesta poate fi localizat în alt loc, de exemplu... ChkLic.dll / ChkLic.exe, care împreună ocupă puțin mai puțin de șapte sute de kiloocteți . Stai, ce este ChkLic? Este prescurtarea pentru Check License? Băieții de la Intel au probleme serioase cu simțul umorului. Ar fi mai bine dacă ar numi acest fișier „Hack Me” sincer! Ei bine, judecând după volum, ChkLic este același FLEX lm și l-am întâlnit deja (vezi „Compilatorul Intel C++ 5.0”) și imaginează-ți cum să-l spargem.

Dăm comanda „dumpbin / EXPORTS ChkLic.dll” pentru a examina funcțiile exportate și... țineți-vă bine de Klava pentru a nu cădea de pe scaun:

    Dump-ul fișierului ChkLic.dll

  1. Secțiunea conține următoarele exporturi pentru ChkLic.dll

    0 caracteristici

    3DB438B4 ștampila datei oră Luni 21 octombrie 21:26:12 2002

  2. 1 număr de funcții

    1 număr de nume

    indiciu ordinal nume RVA

    1 0 000010A0_CheckValidLicense

La naiba! Protecția exportă doar o singură funcție cu minunatul nume CheckValidLicense. „Remarcabil” - deoarece scopul funcției devine clar din numele ei și devine posibil să se evite analiza minuțioasă a codului de dezasamblare. Ei bine, au recaptat orice interes... ar fi mai bine să-l exporte într-un ordinal sau așa ceva, sau cel puțin să-l boteze un fel de nume înspăimântător precum DES Decrypt.

... visând! Bine, înapoi la oile noastre. Să ne gândim logic: dacă tot codul de securitate se află direct în ChkLic.dll (și, judecând după natura „articulată” a securității, acest lucru este adevărat), atunci toată „protecția” se reduce la apelarea CheckValidLicense de la Setup.exe și verificând rezultatul returnat de acesta. Prin urmare, pentru a „hack” este suficient doar să patchezi ChkLic.dll, forțând funcția ChekValidLicense să revină mereu... apropo, ce ar trebui să returneze? Mai exact: care este mai exact valoarea returnată corespunzătoare unei verificări reușite a licenței? Nu, nu vă grăbiți să dezasamblați setup.exe pentru a afla, pentru că nu există atât de multe opțiuni posibile: fie FALSE, fie ADEVĂRAT. Pariezi pe TRUE? Ei bine, într-un fel, acest lucru este logic, dar pe de altă parte: de ce am decis, de fapt, că funcția CheckValidLicense returnează exact steag-ul de succes al operației, și nu codul de eroare? La urma urmei, trebuie să motiveze cumva motivele refuzului de a instala compilatorul: fișierul cu licența nu a fost găsit, fișierul este deteriorat, licența a expirat și așa mai departe? Bine, să încercăm să returnăm un zero, iar dacă nu funcționează, vom returna unul.

OK, pune-ți centura, hai să mergem! Lansăm HIEW, deschidem fișierul ChkLic.dll (dacă nu se deschide, amintiți-vă de gophers de trei ori, îl copiam temporar în rădăcină sau în orice alt director care nu conține caractere speciale în numele său care nu-i plac pe „y” atat de mult). Apoi, revenind din nou la tabelul de export obtinut folosind dumpbin, determinam adresa functiei CheckValidLicense (in acest caz, 010A0h) si prin "10A0" trecem la inceputul ei. Acum, il taiem live, suprascriind peste vechiul cod „XOR EAX, EAX / RETN 4. De ce exact „REN 4”, și nu doar „RET”? Da, deoarece funcția acceptă convenția stdcall, care poate fi aflată uitându-se la epilogul său în HIEW " e (doar derulați în jos ecranul dezasamblatorului până când întâlniți RET).

Se verifică... Funcționează!!! În ciuda absenței unei licențe, instalatorul începe instalarea fără a pune prea multe întrebări! Deci apărarea a căzut. Oh, nu ne vine să credem că totul este atât de simplu și, pentru a nu sta, privind în gol la monitor în timp ce așteptăm finalizarea procesului de instalare a programului, am setat dezasamblatorul nostru IDA preferat pe setup.exe. Primul lucru care vă atrage atenția este absența CheckValidLicense în lista de funcții importate. Poate lansează cumva fișierul ChkLic.exe? Să încercăm să găsim legătura corespunzătoare printre șirurile recunoscute automat: „~View aNames”, „ChkLic”... da, șirul „Chklic.exe” nu este deloc aici, dar „Chklic.dll” este găsit. Da, văd, asta înseamnă că biblioteca ChkLic este încărcată printr-o legătură explicită prin LoadLibrary. Și în urma referințelor încrucișate confirmă acest lucru:

    Text:0040175D push offset aChklic_dll ; lpLibFileName

    Text:00401762 apel ds:LoadLibraryA

    Text:00401762; încărcați ChkLic.dll ^^^^^^^^^^^^^^^^^^

    Text:00401762;

    Text:00401768 mov esi,eax

    Text:0040176A push offset a_checkvalidlic ; lpProcName

    Text:0040176F push esi ; hModul

    Text:00401770 apel ds:GetProcAddress

    Text:00401770; obțineți adresa funcției CheckValidLicense

    Text:00401770;

    Text:00401776 cmp esi, ebx

    Text:00401778 jz loc_40192E

    Text:00401778; dacă nu există o astfel de bibliotecă, atunci părăsiți programul de instalare

    Text:00401778;

    Text:0040177E cmp eax, ebx

    Text:00401780 jz loc_40192E

    Text:00401780; dacă nu există o astfel de funcție în bibliotecă, atunci părăsiți instalarea

    Text:00401780;

    Text: 00401786 push ebx

    Text: 00401787 apel eax

    Text:00401787; apelați funcția CheckValidLicense

    Text:00401787;

    Text:00401789 test eax, eax

    Text:0040178B jnz loc_4019A3

Text:0040178; dacă funcția a returnat diferit de zero, atunci părăsiți programul de instalare

Incredibil, această apărare teribil de primitivă este construită exact așa! Mai mult decât atât, fișierul ChkLic.exe de jumătate de metru nu este deloc necesar! Și de ce a meritat să-l tragi de pe Internet? Apropo, dacă decideți să salvați distribuția compilatorului (atenție: nu am spus „distribuie”), atunci pentru a economisi spațiu pe disc, puteți șterge ChkLic. ChkLic.dll, care exportă funcția stdcall CheckValidLicence de forma: int CheckValidLicence(int some_flag) ( returnează 0;)

Deci, în timp ce discutam despre toate acestea, programul de instalare a terminat de instalat compilatorul și și-a încheiat cu succes munca. Dacă este interesant dacă compilatorul va fi pornit sau toate cele mai interesante doar încep? Coborâm febril în ierarhia ramificată a folderelor imbricate, găsim icl.exe, care, așa cum era de așteptat, se află în directorul bin, facem clic și... Compilatorul nu pornește desigur, referindu-ne la faptul că „icl: eroare: nu a putut verifica licența FLEX lm" fără de care își poate continua munca.

Se pare că Intel a aplicat protecție pe mai multe niveluri, iar primul nivel s-a dovedit a fi o apărare dură împotriva proștilor. Bine! Acceptăm această provocare și, pe baza experienței noastre anterioare, căutăm automat fișierul LMGR*.DLL în directorul compilatorului. Inutil! De data aceasta, nu există un astfel de fișier aici, dar se dovedește că icl.exe s-a îngrășat foarte mult, depășind marca de șase sute de kiloocteți... Stop! Dar dezvoltatorii compilatorului au legat acest lm FLEX cu o legătură statică? Ne uităm: în Intel C++ 5.0, suma dimensiunilor lmgr327.dll și icl.exe a fost de 598 KB, iar acum doar icl.exe ia 684 KB. După ajustarea pentru „obezitatea naturală” senilă, cifrele converg foarte bine. Deci, la urma urmei, FLEX lm! Oh oh! Dar acum, fără denumirile simbolice ale funcțiilor, va fi mult mai dificil să spargi protecția... Totuși, să nu intrăm în panică înainte de timp! Să ne gândim doar calm! Este puțin probabil ca echipa de dezvoltare să rescrie complet tot codul care interacționează cu această protecție „plic”. Cel mai probabil, „îmbunătățirea” sa prin simpla schimbare a tipului de aspect sa încheiat. Și dacă da, atunci șansele de a pirata programul sunt încă mari!

Ținând cont de faptul că ultima dată când a fost introdus codul de securitate functii principale, noi, după ce i-am determinat adresa, pur și simplu setăm un punct de întrerupere și, după ce așteptăm să apară depanatorul, urmărim prostesc codul, aruncând o privire alternativă fie la depanator, fie la fereastra de ieșire a programului: a apărut acolo un mesaj abuziv? În același timp, notăm toate săriturile condiționate pe care le întâlnim pe o bucată de hârtie separată (sau o punem deoparte în propria noastră memorie, dacă doriți), fără a uita să indicăm dacă fiecare săritură condiționată a fost efectuată sau nu. .. Stop! Am discutat ceva, dar mesajul abuziv a apărut deja! OK, bine! Să vedem ce tranziție condiționată îi corespundea. Înregistrările noastre arată că ultima ramură întâlnită a fost ramura condiționată JNZ, situată la adresa 0401075h și care „reacționează” la rezultatul returnat de sub_404C0E:

  • Text:0040107F loc_40107F: ; COD XREF: _main+75^j

    Text:0040107F mov eax, offset aFfrps ; "FFrps"

    Text:00401084 mov edx, 21h

    Text: 00401089 apel sub_404C0E

    Text:0040108E test eax, eax

    Text:00401090 jnz scurt loc_40109A

    Evident, sub_404C0E este aceeași procedură de protecție care verifică prezența licenței. Cum să o păcălesc? Ei bine, există o mulțime de opțiuni... În primul rând, puteți analiza cu atenție și scrupulos conținutul sub_404C0E pentru a afla: ce anume și cum exact verifică. În al doilea rând, puteți înlocui pur și simplu JNZ short loc_40107F cu JZ short loc_40107F sau chiar NOP, NOP. În al treilea rând, comanda pentru verificarea rezultatului returnat TEST EAX, EAX poate fi transformată într-o comandă de setare la zero: XOR EAX, EAX. În al patrulea rând, sub_404C0E însuși poate fi patch-at, astfel încât să returneze întotdeauna zero. Nu știu despre tine, dar cel mai mult mi-a plăcut metoda numărul trei. Schimbăm doi octeți și pornim compilatorul. Dacă nu există alte verificări ale „licenței” în protecție, atunci programul va funcționa și, în consecință, invers. (După cum ne amintim, au existat două astfel de verificări în versiunea a cincea). Este uimitor, dar compilatorul nu mai înjură și funcționează!!! Într-adevăr, așa cum era de așteptat, dezvoltatorii săi nu au întărit deloc protecția, ci, dimpotrivă, chiar au slăbit-o! Chris Kaspersky



  • Se încarcă...
    Top