kompilátory Intel. Prečo boli potrebné nové kompilátory?

Kompilátory Intel C++ a Fortran a knižnica MKL

Spolu so štandardnými kompilátormi GNU pre Linux sú na klastroch výpočtového komplexu NIVC nainštalované kompilátory Intel C++ a Fortran. V súčasnosti (začiatok roku 2006) sú na všetkých klastroch nainštalované kompilátory verzie 9.1. Táto stránka je venovaná popisu najdôležitejších možností a nastavení týchto kompilátorov, ako aj ich hlavných rozdielov od kompilátorov GNU. Stránka je zameraná hlavne na používateľov klastrov MSU Research Computing Center, ale môže byť užitočná aj pre ostatných rusky hovoriacich používateľov. Problémy súvisiace s kompiláciou pre platformu IA-64 tu nie sú riešené.

Knižnica Intel je tiež nainštalovaná na všetkých klastroch Knižnica jadrovej matematiky(MKL) verzia 8.0.2. Knižnica sa nachádza v adresári /usr/mkl. Upozorňujeme, že podadresáre 32, 64 a em64t sú dostupné v adresári lib. Na klastri Ant je potrebné použiť knižnice z podadresára em64t a na ostatných klastroch z podadresára 32. Všetku potrebnú dokumentáciu a príklady môžete získať z adresára /usr/mkl/doc.

Prečo boli potrebné nové kompilátory?

Potreba nových kompilátorov vznikla hlavne kvôli a) podpore programovania vo Fortran 90 a tiež b) výkonnejšej optimalizácii programov Fortran, než poskytuje kompilátor g77, ktorý využíva preklad do C a následne kompiláciu pomocou gcc.

Tieto požiadavky spĺňajú aj kompilátory PGI (Portland Group), ktoré však developerská spoločnosť odmietla dodať do Ruska.

Ako použiť?

Kompilátory Intel sa vyvolávajú pomocou príkazov icc(C alebo C++), icpc(C++) a ifort(Fortran 77/90). Príkazy mpicc, mpiCC a mpif77 na kompiláciu a zostavenie programov MPI sú tiež nakonfigurované na používanie kompilátorov Intel.

Je tiež možné použiť GNU kompilátory pomocou príkazov mpigcc, mpig++ a mpig77 (Fortran 90 nie je podporovaný).

Vstupné súbory

V predvolenom nastavení sú súbory s príponou .cpp A .cxx sa považujú za zdrojové texty v jazyku C++, súbory s príponou .c- Zdrojový kód C a kompilátor icpc tiež kompiluje súbory .c ako zdrojový kód C++.

Súbory s príponami .f, .ftn A .pre sú rozpoznávané ako zdrojové texty v jazyku Fotran s pevnou formou notácie a súbory .fpp A .F dodatočne prešiel cez preprocesor jazyka Fortran. Súbory s príponou .f90 sa považujú za zdrojové texty Fortran 90/95 s voľnou notáciou. Pomocou možností môžete explicitne určiť pevnú alebo voľnú formu notácie pre programy Fortran -FI A -FR resp.

Súbory s príponou .s uznávaný ako kód assembleru pre IA-32.

Funkcie kompilátora Intel

Tu uvádzame charakteristiky kompilátorov Intel, ako ich uvádza vývojár v používateľskej príručke s niektorými našimi komentármi.

  • Výrazná optimalizácia
    Zrejme to znamená optimalizáciu kódu na vysokej úrovni, t.j. v prvom rade rôzne slučkové transformácie, ktoré takmer všetky kompilátory robia s väčším či menším úspechom
  • Optimalizácia s pohyblivou rádovou čiarkou
    Zrejme to znamená v prvom rade maximálne využitie príkazov implementovaných na hardvérovej úrovni
  • Interprocedurálne optimalizácie
    tie. globálna optimalizácia celého programu na rozdiel od bežnej optimalizácie, ktorá ovplyvňuje iba kód konkrétnych funkcií
  • Optimalizácia založená na profile
    tie. schopnosť spustiť program v testovacom režime, zbierať údaje o čase, ktorý je potrebný na prechod určitých fragmentov kódu v rámci často používaných funkcií, a potom použiť tieto údaje na optimalizáciu
  • Podpora inštrukčnej sady SSE v procesoroch Pentium III
    poznámka: pre výpočtové úlohy sú zaujímavejšie príkazy SSE2, t.j. vektorové príkazy nad 64-bitovými reálnymi číslami, ale sú podporované iba na procesoroch Pentium 4, ktoré zatiaľ nemáme k dispozícii
  • Automatická vektorizácia
    tie. opäť pomocou príkazov SSE a SSE2, ktoré automaticky vkladá kompilátor
  • Podpora OpenMP pre programovanie na SMP systémoch
    poznámka: na klastri sa odporúča primárne používať rozhranie MPI; rozšírené používanie OpenMP na klastri sa neočakáva a takéto experimenty ešte neboli vykonané; ale asi má zmysel používať knižnice (BLAS a pod.), ktoré sú paralelizované pre zdieľanú pamäť.
  • Predbežné načítanie údajov
    tie. Zrejme použitie príkazov preload z pamäte do dátovej vyrovnávacej pamäte, čo bude po určitom čase potrebné
  • "Dispečingový" kód pre rôzne procesory
    tie. schopnosť generovať kód pre rôzne procesory v jednom spustiteľnom súbore, čo vám umožňuje využívať výhody najnovšie procesory dosiahnuť na nich najvyšší výkon pri zachovaní binárnej kompatibility programov so staršími procesormi; Na našom klastri to zatiaľ nie je relevantné, pretože používajú sa iba procesory Pentium III a programy kompilované v klastri sa nemajú prenášať a spúšťať na iných počítačoch

Základné možnosti kompilátora

