Osma verzija Intelovih kompajlera. Kompajleri za Microsoft Windows platformu

Ti nisi rob!
Zatvoreni edukativni kurs za djecu elite: "Pravo uređenje svijeta."
http://noslave.org

Iz Wikipedije, slobodne enciklopedije

Intel C++ kompajler
Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).
Tip
Autor

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

Developer
Developers

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

Upisano

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

Interface

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

operativni sistem
Jezici interfejsa

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

Prvo izdanje

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

Hardverska platforma
najnoviju verziju
osloboditi kandidata

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

beta verzija

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

alfa verzija

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

Test verzija

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

Čitljivi formati datoteka

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

Generisani formati datoteka

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

Država

Lua greška u Modulu:Vikipodaci na liniji 170: pokušaj indeksiranja polja "wikibase" (nula vrijednost).

Licenca

Ključne karakteristike:

  • Vektorizacija za SSE , SSE2 , SSE3 , SSE4

Kompajler podržava OpenMP 3.0 standard za pisanje paralelnih programa. Takođe sadrži modifikaciju OpenMP-a pod nazivom Cluster OpenMP, sa kojom možete pokrenuti aplikacije napisane prema OpenMP-u na klasterima koristeći MPI.

Intel C++ kompajler koristi frontend (deo kompajlera koji analizira program koji se kompajlira) iz Edison Design Group. Isti frontend koriste kompajleri SGI MIPSpro, Comeau C++, Portland Group.

Ovaj kompajler se naširoko koristi za kompajliranje SPEC CPU referentnih vrednosti.

Postoje 4 serije proizvoda kompanije Intel koji sadrže kompajler:

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

Nedostaci Linux verzije kompajlera uključuju djelomičnu nekompatibilnost sa GNU ekstenzijama jezika C (podržane od strane GCC kompajlera), što može uzrokovati probleme pri kompajliranju nekih programa.

Eksperimentalne varijante

Objavljene su sljedeće eksperimentalne verzije kompajlera:

  • Intel STM Compiler Prototype Edition od 17. septembra 2007. Podrška za softversku transakcionu memoriju (STM). Objavljeno za Linux i Windows, samo IA-32 (x86 procesori);
  • Intelove istovremene kolekcije za C/C++ 0.3, septembar 2008. Sadrži mehanizme koji olakšavaju pisanje paralelnih C++ programa.

Glavne zastave

Windows Linux, Mac OSX Opis
/od -O0 Onemogućite optimizacije
/O1 -O1 Optimizirajte kako biste minimizirali veličinu izvršne datoteke
/O2 -O2 Optimizirajte za brzinu. Neke optimizacije uključene
/O3 -O3 Omogućite sve optimizacije iz O2. Također izvršite intenzivne optimizacije petlje
/Oip -Oip Omogućite međuproceduralnu optimizaciju po fajlu
/Oipo -Oipo Omogućite globalnu međuproceduralnu optimizaciju
/QxO -xO Dozvolite upotrebu ekstenzija SSE3, SSE2 i SSE za procesore koje proizvodi bilo koja kompanija
/brzo -brzo "Brzi način rada". Ekvivalentno "/O3 /Qipo /QxHost /no-prec-div" na Windows-u i "-O3 -ipo -static -xHOST -no-prec-div" na Linuxu. Imajte na umu da oznaka "-xHOST" znači optimizaciju za procesor na kojem kompajler radi.
/Qprof-gen -prof_gen Kreirajte instrumentiranu verziju programa koja će sastaviti profil izvršavanja
/Qprof-use -prof_use Iskoristite informacije o profilu iz pokretanja programa kompajlirane sa prof_gen zastavicom.

Napišite recenziju na članak "Intel C++ kompajler"

Bilješke

vidi takođe

Linkovi

Izvod koji karakteriše Intel C++ kompajler

Pa ipak, vratila se da bi poslednji put videla Belog maga... Njenog muža i najiskrenijeg prijatelja, kojeg nikada nije mogla zaboraviti. U srcu mu je oprostila. Ali, na njegovu veliku žalost, nije mu mogla donijeti oproštenje Magdalene.... Dakle, kao što vidite, Isidora, velika kršćanska bajka o "oprostu" je samo djetinjasta laž za naivne vjernike da im dopuste bilo šta. Zlo, znajući da će im na kraju biti oprošteno šta god da urade. Ali možete oprostiti samo ono što je zaista vrijedno oprosta. Čovek mora da shvati da za svako učinjeno zlo mora da odgovara... I to ne pred nekim misterioznim Bogom, već pred samim sobom, primoravajući sebe da surovo pati. Magdalena nije oprostila Vladiki, iako ga je duboko poštovala i iskreno voljela. Kao što nije uspjela svima nama oprostiti strašnu Radomirovu smrt. Uostalom, ONA je najbolje razumjela - mogli smo mu pomoći, mogli smo ga spasiti od okrutne smrti... Ali nismo htjeli. Smatrajući krivicu Belog Maga preokrutnom, ostavila ga je da živi sa tom krivicom, ne zaboravljajući je ni na trenutak... Nije htela da mu oprosti lakši oprost. Nikad je više nismo videli. Kao nikad vidjela svoje bebe. Preko jednog od vitezova njenog Hrama – našeg čarobnjaka – Magdalena je prenela odgovor Gospodu na njegovu molbu da nam se vrati: „Sunce ne izlazi dvaput u jednom danu... Radost tvoga sveta (Radomir) nikada neće vratiti se tebi, kao sto se necu vratiti tebi i ja... nasao sam svoju VJERU i svoju ISTINU, oni su ZIVE, tvoj je MRTVA... Oplakuj sinove svoje - voljeli su te. Nikad ti neću oprostiti njihovu smrt dok sam živ. I neka vaša krivica ostane sa vama. Možda će ti jednog dana doneti Svetlost i Oprost... Ali ne od mene. Glava maga Jovana nije dovedena na Meteore iz istog razloga - niko od vitezova Hrama nije hteo da nam se vrati... Izgubili smo ih, kao što smo izgubili i mnoge druge više puta, koji nisu želeli da razumeju i prihvatite naše žrtve... Ko je to baš kao i vi - otišli su, osuđujući nas.
Vrtelo mi se u glavi!.. Kao žedan, zadovoljavajući svoju večnu glad za znanjem, pohlepno sam upijao tok neverovatnih informacija koje je velikodušno davao Sever... I želeo sam mnogo više!.. Hteo sam da saznam sve do kraja . Bio je to dašak slatke vode u pustinji sprženoj bolom i nesrećom! I nisam mogao dovoljno piti...
Imam hiljadu pitanja! Ali nema više vremena... Šta da radim, Sever? ..
- Pitaj Isidora!.. Pitaj, pokušaću da ti odgovorim...
- Reci mi, Sever, zašto mi se čini da su u ovoj priči dvije životne priče, isprepletene sličnim događajima, povezane, a predstavljene kao život jedne osobe? Ili nisam u pravu?
– Potpuno si u pravu, Isidora. Kao što sam vam ranije rekao, „moćnici ovoga sveta“, koji su stvorili lažnu istoriju čovečanstva, „stavili su“ na pravi Hristov život vanzemaljski život jevrejskog proroka Jošue, koji je živeo pre hiljadu i po godina. (još od priče o Sjeveru). I ne samo sebe, već i njegovu porodicu, rodbinu i prijatelje, prijatelje i pratioce. Na kraju krajeva, to je bila žena proroka Jošue, Jevrejka Marija, koja je imala sestru Martu i brata Lazara, majčinu sestru Mariju Jakobe i druge koji nikada nisu bili blizu Radomira i Magdalene. Kao što pored njih nije bilo drugih "apostola" - Pavla, Mateja, Petra, Luke i ostalih...
Bila je to porodica proroka Jošue koja se prije hiljadu i po godina preselila u Provansu (koja se u to vrijeme zvala Galija (Transalpinska Galija), u grčki grad Masalija (danas Marseille), budući da je Masalija u to vrijeme bila “kapija” između Evrope i Azije, i to je bio najlakši način da svi “progonjeni” izbjegnu progon i nesreću.

Uvod Krajem 2003. Intel je predstavio verziju 8.0 svoje kolekcije kompajlera. Novi prevodioci su dizajnirani da poboljšaju performanse aplikacija koje rade na serverima, desktop računarima i mobilni sistemi(laptopovi, mobilni telefoni i PDA) zasnovani na Intel procesori. Zadovoljstvo nam je napomenuti da je ovaj proizvod kreiran uz aktivno učešće zaposlenika Intelovog centra za razvoj softvera u Nižnjem Novgorodu i Intelovih stručnjaka iz Sarova.

Nova serija uključuje Intel kompajlere za C++ i Fortran za Windows i Linux, kao i Intel kompajlere za C++ za Windows CE .NET. Kompajlatori ciljaju sisteme zasnovane na sljedećim Intel procesorima: Intel Itanium 2, Intel Xeon, Intel Pentium 4, Intel Personal Internet Client Architecture procesori za mobilne telefone i PDA, i Intel Pentium M procesor za mobilne računare (komponenta Intel Centrino tehnologije za mobilne telefone). PC).

