Intelovi prevajalniki. Zakaj so bili potrebni novi prevajalniki?

Prevajalniki Intel C++ in Fortran ter knjižnica MKL

Skupaj s standardnimi prevajalniki GNU za Linux so v gručah računalniškega kompleksa NIVC nameščeni prevajalniki Intel C++ in Fortran. Trenutno (začetek leta 2006) so prevajalniki različice 9.1 nameščeni na vse gruče. Ta stran je namenjena opisu najpomembnejših možnosti in nastavitev teh prevajalnikov, kot tudi njihovim glavnim razlikam od prevajalnikov GNU. Stran je namenjena predvsem uporabnikom grozdov MSU Research Computing Center, vendar je lahko uporabna tudi drugim rusko govorečim uporabnikom. Težave, povezane s kompilacijo za platformo IA-64, tukaj niso obravnavane.

Prav tako je knjižnica Intel nameščena na vseh grozdih Kernel Math Library(MKL) različica 8.0.2. Knjižnica se nahaja v imeniku /usr/mkl. Upoštevajte, da so podimeniki 32, 64 in em64t na voljo v imeniku lib. V gruči Ant morate uporabiti knjižnice iz podimenika em64t, v drugih gručih pa iz podimenika 32. Vso potrebno dokumentacijo in primere lahko dobite v imeniku /usr/mkl/doc.

Zakaj so bili potrebni novi prevajalniki?

Potreba po novih prevajalnikih se je pojavila predvsem za a) podporo programiranju v Fortran 90 in tudi b) za zmogljivejšo optimizacijo programov Fortran, kot jo ponuja prevajalnik g77, ki uporablja prevajanje v C in nato prevajanje z uporabo gcc.

Tem zahtevam ustrezajo tudi prevajalniki PGI (Portland Group), vendar jih je podjetje razvijalec zavrnilo dobaviti Rusiji.

Kako uporabiti?

Prevajalniki Intel se prikličejo z ukazi icc(C ali C++), icpc(C++) in ifort(Fortran 77/90). Ukazi mpicc, mpiCC in mpif77 za prevajanje in sestavljanje programov MPI so prav tako konfigurirani za uporabo prevajalnikov Intel.

Možna je tudi uporaba prevajalnikov GNU z ukazi mpigcc, mpig++ in mpig77 (Fortran 90 ni podprt).

Vhodne datoteke

Privzeto so datoteke s pripono .cpp in .cxx se štejejo za izvorna besedila v jeziku C++, datoteke s pripono .c- Izvorna koda C, prevajalnik icpc pa tudi datoteke .c prevaja kot izvorno kodo C++.

Datoteke s končnicami .f, .ftn in .za so prepoznana kot izvorna besedila v jeziku fotran s fiksno obliko zapisa in datoteke .fpp in .F dodatno prešel skozi predprocesor jezika Fortran. Datoteke s pripono .f90 veljajo za izvorna besedila Fortran 90/95 s prostim zapisom. Z možnostmi lahko izrecno določite fiksno ali prosto obliko zapisa za programe Fortran -FI in -FR oz.

Datoteke s pripono .s prepoznana kot koda zbirnega jezika za IA-32.

Funkcije prevajalnika Intel

Tukaj predstavljamo značilnosti prevajalnikov Intel, kot jih je navedel razvijalec v uporabniškem priročniku z nekaterimi našimi komentarji.

  • Pomembna optimizacija
    Očitno to pomeni optimizacijo kode na visoki ravni, tj. najprej razne transformacije zank, ki jih z večjim ali manjšim uspehom počnejo skoraj vsi prevajalniki
  • Optimizacija s plavajočo vejico
    Očitno to pomeni najprej največjo uporabo ukazov, ki se izvajajo na ravni strojne opreme
  • Medproceduralne optimizacije
    tiste. globalna optimizacija celotnega programa, za razliko od navadne optimizacije, ki vpliva samo na kodo določenih funkcij
  • Optimizacija na podlagi profila
    tiste. možnost izvajanja programa v testnem načinu, zbiranje podatkov o času, ki je potreben za prenos določenih fragmentov kode znotraj pogosto uporabljenih funkcij, in nato uporaba teh podatkov za optimizacijo
  • Podpora za nabor navodil SSE v procesorjih Pentium III
    opomba: za računalniške naloge so bolj zanimivi ukazi SSE2, tj. vektorski ukazi nad 64-bitnimi realnimi števili, vendar so podprti samo na procesorjih Pentium 4, ki jih še nimamo na razpolago
  • Samodejna vektorizacija
    tiste. spet z uporabo ukazov SSE in SSE2, ki jih samodejno vstavi prevajalnik
  • Podpora OpenMP za programiranje na sistemih SMP
    opomba: na gruči je priporočljiva predvsem uporaba vmesnika MPI; široke uporabe OpenMP v gruči ni pričakovati in takšni poskusi še niso bili izvedeni; verjetno pa je smiselno uporabljati knjižnice (BLAS itd.), ki so vzporedne za skupni pomnilnik.
  • Vnaprejšnje pridobivanje podatkov
    tiste. Očitno je uporaba prednalaganja ukazov iz pomnilnika v predpomnilnik podatkov, ki bodo potrebni čez nekaj časa
  • Koda "odpreme" za različne procesorje
    tiste. možnost generiranja kode za različne procesorje v eni izvedljivi datoteki, kar vam omogoča, da izkoristite najnovejši procesorji doseči najvišjo zmogljivost na njih, hkrati pa ohraniti binarno združljivost programov s prejšnjimi procesorji; Na našem grozdu to še ni relevantno, ker uporabljajo se le procesorji Pentium III, programi, prevedeni v gruči, pa se ne smejo prenašati in izvajati na drugih računalnikih

Osnovne možnosti prevajalnika