Najzaujímavejšie sú samozrejme možnosti optimalizácie kódu. Väčšina možností je spoločná pre kompilátory C++ a Fortran. Viac Detailný popis možnosti v anglických používateľských príručkách.

Úrovne optimalizácie
MožnosťPopis
-O0Zakáže optimalizáciu
-O1 alebo -O2Základná optimalizácia pre rýchlosť. Inline vkladanie funkcií knižnice je vypnuté. Pre kompilátor C++ poskytujú tieto možnosti rovnakú optimalizáciu; pre kompilátor Fortran je vhodnejšia možnosť -O2, pretože zahŕňa aj propagáciu cyklu.
-O3Výkonnejšie optimalizácie vrátane transformácií slučiek, predbežného načítania údajov a použitia OpenMP. Niektoré programy nemusia zaručovať lepší výkon v porovnaní s -O2. Má zmysel používať v spojení s možnosťami vektorizácie -xK A -xW.
-rozvinúť[n]Umožňuje odvíjanie slučky až n-krát.
Optimalizácia pre konkrétny procesor
MožnosťPopis
-tpp6Optimalizácia pre procesory Penitum Pro, Pentium II a Pentium III
-tpp7Optimalizácia pre procesory Penitum 4 (táto možnosť je predvolene povolená pre kompilátor IA-32)
-xMGenerovanie kódu pomocou rozšírení MMX špecifických pre procesory Pentium MMX, Pentium II a novšie
-xKGenerovanie kódu pomocou rozšírení SSE špecifických pre procesory Pentium III
-xWGenerovanie kódu pomocou rozšírení SSE2 špecifických pre procesory Pentium 4
Interprocedurálna optimalizácia
-ipV rámci jedného súboru je povolená interprocedurálna optimalizácia. Ak zadáte možnosť -ip_no_inlining, potom je vkladanie inline funkcií deaktivované.
-ipoUmožňuje interprocedurálnu optimalizáciu medzi rôznymi súbormi
Optimalizácia pomocou profilov
-prof_genVygeneruje sa „profilovací“ kód, ktorý bude použitý na profilovanie, t.j. zber údajov o frekvencii prejazdu určitými miestami v programe
-prof_useOptimalizácia sa vykonáva na základe údajov získaných počas fázy profilovania. Má zmysel používať ho spolu s možnosťou interprocedurálnej optimalizácie -ipo.
Paralelizácia pre SMP systémy
- openmpUmožňuje podporu pre štandard OpenMP 2.0
- paralelneAutomatická paralelizácia slučiek je povolená

Výkon

Podľa výsledkov testov SPEC CPU2000 zverejnených na serveri ixbt.com boli kompilátory Intel verzie 6.0 takmer všeobecne lepšie v porovnaní s kompilátormi gcc verzie 2.95.3, 2.96 a 3.1 a PGI verzie 4.0.2. Tieto testy boli vykonané v roku 2002 na počítači s procesorom Pentium 4/1,7 GHz a RedHat Linux 7.3.

Podľa testov vykonaných spoločnosťou Polyhedron bol kompilátor Intel Fortran verzie 7.0 takmer univerzálne lepší ako ostatné kompilátory Fortran 77 pre Linux (Absoft, GNU, Lahey, NAG, NAS, PGI). Iba v niektorých testoch je kompilátor Intel mierne horší ako kompilátory Absoft, NAG a Lahey. Tieto testy boli vykonané na počítači s procesorom Pentium 4/1,8 GHz a Mandrake Linux 8.1.

Kompilátory Intel verzie 9.1 tiež prekonávajú kompilátory gcc a vykazujú výkon porovnateľný s Absoft, PathScale a PGI.

Budeme vďační tým používateľom a čitateľom, ktorí nám pošlú údaje o vplyve výberu kompilátora (GCC alebo Intel) a možnostiach optimalizácie na rýchlosť práce na ich reálne problémy.

Knižnice

Kompilátor jazyka C používa runtime knižnicu vyvinutú v rámci projektu GNU ( libc.a).

S kompilátorom Intel C++ sa dodávajú nasledujúce knižnice:

  • libcprts.a- runtime jazyková knižnica C++ vyvinutá spoločnosťou Denkumware.
  • libcxa.a- dodatočná runtime knižnica pre vývoj C++ od Intelu.
  • libimf.a- knižnica matematických funkcií vyvinutá spoločnosťou Intel, ktorá obsahuje optimalizované a vysoko presné implementácie trigonometrických, hyperbolických, exponenciálnych, špeciálnych, komplexných a iných funkcií (podrobnejšie pozri zoznam funkcií).
  • libirc.a- runtime podpora pre profilovanie (PGO) a odosielanie kódu v závislosti od procesora (pozri vyššie).
  • libguide.a- Implementácia OpenMP.

Tento zoznam obsahuje statické knižnice, no pre väčšinu z nich existujú aj dynamické, t.j. možnosti pripojené počas spúšťania ( .takže).

S kompilátorom Fortran sú dodávané nasledujúce knižnice: libCEPCF90.a, libIEPCF90.a, libintríny.a, libF90.a, používa sa aj knižnica matematických funkcií libimf.a.

Vytvorenie spustiteľného súboru

Knižnice môžu byť pripojené staticky (počas zostavovania) alebo dynamicky (počas spúšťania programu). Dynamický prístup vám umožňuje zmenšiť veľkosť spustiteľného súboru a umožňuje vám zdieľať rovnakú kópiu knižnice v pamäti, ale na to musíte nainštalovať kompletnú sadu dynamických knižníc používaných na každom uzle, kde budú programy spustené. .

Ak ste teda nainštalovali kompilátor Intel na svoj počítač so systémom Linux a chcete spustiť skompilované spustiteľné súbory na iných počítačoch, musíte buď použiť statickú zostavu (čo je jednoduchšie) alebo skopírovať dynamické knižnice Intel na tieto počítače (zvyčajne z adresár ako /opt/intel /compiler70/ia32/lib) do jedného z adresárov uvedených v súbore /etc/ld.so.conf a tiež sa uistite, že na týchto počítačoch je nainštalovaná rovnaká sada dynamických knižníc GNU/Linux .