Intel Visual Fortran Compiler za Windows pruža tehnologiju kompilacije nove generacije za računarstvo visokih performansi. Kombinira funkcionalnost Compaq Visual Fortran (CVF) jezika s poboljšanjima performansi koja su omogućena Intelovim tehnologijama za optimizaciju kompilacije i generiranja koda i pojednostavljuje zadatak portiranja izvorni kod, razvijen sa CVF-om, u Intel Visual Fortran okruženje. Ovaj kompajler je prvi koji implementira CVF funkcije za 32-bitne Intel sisteme i sisteme zasnovane na porodici Intel Itanium procesora koji rade u Windows okruženje. Pored toga, ovaj kompajler vam omogućava da implementirate funkcije CVF jezika na Linux sisteme zasnovane na 32-bitnim Intel procesorima i porodici Intel Itanium procesora. U 2004. godini planirano je izdavanje proširene verzije ovog kompajlera - kompajlera Intel Visual Fortran Compiler Professional Edition za Windows, koji će uključivati ​​IMSL Fortran 5.0 biblioteku koju je razvio Visual Numerics, Inc.


"Novi kompajleri takođe podržavaju Intelove nadolazeće procesore, kodnog naziva Prescott, koji pružaju nove komande za poboljšanje grafičkih i video performansi, kao i druga poboljšanja performansi. Takođe podržavaju nova tehnologija Mobilni MMX(tm), koji na sličan način poboljšava performanse grafičkih, zvučnih i video aplikacija za mobilne telefone i PDA uređaje, - rekao je Aleksej Odinokov, ko-direktor Intelovog centra za razvoj softvera u Nižnjem Novgorodu. - Ovi prevodioci pružaju programerima aplikacija jedan skup alata za pravljenje novih aplikacija bežične mreže baziran na Intel arhitekturi. Novi Intelovi kompajleri takođe podržavaju Intelovu Hyper-Threading tehnologiju i industrijsku specifikaciju OpenMP 2.0, koja definiše upotrebu direktiva visoki nivo za kontrolu toka instrukcija u aplikacijama".

Među novim alatima uključenim u kompajlere su Intel Code Coverage i Intel Test Prioritization alati. Zajedno, ovi alati pomažu da se ubrza razvoj aplikacija i poboljša kvalitet aplikacije poboljšavajući proces testiranja. softver.

Alat za pokrivanje koda, prilikom testiranja aplikacije, pruža potpune detalje o korištenju logike aplikacije i lokaciji područja koja se koriste u izvornom kodu aplikacije. Ako se naprave promjene u aplikaciji ili ako ovaj test ne dozvoljava provjeru dijela aplikacije koji je od interesa za programera, alat za određivanje prioriteta testa omogućava vam da provjerite rad odabranog područja programski kod.

Novi Intel kompajleri dolaze u raznim konfiguracijama u rasponu od 399 USD do 1,499 USD. Danas se mogu kupiti od Intel Corporation ili od preprodavaca širom svijeta, čija se lista nalazi na web stranici. http://www.intel.com/software/products/reseller.htm#Russia.

Podrška za Prescott procesore

Podrška za Intel Pentium 4 (Prescott) procesor u osmoj verziji kompajlera je sljedeća:

1. Podrška za SSE3 komande (ili PNI, Prescott New Instructions). Ovdje postoje tri načina za isticanje:

A. Montažni umetci (Inline Assembly). Na primjer, kompajler će prepoznati sljedeću upotrebu SSE3 naredbe _asm(addsubpd xmm0, xmm1). Dakle, korisnici zainteresovani za optimizaciju niskog nivoa mogu direktno pristupiti komandama asemblera.

b. U C/C++ kompajleru, nove instrukcije su dostupne sa višeg nivoa od korišćenja asemblerskih umetaka. Naime, kroz ugrađene funkcije (intrinzične funkcije):

Ugrađene funkcije

ugrađena funkcijaGenerirana komanda
_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