Najbolj zanimive so seveda možnosti optimizacije kode. Večina možnosti je skupnih prevajalnikom C++ in Fortran. več natančen opis možnosti v angleških uporabniških priročnikih.

Stopnje optimizacije
MožnostOpis
-O0Onemogoči optimizacijo
-O1 ali -O2Osnovna optimizacija za hitrost. Vstavljanje knjižničnih funkcij je onemogočeno. Za prevajalnik C++ te možnosti nudijo enako optimizacijo; za prevajalnik Fortran je boljša možnost -O2, ker vključuje tudi promocijo cikla.
-O3Zmogljivejše optimizacije, vključno s transformacijami zank, vnaprejšnjim pridobivanjem podatkov in uporabo OpenMP. Nekateri programi morda ne zagotavljajo boljšega delovanja v primerjavi z -O2. Smiselno je uporabljati v povezavi z možnostmi vektorizacije -xK in -xW.
-odvij [n]Omogoča odvijanje zanke do n-krat.
Optimizacije za določen procesor
MožnostOpis
-tpp6Optimizacija za procesorje Penitum Pro, Pentium II in Pentium III
-tpp7Optimizacija za procesorje Penitum 4 (ta možnost je privzeto omogočena za prevajalnik IA-32)
-xMGeneriranje kode z uporabo razširitev MMX, značilnih za procesorje Pentium MMX, Pentium II in novejše
-xKGeneriranje kode z uporabo razširitev SSE, značilnih za procesorje Pentium III
-xWGeneriranje kode z uporabo razširitev SSE2, značilnih za procesorje Pentium 4
Medproceduralna optimizacija
-ipOmogočena je medproceduralna optimizacija znotraj ene datoteke. Če določite možnost -ip_no_inlining, potem je vstavljanje funkcij v vrstici onemogočeno.
-ipoOmogoča medproceduralno optimizacijo med različnimi datotekami
Optimizacije z uporabo profilov
-prof_genUstvari se koda za "profiliranje", ki bo uporabljena za profiliranje, tj. zbiranje podatkov o pogostosti prehajanja določenih mest v programu
-prof_useOptimizacija se izvaja na podlagi podatkov, pridobljenih v fazi profiliranja. Smiselno jo je uporabljati skupaj z možnostjo interproceduralne optimizacije -ipo.
Paralelizacija za SMP sisteme
-openmpOmogoča podporo za standard OpenMP 2.0
- vzporednoSamodejna paralelizacija zanke je omogočena

Izvedba

Glede na rezultate izvajanja testov SPEC CPU2000, objavljenih na strežniku ixbt.com, so bili Intelovi prevajalniki različice 6.0 skoraj povsod boljši v primerjavi s prevajalniki gcc različic 2.95.3, 2.96 in 3.1 ter PGI različice 4.0.2. Ti testi so bili izvedeni leta 2002 na računalniku s procesorjem Pentium 4/1,7 GHz in RedHat Linux 7.3.

Glede na teste, ki jih je izvedel Polyhedron, je bil prevajalnik Intel Fortran različice 7.0 skoraj univerzalno boljši od drugih prevajalnikov Fortran 77 za Linux (Absoft, GNU, Lahey, NAG, NAS, PGI). Samo v nekaterih testih je prevajalnik Intel nekoliko slabši od prevajalnikov Absoft, NAG in Lahey. Ti testi so bili izvedeni na računalniku s procesorjem Pentium 4/1,8 GHz in Mandrake Linux 8.1.

Intelovi prevajalniki različice 9.1 prav tako prekašajo prevajalnike gcc in kažejo zmogljivost, primerljivo z Absoft, PathScale in PGI.

Hvaležni bomo tistim uporabnikom in bralcem, ki nam bodo posredovali podatke o vplivu izbire prevajalnika (GCC ali Intel) in možnosti optimizacije na hitrost dela pri njihovih realnih problemih.

Knjižnice

Prevajalnik jezika C uporablja knjižnico izvajalnega okolja, razvito v okviru projekta GNU ( libc.a).

Naslednje knjižnice so priložene prevajalniku Intel C++:

  • libcprts.a- jezikovna knjižnica izvajalnega okolja C++, ki jo je razvil Dinkumware.
  • libcxa.a- dodatna izvajalna knjižnica za razvoj C++ s strani Intel.
  • libimf.a- knjižnica matematičnih funkcij, ki jo je razvil Intel, ki vključuje optimizirane in visoko natančne izvedbe trigonometričnih, hiperboličnih, eksponentnih, posebnih, kompleksnih in drugih funkcij (za več podrobnosti glejte seznam funkcij).
  • libirc.a- podpora med izvajanjem za profiliranje (PGO) in pošiljanje kode, odvisno od procesorja (glejte zgoraj).
  • libguide.a- Implementacija OpenMP.

Ta seznam vsebuje statične knjižnice, za večino pa tudi dinamične, tj. možnosti, povezane med zagonom ( .tako).

Naslednje knjižnice so priložene prevajalniku Fortran: libCEPCF90.a, libIEPCF90.a, libintrini.a, libF90.a, uporablja se tudi knjižnica matematičnih funkcij libimf.a.

Gradnja izvršljive datoteke

Knjižnice se lahko povezujejo statično (med gradnjo) ali dinamično (med zagonom programa). Dinamični pristop vam omogoča zmanjšanje velikosti izvedljive datoteke in omogoča skupno rabo iste kopije knjižnice v pomnilniku, vendar morate za to namestiti celoten niz dinamičnih knjižnic, ki se uporabljajo na vsakem vozlišču, kjer se bodo programi zagnali .