Štandardne sú všetky vývojové knižnice Intel (okrem libcxa.so) prepojené staticky a všetky linuxové systémové knižnice a knižnice GNU sú prepojené dynamicky. Pomocou možnosti -statický môžete prinútiť kolektor (editor odkazov), aby pripojil všetky knižnice staticky (čo zvýši objem spustiteľný súbor) a pomocou možnosti -i_dynamický Môžete dynamicky prepojiť všetky vývojové knižnice Intel.

Pri pripájaní ďalších knižníc pomocou možnosti zobrazenia -knižnica možno budete musieť použiť túto možnosť -Ladresár určiť cestu, kde sa nachádzajú knižnice.

Používanie možností -Bstatický A -Bdynamický môžete explicitne špecifikovať dynamické alebo statické pripojenie každej z knižníc špecifikovaných v príkazový riadok.

Pomocou možnosti -c zostavenie spustiteľného súboru je zakázané a vykoná sa iba kompilácia (generovanie objektového modulu).

Zdieľanie modulov vo Fortrane a C

Ak chcete zdieľať moduly napísané vo Fortrane a C, musíte sa dohodnúť na pomenovaní procedúr v objektových moduloch, odovzdávaní parametrov a prístupe ku globálnym premenným, ak nejaké existujú.

Kompilátor Intel Fortran štandardne konvertuje názvy procedúr na malé písmená a na koniec názvu pridá podčiarknutie. Kompilátor C nikdy nemení názvy funkcií. Ak teda chceme volať funkciu alebo procedúru FNNAME implementovanú v C z modulu Fortran, potom by sa v module C mala volať fnname_.

Kompilátor Fortran túto možnosť podporuje -nus [názov súboru], ktorá vám umožňuje zakázať pridávanie podčiarkovníkov do interných názvov procedúr. Ak je zadaný názov súboru, vykoná sa to len pre názvy procedúr uvedené v zadanom súbore.

Štandardne sa vo Fortrane parametre odovzdávajú odkazom a v C sa vždy odovzdávajú hodnotou. Preto pri volaní procedúry Fortran z modulu C musíme odovzdať ukazovatele na zodpovedajúce premenné obsahujúce hodnoty skutočných parametrov ako parametre. Pri písaní funkcie v C, ktorú bude potrebné volať z modulu Fortran, musíme opísať formálne parametre ako ukazovatele na zodpovedajúce typy.

V moduloch C je možné použiť COMMON bloky definované v moduloch Fortran (viac informácií nájdete v Užívateľskej príručke kompilátora Intel Fortran, kapitola Miešanie C a Fortran).

Zdieľanie kompilátorov Intel a GCC

Objektové moduly C vytvorené kompilátorom Intel C++ sú kompatibilné s modulmi vytvorenými kompilátorom GCC a knižnicou GNU C. Tieto moduly je teda možné používať spolu v jedinom programe zostavenom pomocou príkazov icc alebo gcc, ale na správne zahrnutie knižníc Intel sa odporúča použiť icc.

Kompilátor Intel podporuje množstvo neštandardných rozšírení jazyka C používaných projektom GNU a podporovaných kompilátorom GCC (ale nie všetky, ďalšie podrobnosti nájdete tu).

Užívateľská príručka nehovorí nič o kompatibilite objektových modulov v jazykoch C++ a Fortran, zjavne nie je podporovaná.

Podpora štandardov