Tabela prikazuje ugrađene funkcije i odgovarajuće asemblerske upute iz SSE3 seta. Ista podrška postoji za naredbe iz skupova MMX\SSE\SSE2. Ovo omogućava programeru da izvrši optimizaciju koda niskog nivoa bez pribjegavanja programiranju asemblerskog jezika: kompajler se sam brine o mapiranju (mapiranju "e) ugrađenih funkcija u odgovarajuće procesorske instrukcije i optimalnoj upotrebi registara. Programer može koncentrirati se na kreiranje algoritma koji efikasno koristi nove skupove instrukcija.

V. Automatsko generiranje novih naredbi od strane kompajlera. Prethodne dvije metode uključuju korištenje novih naredbi od strane programera. Ali kompajler takođe može (koristeći odgovarajuće opcije - vidi odeljak 3 ispod) da automatski generiše nove instrukcije iz SSE3 seta za C/C++ i Fortran kod. Na primjer, optimizirana naredba za neusklađeno učitavanje (lddqu), koja vam omogućava da dobijete povećanje performansi do 40% (na primjer, u zadacima kodiranja videa i zvuka). Ostale komande iz SSE3 skupa omogućavaju vam da dobijete značajno ubrzanje u 3D grafičkim zadacima ili računskim zadacima koristeći kompleksne brojeve. Na primjer, grafikon u odjeljku 3.1 ispod pokazuje da je za 168.wupwise aplikaciju iz paketa SPEC CPU2000 FP, ubrzanje dobiveno automatskim generiranjem SSE3 instrukcija iznosilo ~25%. Izvedba ove aplikacije uvelike ovisi o brzini aritmetike kompleksnih brojeva.

2. Korišćenje mikroarhitektonskih prednosti Prescott procesora. Prilikom generisanja koda, kompajler uzima u obzir mikroarhitektonske promjene u novom procesoru. Na primjer, neke operacije (kao što su pomaci cijelih brojeva, množenja cijelih brojeva ili konverzije brojeva između različitih formata s pomičnim zarezom u SSE2) su brže na novom procesoru u odnosu na prethodne verzije (recimo, pomak cijelog broja sada traje jedan ciklus procesora u odnosu na četiri za prethodna verzija). Intel Pentium 4 procesor). Intenzivnije korištenje ovakvih naredbi omogućava vam značajno ubrzanje aplikacija.
Još jedan primjer mikroarhitektonskih promjena je poboljšani mehanizam prosljeđivanja skladišta (brzo učitavanje podataka prethodno pohranjenih u memoriji); Pravo spremanje se čak i ne dešava u keš memoriji, već u nekom srednjem baferu za spremanje, koji onda omogućava vrlo brz pristup podacima. Takva karakteristika arhitekture omogućava, na primjer, izvođenje agresivnije automatske vektorizacije programskog koda.
Kompajler takođe uzima u obzir povećanu količinu keš memorije na prvom i drugom nivou.

3. Poboljšana podrška za Hyper-Threading tehnologiju. Ova stavka može biti povezana s prethodnom - mikroarhitektonske promjene i njihova upotreba u kompajleru. Na primjer, runtime biblioteka koja podržava industrijsku specifikaciju OpenMP optimizirana je za rad na novom procesoru.

Performanse

Korišćenje kompajlera je jednostavan i efikasan način da se iskoristi prednost Intel procesorske arhitekture. U nastavku su uslovno (veoma) istaknuta dva načina korišćenja kompajlera: a) rekompilacija programa sa moguća promjena postavke kompajlera, b) ponovna kompilacija sa promjenom postavki kompajlera i izvornog teksta, kao i korištenje dijagnostike kompajlera za tekuće optimizacije i moguću upotrebu drugih softverski alati(na primjer, profileri).


1.1 Optimizacija programa ponovnim kompajliranjem i promjenom postavki kompajlera


Često je prvi korak u prelasku na novi optimizirajući kompajler korištenje sa zadanim postavkama. Sljedeći logičan korak je korištenje opcija za agresivniju optimizaciju. Slike 1, 2, 3 i 4 pokazuju efekat prelaska na Intelov kompajler verziju 8.0 u poređenju sa korišćenjem drugih proizvoda vodećih u industriji (-O2 - podrazumevane postavke kompajlera, baza - postavke na maksimalne performanse). Poređenje je napravljeno na 32-bitnoj i 64-bitnoj Intel arhitekturi. Aplikacije iz SPEC CPU2000 se koriste kao testni set.


Slika 1




Slika 2




Slika 3




Slika 4


Neke od opcija su navedene u nastavku (u daljem tekstu, opcije su za porodicu Windows OS; za porodicu Linux OS postoje opcije sa istim efektom, ali se naziv može razlikovati; na primjer, -Od ili QxK za Windows imaju sličan efekat sa -O0 ili -xK za Linux respektivno, više detaljne informacije može se naći u priručniku kompajlera) koje podržava Intelov kompajler.


Kontrola nivoa optimizacije: Opcije -Od (bez optimizacija; koristi se za otklanjanje grešaka u programima), -O1 (maksimalna brzina uz minimiziranje veličine koda), -O2 (optimizacija za brzinu izvršavanja koda; koristi se po defaultu), -O3 (omogućava najagresivnije optimizacije za izvršenje koda brzina; u nekim slučajevima može dovesti do suprotnog efekta, odnosno do usporavanja; treba napomenuti da na IA-64 upotreba -O3 u većini slučajeva dovodi do ubrzanja, dok je pozitivan efekat na IA-32 manje izražen ). Primjeri optimizacija koje omogućava -O3 su razmjena petlji, fuzija petlje, distribucija petlje (optimizacija fuzije obrnute petlje), softversko prethodno preuzimanje podataka. Razlog zašto je sporost moguća kada se koristi -O3 može biti taj što je kompajler koristio heuristički pristup za odabir agresivne optimizacije za konkretan slučaj, bez dovoljno informacija o programu (na primjer, generirane instrukcije prethodnog preuzimanja za podatke koji se koriste u petlji, vjerujući da se petlja izvršava veliki broj puta, a zapravo ima samo nekoliko iteracija). Optimizacija međuproceduralnog profilisanja, kao i razni programerski "nagoveštaji" (pogledajte odeljak 3.2) mogu pomoći u ovoj situaciji.

Interproceduralna optimizacija: -Qip (unutar jedne datoteke) i -Qipo (unutar nekoliko ili svih projektnih datoteka). Uključuje takve optimizacije kao što je, na primjer, inline zamjena često korištenog koda (smanjenje cijene poziva funkcije/procedure). Predstavlja informacije za druge faze optimizacije - na primjer, informacije o gornjoj granici petlje (recimo, ako je to konstanta vremena kompajliranja definirana u jednoj datoteci, ali se koristi u mnogim) ili informacije o poravnanju podataka u memoriji (mnogi MMX \SSE\SSE2\SSE3 komande rade brže ako su operandi poravnati u memoriji na granici od 8 ili 16 bajtova). Analiza procedura alokacije memorije (implementirane/pozvane u jednoj od projektnih datoteka) se prosljeđuju onim funkcijama/procedurama u kojima se ova memorija koristi (ovo može pomoći kompajleru da napusti konzervativnu pretpostavku da podaci nisu pravilno usklađeni u memoriji; a pretpostavka bi trebala biti konzervativna kada nema dodatnih informacija). Kao još jedan primjer može poslužiti analiza pseudonima podataka: u nedostatku dodatnih informacija i nemogućnosti dokazivanja odsustva raskrsnica, kompajler polazi od konzervativne pretpostavke da ukrštanja postoje. Takva odluka može negativno utjecati na kvalitetu takvih optimizacija kao što je, na primjer, automatska vektorizacija na IA-32 ili softverski cjevovod (software pipelining ili SWP) na IA-64. Međuproceduralna optimizacija može pomoći u analizi prisutnosti memorijskih raskrsnica.