Če ste torej namestili Intelov prevajalnik na svoj računalnik z Linuxom in želite zagnati prevedene izvedljive datoteke na drugih računalnikih, potem morate uporabiti statično gradnjo (kar je lažje) ali kopirati Intelove dinamične knjižnice v te računalnike (običajno iz imenik, npr. stroji.

Privzeto so vse Intelove razvojne knjižnice (razen libcxa.so) povezane statično, vse sistemske knjižnice Linux in knjižnice GNU pa so povezane dinamično. Uporaba možnosti -statična lahko prisilite zbiralnik (urejevalnik povezav), da statično poveže vse knjižnice (kar bo povečalo glasnost izvršljiva datoteka) in z uporabo možnosti -i_dinamičen Vse Intelove razvojne knjižnice lahko dinamično povežete.

Pri povezovanju dodatnih knjižnic z možnostjo pogleda -knjižnica morda boste morali uporabiti možnost -Imenik da določite pot, kjer se nahajajo knjižnice.

Uporaba možnosti -Bstatično in -Bdinamično lahko izrecno podate dinamično ali statično povezavo vsake od knjižnic, navedenih v ukazna vrstica.

Uporaba možnosti -c sestavljanje izvršljive datoteke je onemogočeno in izvede se samo prevajanje (generacija objektnega modula).

Moduli za skupno rabo v Fortranu in C

Za skupno rabo modulov, napisanih v Fortranu in C, se morate dogovoriti o poimenovanju postopkov v objektnih modulih, posredovanju parametrov in dostopu do globalnih spremenljivk, če obstajajo.

Prevajalnik Intel Fortran privzeto pretvori imena postopkov v male črke in na koncu imena doda podčrtaj. Prevajalnik C nikoli ne spremeni imen funkcij. Torej, če želimo poklicati funkcijo ali proceduro FNNAME, implementirano v C iz modula Fortran, potem se mora v modulu C imenovati fnname_.

Prevajalnik Fortran podpira možnost -nus [ime datoteke], ki vam omogoča, da onemogočite dodajanje podčrtajev notranjim imenom postopkov. Če je podano ime datoteke, se to naredi samo za imena postopkov, navedena v navedeni datoteki.

Privzeto se v Fortranu parametri posredujejo po sklicu, v C pa se vedno posredujejo po vrednosti. Tako moramo pri klicu postopka Fortran iz modula C posredovati kazalce na ustrezne spremenljivke, ki vsebujejo vrednosti dejanskih parametrov kot parametrov. Ko pišemo funkcijo v C, ki jo bo treba poklicati iz modula Fortran, moramo formalne parametre opisati kot kazalce na ustrezne tipe.

V modulih C je mogoče uporabiti bloke COMMON, definirane znotraj modulov Fortran (za več informacij glejte Uporabniški priročnik za prevajalnik Intel Fortran, poglavje Mešanje C in Fortran).

Skupna raba prevajalnikov Intel in GCC

Objektni moduli C, ki jih izdeluje prevajalnik Intel C++, so združljivi z moduli, ki jih izdelujeta prevajalnik GCC in knjižnica GNU C. Tako je mogoče te module uporabljati skupaj v enem samem programu, prevedenem z ukazoma icc ali gcc, vendar je priporočljivo, da uporabite icc za pravilno vključitev knjižnic Intel.

Intelov prevajalnik podpira številne nestandardne razširitve jezika C, ki jih uporablja projekt GNU in podpira prevajalnik GCC (vendar ne vseh, za več podrobnosti glejte tukaj).

Uporabniški priročnik ne pove ničesar o združljivosti objektnih modulov v jezikih C++ in Fortran; očitno ni podprt.

Podpora standardom

Intel C++ Compiler 7.0 za Linux podpira jezikovni standard ANSI/ISO C (ISO/IEC 9899/1990). Možno je vzpostaviti strogo združljivost s standardom ANSI C ( -ansi) ali razširjeno narečje ANSI C ( -Xa). Pri uporabi možnosti -c99

  • Priročniki za prevajalnik v formatu HTML (na voljo "online" na našem strežniku, vendar zahtevajo podporo za jezik Java)
    • Uporabniški priročnik za prevajalnik Intel C++.
    • Navodila za uporabo prevajalnika Intel Fortran.
  • Priročniki za prevajalnike za angleški jezik v formatu PDF (potreben je Acrobat Reader, datoteke PDF morate prenesti na svoj računalnik)
    • Uporabniški priročnik za Intel C++ Compiler: Uporabniški priročnik za Intel C++ Compiler (1,3 MB, 395 strani).
    • Uporabniški priročnik za prevajalnik Intel Fortran: Uporabniški priročnik za prevajalnik Intel Fortran (1,1 MB, 285 strani).
    • Programmer's Reference in Fortran: Intel Fortran Programmer's Reference (7 MB, 566 strani).
    • Sklicevanje na knjižnice za jezik Fortran: Referenčni priročnik za knjižnice Intel Fortran (9,5 MB, 881 strani).
  • Priročnik za razhroščevanje aplikacij Intel.
  • Primerjava prevajalnikov na testih SPEC CPU2000 (članek na ixbt.com v ruščini).
  • Spletna stran Polyhedron predstavlja primerjalne rezultate med različnimi prevajalniki.
  • V prejšnji številki revije smo razpravljali o izdelkih iz družine Intel VTune Performance Analyzer - orodjih za analizo zmogljivosti, ki so zasluženo priljubljena med razvijalci aplikacij in omogočajo zaznavanje v kodi timske prijave, ki zapravljajo preveč virov procesorja, kar daje razvijalcem možnost, da prepoznajo in odpravijo potencial ozka mesta, povezane s podobnimi deli kode, s čimer se pospeši proces razvoja aplikacije. Upoštevajte pa, da je zmogljivost aplikacij v veliki meri odvisna od tega, kako učinkoviti so prevajalniki, uporabljeni pri njihovem razvoju, in katere funkcije strojna oprema uporabljajo se pri generiranju strojne kode.

    Najnovejše različice prevajalnikov Intel Intel C++ in Intel Fortran za Windows in Linux vam omogočajo, da pridobite prednosti zmogljivosti aplikacij za sisteme, ki temeljijo na Intel procesorji Itanium 2, Intel Xeon in Intel Pentium 4 do 40 % v primerjavi z obstoječimi prevajalniki drugih proizvajalcev zaradi uporabe takih funkcij teh procesorjev, kot je tehnologija Hyper-Threading.

    Razlike, povezane z optimizacijo kode s to družino prevajalnikov, vključujejo uporabo sklada za izvajanje operacij s plavajočo vejico, medproceduralno optimizacijo (IPO), optimizacijo v skladu s profilom aplikacije (profilno vodena optimizacija (PGO), prednalaganje podatkov v predpomnilnik ( Vnaprejšnje pridobivanje podatkov), ki se izogne ​​zakasnitvi, povezani z dostopom do pomnilnika, podpora značilnim lastnostim procesorjev Intel (na primer razširitve za pretočno obdelavo podatkov Intel Streaming SIMD Extensions 2, značilnost Intel Pentium 4), avtomatska paralelizacija izvajanja kode, aplikacija ustvarjanje, ki teče na več različni tipi procesorji pri optimizaciji za enega od njih, orodja za "predvidevanje" naslednje kode (branch prediction), razširjena podpora za delo z izvajalnimi nitmi.

    Upoštevajte, da prevajalnike Intel uporabljajo tako znana podjetja, kot so Alias/Wavefront, Oracle, Fujitsu Siemens, ABAQUS, Silicon Graphics, IBM. Glede na neodvisna testiranja, ki so jih izvedla številna podjetja, je zmogljivost Intelovih prevajalnikov znatno višja od zmogljivosti prevajalnikov drugih proizvajalcev (glejte na primer http://intel.com/software/products/compilers/techtopics/compiler_gnu_perf .pdf).

    Spodaj si bomo ogledali nekaj funkcij najnovejše različice Intelovi prevajalniki za namizje in strežnike operacijski sistemi.

    Prevajalniki za platformo Microsoft Windows

    Intel C++ Compiler 7.1 za Windows

    Intel C++ Compiler 7.1 je prevajalnik, izdan v začetku tega leta, ki zagotavlja visoko optimizirano kodo za procesorje Intel Itanium, Intel Itanium 2, Intel Pentium 4 in Intel Xeon ter procesor Intel Pentium M, ki uporablja tehnologijo Intel Centrino in je namenjen za uporabo v mobilne naprave.

    Navedeni prevajalnik je popolnoma združljiv z razvojnimi orodji Microsoft Visual C++ 6.0 in Microsoft Visual Studio .NET: vgradimo ga lahko v ustrezna razvojna okolja.

    Ta prevajalnik podpira standarde ANSI in ISO C/C++.

    Prevajalnik Intel Fortran 7.1 za Windows

    Intel Fortran Compiler 7.1 za Windows, prav tako izdan v začetku tega leta, vam omogoča ustvarjanje optimizirane kode za procesorje Intel Itanium, Intel Itanium 2, Intel Pentium 4 in Intel Xeon, Intel Pentium M.

    Ta prevajalnik je popolnoma združljiv z razvojnimi orodji Microsoft Visual C++ 6.0 in Microsoft Visual Studio .NET, kar pomeni, da ga je mogoče vgraditi v ustrezna razvojna okolja. Poleg tega vam ta prevajalnik omogoča razvoj 64-bitnih aplikacij za operacijske sisteme, ki se izvajajo na procesorjih Itanium/Itanium 2 z uporabo programa Microsoft Visual Studio na 32-bitnem procesorju Pentium z uporabo 64-bitnega prevajalnika Intel Fortran. Pri odpravljanju napak v kodi vam ta prevajalnik omogoča uporabo razhroščevalnika za Microsoftove platforme.MREŽA.

    Če imate nameščen izdelek Compaq, lahko namesto originalnega Intel Fortran Compiler 7.1 uporabite Visual Fortran 6.6, saj so ti prevajalniki združljivi na ravni izvorna koda.

    Intel Fortran Compiler 7.1 za Windows je popolnoma združljiv s standardom ISO Fortran 95 in podpira ustvarjanje in razhroščevanje aplikacij, ki vsebujejo kodo v dveh jezikih: C in Fortran.

    Prevajalniki za platformo Linux

    Intel C++ Compiler 7.1 za Linux

    Drugi prevajalnik, ki je bil izdan na začetku leta, Intel C++ Compiler 7.1 za Linux, omogoča doseganje visoke stopnje optimizacije kode za procesorje Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Ta prevajalnik je v celoti združljiv s prevajalnikom GNU C pri izvorni kodi in objektnih modulih, kar vam omogoča, da vanj brez dodatnih stroškov preselite aplikacije, ustvarjene z GNU C. Prevajalnik Intel C++ podpira C++ ABI (dodatek k jedru Linuxa, ki vam omogoča zagon Spodaj Linux nadzor prevedena koda za druge platforme, kot so zgodnji operacijski sistemi SCO, zgodnje različice Sun Solaris itd.), kar pomeni popolno združljivost s prevajalnikom gcc 3.2 na ravni binarne kode. Nazadnje, z Intel C++ Compiler 7.1 za Linux lahko celo znova prevedete jedro Linuxa tako, da naredite nekaj manjših sprememb v njegovi izvorni kodi.

    Prevajalnik Intel Fortran 7.1 za Linux

    Prevajalnik Intel Fortran 7.1 za Linux vam omogoča ustvarjanje optimizirane kode za procesorje Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Ta prevajalnik je popolnoma združljiv s prevajalnikom Compaq Visual Fortran 6.6 na ravni izvorne kode, kar vam omogoča za ponovno prevajanje aplikacij, ustvarjenih s Compaq Visual Fortran, in s tem povečanje njihove zmogljivosti.

    Poleg tega je podani prevajalnik združljiv s pripomočki, ki jih uporabljajo razvijalci, kot so urejevalnik emacs, razhroščevalnik gdb in pripomoček za izdelavo aplikacije make.

    Tako kot različica tega prevajalnika za Windows je Intel Fortran Compiler 7.1 za Linux popolnoma združljiv s standardom ISO Fortran 95 in podpira ustvarjanje in razhroščevanje aplikacij, ki vsebujejo kodo v dveh jezikih: C in Fortran.

    Posebej je treba poudariti, da so pomemben prispevek k ustvarjanju naštetih Intelovih prevajalnikov prispevali strokovnjaki Intelovega ruskega centra za razvoj programske opreme v Nižnem Novgorodu. več podrobne informacije Informacije o Intelovih prevajalnikih najdete na Intelovem spletnem mestu www.intel.com/software/products/.

    Drugi del tega članka bo posvečen Intelovim prevajalnikom, ki ustvarjajo aplikacije za mobilne naprave.

    Primeri resničnih vdorov: prevajalnik Intel C++ 7.0 - arhiv WASM.RU

    ... prevajalnik Intel C++ 7.0 prenesen pozno ponoči, približno ob petih zjutraj. Zelo sem si želel spati, a me je razganjala tudi radovednost, ali so varovanje okrepili ali ne. Odločil sem se, da dokler ne ugotovim zaščite, še vedno ne bom zaspal, sem odprl nova konzola, in ponastavitev sistemskih spremenljivk TEMP in TMP v imenik C:\TEMP, naglo in nespodobno vtipkano dolgo ime namestitveni program W_CC_P_7.0.073.exe v ukazni vrstici (potreba po nastavitvi spremenljivk TEMP in TMP je razložena z dejstvom, da v sistemu Windows 2000 privzeto kažejo na zelo globoko ugnezdeni imenik in namestitveni program Intel C++ - in ne samo - ne podpira poti tako velike velikosti).

    Takoj je postalo jasno, da je bila politika zaščite korenito spremenjena in zdaj je bila prisotnost licence preverjena že v fazi namestitve programa (v različici 5.x je bila namestitev izvedena brez težav). V redu, izdamo ukaz dir in pogledamo vsebino tega, s čimer se moramo zdaj boriti:

      Vsebina mape 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

      opombe

      05.06.2002 10:35 45 056 AutoRun.exe

      10.7.2001 12:56 27 avtorun.inf

      29.10.2002 11:25 2 831 ccompindex.htm

      24.10.2002 8:12 126 976 ChkLic.dll

      18.10.2002 22:37 552 960 chklic.exe

      17.10.2002 16:29 28 663 CLicense.rtf

      17.10.2002 16:35 386 credist.txt

      16.10.2002 17:02 34 136 Crellnotes.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.7.2001 12:56 184 setup.mwg

      19 datotek 2.519.238 bajtov

      6 map 886.571.008 bajtov brezplačno

    ja! Namestitveni program setup.exe traja le štirideset kilobajtov. Zelo dobro! Malo verjetno je, da lahko v tolikšni količini skrijete resno zaščito, in tudi če je tako, ta majhna datoteka ni vredna ničesar, da bi jo analizirali v celoti - do zadnjega bajta seznama disassemblerja. Vendar pa ni dejstvo, da varnostna koda ki se nahaja točno v setup.exe, lahko na drugem mestu, na primer ... ChkLic.dll/ChkLic.exe, ki skupaj zavzameta nekaj manj kot sedemsto kilobajtov. Čakaj, kaj je ChkLic? Je to okrajšava za Preveri licenco ali kaj?! Hmm, fantje iz Intela imajo očitno resne težave s smislom za humor. Bolje bi bilo, če bi to datoteko pošteno poimenovali "Hack Me"! V redu, sodeč po obsegu je ChkLic isti FLEX lm in smo ga že srečali (glejte "Intel C++ 5.0 Compiler") in imamo približno idejo, kako ga zlomiti.

    Damo ukaz "dumpbin /EXPORTS ChkLic.dll", da pregledamo izvožene funkcije in ... se trdno držimo Klave, da ne pademo s stola:

      Izpis datoteke ChkLic.dll

    1. Razdelek vsebuje naslednje izvoze za ChkLic.dll

      0 lastnosti

      3DB438B4 čas in datum žig Pon, 21. oktober 21:26:12 2002

    2. 1 število funkcij

      1 število imen

      vrstni namig RVA ime

      1 0 000010A0 _CheckValidLicense

    Prekleto! Zaščita izvozi samo eno samo funkcijo s čudovitim imenom CheckValidLicense. "Čudovito" - ker namen funkcije postane jasen iz njenega imena in se je mogoče izogniti mukotrpni analizi kode disassemblerja. Pa so izgubili vsakršno zanimanje... bolje bi bilo, če bi ga ordinalno izvozili ali kaj podobnega ali pa ga vsaj krstili s kakšnim zastrašujočim imenom kot je DES Decrypt.

    ... sanjarjenje! V redu, vrnimo se k našim ovcam. Razmišljajmo logično: če je vsa varnostna koda skoncentrirana neposredno v ChkLic.dll (in, sodeč po "zgibni" naravi zaščite, je temu res tako), potem se vsa "zaščita" zmanjša na klic CheckValidLicense iz namestitve. exe in preverjanje rezultata, ki ga vrne. Zato je za "hekanje" dovolj samo izgubiti ChkLic.dll, zaradi česar se funkcija ChekValidLicense vedno vrne ... in mimogrede, kaj naj vrne? Natančneje: kaj točno je vrnjena vrednost, ki ustreza uspešnemu preverjanju licence? Ne, ne hitite z razstavljanjem setup.exe, da ga ugotovite, ker možne možnosti ne več toliko: ali FALSE ali TRUE. Ali stavite na TRUE? No, v nekem smislu je to logično, a po drugi strani: zakaj smo se pravzaprav odločili, da funkcija CheckValidLicense vrne ravno zastavico uspešnosti operacije in ne kode napake? Navsezadnje mora nekako motivirati razloge za zavrnitev namestitve prevajalnika: datoteka z licenco ni bila najdena, datoteka je poškodovana, licenca je potekla in tako naprej? V redu, poskusimo vrniti nič, in če to ne deluje, bomo vrnili eno.

    OK, pripni se, gremo! Zaženemo HIEW, odpremo datoteko ChkLic.dll (če se ne odpre, si trikrat zapomnimo gophers, jo začasno prekopiramo v root ali katerikoli drug imenik, ki v svojem imenu ne vsebuje posebnih znakov, ki jih hiew ne mara) Nato se znova obrnemo na izvozno tabelo, pridobljeno s smetiščem, določimo naslov funkcije CheckValidLicense (v tem primeru 010A0h) in skozi "10A0" gremo na njen začetek. Zdaj ga izrežemo "v živo", prepišemo čez stara koda “XOR EAX, EAX/RETN 4". Zakaj točno "REN 4" in ne samo "RET"? Da, ker funkcija podpira konvencijo stdcall, kar lahko ugotovite, če pogledate njen epilog v HIEW"e ( samo pomaknite se navzdol po zaslonu razstavljalnika, dokler ne srečate RET).

    Preverimo... Deluje!!! Kljub pomanjkanju licence namestitveni program začne namestitev brez vprašanj! Zato je obramba padla. Oh, ne moremo verjeti, da je vse tako preprosto in, da ne bi neumno sedeli in strmeli v monitor in čakali, da se postopek namestitve programa konča, uporabljamo naš najljubši IDA disassembler na setup.exe. Prva stvar, ki ujame vaše oči, je odsotnost CheckValidLicense na seznamu uvoženih funkcij. Mogoče nekako zažene datoteko ChkLic.exe? Poskušamo najti ustrezno povezavo med samodejno prepoznanimi vrsticami: “~View aNames”, “ChkLic”... ja, vrstice “Chklic.exe” sploh ni, zaznana pa je “Chklic.dll”. Ja, razumem, to pomeni, da se knjižnica ChkLic naloži z eksplicitnim povezovanjem prek LoadLibrary. In naslednje navzkrižno sklicevanje to potrjuje:

      Besedilo:0040175D potisni odmik aChklic_dll ; lpLibFileName

      Text:00401762 pokličite ds:LoadLibraryA

      Besedilo:00401762 ; naloži ChkLic.dll ^^^^^^^^^^^^^^^^^

      Besedilo:00401762 ;

      Besedilo:00401768 mov esi, eax

      Besedilo:0040176A potisni odmik a_checkvalidlic ; lpProcName

      Besedilo:0040176F potisni esi ; hModule

      Text:00401770 klic ds:GetProcAddress

      Besedilo:00401770 ; dobite naslov funkcije CheckValidLicense

      Besedilo:00401770 ;

      Besedilo:00401776 cmp esi, ebx

      Besedilo: 00401778 jz loc_40192E

      Besedilo:00401778 ; če take knjižnice ni, zapustite namestitveni program

      Besedilo:00401778 ;

      Besedilo:0040177E cmp eax, ebx

      Besedilo: 00401780 jz loc_40192E

      Besedilo:00401780 ; če te funkcije v knjižnici ni, zapustite namestitev

      Besedilo:00401780 ;

      Besedilo:00401786 potisnite ebx

      Besedilo:00401787 pokliči eax

      Besedilo:00401787 ; pokličite funkcijo ChekValidLicense

      Besedilo:00401787 ;

      Besedilo:00401789 test eax, eax

      Besedilo: 0040178B jnz loc_4019A3

    Besedilo:0040178 ; če je funkcija vrnila različno od nič, potem zapustite namestitveni program

    Neverjetno, ta strašno primitivna obramba je zgrajena točno tako! Še več, polmetrska datoteka ChkLic.exe sploh ni potrebna! In zakaj se ga je splačalo potegniti z interneta? Mimogrede, če se odločite shraniti distribucijo prevajalnika (pozor: nisem rekel "distribuirati"!), lahko ChkLic.* zaradi prihranka prostora na disku izbrišete: bodisi z brisanjem setup.exe, tako da ga za vedno odstavite od dostop do njih ali preprosto ustvarjanje lastne ChkLic.dll, izvoz funkcije stdcall CheckValidLicence v obliki: int CheckValidLicence(int some_flag) ( return 0;)

    No, medtem ko smo razpravljali o vsem tem, je namestitveni program končal z namestitvijo prevajalnika in uspešno zaključil svoje delo. Je zanimivo, ali se bo prevajalnik zagnal ali se zabava šele začenja? Mrzlično se spustimo po razvejani hierarhiji podmap, najdemo icl.exe, ki se, kot bi pričakovali, nahaja v imeniku bin, kliknemo in ... Prevajalnik se seveda ne zažene, navaja dejstvo, da "icl: error: ni mogel preveriti licence FLEX lm« , brez katere ne more nadaljevati svojega dela.

    Izkazalo se je, da je Intel uporabil večnivojsko zaščito in prva raven se je izkazala za grobo zaščito pred bedaki. No! Sprejmemo ta izziv in na podlagi naših prejšnjih izkušenj samodejno poiščemo datoteko LMGR*.DLL v imeniku prevajalnika. Neuporabna! Tokrat te datoteke tukaj ni, se je pa izkazalo, da je icl.exe močno pridobil na teži in presegel mejo šeststo kilobajtov ... Stop! Ali niso razvijalci prevajalnika povezali tega istega FLEX lm s statičnim povezovanjem? Poglejmo: v Intel C++ 5.0 je bila vsota velikosti lmgr327.dll in icl.exe 598 KB, zdaj pa samo icl.exe zaseda 684 KB. Ob upoštevanju prilagoditve za naravno senilno »debelost« se številke zelo dobro ujemajo. Torej, konec koncev, FLEX lm! oh oh! Toda zdaj, brez simboličnih imen funkcij, bo veliko težje zlomiti zaščito ... Vendar ne bodimo prestrašeni pred časom! Premislimo, le mirno! Malo verjetno je, da je razvojna skupina popolnoma prepisala vso kodo, ki je v interakciji s to zaščito "ovojnice". Najverjetneje se je njegova "izboljšava" končala le s spremembo vrste postavitve. In če je tako, potem so možnosti za vdor v program še vedno velike!

    Ko smo se spomnili, da je bila varnostna koda zadnjič v glavni funkciji, smo, ko smo določili njen naslov, preprosto nastavili prekinitveno točko in čakali, da se odpre razhroščevalnik, neumno izsledili kodo, izmenično pogledali razhroščevalnik in nato izhod programa okno: se je pojavilo Ali obstaja psovka? Hkrati označimo vse pogojne prehode, na katere naletimo, na ločen list papirja (ali ga shranimo v svoj spomin, če želite), pri čemer ne pozabimo navesti, ali je bil vsak pogojni prehod izveden ali ne ... Stop! S tabo sva o nečem klepetala, a se je že pojavilo žaljivo sporočilo! v redu dobro! Poglejmo, kakšen pogojni prehod je temu ustrezal. Naši zapisi kažejo, da je bil zadnji skok, na katerega smo naleteli, pogojni skok JNZ, ki se nahaja na naslovu 0401075h in se "odziva" na rezultat, ki ga vrne sub_404C0E:

  • Besedilo:0040107F loc_40107F: ; KODA XREF: _main+75^j

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

    Besedilo:00401084 mov edx, 21h

    Besedilo:00401089 pokličite sub_404C0E

    Besedilo:0040108E test eax, eax

    Besedilo:00401090 jnz kratko loc_40109A

    Očitno je sub_404C0E zelo zaščitni postopek, ki preverja prisotnost licence. Kako jo pretentati? No, obstaja veliko možnosti ... Prvič, lahko premišljeno in natančno analizirate vsebino sub_404C0E, da ugotovite, kaj natančno preverja in kako natančno preverja. Drugič, lahko preprosto zamenjate JNZ short loc_40107F z JZ short loc_40107F ali celo NOP, NOP. Tretjič, povratni ukaz za preverjanje rezultatov TEST EAX, EAX je mogoče spremeniti v ničelni ukaz: XOR EAX, EAX. Četrtič, lahko naredite, da sam sub_404C0E izgine, tako da vedno vrne nič. Ne vem za vas, ampak meni je bila najbolj všeč metoda številka tri. Spremenimo dva bajta in zaženemo prevajalnik. Če v zaščiti ni drugih preverjanj njegovega "licenciranja", bo program deloval in v skladu s tem obratno. (Kot se spomnimo, sta bila v peti različici dva takšna preverjanja). Neverjetno, prevajalnik se ne pritožuje več in deluje!!! Dejansko, kot bi pričakovali, njeni razvijalci zaščite sploh niso okrepili, ampak, nasprotno, celo oslabili! Chris Kaspersky

  • Nisi suženj!
    Zaprti izobraževalni tečaj za otroke elite: "Prava ureditev sveta."
    http://noslave.org

    Gradivo iz Wikipedije - proste enciklopedije

    Prevajalnik Intel C++
    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).
    Vrsta
    Avtor

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Razvijalec
    Razvijalci

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Napisano naprej

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Vmesnik

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    operacijski sistem
    Jeziki vmesnika

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Prva izdaja

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Strojna platforma
    Najnovejša različica
    Kandidat za sprostitev

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Beta različica

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Alfa različica

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Testna različica

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Berljivi formati datotek

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Ustvarjeni formati datotek

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Država

    Napaka Lua v Module:Wikidata v vrstici 170: poskus indeksiranja polja "wikibase" (ničelna vrednost).

    Licenca

    Glavne značilnosti:

    • Vektorizacija za SSE, SSE2, SSE3, SSE4

    Prevajalnik podpira standard OpenMP 3.0 za pisanje vzporednih programov. Vsebuje tudi modifikacijo OpenMP, imenovano Cluster OpenMP, s katero lahko izvajate aplikacije, napisane v skladu z OpenMP, na gručah z uporabo MPI.

    Intel C++ Compiler uporablja frontend (del prevajalnika, ki razčleni prevedeni program) podjetja Edison Design Group. Isti vmesnik uporabljajo prevajalniki SGI MIPSpro, Comeau C++ in Portland Group.

    Ta prevajalnik se pogosto uporablja za prevajanje SPEC CPU meril uspešnosti.

    Obstajajo 4 serije izdelkov podjetja Intel, ki vsebujejo prevajalnik:

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

    Slabosti različice prevajalnika za Linux so delna nezdružljivost z razširitvami GNU jezika C (podprte s prevajalnikom GCC), kar lahko povzroči težave pri prevajanju nekaterih programov.

    Eksperimentalne možnosti

    Objavljene so bile naslednje poskusne različice prevajalnika:

    • Intel STM Compiler Prototype Edition z dne 17. septembra 2007. Podpora za programski transakcijski pomnilnik (STM). Izdano za Linux in Windows, samo za IA-32 (procesorji x86);
    • Intel Concurrent Collections za C/C++ 0.3 od septembra 2008. Vsebuje mehanizme, ki olajšajo pisanje vzporednih programov C++.

    Osnovne zastave

    Windows Linux, MacOSX Opis
    /od -O0 Onemogoči optimizacije
    /O1 -O1 Optimizirajte, da zmanjšate velikost izvršljive datoteke
    /O2 -O2 Optimizirajte za hitrost. Vključene so nekatere optimizacije
    /O3 -O3 Omogoči vse optimizacije iz O2. Izvedite tudi intenzivne optimizacije cikla
    /Oip -Ojp Omogoči medproceduralno optimizacijo po posameznih datotekah
    /Oipo -Oipo Omogoči globalno medproceduralno optimizacijo
    /QxO -xO Dovolite uporabo razširitev SSE3, SSE2 in SSE za procesorje, ki jih proizvaja katero koli podjetje
    /hitro -hitro "Hitri način". Enakovredno možnostima "/O3 /Qipo /QxHost /no-prec-div" v sistemu Windows in "-O3 -ipo -static -xHOST -no-prec-div" v sistemu Linux. Upoštevajte, da zastavica “-xHOST” pomeni optimizacijo za procesor, na katerem se izvaja prevajalnik.
    /Qprof-gen -prof_gen Ustvarite instrumentalno različico programa, ki bo sestavil profil delovanja
    /Qprof-use -prof_use Uporabite informacije o profilu iz zagonov programov, zbrane z zastavico prof_gen.

    Napišite oceno o članku "Prevajalnik Intel C++"

    Opombe

    Poglej tudi

    Povezave

    Odlomek, ki opisuje prevajalnik Intel C++

    In prav tako se je vrnila, da bi še zadnjič videla Belega maga... Njenega moža in zvestega prijatelja, ki ga nikoli ni mogla pozabiti. V srcu mu je odpustila. Toda na njegovo veliko žalost mu ni mogla prinesti Magdaleninega odpuščanja ... Torej, kot vidiš, Izidora, je velika krščanska bajka o "odpuščanju" le otročja laž za naivne vernike, da bi jim dovolili storiti kakršno koli zlo, vedoč, da jim bo ne glede na to, kaj storijo, na koncu odpuščeno. Toda odpustiš lahko le tisto, kar je resnično vredno odpuščanja. Človek mora razumeti, da mora za vsako storjeno zlo odgovarjati ... In ne pred nekim skrivnostnim Bogom, ampak pred samim seboj, ki se prisili v kruto trpljenje. Magdalena Vladyku ni odpustila, čeprav ga je globoko spoštovala in iskreno ljubila. Tako kot vsem nam ni odpustila strašne Radomirjeve smrti. Navsezadnje je ONA razumela bolje kot kdorkoli drug - lahko bi mu pomagali, lahko bi ga rešili pred kruto smrtjo ... Ampak tega nismo hoteli. Ker je menila, da je krivda Belega maga preveč kruta, ga je pustila živeti s to krivdo, ne da bi je pozabila niti za minuto... Ni mu želela dati lahkega odpuščanja. Nikoli več je nismo videli. Tako kot nikoli niso videli svojih otrok. Preko enega od vitezov svojega templja - našega čarovnika - je Magdalena posredovala odgovor Vladiki na njegovo prošnjo, naj se vrne k nam: »Sonce ne vzide dvakrat na isti dan ... Veselje tvojega sveta (Radomir) bo nikoli se ne vrni k tebi, tako kot se ne bom vrnil k tebi in jaz... Našel sem svojo VERO in svojo RESNICO, ŽIVI sta, tvoja pa je MRTVA... Žaluj za svojimi sinovi - ljubili so te. Nikoli ti ne bom odpustil njihove smrti, dokler bom živ. In naj vaša krivda ostane s tabo. Morda ti bo nekega dne prinesla svetlobo in odpuščanje ... Ampak ne od mene.« Glava maga Janeza ni bila prinesena v Meteoro iz istega razloga - nihče od vitezov templja se ni hotel vrniti k nam ... Izgubili smo jih, kot smo izgubili že večkrat mnoge druge, ki niso hoteli razumeti in sprejeti naše žrtve... Ki so storili tako kot vi - so odšli in nas obsojali.
    V glavi se mi je vrtelo!.. Kot žejen človek, ki teši večno lakoto po znanju, sem pohlepno vsrkaval tok neverjetnih informacij, ki jih je velikodušno dajal sever... In želel sem veliko več!.. Hotel sem vedeti vse, konec. To je bil dih sveže vode v puščavi, ožgani od bolečine in težav! In nisem se mogla naveličati...
    – Imam na tisoče vprašanj! Ampak ni več časa ... Kaj naj storim, Sever?..
    - Vprašaj, Izidora!.. Vprašaj, poskušal ti bom odgovoriti ...
    – Povej mi, Sever, zakaj se mi zdi, da ta zgodba združuje dve življenjski zgodbi, prepleteni s podobnimi dogodki, in sta predstavljeni kot življenje ene osebe? Ali pa nimam prav?
    – Popolnoma prav imaš, Izidora. Kot sem vam že povedal, so »močneži tega sveta«, ki so ustvarile lažno zgodovino človeštva, na resnično Kristusovo življenje »oblekle« tuje življenje judovskega preroka Jozueta, ki je živel pred tisoč leti in pol ( iz časa zgodbe o severu). Pa ne samo sebe, tudi svojo družino, svoje sorodnike in prijatelje, svoje prijatelje in sledilce. Navsezadnje je bila to žena preroka Jozueta, judovska Marija, ki je imela sestro Marto in brata Lazarja, sestro njegove matere Marijo Jakobe in druge, ki nikoli niso bili blizu Radomirja in Magdalene. Tako kot ob njih ni bilo drugih »apostolov« - Pavla, Mateja, Petra, Luke in ostalih ...
    Družina preroka Jozueta se je pred tisoč leti in pol preselila v Provanso (ki se je takrat imenovala Transalpska Galija), v grško mesto Massalia (današnji Marseille), saj je bila Massalia takrat »vrata« med Evropo in Azijo in je bila to najlažja pot za vse »preganjane«, da so se izognili preganjanju in težavam.



    
    Vrh