Intel C++ Compiler 7.0 pre Linux podporuje jazykový štandard ANSI/ISO C (ISO/IEC 9899/1990). Je možné stanoviť prísnu kompatibilitu so štandardom ANSI C ( -ansi) alebo rozšírený dialekt ANSI C ( -Xa). Pri použití opcie -c99

  • Príručky pre kompilátor vo formáte HTML (dostupné „online“ na našom serveri, ale vyžadujú si podporu jazyka Java)
    • Používateľská príručka kompilátora Intel C++.
    • Používateľská príručka kompilátora Intel Fortran.
  • Kompilátor manuály pre anglický jazyk vo formáte PDF (vyžaduje Acrobat Reader, musíte si stiahnuť súbory PDF do počítača)
    • Používateľská príručka kompilátora Intel C++: Používateľská príručka kompilátora Intel C++ (1,3 MB, 395 strán).
    • Používateľská príručka kompilátora Intel Fortran: Používateľská príručka kompilátora Intel Fortran (1,1 MB, 285 strán).
    • Programátorská príručka vo Fortran: Intel Fortran Programátorská príručka (7 MB, 566 strán).
    • Odkaz na knižnice pre jazyk Fortran: Referenčná príručka knižníc Intel Fortran (9,5 MB, 881 strán).
  • Intel Application Debugger Guide.
  • Porovnanie kompilátorov na testoch SPEC CPU2000 (článok na ixbt.com v ruštine).
  • Webová stránka Polyhedron predstavuje porovnávacie výsledky medzi rôznymi kompilátormi.
  • V predchádzajúcom čísle magazínu sme rozoberali produkty z rodiny Intel VTune Performance Analyzer – nástroje na analýzu výkonu, ktoré sú zaslúžene obľúbené medzi vývojármi aplikácií a umožňujú detekciu v kóde. tímové aplikácie, ktoré zbytočne míňajú zdroje CPU, čo dáva vývojárom príležitosť identifikovať a eliminovať potenciál úzke miesta, spojené s podobnými časťami kódu, čím sa urýchli proces vývoja aplikácie. Všimnite si však, že výkon aplikácií do značnej miery závisí od toho, ako efektívne sú kompilátory používané pri ich vývoji a aké funkcie hardvér používajú sa pri generovaní strojového kódu.

    Najnovšie verzie kompilátorov Intel Intel C++ a Intel Fortran pre Windows a Linux vám umožňujú získať výhody výkonu aplikácií pre systémy založené na procesory Intel Itanium 2, Intel Xeon a Intel Pentium 4 až o 40 % v porovnaní s existujúcimi kompilátormi od iných výrobcov vďaka použitiu takých vlastností týchto procesorov, ako je technológia Hyper-Threading.

    Rozdiely spojené s optimalizáciou kódu touto rodinou kompilátorov zahŕňajú použitie zásobníka na vykonávanie operácií s pohyblivou rádovou čiarkou, interprocedurálnu optimalizáciu (IPO), optimalizáciu v súlade s profilom aplikácie (Profile Guided Optimization (PGO), predbežné načítanie údajov do vyrovnávacej pamäte ( Prefetching dát), ktorý zabraňuje latencii spojenej s prístupom do pamäte, podpora charakteristických vlastností procesorov Intel (napríklad rozšírenia pre streamingové spracovanie dát Intel Streaming SIMD Extensions 2, charakteristické pre Intel Pentium 4), automatická paralelizácia vykonávania kódu, aplikácia tvorba, beží na viacerých odlišné typy procesorov pri optimalizácii pre jeden z nich, nástroje na „predikciu“ následného kódu (predikcia vetvy), rozšírená podpora práce s vykonávacími vláknami.

    Všimnite si, že kompilátory Intel sa používajú v takých známych spoločnostiach ako Alias/Wavefront, Oracle, Fujitsu Siemens, ABAQUS, Silicon Graphics, IBM. Podľa nezávislého testovania viacerých spoločností je výkon kompilátorov Intel výrazne vyšší ako výkon kompilátorov od iných výrobcov (pozri napr. http://intel.com/software/products/compilers/techtopics/compiler_gnu_perf .pdf).

    Nižšie sa pozrieme na niektoré funkcie najnovšie verzie Kompilátory Intel pre stolné počítače a servery operačné systémy.

    Kompilátory pre platformu Microsoft Windows

    Intel C++ Compiler 7.1 pre Windows

    Intel C++ Compiler 7.1 je kompilátor vydaný začiatkom tohto roka, ktorý poskytuje vysoko optimalizovaný kód pre procesory Intel Itanium, Intel Itanium 2, Intel Pentium 4 a Intel Xeon, ako aj procesor Intel Pentium M využívajúci technológiu Intel Centrino a určený na použitie v mobilné zariadenia.

    Uvedený kompilátor je plne kompatibilný s vývojovými nástrojmi Microsoft Visual C++ 6.0 a Microsoft Visual Studio .NET: môže byť zabudovaný do príslušných vývojových prostredí.

    Tento kompilátor podporuje štandardy ANSI a ISO C/C++.

    Intel Fortran Compiler 7.1 pre Windows

    Intel Fortran Compiler 7.1 pre Windows, tiež vydaný začiatkom tohto roka, vám umožňuje vytvárať optimalizovaný kód pre procesory Intel Itanium, Intel Itanium 2, Intel Pentium 4 a Intel Xeon, Intel Pentium M.

    Tento kompilátor je plne kompatibilný s vývojovými nástrojmi Microsoft Visual C++ 6.0 a Microsoft Visual Studio .NET, to znamená, že môže byť zabudovaný do príslušných vývojových prostredí. Okrem toho vám tento kompilátor umožňuje vyvíjať 64-bitové aplikácie pre operačné systémy bežiace na procesoroch Itanium/Itanium 2 pomocou Microsoft Visual Studio na 32-bitovom procesore Pentium pomocou 64-bitového kompilátora Intel Fortran. Pri ladení kódu vám tento kompilátor umožňuje použiť debugger na platformy Microsoft.NET.

    Ak máte nainštalovaný produkt Compaq, namiesto pôvodného Intel Fortran Compiler 7.1 je možné použiť Visual Fortran 6.6, pretože tieto kompilátory sú kompatibilné na úrovni zdrojový kód.

    Intel Fortran Compiler 7.1 pre Windows je plne kompatibilný so štandardom ISO Fortran 95 a podporuje vytváranie a ladenie aplikácií obsahujúcich kód v dvoch jazykoch: C a Fortran.

    Kompilátory pre platformu Linux

    Intel C++ Compiler 7.1 pre Linux

    Ďalší kompilátor, ktorý bol vydaný začiatkom roka, Intel C++ Compiler 7.1 pre Linux, umožňuje dosiahnuť vysoký stupeň optimalizácie kódu pre procesory Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Tento kompilátor je plne kompatibilný s kompilátorom GNU C na zdrojovom kóde a objektových moduloch, čo vám umožňuje migrovať naň bez dodatočných nákladov aplikácie vytvorené pomocou GNU C. Intel C++ Compiler podporuje C++ ABI (doplnok k jadru Linuxu, ktorý umožňuje spúšťať pod Linuxové ovládanie skompilovaný kód pre iné platformy, ako sú skoré operačné systémy SCO, skoré verzie Sun Solaris atď.), čo znamená plnú kompatibilitu s kompilátorom gcc 3.2 na úrovni binárneho kódu. Nakoniec, s Intel C++ Compiler 7.1 pre Linux môžete dokonca prekompilovať jadro Linuxu vykonaním niekoľkých menších zmien v jeho zdrojovom kóde.

    Intel Fortran Compiler 7.1 pre Linux

    Intel Fortran Compiler 7.1 pre Linux umožňuje vytvárať optimalizovaný kód pre procesory Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Tento kompilátor je plne kompatibilný s kompilátorom Compaq Visual Fortran 6.6 na úrovni zdrojového kódu, čo umožňuje prekompilovať aplikácie pomocou neho vytvorené pomocou Compaq Visual Fortran, čím sa zvýši ich výkon.

    Okrem toho je špecifikovaný kompilátor kompatibilný s takými nástrojmi, ktoré používajú vývojári, ako je editor emacs, debugger gdb a nástroj na zostavenie aplikácie make.

    Rovnako ako verzia tohto kompilátora pre Windows, aj Intel Fortran Compiler 7.1 pre Linux je plne kompatibilný so štandardom ISO Fortran 95 a podporuje vytváranie a ladenie aplikácií obsahujúcich kód v dvoch jazykoch: C a Fortran.

    Osobitne treba zdôrazniť, že k vytvoreniu uvedených kompilátorov Intel významne prispeli špecialisti z ruského centra vývoja softvéru Intel v Nižnom Novgorode. Viac detailné informácie Informácie o kompilátoroch Intel možno nájsť na webovej stránke spoločnosti Intel na adrese www.intel.com/software/products/.

    Druhá časť tohto článku bude venovaná kompilátorom Intel, ktoré vytvárajú aplikácie pre mobilné zariadenia.

    Príklady skutočných hackov: Intel C++ 7.0 Compiler - Archív WASM.RU

    ...kompilátor Intel C++ 7.0 sa stiahol neskoro v noci, asi o piatej ráno. Veľmi sa mi chcelo spať, no trhala ma aj zvedavosť: či bola ochrana zosilnená alebo nie. Rozhodol som sa, že kým nezistím ochranu, stále nezaspím, otvoril som nová konzola a resetovanie systémových premenných TEMP a TMP do adresára C:\TEMP, narýchlo neslušne napísané dlhé meno inštalátor W_CC_P_7.0.073.exe na príkazovom riadku (potreba nastavenia premenných TEMP a TMP je vysvetlená tým, že vo Windows 2000 štandardne ukazujú na veľmi hlboko vnorený adresár a inštalátor Intel C++ – a nielen ten - nepodporuje cesty takej obrovskej veľkosti).

    Okamžite sa ukázalo, že politika ochrany bola radikálne prepracovaná a prítomnosť licencie bola skontrolovaná už vo fáze inštalácie programu (vo verzii 5.x bola inštalácia vykonaná bez problémov). OK, dáme príkaz dir a pozrieme sa na obsah toho, s čím teraz musíme bojovať:

      Obsah priečinka 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

      poznámky

      6. 5. 2002 10:35 45 056 AutoRun.exe

      7.10.2001 12:56 27 autorun.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

      7. 10. 2001 12:56 184 setup.mwg

      19 súborov 2 519 238 bajtov

      6 priečinkov 886 571 008 voľných bajtov

    Áno! Inštalačný program setup.exe zaberá iba štyridsať kilobajtov. Veľmi dobre! Je nepravdepodobné, že v takom zväzku dokážete skryť serióznu ochranu, a aj keby áno, tento malý súbor nemá cenu analyzovať celý – až do posledného bajtu v zozname disassemblera. Nie je to však skutočnosť bezpečnostný kód nachádza presne v setup.exe, môže sa nachádzať na inom mieste, napríklad... ChkLic.dll/ChkLic.exe, ktoré spolu zaberajú o niečo menej ako sedemsto kilobajtov. Počkaj, čo je ChkLic? Je to skratka pre Check License alebo čo?! Hmm, chalani z Intelu majú evidentne vážne problémy so zmyslom pre humor. Bolo by lepšie, keby tento súbor nazvali úprimne „Hack Me“! Dobre, súdiac podľa objemu, ChkLic je rovnaký FLEX lm a už sme sa s ním stretli (pozri „Intel C++ 5.0 Compiler“) a máme približnú predstavu, ako ho prelomiť.

    Dáme príkaz „dumpbin /EXPORTS ChkLic.dll“, aby sme preskúmali exportované funkcie a... pevne sa držte Klavy, aby ste nespadli zo stoličky:

      Výpis súboru ChkLic.dll

    1. Časť obsahuje nasledujúce exporty pre ChkLic.dll

      0 charakteristík

      3DB438B4 časová dátumová pečiatka Po 21. okt 21:26:12 2002

    2. 1 počet funkcií

      1 počet mien

      radová nápoveda názov RVA

      1 0 000010A0 _Skontrolujte platnú licenciu

    Dočerta! Ochrana exportuje iba jednu jedinú funkciu s úžasným názvom CheckValidLicense. „Úžasné“ - pretože účel funkcie je jasný z jej názvu a je možné vyhnúť sa starostlivej analýze kódu disassemblera. No, stratili všetok záujem... bolo by lepšie, keby to vyviezli obyčajne alebo tak, alebo to aspoň pokrstili nejakým zastrašujúcim názvom ako DES Decrypt.

    ...snívanie! Dobre, vráťme sa k našim ovečkám. Uvažujme logicky: ak je všetok bezpečnostný kód sústredený priamo v ChkLic.dll (a súdiac podľa „závesnej“ povahy ochrany je to skutočne tak), potom celá „ochrana“ spočíva v volaní CheckValidLicense z Setupu. exe a skontroluje výsledok, ktorý vráti. Preto na „hacknutie“ stačí stratiť ChkLic.dll, čím sa funkcia ChekValidLicense vždy vráti... a mimochodom, čo by sa mala vrátiť? Presnejšie: aká presne je návratová hodnota, ktorá zodpovedá úspešnej kontrole licencie? Nie, neponáhľajte sa rozoberať setup.exe, aby ste to zistili, pretože možné možnosti už nie toľko: buď NEPRAVDA, alebo PRAVDA. Tipujete na TRUE? Nuž, v istom zmysle je to logické, ale na druhej strane: prečo sme sa vlastne rozhodli, že funkcia CheckValidLicense vracia práve príznak úspešnosti operácie, a nie kód chyby? Musí to predsa nejako motivovať dôvody na odmietnutie inštalácie kompilátora: nenašiel sa súbor s licenciou, súbor je poškodený, licencia vypršala a podobne? Dobre, skúsme vrátiť nulu a ak to nebude fungovať, vrátime jednotku.

    Dobre, pripútajte sa, poďme! Spustíme HIEW, otvoríme súbor ChkLic.dll (ak sa neotvorí, zapamätajte si tri krát gophery, dočasne ho skopírujte do koreňového adresára alebo iného adresára, ktorý neobsahuje špeciálne znaky v názve, ktoré sa nepáčia Hiew) Potom sa opäť obrátime na exportnú tabuľku získanú pomocou dumpbin, určíme adresu funkcie CheckValidLicense (v tomto prípade 010A0h) a cez „10A0“ prejdeme na jej začiatok. starý kód „XOR EAX, EAX/RETN 4". Prečo práve „REN 4" a nie iba „RET"? Áno, pretože funkcia podporuje konvenciu stdcall, čo zistíte tak, že sa pozriete na jej epilóg v HIEW"e ( jednoducho prejdite nadol po obrazovke disassemblera, kým nenájdete RET).

    Skontrolujeme... Funguje!!! Napriek absencii licencie inštalátor spustí inštaláciu bez kladenia akýchkoľvek otázok! Obrana preto padla. Oh, nemôžeme uveriť, že všetko je také jednoduché, a aby sme nezostali hlúpo hľadieť na monitor a čakať na dokončenie procesu inštalácie programu, používame náš obľúbený disassembler IDA na setup.exe. Prvá vec, ktorá vás upúta, je absencia CheckValidLicense v zozname importovaných funkcií. Možno to nejako spustí súbor ChkLic.exe? Snažíme sa nájsť zodpovedajúci odkaz medzi automaticky rozpoznanými riadkami: “~View aNames”, “ChkLic”... áno, riadok “Chklic.exe” tam vôbec nie je, ale “Chklic.dll” je detekovaný. Áno, vidím, to znamená, že knižnica ChkLic sa načíta explicitným prepojením cez LoadLibrary. A nasledujúci krížový odkaz to potvrdzuje:

      Text:0040175D push offset aChklic_dll ; lpLibFileName

      Text:00401762 zavolajte ds:LoadLibraryA

      Text:00401762; načítať ChkLic.dll ^^^^^^^^^^^^^^^^^

      Text:00401762;

      Text:00401768 mov esi, eax

      Text:0040176A posunutie posunu a_checkvalidlic ; lpProcName

      Text:0040176F push esi ; hModule

      Text:00401770 zavolajte ds:GetProcAddress

      Text:00401770; získajte adresu funkcie CheckValidLicense

      Text:00401770;

      Text:00401776 cmp esi, ebx

      Text:00401778 jz loc_40192E

      Text:00401778; ak taká knižnica neexistuje, ukončite inštalačný program

      Text:00401778;

      Text:0040177E cmp eax, ebx

      Text:00401780 jz loc_40192E

      Text:00401780; ak v knižnici takáto funkcia nie je, ukončite inštaláciu

      Text:00401780;

      Text:00401786 push ebx

      Text:00401787 volajte eax

      Text:00401787; zavolajte funkciu ChekValidLicense

      Text:00401787;

      Text:00401789 test eax, eax

      Text:0040178B jnz loc_4019A3

    Text:0040178; ak funkcia vrátila nenulovú hodnotu, ukončite inštalačný program

    Je neuveriteľné, že táto strašne primitívna obrana je postavená presne takto! Navyše polmetrový súbor ChkLic.exe nie je vôbec potrebný! A prečo sa oplatilo ťahať to z internetu? Mimochodom, ak sa rozhodnete uložiť distribúciu kompilátora (pozor: nepovedal som “distribuovať”!), potom kvôli šetreniu miesta na disku je možné ChkLic.* vymazať: buď vymazaním setup.exe, a tým ho navždy odstaviť od prístupom k nim alebo jednoduchým vytvorením vlastného ChkLic.dll, exportovaním funkcie stdcall CheckValidLicence vo forme: int CheckValidLicence(int some_flag) ( return 0;)

    Kým sme o tom všetkom diskutovali, inštalátor dokončil inštaláciu kompilátora a úspešne dokončil svoju prácu. Je zaujímavé, či sa spustí kompilátor alebo sa všetka zábava len začína? Horúčkovito ideme dole po rozvetvenej hierarchii podpriečinkov, nájdeme icl.exe, ktorý sa, ako by sa dalo očakávať, nachádza v adresári bin, klikneme a... Kompilátor sa prirodzene nespustí s odvolaním sa na fakt, že „icl: chyba: nemohol zaplatiť licenciu FLEX lm“, bez ktorej nemôže pokračovať vo svojej práci.

    Ukázalo sa, že Intel použil viacúrovňovú ochranu a prvá úroveň sa ukázala ako hrubá ochrana pred hlupákmi. Dobre! Prijímame túto výzvu a na základe našich doterajších skúseností automaticky hľadáme súbor LMGR*.DLL v adresári kompilátora. Neužitočné! Tentoraz tu takýto súbor nie je, ale ukazuje sa, že icl.exe výrazne nabral na váhe a prekročil hranicu šesťsto kilobajtov... Stop! Neprepojili vývojári kompilátora ten istý FLEX lm so statickým prepojením? Pozrime sa: v Intel C++ 5.0 bol súčet veľkostí lmgr327.dll a icl.exe 598 KB a teraz samotný icl.exe zaberá 684 KB. Ak vezmeme do úvahy úpravu pre prirodzenú stareckú „obezitu“, čísla sa veľmi dobre zhodujú. Tak predsa FLEX lm! Oh, oh! Teraz však bez symbolických názvov funkcií bude oveľa ťažšie prelomiť ochranu... Nerobme však paniku vopred! Zamyslime sa, len pokojne! Je nepravdepodobné, že by vývojový tím úplne prepísal celý kód, ktorý interaguje s touto „obálkovou“ ochranou. S najväčšou pravdepodobnosťou sa jeho „vylepšenie“ skončilo len zmenou typu rozloženia. A ak áno, potom sú šance na hacknutie programu stále veľké!

    Pamätajúc si, že keď bol bezpečnostný kód naposledy v hlavnej funkcii, po určení jeho adresy sme jednoducho nastavili bod prerušenia a čakali, kým sa objaví debugger, hlúpo vysledovali kód, striedavo sa pozerali na debugger a potom na výstup programu. okno: objavilo sa Existuje upresňujúca správa? Zároveň si všetky podmienené prechody, s ktorými sa stretneme, označíme na samostatnom papieri (alebo si ho vložíme do vlastnej pamäte, ak chcete), pričom nezabudneme uviesť, či bol každý podmienený prechod vykonaný alebo nie... Stop! Vy a ja sme sa o niečom rozprávali, ale už sa objavila urážlivá správa! Okej dobre! Pozrime sa, aký podmienený prechod tomu zodpovedal. Naše záznamy ukazujú, že posledným zaznamenaným skokom bol podmienený skok JNZ, ktorý sa nachádza na adrese 0401075h a „reaguje“ na výsledok vrátený sub_404C0E:

  • Text:0040107F loc_40107F: ; KÓD XREF: _main+75^j

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

    Text:00401084 mov edx, 21h

    Text:00401089 zavolajte na sub_404C0E

    Text:0040108E test eax, eax

    Text:00401090 jnz krátky loc_40109A

    Je zrejmé, že sub_404C0E je veľmi ochranný postup, ktorý kontroluje prítomnosť licencie. Ako ju oklamať? No, existuje veľa možností... Po prvé, môžete premyslene a svedomito analyzovať obsah sub_404C0E, aby ste zistili, čo presne kontroluje a ako presne kontroluje. Po druhé, môžete jednoducho nahradiť JNZ short loc_40107F za JZ short loc_40107F alebo dokonca NOP, NOP. Po tretie, príkaz kontroly výsledku TEST EAX, EAX možno zmeniť na nulový príkaz: XOR EAX, EAX. Po štvrté, môžete nechať sub_404C0E zmiznúť tak, aby vždy vrátil nulu. Neviem ako vám, ale mne sa najviac páčila metóda číslo tri. Zmeníme dva bajty a spustíme kompilátor. Ak v ochrane neexistujú žiadne ďalšie kontroly jeho „licencovania“, program bude fungovať a podľa toho aj naopak. (Ako si pamätáme, v piatej verzii boli dve takéto kontroly). Úžasné, kompilátor sa už nesťažuje a funguje!!! Jeho vývojári totiž, ako by sa dalo očakávať, ochranu vôbec neposilnili, ale naopak, dokonca oslabili! Chris Kaspersky

  • Nie si otrok!
    Uzavretý vzdelávací kurz pre deti elity: "Skutočné usporiadanie sveta."
    http://noslave.org

    Materiál z Wikipédie – voľnej encyklopédie

    Kompilátor Intel C++
    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).
    Typ
    Autor

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Vývojár
    Vývojári

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Napísané na

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Rozhranie

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    operačný systém
    Jazyky rozhrania

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Prvá edícia

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Hardvérová platforma
    Najnovšia verzia
    Uvoľniť kandidáta

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Beta verzia

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Alfa verzia

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Testovacia verzia

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Čitateľné formáty súborov

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Generované formáty súborov

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Štát

    Chyba Lua v Module:Wikidata na riadku 170: pokus o indexovanie poľa „wikibase“ (nulová hodnota).

    Licencia

    Hlavné rysy:

    • Vektorizácia pre SSE, SSE2, SSE3, SSE4

    Kompilátor podporuje štandard OpenMP 3.0 pre písanie paralelných programov. Obsahuje tiež modifikáciu OpenMP s názvom Cluster OpenMP, pomocou ktorej môžete spúšťať aplikácie napísané v súlade s OpenMP na klastroch pomocou MPI.

    Intel C++ Compiler používa frontend (časť kompilátora, ktorý analyzuje skompilovaný program) od Edison Design Group. Rovnaký frontend používajú kompilátory SGI MIPSpro, Comeau C++ a Portland Group.

    Tento kompilátor je široko používaný na kompiláciu SPEC CPU benchmarkov.

    Existujú 4 série produktov od spoločnosti Intel, ktoré obsahujú kompilátor:

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

    Medzi nevýhody linuxovej verzie kompilátora patrí čiastočná nekompatibilita s GNU rozšíreniami jazyka C (podporovanými kompilátorom GCC), čo môže spôsobovať problémy pri kompilácii niektorých programov.

    Experimentálne možnosti

    Boli publikované nasledujúce experimentálne verzie kompilátora:

    • Intel STM Compiler Prototype Edition zo 17. septembra 2007. Podpora softvérovej transakčnej pamäte (STM). Vydané pre Linux a Windows, len pre IA-32 (procesory x86);
    • Intel Concurrent Collections pre C/C++ 0.3 zo septembra 2008. Obsahuje mechanizmy, ktoré uľahčujú písanie paralelných programov C++.

    Základné vlajky

    Windows Linux, MacOSX Popis
    /Od -O0 Zakázať optimalizácie
    /O1 -O1 Optimalizujte, aby ste minimalizovali veľkosť spustiteľného súboru
    /O2 -O2 Optimalizujte rýchlosť. Zahrnuté sú niektoré optimalizácie
    /O3 -O3 Povoliť všetky optimalizácie od O2. Vykonajte tiež intenzívne optimalizácie cyklu
    /Oop - Oj Povoliť medziprocedurálnu optimalizáciu súbor po súbore
    /Oipo -Oipo Povoliť globálnu interprocedurálnu optimalizáciu
    /QxO -xO Povoliť používanie rozšírení SSE3, SSE2 a SSE pre procesory vyrobené akoukoľvek spoločnosťou
    /rýchlo -rýchlo "Rýchly režim". Ekvivalent možnosti "/O3 /Qipo /QxHost /no-prec-div" v systéme Windows a "-O3 -ipo -static -xHOST -no-prec-div" v systéme Linux. Upozorňujeme, že príznak „-xHOST“ znamená optimalizáciu pre procesor, na ktorom beží kompilátor.
    /Qprof-gen -prof_gen Vytvorte inštrumentovanú verziu programu, ktorá zostaví výkonnostný profil
    /Qprof-použitie -prof_use Použite informácie o profile zo spustenia programu zhromaždené s príznakom prof_gen.

    Napíšte recenziu na článok "Intel C++ kompilátor"

    Poznámky

    pozri tiež

    Odkazy

    Výňatok charakterizujúci kompilátor Intel C++

    A tiež sa vrátila, aby naposledy videla Bieleho mága... svojho manžela a najvernejšieho priateľa, na ktorého nikdy nezabudla. Vo svojom srdci mu odpustila. Ale na jeho veľkú ľútosť mu nemohla priniesť odpustenie Magdalény... Takže, ako vidíš, Isidora, veľká kresťanská bájka o „odpustení“ je len detskou lžou pre naivných veriacich, aby im to umožnila. robiť akékoľvek zlo s vedomím, že bez ohľadu na to, čo urobia, nakoniec im bude odpustené. Ale odpustiť môžete len to, čo je skutočne hodné odpustenia. Človek musí pochopiť, že za každé spáchané Zlo sa musí zodpovedať... A nie pred akýmsi tajomným Bohom, ale pred sebou samým, ktorý si núti kruto trpieť. Magdaléna Vladykovi neodpustila, hoci si ho hlboko vážila a úprimne ho milovala. Tak ako nám všetkým nedokázala odpustiť strašnú smrť Radomira. ONA predsa rozumela lepšie ako ktokoľvek iný – mohli sme mu pomôcť, mohli sme ho zachrániť pred krutou smrťou... Ale nechceli sme. Keďže považovala vinu Bieleho mága za príliš krutú, nechala ho žiť s touto vinou a nezabudla na ňu ani minútu... Nechcela mu poskytnúť ľahké odpustenie. Už sme ju nikdy nevideli. Rovnako ako nikdy nevideli svoje deti. Magdaléna prostredníctvom jedného z rytierov svojho Chrámu - nášho čarodejníka - odovzdala vladykovi odpoveď na jeho prosbu vrátiť sa k nám: „Slnko nevyjde dvakrát v ten istý deň... Radosť tvojho sveta (Radomír) bude nikdy sa k tebe nevracaj, tak ako sa nevrátim k tebe a ja... Našiel som svoju VIERU a svoju PRAVDU, sú ŽIVÉ, ale tvoje sú MRTVÉ... Oplakávaj svojich synov - milovali ťa. Nikdy ti neodpustím ich smrť, kým budem nažive. A nech vaša vina zostane s vami. Možno ti jedného dňa prinesie Svetlo a Odpustenie... Ale nie odo mňa." Hlava mága Jána nebola prinesená do Meteory z rovnakého dôvodu - nikto z rytierov chrámu sa k nám nechcel vrátiť... Stratili sme ich, ako sme už viackrát stratili mnohých iných, ktorí nechceli. pochopte a prijmite naše obete... Kto to urobil ako vy - odišli a odsúdili nás.
    Točila sa mi hlava!.. Ako smädnému človeku, ktorý hasí večný hlad po poznaní, som hltavo nasával tok úžasných informácií štedro podávaných Severom... A chcel som ešte oveľa viac!.. Chcel som vedieť všetko, koniec. Bol to závan čerstvej vody v púšti spálenej bolesťou a problémami! A nevedela som sa toho nabažiť...
    – Mám tisíce otázok! Ale nezostáva čas... Čo mám robiť, Sever?...
    - Pýtajte sa, Isidora!.. Pýtajte sa, pokúsim sa vám odpovedať...
    – Povedz mi, Sever, prečo sa mi zdá, že tento príbeh akoby spájal dva životné príbehy, prepletené podobnými udalosťami, a tie sú prezentované ako život jedného človeka? Alebo nemám pravdu?
    – Máš úplnú pravdu, Isidora. Ako som vám už povedal, „mocní tohto sveta“, ktorí vytvorili falošnú históriu ľudstva, „obliekli“ skutočný Kristov život, mimozemský život židovského proroka Jozuu, ktorý žil pred jeden a pol tisíc rokmi ( z čias príbehu Severu). A nielen on sám, ale aj jeho rodina, jeho príbuzní a priatelia, jeho priatelia a nasledovníci. Veď to bola manželka proroka Jozuu, židovská Mária, ktorá mala sestru Martu a brata Lazara, sestru jeho matky Máriu Yakobe a ďalších, ktorí nikdy neboli blízko Radomíra a Magdalény. Tak ako vedľa nich neboli žiadni iní „apoštoli“ – Pavol, Matúš, Peter, Lukáš a ostatní...
    Bola to rodina proroka Jozuu, ktorá sa pred jeden a pol tisíc rokmi presťahovala do Provensálska (ktoré sa v tých časoch nazývalo Zaalpská Galia), do gréckeho mesta Massalia (dnešná Marseille), keďže Massalia bola v tom čase „bránou“ medzi Európou a Áziou a pre všetkých „prenasledovaných“ to bol najjednoduchší spôsob, ako sa vyhnúť prenasledovaniu a problémom.



    
    Hore