Optimizacija profilisanja: Uključuje tri faze. 1) generiranje instrumentiranog koda pomoću opcije -Qprof_gen. 2) rezultujući kod se pokreće na reprezentativnim podacima, dok se tokom rada prikupljaju informacije o različitim karakteristikama izvršavanja koda (na primer, verovatnoće prelaza ili tipična vrednost za broj iteracija petlje). 3) Rekompilacija sa opcijom -Qprof_use, koja osigurava da kompajler koristi informacije prikupljene u prethodnom koraku. Dakle, kompajler ima mogućnost da koristi ne samo statičke procene važnih karakteristika programa, već i podatke dobijene tokom stvarnog pokretanja programa. Ovo može pomoći pri naknadnom odabiru određenih optimizacija (na primjer, efikasniji raspored u memoriji različitih grana programa, na osnovu informacija o tome koje su grane izvršene na kojoj frekvenciji; ili primjena optimizacije na petlju na osnovu informacija o tipičan broj iteracija u njemu). Optimizacija profilisanja je posebno korisna kada je moguće odabrati mali, ali reprezentativan skup podataka (za korak #2) koji dobro ilustruje najtipičnije buduće slučajeve upotrebe programa. U nekim predmetnim oblastima izbor ovakvog reprezentativnog skupa je sasvim moguć. Na primjer, optimizaciju profiliranja koriste programeri DBMS-a.

Gore navedene optimizacije su generičkog tipa, tj. generisani kod će raditi na svim različitim procesorima iz porodice (recimo, u slučaju 32-bitne arhitekture, na svim sledećim procesorima: Intel Pentium-III, Pentium 4, uključujući Prescott jezgro, Intel Pentium M). Postoje i optimizacije za određeni procesor.

Specifične optimizacije procesora: -QxK (Pentium-III; upotreba SSE komandi, specifičnosti mikroarhitekture), -QxW i -QxN (Pentium 4; upotreba SSE i SSE2 naredbi, specifičnosti mikroarhitekture), -QxB (Pentium M; upotreba SSE i SSE2 naredbi, specifičnosti mikroarhitekture) ), QxP (Prescott; upotreba SSE, SSE2 i SSE3 komandi, karakteristike mikroarhitekture). U ovom slučaju, kod generiran korištenjem ovih opcija možda neće raditi na drugim predstavnicima porodice procesora (na primjer, -QxW kod može rezultirati izvršenjem nevažeće komande ako se izvršava na sistemu zasnovanom na Intel Pentium-III procesor). Ili ne radite s maksimalnom efikasnošću (na primjer, -QxB kod na Pentium 4 procesoru zbog razlika u mikroarhitekturi). Uz ove opcije, također je moguće koristiti runtime biblioteke optimizirane za određeni procesor koristeći njegov skup instrukcija. Da bi se kontrolisalo da se kod zaista izvršava na ciljnom procesoru, implementiran je mehanizam za otpremu (cpu-dispatch): provjera procesora tokom izvršavanja programa. U različitim situacijama ovaj mehanizam se može aktivirati ili ne aktivirati. Otpremanje se uvijek koristi ako se koristi varijacija opcije -Qax(KWNP). U ovom slučaju se generišu dvije verzije koda: optimizovana za određeni procesor i "opšta" (generička), izbor se dešava tokom izvršavanja programa. Dakle, povećanjem veličine koda moguće je postići izvršavanje programa na svim procesorima linije i optimalno izvršenje na ciljnom procesoru. Druga opcija je korištenje optimizacije koda za prethodnog predstavnika linije i korištenje ovog koda na ovom i narednim procesorima. Na primjer, -QxN kod može raditi na Pentium 4 sa Northwood i Prescott jezgrama. Nema povećanja veličine koda. Ovim pristupom možete postići dobre, ali još uvijek ne optimalne performanse na sistemu sa Prescott procesorom (jer se SSE3 ne koristi i razlike u mikroarhitekturi se ne uzimaju u obzir) uz optimalne performanse na Northwoodu. Slične opcije postoje i za procesore arhitekture IA-64. On ovog trenutka postoje dva od njih: -G1 (Itanium) i -G2 (Itanium 2; podrazumevana opcija).

Grafikon ispod (Slika 5) prikazuje ubrzanje (zasnovano na jednom - bez ubrzanja) korištenjem nekih od gore navedenih optimizacija (naime -O3 -Qipo -Qprof_use -Qx(N,P)) na Prescott procesoru u poređenju sa zadanim postavkama (-O2). Korištenje -QxP pomaže u nekim slučajevima da se postigne ubrzanje u odnosu na -QxN. Najveće ubrzanje postiže se u 168.wupwise aplikaciji već spomenutoj u prethodnom dijelu (zbog intenzivne optimizacije složene aritmetike korištenjem SSE3 instrukcija).


Slika 5


Slika 6 ispod prikazuje omjer (u vremenima) brzine koda sa optimalne postavke u poređenju sa potpuno neoptimiziranim kodom (-Od) na procesorima Pentium 4 i Itanium 2. Vidi se da Itanium 2 mnogo više zavisi od kvaliteta optimizacije. Ovo je posebno izraženo kod proračuna s pomičnim zarezom (FP), gdje je omjer oko 36 puta. Izračuni s pomičnim zarezom su jaka tačka IA-64 arhitekture, ali se mora voditi računa o korištenju najefikasnijih postavki kompajlera. Rezultirajući dobitak u produktivnosti plaća rad utrošen na njihovo pronalaženje.


Slika 6. Ubrzanje pri korištenju najboljih opcija optimizacije SPEC CPU200


Intel kompajleri podržavaju OpenMP industrijsku specifikaciju za izgradnju višenitnih aplikacija. Podržana je eksplicitna (opcija -Qopenmp) i automatska (-Qparallel) paralelizacija. U slučaju eksplicitnog načina rada, programer je odgovoran za ispravnu i efikasnu upotrebu OpenMP standarda. U slučaju automatske paralelizacije, kompajler ima dodatno opterećenje povezano sa analizom programskog koda. Iz tog razloga, trenutno automatska paralelizacija efikasno radi samo na prilično jednostavnim kodovima.

Grafikon na slici 7 pokazuje ubrzanje od upotrebe eksplicitne paralelizacije na inženjerskom (preprodukcijskom) uzorku sistema zasnovanog na Intel Pentium 4 procesoru (Prescott) sa podrškom za Hyper-Threading tehnologiju: 2,8 GHz, 2 GB RAM-a, 8K L1-Cache, 512K L2-Cache . SPEC OMPM2001 se koristi kao testni paket. Ovaj set se fokusira na male i srednje SMP sisteme, potrošnja memorije je do dva gigabajta. Aplikacije su kompajlirane koristeći Intel 8.0 C/C++ i Fortran sa dva skupa opcija: -Qopenmp -Qipo -O3 -QxN i -Qopenmp -Qipo -O3 -QxP, sa svakom od kojih su aplikacije počinjale sa omogućenim i onemogućenim Hyper-Threadingom . Vrijednosti ubrzanja na grafikonu normalizirane su na performanse jednonitne verzije s onemogućenim Hyper-Threadingom.


Slika 7: Aplikacije iz paketa SPEC OMPM2001 na Prescott procesoru


Može se vidjeti da u 9 od 11 slučajeva korištenje eksplicitne paralelizacije pomoću OpenMP-a daje povećanje performansi kada je omogućena Hyper-Threading tehnologija. Jedna aplikacija (312.swim) se usporava. Poznata je činjenica da ovu aplikaciju karakteriše visok stepen zavisnosti od propusni opseg memorija. Kao i kod SPEC CPU2000, wupwise ima velike koristi od Prescott optimizacije (-QxP).


1.2 Optimizacija programa sa promenama izvornog koda i korišćenjem dijagnostike kompajlera


U prethodnim odeljcima razmatrali smo uticaj kompajlera (i njegovih postavki) na brzinu izvršavanja koda. Istovremeno, Intel kompajleri pružaju više mogućnosti za optimizaciju koda nego samo mijenjanje postavki. Konkretno, kompajleri omogućavaju programeru da napravi "nagoveštaje" u programskom kodu, koji omogućavaju generisanje efikasnijeg koda u smislu performansi. Ispod su neki primjeri za jezik C/C++ (postoje slični alati za jezik Fortran, koji se razlikuju samo u sintaksi).

#pragma ivdep (gdje ivdep znači zanemariti vektorske ovisnosti) se koristi prije programskih petlji da se kompajleru kaže da unutra nema ovisnosti o podacima. Ovaj nagoveštaj funkcioniše kada kompajler (na osnovu analize) konzervativno pretpostavlja da takve zavisnosti mogu postojati (ako prevodilac može da dokaže da zavisnost postoji kao rezultat analize, onda „hint“ nema efekta), dok autor koda zna da takve zavisnosti ne mogu nastati. Sa ovim nagoveštajem, kompajler može generisati efikasniji kod: automatsku vektorizaciju za IA-32 (koristeći vektorske instrukcije iz skupova MMX\SSE\SSE2\SSE3 za C/C++ i Fortran programske petlje; možete saznati više o ovoj tehnici, za primjer, sljedeći članak u časopisu Intel Technology Journal), dovođenje softvera (SWP) za IA-64.

#pragma vektor se uvijek koristi da prisili kompajler da promijeni odluku o neefikasnosti vektorizacije petlje (i automatske za IA-32 i SWP za IA-64), na osnovu analize kvantitativnih i kvalitativnih karakteristika rada na svakom iteracija.

#pragma novector uvijek radi suprotno od #pragma vector.

#pragma vector aligned se koristi da kaže kompajleru da su podaci koji se koriste u petlji poravnati na granici od 16 bajtova. Ovo vam omogućava da generišete efikasniji i/ili kompaktniji (zbog nedostatka provera vremena izvršavanja) kod.

#pragma vector unaligned radi suprotno od #pragma aligned. Teško je govoriti o poboljšanju performansi u ovom slučaju, ali možete računati na kompaktniji kod.

#pragma tačka distribucije se koristi unutar programske petlje tako da kompajler može podijeliti distribucijsku petlju u ovoj tački na nekoliko manjih. Na primjer, takav "hint" se može koristiti kada kompajler ne uspije automatski vektorizirati izvornu petlju (na primjer, zbog ovisnosti o podacima koja se ne može zanemariti čak ni sa #pragma ivdep), dok svaki (ili dio) novog formirani ciklusi se mogu efikasno vektorizovati.

#pragma loop count (N) se koristi da kaže kompajleru da će najvjerovatnija vrijednost za broj iteracija petlje biti N. Ove informacije pomažu pri odlučivanju o najefikasnijoj optimizaciji za ovu petlju (na primjer, da li da se odmotaju , da li da radim SWP ili automatsku vektorizaciju, da li da koristim softverske komande za prethodno preuzimanje, ...)

"Nagoveštaj" _assume_aligned(p, base) se koristi da kaže kompajleru da je memorijski region povezan sa pokazivačem p poravnat na granici base = 2^n bajta.

Ovo je daleko od toga puna lista razne "nagoveštaje" kompajleru, koji mogu značajno uticati na efikasnost generisanog koda. Može se postaviti pitanje kako odrediti da je kompajleru potreban savjet.

Prvo, možete koristiti dijagnostiku kompajlera u obliku izvještaja koje pruža programeru. Na primjer, korištenjem opcije -Qvec_reportN (gdje N varira od 0 do 3 i predstavlja nivo detalja) možete dobiti izvještaj o automatskoj vektorizaciji. Programer će imati pristup informacijama o tome koje su petlje vektorizovane, a koje nisu. Inače, kompajler prijavljuje razloge zašto vektorizacija nije uspjela. Pretpostavimo da je uzrok bila konzervativno pretpostavljena ovisnost o podacima. U ovom slučaju, ako je programer siguran da se zavisnost ne može pojaviti, onda se može koristiti #pragma ivdep. Kompajler pruža slične (u poređenju sa Qvec_reportN za IA-32) mogućnosti na IA-64 za kontrolu prisutnosti i efikasnosti SWP-a. Općenito, Intel kompajleri pružaju obilje mogućnosti za dijagnosticiranje optimizacija.

Drugo, drugi softverski proizvodi (kao što je Intel VTune profiler) mogu se koristiti za pronalaženje uskih grla u performansama u kodu. Rezultati analize mogu pomoći programeru da izvrši potrebne promjene.

Za analizu možete koristiti i popis asemblerskog koda generiran od strane kompajlera.


Slika 8


Slika 8 iznad prikazuje korak po korak proces optimizacije aplikacije pomoću kompajlera (i drugih softverskih proizvoda) Intel na jeziku Fortran za IA-64 arhitekturu. Kao primjer, razmatra se neadijabatska regionalna šema prognoze za 48 sati Roshidrometcentra (o tome možete pročitati, na primjer, u ovom članku. Članak govori o vremenu izračunavanja od oko 25 minuta, ali je došlo do značajnih promjena Performanse koda su uzete kao početna tačka na Cray-YMP sistemu Nemodifikovani kod sa podrazumevanim opcijama kompajlera (-O2) pokazao je povećanje performansi od 20% na 4-smernom sistemu zasnovanom na Intel Itanium 2 900 MHz procesor Primjena agresivnije optimizacije (-O3) rezultirala je ubrzanjem od ~2,5x bez promjene koda uglavnom zbog SWP-a i prethodnog dohvaćanja podataka. Analiza korištenjem dijagnostike kompajlera i Intel VTune profilera otkrila je neka uska grla Na primjer, kompajler nije programski doveo nekoliko performansi- kritične petlje, izvještavajući u izvještaju da sugerira ovisnost o podacima. Male promjene koda (direktiva ivdep) pomogle su da se postigne efekat aktivno prenošenje. Koristeći VTune profiler, otkriveno je (i izveštaj kompajlera je to potvrdio) da kompajler nije promenio redosled ugnežđenih petlji (razmena petlji) radi efikasnijeg korišćenja keš memorije. Razlog su opet bile konzervativne pretpostavke o zavisnosti od podataka. Izmjene su napravljene u izvornom kodu programa. Kao rezultat toga, uspjeli smo postići 4-struko ubrzanje u odnosu na početnu verziju. Korišćenje eksplicitne paralelizacije sa OpenMP direktivama, a zatim prelazak na sistem sa više od visoka frekvencija omogućilo je smanjenje vremena izračunavanja na manje od 8 minuta, što je dalo više od 16 puta brže u odnosu na početnu verziju.

Intel Visual Fortran

Intel Visual Fortran 8.0 koristi front-end (dio kompajlera odgovoran za pretvaranje programa iz teksta u programskom jeziku u internu reprezentaciju kompajlera, koji je u velikoj mjeri nezavisan ni od programskog jezika ni od ciljne mašine), CVF kompajler tehnologije i komponente Intelovog kompajlera, odgovorne za skup optimizacija i generisanje koda.


Slika 9




Slika 10


Na slikama 9 i 10 prikazani su uporedni grafikoni Intel performanse Visual Fortran 8.0 sa prethodnom verzijom Intel Fortran 7.1 i sa drugim industrijski poznatim kompajlerima iz ovog jezika koji rade pod operativnim sistemom Windows porodice i Linux. Za poređenje korišćeni su testovi čiji su izvorni tekstovi, koji zadovoljavaju standarde F77 i F90, dostupni na http://www.polyhedron.com/. Na istoj stranici dostupne su detaljnije informacije o upoređivanju performansi kompajlera (Win32 Compiler Comparisons -> Fortran (77, 90) Execution Time Benchmarks i Linux Compiler Comparisons -> Fortran (77, 90) Execution Time Benchmarks): više različitih kompajlera je prikazano, a geometrijska sredina je data u vezi sa pojedinačnim rezultatima za svaki test.

U prethodnom broju časopisa raspravljali smo o proizvodima iz porodice Intel VTune Performance Analyzer - alatima za analizu performansi koji su zasluženo popularni među programerima aplikacija i koji vam omogućavaju da otkrijete u kodu timske aplikacije, koji troši previše procesorskih resursa, što daje programerima priliku da identifikuju i eliminišu potencijalna uska grla povezana s takvim dijelovima koda, čime se ubrzava proces razvoja aplikacije. Imajte na umu, međutim, da performanse aplikacija u velikoj meri zavise od toga koliko su efikasni prevodioci koji se koriste u njihovom razvoju i koje hardverske karakteristike koriste prilikom generisanja mašinskog koda.

Najnoviji kompajleri Intel C++ i Intel Fortran za Windows i Linux obezbeđuju do 40% povećanja performansi u performansama aplikacija za sisteme zasnovane na Intel Itanium 2, Intel Xeon i Intel Pentium 4 procesorima u odnosu na postojeće kompajlere drugih proizvođača korišćenjem ovih funkcija procesori, kao što je Hyper-Threading tehnologija.

Razlike u vezi sa optimizacijom koda od strane ove porodice kompajlera uključuju upotrebu steka za izvođenje operacija s pomičnim zarezom, međuproceduralnu optimizaciju (Interprocedural Optimization, IPO), optimizaciju u skladu sa profilom aplikacije (Profile Guided Optimization, PGO), prethodno učitavanje podataka u keš memorija (prethodno dohvaćanje podataka), čime se izbjegava kašnjenje povezano s pristupom memoriji, podrška za karakteristične karakteristike Intel procesora (na primjer, ekstenzije za obradu striming podataka Intel Streaming SIMD Extensions 2, specifično za Intel Pentium 4), automatska paralelizacija izvršavanja koda , kreiranje aplikacija, pokretanje na više različite vrste procesori pri optimizaciji za jedan od njih, sredstva "predviđanja" narednog koda (predviđanje grananja), proširena podrška za rad sa nitima izvršavanja.

Imajte na umu da se Intel kompajleri koriste u poznatim kompanijama kao što su Alias/Wavefront, Oracle, Fujitsu Siemens, ABAQUS, Silicon Graphics, IBM. Na osnovu nezavisnog testiranja brojnih kompanija, performanse Intelovih kompajlera značajno nadmašuju kompajlere drugih proizvođača (pogledajte, na primer, http://intel.com/software/products/compilers/techtopics/compiler_gnu_perf.pdf).

U nastavku ćemo pogledati neke od karakteristika najnovije verzije Intel kompajleri za desktop i servere operativni sistemi.

Kompajleri za Microsoft Windows platformu

Intel C++ kompajler 7.1 za Windows

Intel C++ Compiler 7.1 je kompajler objavljen ranije ove godine koji vam omogućava da postignete visok stepen optimizacije koda za procesore Intel Itanium, Intel Itanium 2, Intel Pentium 4 i Intel Xeon, kao i za Intel Pentium M procesor koji koristi Intel tehnologija Centrino i dizajniran za upotrebu u mobilnim uređajima.

Navedeni kompajler je potpuno kompatibilan sa razvojnim alatima Microsoft Visual C++ 6.0 i Microsoft Visual Studio .NET: Može se ugraditi u odgovarajuća razvojna okruženja.

Ovaj kompajler podržava ANSI i ISO C/C++ standarde.

Intel Fortran Compiler 7.1 za Windows

Intel Fortran Compiler 7.1 za Windows, takođe objavljen ranije ove godine, omogućava vam da kreirate optimizovani kod za Intel Itanium, Intel Itanium 2, Intel Pentium 4 i Intel Xeon, Intel Pentium M procesore.

Ovaj kompajler je u potpunosti kompatibilan sa razvojnim alatima Microsoft Visual C++ 6.0 i Microsoft Visual Studio .NET, odnosno može se integrisati u odgovarajuća razvojna okruženja. Pored toga, ovaj kompajler vam omogućava da razvijete 64-bitne aplikacije za operativne sisteme koji rade na Itanium / Itanium 2 procesorima, sa pomoć od Microsofta Visual Studio na 32-bitnom Pentium procesoru koji koristi 64-bitni Intel Fortran kompajler. Prilikom otklanjanja grešaka koda, ovaj kompajler vam omogućava da koristite program za otklanjanje grešaka za Microsoft .NET platformu.

Ako imate instaliran Compaq Visual Fortran 6.6, možete koristiti Intel Fortran Compiler 7.1 umjesto originalnog kompajlera jer su ovi prevodioci kompatibilni na nivou izvornog koda.

Intel Fortran Compiler 7.1 za Windows je u potpunosti usklađen sa ISO Fortran 95 standardom i podržava izgradnju i otklanjanje grešaka dvojezičnih aplikacija C i Fortran.

Kompajleri za Linux platformu

Intel C++ kompajler 7.1 za Linux

Drugi kompajler koji je objavljen početkom godine, Intel C++ Compiler 7.1 za Linux, omogućava postizanje visokog stepena optimizacije koda za procesore Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Ovaj kompajler je u potpunosti kompatibilan sa GNU C kompajlerom na nivou izvornog koda i objektnih modula, omogućavajući aplikacijama izgrađenim sa GNU C da se migriraju na njega bez dodatnih troškova. operativni sistemi SCO, rane verzije Sun Solaris, itd.), što znači potpunu kompatibilnost sa gcc 3.2 kompajler na binarnom nivou. Konačno, sa Intel C++ kompajlerom 7.1 za Linux, možete čak i rekompajlirati Linux kernel uz nekoliko manjih izmjena njegovog izvornog koda.

Intel Fortran kompajler 7.1 za Linux

Kompajler Intel Fortran Compiler 7.1 za Linux vam omogućava kreiranje optimizovanog koda za procesore Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Ovaj kompajler je potpuno kompatibilan sa Compaq Visual Fortran 6.6 kompajlerom na nivou izvornog koda, što omogućava da ponovo kompajlirate aplikacije s njim kreirane pomoću Compaq Visual Fortrana, čime ćete poboljšati njihove performanse.

Dodatno, navedeni kompajler je kompatibilan sa uslužnim programima koje koriste programeri, kao što su emacs editor, gdb debugger i pomoćni program za pravljenje aplikacije.

Kao i Windows verzija ovog kompajlera, Intel Fortran Compiler 7.1 za Linux je u potpunosti kompatibilan sa ISO Fortran 95 standardom i podržava kreiranje i otklanjanje grešaka u aplikacijama koje sadrže kod na dva jezika C i Fortran.

Treba naglasiti da su značajan doprinos kreiranju navedenih Intel kompajlera dali stručnjaci Ruski centar Intel za razvoj softvera u Nižnjem Novgorodu. Više informacija o Intel kompajlerima možete pronaći na Intel Web lokaciji na: www.intel.com/software/products/.

Drugi dio ovog članka bit će posvećen Intelovim kompajlerima koji kreiraju aplikacije za mobilne uređaje.

Primeri pravih hakova: Intel C++ 7.0 kompajler — WASM.RU arhiva

…kompajler Intel C++ 7.0 preuzet je kasno uveče, oko 5:00 ujutro. Neverovatno sam želeo da zaspim, ali radoznalost: da li je zaštita pojačana ili ne, takođe se raspala. Odlučujući da, dok se ne pozabavim zaštitom, ipak neću zaspati, otvorivši nova konzola, i ponovno instaliranje sistemskih varijabli TEMP i TMP u direktorij C:\TEMP, na brzinu otkucao nepristojno dugo ime instalatera W_CC_P_7.0.073.exe u komandna linija(Potreba za postavljanjem varijabli TEMP i TMP je zbog činjenice da u Windowsu 2000 one prema zadanim postavkama ukazuju na vrlo duboko ugniježđeni direktorij, a Intel C++ instalater - i ne samo on - ne podržava tako velike puteve) .

Odmah je postalo jasno da je politika zaštite radikalno revidirana i sada je prisustvo licence provjereno već u fazi instaliranja programa (u verziji 5.x instalacija je obavljena bez problema). OK, dajemo komandu dir i pogledamo sadržaj onoga s čime se sada moramo boriti:

    Sadržaj fascikle 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

    bilješke

    6.5.2002 10:35 45 056 AutoRun.exe

    10.7.2001 12:56 27 autorun.inf

    29.10.2002. 11:25 2.831 ccomindex.htm

    24.10.2002 08:12 126 976 ChkLic.dll

    18.10.2002 10:37 552 960 chklic.exe

    17.10.2002 04:29 28.663 CLicense.rtf

    17.10.2002. 16:35 386 credist.txt

    16.10.2002 17:02 34 136 Crelnotes.htm

    19.03.2002. 14:28 4.635 PLSuite.htm

    21.2.2002. 12:39 2 478 register.htm

    02.10.2002 14:51 40 960 Setup.exe

    2.10.2002 10:40 151 Setup.ini

    10.7.2001 12:56 184 setup.mwg

    19 fajlova 2,519,238 bajtova

    6 foldera 886 571 008 bajtova besplatno

Aha! Instalacioni program setup.exe zauzima samo četrdeset i nešto kilobajta. Veoma dobro! Teško da možete sakriti ozbiljnu zaštitu u takvom obimu, a čak i ako jeste, ovaj sićušni fajl ne košta ništa za analizu u celosti - do poslednjeg bajta liste disassemblera. Međutim, nije činjenica da se sigurnosni kod nalazi upravo u setup.exe, može se nalaziti i na drugom mjestu, na primjer... ChkLic.dll / ChkLic.exe, koji zajedno zauzimaju nešto manje od sedamsto kilobajta . Čekaj, šta je ChkLic? Je li to skraćenica od Check License? Hm, momci iz Intela očigledno imaju ozbiljnih problema sa smislom za humor. Bilo bi bolje da su ovaj fajl nazvali "Hack Me" iskreno! Pa, sudeći po obimu, ChkLic je isti FLEX lm, a mi smo ga već sreli (pogledajte "Intel C++ 5.0 kompajler") i otprilike zamislite kako ga razbiti.

Dajemo naredbu "dumpbin / EXPORTS ChkLic.dll" da ispitamo izvezene funkcije i ... čvrsto se držimo Klave da ne padne sa stolice:

    Dump datoteke ChkLic.dll

  1. Odjeljak sadrži sljedeće izvoze za ChkLic.dll

    0 karakteristike

    3DB438B4 vremenska oznaka datuma Mon Oct 21 21:26:12 2002

  2. 1 broj funkcija

    1 broj imena

    redni nagovještaj RVA naziv

    1 0 000010A0_CheckValidLicense

Prokletstvo! Zaštita izvozi samo jednu jedinu funkciju sa prekrasnim imenom CheckValidLicense. "Izvanredno" - jer svrha funkcije postaje jasna iz njenog imena i postaje moguće izbjeći mukotrpnu analizu koda za rasklapanje. Pa povratili su sav interes... bilo bi bolje da su ga izvezli u ordinal ili tako nešto, ili ga barem krstili nekakvim zastrašujućim imenom kao DES Decrypt.

...sanjam! Ok, vratimo se našim ovcama. Razmišljajmo logično: ako se sav sigurnosni kod nalazi direktno u ChkLic.dll (a, sudeći po "zglobnoj" prirodi sigurnosti, to je tačno), onda se sva "zaštita" svodi na pozivanje CheckValidLicense iz Setup.exe i provjeravanje rezultata koji je vratio. Stoga, za "hakiranje" dovoljno je samo zakrpiti ChkLic.dll, prisiljavajući funkciju ChekValidLicense da se uvijek vraća ... usput, šta treba da vrati? Preciznije: koja je tačno vraćena vrijednost koja odgovara uspješnoj provjeri licence? Ne, nemojte žuriti da rastavite setup.exe da biste saznali, jer nema toliko mogućih opcija: ili FALSE ili TRUE. Da li se kladite na TRUE? Pa, u nekom smislu je to logično, ali s druge strane: zašto smo, zapravo, odlučili da funkcija CheckValidLicense vraća upravo oznaku uspjeha operacije, a ne šifru greške? Uostalom, to mora nekako motivirati razloge odbijanja instaliranja kompajlera: datoteka s licencom nije pronađena, datoteka je oštećena, licenca je istekla i tako dalje? U redu, pokušajmo vratiti nulu, a ako to ne uspije, vratit ćemo jedinicu.

OK, vežite se, idemo! Pokrećemo HIEW, otvorimo datoteku ChkLic.dll (ako se ne otvori, zapamtite gophers tri puta, privremeno je kopirajte u korijenski ili bilo koji drugi direktorij koji ne sadrži posebne znakove u svom nazivu koji hiew "y" ne voli Zatim, ponovo se okrećući izvoznoj tabeli dobijenoj korišćenjem dumpbin-a, odredimo adresu funkcije CheckValidLicense (u ovom slučaju 010A0h) i kroz "10A0" idemo na njen početak. Sada je isečemo uživo, prepisujemo preko starog koda "XOR EAX, EAX / RETN 4. Zašto baš "REN 4", a ne samo "RET"? Da, jer funkcija podržava konvenciju stdcall, što se može saznati gledajući njen epilog u HIEW " e (samo skrolujte nadole po ekranu rastavljača dok ne ispunite RET).

Provjeravam... Radi!!! Unatoč nedostatku licence, instalater započinje instalaciju bez postavljanja previše pitanja! Dakle, odbrana je pala. Oh, ne možemo vjerovati da je sve tako jednostavno, a kako ne bismo sjedili, netremice zureći u monitor dok čekamo da se završi proces instalacije programa, postavili smo naš omiljeni IDA disassembler na setup.exe. Prva stvar koja vam upada u oči je odsustvo CheckValidLicense na listi uvezenih funkcija. Možda ona nekako pokrene datoteku ChkLic.exe? Pokušajmo pronaći odgovarajuću vezu među automatski prepoznatim stringovima: "~View aNames", "ChkLic"... da, string "Chklic.exe" uopće nije ovdje, ali je "Chklic.dll" pronađen. Da, vidim, to znači da se ChkLic biblioteka učitava eksplicitnim povezivanjem preko LoadLibrary. I praćenje unakrsnih referenci to potvrđuje:

    Tekst:0040175D push offset aChklic_dll ; lpLibFileName

    Tekst:00401762 poziv ds:LoadLibraryA

    Tekst:00401762 ; učitaj ChkLic.dll ^^^^^^^^^^^^^^^^^^

    Tekst:00401762 ;

    Tekst:00401768 mov esi,eax

    Tekst:0040176A push offset a_checkvalidlic ; lpProcName

    Tekst:0040176F push esi ; hModule

    Tekst:00401770 poziv ds:GetProcAddress

    Tekst:00401770 ; dobiti adresu funkcije CheckValidLicense

    Tekst:00401770 ;

    Tekst:00401776 cmp esi, ebx

    Tekst:00401778 jz loc_40192E

    Tekst:00401778 ; ako ne postoji takva biblioteka, izađite iz instalacionog programa

    Tekst:00401778 ;

    Tekst:0040177E cmp eax, ebx

    Tekst:00401780 jz loc_40192E

    Tekst:00401780 ; ako u biblioteci nema takve funkcije, izađite iz instalacije

    Tekst:00401780 ;

    Tekst:00401786 push ebx

    Tekst:00401787 pozvati eax

    Tekst:00401787 ; pozovite funkciju CheckValidLicense

    Tekst:00401787 ;

    Tekst:00401789 test eax, eax

    Tekst:0040178B jnz loc_4019A3

Tekst:0040178 ; ako je funkcija vratila različitu od nule, izađite iz instalatera

Nevjerovatno, ova užasno primitivna odbrana je izgrađena baš tako! Štaviše, datoteka ChkLic.exe od pola metra uopće nije potrebna! I zašto ga je vrijedilo povući s interneta? Usput, ako odlučite spremiti distribuciju kompajlera (pažnja: nisam rekao "distribuiraj"!), onda da uštedite prostor na disku, možete izbrisati ChkLic. ChkLic.dll, koji izvozi stdcall funkciju CheckValidLicence u obliku: int CheckValidLicence(int some_flag) (vrat 0;)

Dakle, dok smo razgovarali o svemu ovome, instalater je završio instalaciju kompajlera i uspješno završio svoj posao. Da li je zanimljivo da li će se kompajler pokrenuti ili sve najzanimljivije tek počinje? Grozničavo se spuštamo niz razgranatu hijerarhiju ugniježđenih mapa, pronalazimo icl.exe, koji se očekivano nalazi u bin direktoriju, kliknemo i... Kompajler se naravno ne pokreće, pozivajući se na činjenicu da je "icl: greška: nije mogao preuzeti FLEX lm licencu" bez koje ne može nastaviti svoj posao.

Ispostavilo se da je Intel primenio zaštitu na više nivoa i prvi nivo se pokazao kao gruba odbrana od budala. Pa! Prihvatamo ovaj izazov i, na osnovu našeg prethodnog iskustva, automatski tražimo LMGR*.DLL datoteku u direktoriju kompajlera. Beskorisno! Ovog puta ovdje nema takve datoteke, ali se ispostavilo da je icl.exe jako dobio na težini, prešavši oznaku od šest stotina kilobajta... Stani! Ali da li su programeri kompajlera povezali ovaj FLEX lm sa statičkom vezom? Gledamo: u Intelu C++ 5.0, zbir veličina lmgr327.dll i icl.exe bio je 598 KB, a sada samo icl.exe zauzima 684 KB. Nakon prilagođavanja na prirodnu senilnu "gojaznost", brojke se vrlo dobro slažu. Dakle, na kraju krajeva, FLEX lm! Oh oh! Ali sada, bez simboličnih naziva funkcija, bit će mnogo teže razbiti zaštitu... Ipak, nemojmo paničariti prije vremena! Razmislimo mirno! Malo je vjerovatno da je razvojni tim u potpunosti prepisao sav kod koji je u interakciji sa ovom zaštitom "koverte". Najvjerovatnije se završilo njegovo "poboljšanje" samo promjenom tipa izgleda. A ako je tako, onda su šanse za hakovanje programa i dalje velike!

Imajući na umu da je zadnji put sigurnosni kod glavne funkcije, mi smo, nakon što smo odredili njegovu adresu, jednostavno postavili tačku prekida i, nakon što smo čekali da se program za otklanjanje grešaka pojavi, glupo pratimo kod, naizmjenično gledajući ili u program za otklanjanje grešaka ili u izlazni prozor programa: da li se tamo pojavila uvredljiva poruka? Istovremeno, sve uslovne skokove na koje naiđemo označavamo na posebnom papiru (ili ga ostavljamo u vlastitoj memoriji, ako želite), ne zaboravljajući da naznačimo da li je svaki uslovni skok izveden ili ne. .. Stani! Nešto smo razgovarali, ali uvredljiva poruka je već iskočila! OK dobro! Pogledajmo koji je to uslovni prijelaz odgovarao. Naši zapisi pokazuju da je posljednja grana na koju smo naišli bila JNZ uslovna grana, koja se nalazi na adresi 0401075h i "reaguje" na rezultat koji je vratio sub_404C0E:

  • Tekst:0040107F loc_40107F: ; KOD XREF: _glavni+75^j

    Tekst:0040107F mov eax, ofset aFfrps ; "FFrps"

    Tekst:00401084 mov edx, 21h

    Tekst:00401089 pozovite sub_404C0E

    Tekst:0040108E test eax, eax

    Tekst:00401090 jnz kratki loc_40109A

    Očigledno, sub_404C0E je ista zaštitna procedura koja provjerava prisustvo licence. Kako je prevariti? Pa, ima puno opcija... Prvo, možete pažljivo i savjesno analizirati sadržaj sub_404C0E da saznate: šta tačno i kako tačno proverava. Drugo, možete jednostavno zamijeniti JNZ kratki loc_40107F sa JZ kratkim loc_40107F ili čak NOP, NOP. Treće, naredba za provjeru povratnog rezultata TEST EAX, EAX može se pretvoriti u naredbu nulte postavke: XOR EAX, EAX. Četvrto, sam sub_404C0E se može zakrpiti tako da uvijek vraća nulu. Ne znam za vas, ali meni se najviše dopao metod broj tri. Mijenjamo dva bajta i pokrećemo kompajler. Ako nema drugih provjera njegove "licencije" u zaštiti, tada će program raditi i, shodno tome, obrnuto. (Kao što se sjećamo, u petoj verziji bile su dvije takve provjere). Neverovatno, ali kompajler više ne psuje i ne radi!!! Zaista, kao što se i očekivalo, njegovi programeri uopće nisu pojačali zaštitu, već su je, naprotiv, čak i oslabili! Chris Kaspersky



  • Učitavanje...
    Top