Versioni i tetë i përpiluesve Intel. Përpiluesit për platformën Microsoft Windows

Ju nuk jeni rob!
Kurs i mbyllur arsimor për fëmijët e elitës: "Rregullimi i vërtetë i botës".
http://noslave.org

Nga Wikipedia, Enciklopedia e Lirë

Përpiluesi i Intel C++
Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).
Lloji
Autori

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

Zhvilluesi
Zhvilluesit

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

Shkruar në

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

Ndërfaqja

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

sistemi operativ
Gjuhët e ndërfaqes

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

Botimi i parë

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

Platforma e harduerit
Versioni i fundit
lirimin e kandidatit

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

version beta

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

version alfa

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

Versioni i testit

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

Formatet e skedarëve të lexueshëm

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

Formatet e skedarëve të krijuar

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

Shtetit

Gabim Lua në Moduli:Wikidata në rreshtin 170: përpiquni të indeksoni fushën "wikibase" (një vlerë zero).

Liçensë

Karakteristikat kryesore:

  • Vektorizimi për SSE , SSE2 , SSE3 , SSE4

Përpiluesi mbështet standardin OpenMP 3.0 për të shkruar programe paralele. Ai gjithashtu përmban një modifikim të OpenMP të quajtur Cluster OpenMP, me të cilin mund të ekzekutoni aplikacione të shkruara sipas OpenMP në grupe duke përdorur MPI.

Përpiluesi Intel C++ përdor një frontend (pjesën e përpiluesit që analizon programin që kompilohet) nga Edison Design Group. I njëjti front përdoret nga përpiluesit SGI MIPSpro, Comeau C++, Portland Group.

Ky përpilues përdoret gjerësisht për përpilimin e standardeve të SPEC CPU.

Ekzistojnë 4 seri produktesh nga Intel që përmbajnë përpiluesin:

  • Intel C++ Compiler Professional Edition
  • Intel Cluster Toolkit (Edicioni përpilues)

Disavantazhet e versionit Linux të përpiluesit përfshijnë papajtueshmëri të pjesshme me shtesat GNU të gjuhës C (të mbështetura nga përpiluesi GCC), gjë që mund të shkaktojë probleme gjatë përpilimit të disa programeve.

Variantet eksperimentale

Janë publikuar versionet e mëposhtme eksperimentale të përpiluesit:

  • Intel STM Compiler Prototype Edition i datës 17 shtator 2007. Mbështetje për Memorien Transaksionale të Softuerit (STM). Lëshuar vetëm për Linux dhe Windows, IA-32 (procesorë x86);
  • Intel Concurrent Collections për C/C++ 0.3, shtator 2008. Përmban mekanizma që lehtësojnë shkrimin e programeve paralele C++.

Flamujt kryesorë

Dritaret Linux, Mac OSX Përshkrim
/od -O0 Çaktivizo optimizimet
/O1 -O1 Optimizoni për të minimizuar madhësinë e skedarit të ekzekutueshëm
/O2 -O2 Optimizo për shpejtësinë. Përfshihen disa optimizime
/O3 -O3 Aktivizo të gjitha optimizimet nga O2. Kryeni gjithashtu optimizime intensive të ciklit
/Oip -Oip Aktivizo optimizimin ndërprocedural për skedar
/Oipo -Oipo Aktivizo optimizimin global ndërprocedural
/QxO -xO Lejo përdorimin e shtesave SSE3, SSE2 dhe SSE për përpunuesit e prodhuar nga çdo kompani
/ i shpejtë - shpejt "Modaliteti i shpejtë". Ekuivalente me "/O3 /Qipo /QxHost /no-prec-div" në Windows dhe "-O3 -ipo -static -xHOST -no-prec-div" në Linux. Vini re se flamuri "-xHOST" do të thotë optimizim për procesorin në të cilin po funksionon përpiluesi.
/Qprof-gen -prof_gen Krijo një version të instrumentuar të programit që do të mbledhë profilin e ekzekutimit
/Qprof-përdorim -prof_përdor Përfitoni nga informacioni i profilit nga nisjet e programeve të përpiluara me flamurin prof_gen.

Shkruani një përmbledhje për artikullin "Përpiluesi Intel C++"

Shënime

Shiko gjithashtu

Lidhjet

Një fragment që karakterizon përpiluesin Intel C++

E megjithatë, ajo u kthye për të parë Magusin e Bardhë për herë të fundit ... Burrin dhe mikun e saj më të vërtetë, të cilin nuk mund ta harronte kurrë. Në zemrën e saj, ajo e fali atë. Por, për keqardhjen e tij të madhe, ajo nuk mundi t'i sjellë atij faljen e Magdalenës .... Pra, siç e shihni, Isidora, fabula e madhe e krishterë për "faljen" është thjesht një gënjeshtër fëminore për besimtarët naivë për t'i lejuar ata të bëjnë çfarëdo. Të keqen, duke e ditur se çfarëdo që të bëjnë, ata përfundimisht do të falen. Por ju mund të falni vetëm atë që është vërtet e denjë për falje. Njeriu duhet të kuptojë se duhet të përgjigjet për çdo të keqe të bërë... Dhe jo para ndonjë Zoti misterioz, por para vetes, duke e detyruar veten të vuajë mizorisht. Magdalena nuk e fali Vladykën, megjithëse e respektoi thellësisht dhe e donte sinqerisht. Ashtu siç nuk arriti të na falte të gjithëve për vdekjen e tmerrshme të Radomirit. Në fund të fundit, ishte AJO që kuptoi më së miri nga të gjitha - ne mund ta ndihmonim atë, ne mund ta shpëtonim atë nga një vdekje mizore ... Por ne nuk donim. Duke e konsideruar shumë mizore fajin e Magusit të Bardhë, ajo e la atë të jetonte me këtë faj, duke mos e harruar për asnjë çast... Ajo nuk donte t'i jepte një falje të lehtë. Nuk e pamë më kurrë. Siç nuk i panë kurrë foshnjat e tyre. Nëpërmjet njërit prej kalorësve të Tempullit të saj - magjistarit tonë - Magdalena i përcolli Zotit përgjigjen ndaj kërkesës së tij për t'u kthyer tek ne: "Dielli nuk lind dy herë në një ditë ... Gëzimi i botës tënde (Radomir) nuk do të ketë kurrë kthehu tek ti, ashtu siç nuk do të kthehem tek ti dhe unë... E gjeta BESIN dhe TË VËRTETËN time, ato janë LIVE, e jotja është e VDEKUR... Vajto bijtë e tu - të deshën. Nuk do t'ju fal kurrë vdekjen e tyre sa të jem gjallë. Dhe faji juaj le të mbetet me ju. Ndoshta një ditë ajo do t'ju sjellë dritë dhe falje ... Por jo nga unë. Koka e Magus Gjonit nuk u soll në Meteora për të njëjtën arsye - asnjë nga Kalorësit e Tempullit nuk donte të kthehej tek ne ... Ne i humbëm ata, pasi humbëm shumë të tjerë më shumë se një herë, të cilët nuk donin të kuptonin dhe pranoni viktimat tona... Kush është si ju - u larguan duke na dënuar.
Më zunë mendja!.. Si i etur, duke plotësuar urinë time të përjetshme për dije, përthitha me lakmi rrjedhën e informacionit të mahnitshëm të dhënë bujarisht nga Veriu... Dhe doja shumë më tepër!.. Doja të dija gjithçka deri në fund. . Ishte një frymë uji i ëmbël në shkretëtirën e djegur nga dhimbja dhe fatkeqësia! Dhe nuk mund të pija mjaftueshëm ...
Kam një mijë pyetje! Por nuk ka më kohë ... Çfarë duhet të bëj, Sever? ..
- Pyet Isidora!.. Pyet, do të përpiqem të të përgjigjem...
- Më thuaj, Sever, pse më duket se në këtë tregim lidhen dy histori jete, të ndërthurura me ngjarje të ngjashme, dhe ato paraqiten si jeta e një personi? Apo nuk kam të drejtë?
– Ke plotesisht te drejte Isidora. Siç ju thashë më parë, "të fuqishmit e kësaj bote", që krijuan një histori të rreme të njerëzimit, "vunë" në jetën e vërtetë të Krishtit jetën e huaj të profetit hebre Joshua, i cili jetoi një mijë e gjysmë vjet më parë. (që nga historia e Veriut). Dhe jo vetëm ai, por edhe familja e tij, të afërmit dhe miqtë e tij, miqtë dhe ndjekësit e tij. Në fund të fundit, ishte gruaja e profetit Joshua, Judeja Maria, e cila kishte një motër Martën dhe një vëlla Llazarin, motrën e nënës së tij Maria Jakobe dhe të tjerë që nuk ishin kurrë pranë Radomirit dhe Magdalenës. Ashtu siç nuk kishte "apostuj" të tjerë pranë tyre - Pali, Mateu, Pjetri, Luka dhe të tjerët ...
Ishte familja e profetit Joshua që u shpërngul një mijë e gjysmë vjet më parë në Provence (që në atë kohë quhej Gaul (Gali Transalpine), në qytetin grek Massalia (tani Marsejë), pasi Massalia në atë kohë ishte "Portë" midis Evropës dhe Azisë, dhe ishte mënyra më e lehtë për të gjithë "të persekutuarit" për të shmangur persekutimin dhe fatkeqësinë.

Hyrje Në fund të vitit 2003, Intel prezantoi versionin 8.0 të koleksionit të saj të përpiluesve. Përpiluesit e rinj janë krijuar për të përmirësuar performancën e aplikacioneve që funksionojnë në serverë, desktop dhe sistemet celulare(laptopë, telefona celularë dhe PDA) bazuar në Procesorët Intel. Kemi kënaqësinë të vërejmë se ky produkt u krijua me pjesëmarrjen aktive të punonjësve të Qendrës së Zhvillimit të Softuerit Intel Nizhny Novgorod dhe specialistëve të Intel nga Sarov.

Seria e re përfshin përpilues Intel për C++ dhe Fortran për Windows dhe Linux, si dhe përpilues Intel për C++ për Windows CE .NET. Përpiluesit synojnë sistemet e bazuara në procesorët e mëposhtëm Intel: Intel Itanium 2, Intel Xeon, Intel Pentium 4, procesorët Intel Personal Internet Client Architecture për telefonat celularë dhe PDA, dhe procesori Intel Pentium M për PC-të celularë (një komponent i teknologjisë Intel Centrino për telefonat celularë).PC).

Përpiluesi Intel Visual Fortran për Windows ofron teknologji të përpilimit të gjeneratës së ardhshme për llogaritje me performancë të lartë. Ai kombinon funksionalitetin e gjuhës Compaq Visual Fortran (CVF) me përmirësimet e performancës të bëra të mundshme nga teknologjitë e përpilimit dhe optimizimit të gjenerimit të kodit të Intel dhe thjeshton detyrën e bartjes Kodi i burimit, i zhvilluar me CVF, në mjedisin Intel Visual Fortran. Ky përpilues është i pari që zbaton funksionet CVF si për sistemet Intel 32-bit ashtu edhe për sistemet e bazuara në familjen e procesorëve Intel Itanium që funksionojnë në Mjedisi Windows. Përveç kësaj, ky përpilues ju lejon të zbatoni funksionet e gjuhës CVF në sistemet Linux bazuar në procesorët 32-bit Intel dhe familjen e procesorëve Intel Itanium. Në vitin 2004, është planifikuar të lëshohet një version i zgjeruar i këtij përpiluesi - përpiluesi Intel Visual Fortran Compiler Professional Edition për Windows, i cili do të përfshijë Bibliotekën IMSL Fortran 5.0 të zhvilluar nga Visual Numerics, Inc.


"Përpiluesit e rinj mbështesin gjithashtu procesorët e ardhshëm të Intel, të koduar Prescott, të cilët ofrojnë komanda të reja për të përmirësuar performancën grafike dhe video, si dhe përmirësime të tjera të performancës. Ata gjithashtu mbështesin Teknologji e re Mobile MMX(tm), i cili në mënyrë të ngjashme përmirëson performancën e aplikacioneve grafike, zanore dhe video për telefonat celularë dhe PDA-të, - tha Alexei Odinokov, bashkëdrejtor i Qendrës së Zhvillimit të Softuerit Intel në Nizhny Novgorod. - Këta përpilues u ofrojnë zhvilluesve të aplikacioneve një grup të vetëm mjetesh për ndërtimin e aplikacioneve të reja rrjetet pa tela bazuar në arkitekturën Intel. Përpiluesit e rinj të Intel mbështesin gjithashtu teknologjinë Hyper-Threading të Intel dhe specifikimin e industrisë OpenMP 2.0, i cili përcakton përdorimin e direktivave nivel të lartë për të kontrolluar rrjedhën e udhëzimeve në aplikacione”.

Ndër mjetet e reja të përfshira në përpilues janë mjetet e Intel Code Coverage dhe Intel Test Prioritization. Së bashku, këto mjete ndihmojnë në përshpejtimin e zhvillimit të aplikacioneve dhe përmirësimin e cilësisë së aplikacionit duke përmirësuar procesin e testimit. software.

Mjeti i mbulimit të kodit, kur teston një aplikacion, ofron detaje të plota në lidhje me përdorimin logjik të aplikacionit dhe vendndodhjen e zonave të përdorura në kodin burimor të aplikacionit. Nëse bëhen ndryshime në aplikacion ose nëse ky test nuk lejon kontrollimin e pjesës së aplikacionit që është me interes për zhvilluesin, mjeti i Prioritizimit të Testit ju lejon të kontrolloni funksionimin e zonës së zgjedhur kodi i programit.

Përpiluesit e rinj të Intel vijnë në një sërë konfigurimesh që variojnë nga 399 dollarë në 1,499 dollarë. Ato mund të blihen sot nga Intel Corporation ose nga rishitës në mbarë botën, një listë e të cilave gjendet në sit. http://www.intel.com/software/products/reseller.htm#Russia.

Mbështetje për procesorët Prescott

Mbështetja për procesorin Intel Pentium 4 (Prescott) në versionin e tetë të përpiluesit është si më poshtë:

1. Mbështetje për komandat SSE3 (ose PNI, Prescott New Instructions). Ekzistojnë tre mënyra për të theksuar këtu:

A. Insertet e montimit (montim Inline). Për shembull, përpiluesi do të njohë përdorimin e mëposhtëm të komandës SSE3 _asm(addsubpd xmm0, xmm1). Kështu, përdoruesit e interesuar për optimizimin e nivelit të ulët mund të hyjnë drejtpërdrejt në komandat e asemblerit.

b. Në përpiluesin C/C++, udhëzimet e reja janë të disponueshme nga një nivel më i lartë sesa përdorimi i inserteve të asemblerit. Përkatësisht, përmes funksioneve të integruara (funksionet e brendshme):

Funksionet e integruara

funksion i integruarKomanda e gjeneruar
_mm_addsub_psShton nënsubps
_mm_hadd_psHaddps
_mm_hsub_psMsubps
_mm_moveldup_psMovsldup
_mm_movehdup_psMovshdup
_mm_addsub_pdShtosubpd
_mm_hadd_pdHaddpd
_mm_hsub_pdhsubpd
_mm_loaddup_pdmovddup xmm, m64
_mm_movedup_pdmovddup reg, reg
_mm_lddqu_si128Lddqu

Tabela tregon funksionet e integruara dhe udhëzimet përkatëse të montimit nga grupi SSE3. E njëjta mbështetje ekziston për komandat nga grupet MMX\SSE\SSE2. Kjo i lejon programuesit të kryejë optimizimin e kodit të nivelit të ulët pa përdorur programimin në gjuhën e asamblesë: vetë përpiluesi kujdeset për hartëzimin (hartëzimin "e) të funksioneve të integruara në udhëzimet përkatëse të procesorit dhe përdorimin optimal të regjistrave. përqendrohuni në krijimin e një algoritmi që përdor në mënyrë efektive grupe të reja instruksionesh.

V. Gjenerimi automatik i komandave të reja nga përpiluesi. Dy metodat e mëparshme përfshijnë përdorimin e komandave të reja nga programuesi. Por përpiluesi është gjithashtu në gjendje (duke përdorur opsionet e duhura - shih seksionin 3 më poshtë) të gjenerojë automatikisht udhëzime të reja nga grupi SSE3 për kodin C/C++ dhe Fortran. Për shembull, komanda e optimizuar e ngarkimit të padrejtuar (lddqu), e cila ju lejon të merrni një rritje të performancës deri në 40% (për shembull, në detyrat e kodimit video dhe audio). Komanda të tjera nga grupi SSE3 ju lejojnë të merrni një përshpejtim të konsiderueshëm në detyrat grafike 3D ose detyrat llogaritëse duke përdorur numra kompleksë. Për shembull, grafiku në seksionin 3.1 më poshtë tregon se për aplikacionin 168.wupwise nga grupi SPEC CPU2000 FP, shpejtësia e marrë nga gjenerimi automatik i udhëzimeve SSE3 ishte ~25%. Performanca e këtij aplikacioni varet shumë nga shpejtësia e aritmetikës së numrave kompleksë.

2. Përdorimi i avantazheve mikroarkitekturore të procesorit Prescott. Kur gjeneron kodin, përpiluesi merr parasysh ndryshimet mikroarkitekturore në procesorin e ri. Për shembull, disa operacione (të tilla si zhvendosjet e numrave të plotë, shumëzimet e numrave të plotë ose konvertimet e numrave midis formateve të ndryshme me pikë lundruese në SSE2) janë më të shpejta në procesorin e ri në krahasim me versionet e mëparshme (të themi, një zhvendosje e numrit të plotë tani kërkon një cikël procesor kundrejt katër për versioni i mëparshëm).Procesori Intel Pentium 4). Përdorimi më intensiv i komandave të tilla ju lejon të merrni një përshpejtim të konsiderueshëm të aplikacioneve.
Një shembull tjetër i ndryshimeve mikroarkitekturore është mekanizmi i përmirësuar i përcjelljes së dyqaneve (ngarkim i shpejtë i të dhënave të ruajtura më parë në memorie); Ruajtja reale as nuk bëhet në memorien e memories, por në një bufer të ndërmjetëm të ruajtjes, i cili më pas lejon akses shumë të shpejtë në të dhëna. Një veçori e tillë e arkitekturës bën të mundur, për shembull, kryerjen e vektorizimit automatik më agresiv të kodit të programit.
Përpiluesi gjithashtu merr parasysh sasinë e shtuar të memories cache në nivelin e parë dhe të dytë.

3. Mbështetje e përmirësuar për teknologjinë Hyper-Threading. Ky artikull mund të lidhet fare mirë me atë të mëparshëm - ndryshimet mikroarkitekturore dhe përdorimin e tyre në përpilues. Për shembull, një bibliotekë kohëzgjatjeje që mbështet specifikimin e industrisë OpenMP është optimizuar për të ekzekutuar në procesorin e ri.

Performanca

Përdorimi i përpiluesve është një mënyrë e lehtë dhe efikase për të përfituar nga arkitekturat e procesorëve Intel. Më poshtë, dy mënyra të përdorimit të kompajlerëve janë theksuar me kusht (shumë): a) ripërpilimi i programeve me ndryshim i mundshëm cilësimet e përpiluesit, b) ripërpilimi me një ndryshim si në cilësimet e përpiluesit ashtu edhe në tekstin burimor, si dhe duke përdorur diagnostikimin e përpiluesit për optimizime të vazhdueshme dhe përdorimin e mundshëm të të tjerëve mjete softuerike(për shembull, profiluesit).


1.1 Optimizimi i programeve duke rikompiluar dhe ndryshuar cilësimet e përpiluesit


Shpesh, hapi i parë në migrimin në një përpilues të ri optimizues është përdorimi i tij me cilësimet e paracaktuara. Hapi tjetër logjik është përdorimi i opsioneve për optimizim më agresiv. Figurat 1, 2, 3 dhe 4 tregojnë efektin e kalimit në versionin 8.0 të përpiluesit Intel në krahasim me përdorimin e produkteve të tjera kryesore në industri (-O2 - cilësimet e paracaktuara të përpiluesit, bazë - cilësimet në performancën maksimale). Krahasimi është bërë në arkitekturat Intel 32-bit dhe 64-bit. Aplikacionet nga SPEC CPU2000 përdoren si grup testimi.


Foto 1




Figura 2




Figura 3




Figura 4


Disa nga opsionet janë renditur më poshtë (në tekstin e mëtejmë, opsionet janë për familjen Windows OS; për familjen Linux OS, ka opsione me të njëjtin efekt, por emri mund të ndryshojë; për shembull, -Od ose QxK për Windows kanë një efekt i ngjashëm me -O0 ose -xK për Linux respektivisht, më shumë informacion i detajuar mund të gjendet në manualin e përpiluesit) të mbështetur nga përpiluesi Intel.


Kontrolli i niveleve të optimizimit: Opsionet -Od (pa optimizime; përdoret për programet e korrigjimit), -O1 (shpejtësia maksimale duke minimizuar madhësinë e kodit), -O2 (optimizimi për shpejtësinë e ekzekutimit të kodit; përdoret si parazgjedhje), -O3 (mundëson optimizimet më agresive për ekzekutimin e kodit shpejtësia ; në disa raste mund të çojë në efektin e kundërt, pra në një ngadalësim; duhet theksuar se në IA-64 përdorimi i -O3 çon në përshpejtim në shumicën e rasteve, ndërsa efekti pozitiv në IA-32 është më pak i theksuar. ). Shembuj të optimizimeve të aktivizuara nga -O3 janë ndërrimi i lakut, bashkimi i lakut, shpërndarja e lakut (optimizimi i bashkimit të ciklit të kundërt), marrja paraprake e të dhënave nga softueri. Arsyeja pse ngadalësia është e mundur kur përdoret -O3 mund të jetë se përpiluesi përdori një qasje heuristike për të zgjedhur optimizimin agresiv për rast specifik, pa pasur informacion të mjaftueshëm në lidhje me programin (për shembull, gjenerohen udhëzime për marrjen paraprake për të dhënat e përdorura në lak, duke besuar se cikli ekzekutohet një numër i madh herë, kur në fakt ka vetëm disa përsëritje). Optimizimi i profilizimit ndërprocedural, si dhe një sërë "indikacionesh" të programuesit (shih seksionin 3.2) mund të ndihmojnë në këtë situatë.

Optimizimi ndërprocedural: -Qip (brenda një skedari të vetëm) dhe -Qipo (brenda disa ose të gjithë skedarëve të projektit). Përfshin optimizime të tilla si, për shembull, zëvendësimi inline i kodit të përdorur shpesh (duke ulur koston e thirrjes së një funksioni/procedure). Përfaqëson informacionin në fazat e tjera të optimizimit - për shembull, informacion në lidhje me kufirin e sipërm të ciklit (të themi, nëse është një konstante e kohës së përpilimit të përcaktuar në një skedar, por përdoret në shumë) ose informacione rreth shtrirjes së të dhënave në memorie (shumë MMX Komandat \SSE\SSE2\SSE3 funksionojnë më shpejt nëse operandët janë të rreshtuar në memorie në një kufi 8 ose 16 bajt). Analiza e procedurave të alokimit të memories (të zbatuara/të thirrura në një nga skedarët e projektit) u kalohet atyre funksioneve/procedurave ku përdoret kjo memorie (kjo mund të ndihmojë kompajlerin të braktisë supozimin konservator se të dhënat nuk janë të lidhura siç duhet në memorie; dhe supozimi duhet të jetë konservator kur nuk ka informacion shtesë). Shpjegimi, analiza e alisimit të të dhënave mund të shërbejë si një shembull tjetër: në mungesë të informacionit shtesë dhe pamundësisë për të provuar mungesën e kryqëzimeve, përpiluesi rrjedh nga supozimi konservator se ka kryqëzime. Një vendim i tillë mund të ndikojë negativisht në cilësinë e optimizimeve të tilla si, për shembull, vektorizimi automatik në IA-32 ose tubacioni i softuerit (pipelinimi i softuerit ose SWP) në IA-64. Optimizimi ndërprocedural mund të ndihmojë në analizimin e prezencës së kryqëzimeve të kujtesës.

Optimizimi i Profilizimit: Përfshin tre faza. 1) gjenerimi i kodit të instrumentuar duke përdorur opsionin -Qprof_gen. 2) kodi që rezulton ekzekutohet në të dhëna përfaqësuese, ndërsa ekzekutohet, mblidhen informacione rreth karakteristikave të ndryshme të ekzekutimit të kodit (për shembull, probabilitetet e tranzicionit ose një vlerë tipike për numrin e përsëritjeve të ciklit). 3) Rikompilimi me opsionin -Qprof_use, i cili siguron që përpiluesi të përdorë informacionin e mbledhur në hapin e mëparshëm. Kështu, përpiluesi ka aftësinë të përdorë jo vetëm vlerësime statike të karakteristikave të rëndësishme të programit, por edhe të dhëna të marra gjatë një ekzekutimi real të programit. Kjo mund të ndihmojë në zgjedhjen e mëvonshme të disa optimizimeve (për shembull, një rregullim më efikas në kujtesën e degëve të ndryshme të programit, bazuar në informacionin se cilat degë janë ekzekutuar në çfarë frekuence; ose aplikimi i një optimizimi në një lak bazuar në informacionin rreth numri tipik i përsëritjeve në të) . Optimizimi i profilizimit është veçanërisht i dobishëm kur është e mundur të zgjidhet një grup i vogël por përfaqësues i të dhënave (për hapin #2) që ilustron mirë rastet më tipike të përdorimit të programit në të ardhmen. Në disa fusha lëndore, zgjedhja e një grupi të tillë përfaqësues është mjaft e mundur. Për shembull, optimizimi i profilizimit përdoret nga zhvilluesit e DBMS.

Optimizimet e listuara më sipër janë të tipit gjenerik, d.m.th. kodi i gjeneruar do të funksionojë në të gjithë procesorët e ndryshëm të familjes (të themi, në rastin e një arkitekture 32-bitësh, në të gjithë procesorët e mëposhtëm: Intel Pentium-III, Pentium 4, duke përfshirë bërthamën Prescott, Intel Pentium M). Ekzistojnë gjithashtu optimizime për një procesor specifik.

Optimizimet specifike të procesorit: -QxK (Pentium-III; përdorimi i komandave SSE, specifikat e mikroarkitekturës), -QxW dhe -QxN (Pentium 4; përdorimi i komandave SSE dhe SSE2, specifikat e mikroarkitekturës), -QxB (Pentium M; përdorimi i komandave SSE dhe SSE2, specifikat e mikroarkitekturës) ), QxP (Prescott; përdorimi i komandave SSE, SSE2 dhe SSE3, veçoritë e mikroarkitekturës). Në këtë rast, kodi i krijuar duke përdorur këto opsione mund të mos funksionojë në përfaqësues të tjerë të familjes së procesorëve (për shembull, kodi -QxW mund të rezultojë në ekzekutimin e një komande të pavlefshme nëse ekzekutohet në një sistem të bazuar në një Intel Pentium-III procesor). Ose punoni jo me efikasitet maksimal (për shembull, kodi -QxB në një procesor Pentium 4 për shkak të dallimeve në mikroarkitekturë). Me këto opsione, është gjithashtu e mundur të përdoren bibliotekat e funksionimit të optimizuara për një procesor specifik duke përdorur grupin e tij të udhëzimeve. Për të kontrolluar që kodi është ekzekutuar në të vërtetë në procesorin e synuar, zbatohet një mekanizëm dispeçues (cpu-dispatch): kontrollimi i procesorit gjatë ekzekutimit të programit. Në situata të ndryshme, ky mekanizëm mund të aktivizohet ose jo. Dispatch përdoret gjithmonë nëse përdoret variacioni i opsionit -Qax(KWNP). Në këtë rast, gjenerohen dy versione të kodit: i optimizuar për një procesor specifik dhe "i përgjithshëm" (gjenerik), zgjedhja ndodh gjatë ekzekutimit të programit. Kështu, duke rritur madhësinë e kodit, është e mundur të arrihet ekzekutimi i programit në të gjithë procesorët e linjës dhe ekzekutimi optimal në procesorin e synuar. Një opsion tjetër është përdorimi i optimizimit të kodit për përfaqësuesin e mëparshëm të linjës dhe përdorimi i këtij kodi në këtë dhe procesorët pasues. Për shembull, kodi -QxN mund të funksionojë në një Pentium 4 me bërthama Northwood dhe Prescott. Nuk ka rritje në madhësinë e kodit. Me këtë qasje, ju mund të merrni performancë të mirë, por ende jo optimale në një sistem me një procesor Prescott (sepse SSE3 nuk përdoret dhe dallimet në mikroarkitekturë nuk merren parasysh) me performancë optimale në Northwood. Opsione të ngjashme ekzistojnë edhe për procesorët e arkitekturës IA-64. Aktiv ky moment ka dy prej tyre: -G1 (Itanium) dhe -G2 (Itanium 2; opsioni i paracaktuar).

Grafiku më poshtë (Figura 5) tregon përshpejtimin (bazuar në një - pa përshpejtim) nga përdorimi i disa prej optimizimeve të listuara më sipër (domethënë -O3 -Qipo -Qprof_use -Qx(N,P)) në një procesor Prescott krahasuar me cilësimet e paracaktuara (-O2). Përdorimi i -QxP ndihmon në disa raste për të përshpejtuar në krahasim me -QxN. Shpejtësia më e madhe arrihet në aplikacionin 168.wupwise të përmendur tashmë në seksionin e mëparshëm (për shkak të optimizimit intensiv të aritmetikës komplekse duke përdorur udhëzimet SSE3).


Figura 5


Figura 6 më poshtë tregon raportin (në kohë) të shpejtësisë së kodit me cilësimet optimale krahasuar me kodin plotësisht të paoptimizuar (-Od) në procesorët Pentium 4 dhe Itanium 2. Mund të shihet se Itanium 2 varet shumë më tepër nga cilësia e optimizimit. Kjo është veçanërisht e theksuar për llogaritjet me pikë lundruese (FP), ku raporti është rreth 36 herë. Llogaritjet me pikë lundruese janë pikë e fortë Arkitekturat IA-64, por duhet pasur kujdes që të përdoren cilësimet më efikase të përpiluesit. Fitimi që rezulton në produktivitet paguan për punën e shpenzuar për gjetjen e tyre.


Figura 6. Përshpejtimi kur përdoren opsionet më të mira të optimizimit SPEC CPU200


Përpiluesit e Intel mbështesin specifikimet e industrisë OpenMP për ndërtimin e aplikacioneve me shumë fije. Mbështetet paralelizimi eksplicit (opsioni -Qopenmp) dhe automatik (-Qparallel). Në rastin e modalitetit eksplicit, programuesi është përgjegjës për përdorimin korrekt dhe efikas të standardit OpenMP. Në rastin e paralelizimit automatik, kompajleri ka një ngarkesë shtesë që lidhet me analizën e kodit të programit. Për këtë arsye, aktualisht, paralelizimi automatik funksionon në mënyrë efektive vetëm në kode mjaft të thjeshta.

Grafiku në figurën 7 tregon përshpejtimin nga përdorimi i paralelizimit të qartë në një sistem mostër inxhinierik (para-prodhimi) bazuar në një procesor Intel Pentium 4 (Prescott) me mbështetje të teknologjisë Hyper-Threading: 2.8 GHz, 2 GB RAM, 8K L1-Cache, 512K L2-Cache. SPEC OMPM2001 përdoret si një grup testimi. Ky grup fokusohet në sistemet SMP të vogla dhe të mesme, konsumi i memories është deri në dy gigabajt. Aplikacionet u përpiluan duke përdorur Intel 8.0 C/C++ dhe Fortran me dy grupe opsionesh: -Qopenmp -Qipo -O3 -QxN dhe -Qopenmp -Qipo -O3 -QxP, me secilën prej të cilave aplikacionet filluan me Hyper-Threading të aktivizuar dhe çaktivizuar. . Vlerat e përshpejtimit në grafik normalizohen në performancën e versionit me një fillesë me Hyper-Threading të çaktivizuar.


Figura 7: Aplikime nga grupi SPEC OMPM2001 në një procesor Prescott


Mund të shihet se në 9 nga 11 raste, përdorimi i paralelizimit të qartë duke përdorur OpenMP jep një rritje të performancës kur aktivizohet teknologjia Hyper-Threading. Një aplikacion (312.swim) po përjeton ngadalësim. Është një fakt i njohur se ky aplikacion karakterizohet nga një shkallë e lartë e varësisë gjerësia e brezit memorie. Ashtu si me SPEC CPU2000, wupwise përfiton shumë nga optimizimet e Prescott (-QxP).


1.2 Optimizimi i programeve me ndryshime në kodin burimor dhe përdorimi i diagnostikimit të përpiluesit


Në seksionet e mëparshme, ne shqyrtuam ndikimin e përpiluesit (dhe cilësimet e tij) në shpejtësinë e ekzekutimit të kodit. Në të njëjtën kohë, përpiluesit e Intel ofrojnë më shumë mundësi për optimizimin e kodit sesa thjesht ndryshimin e cilësimeve. Në veçanti, përpiluesit i lejojnë programuesit të bëjë "hincime" në kodin e programit, të cilat lejojnë gjenerimin e kodit më efikas për sa i përket performancës. Më poshtë janë disa shembuj për gjuhën C/C++ (ka mjete të ngjashme për gjuhën Fortran, që ndryshojnë vetëm në sintaksë).

#pragma ivdep (ku ivdep do të thotë injoro varësitë e vektorit) përdoret përpara ciklit të programit për t'i treguar kompajlerit se nuk ka varësi të dhënash brenda. Ky aludim funksionon kur përpiluesi (bazuar në analizë) supozon në mënyrë konservative se varësi të tilla mund të ekzistojnë (nëse përpiluesi mund të provojë se varësia ekziston si rezultat i analizës, atëherë "hindja" nuk ka efekt), ndërsa autori i kodit e di se varësi të tilla nuk mund të lindin. Me këtë sugjerim, përpiluesi mund të gjenerojë kode më efikase: vektorizim automatik për IA-32 (duke përdorur udhëzime vektoriale nga grupet MMX\SSE\SSE2\SSE3 për ciklin e programit C/C++ dhe Fortran; mund të mësoni më shumë rreth kësaj teknike, për shembull, në vazhdim artikull në Intel Technology Journal), tubacioni i softuerit (SWP) për IA-64.

Vektori #pragma përdoret gjithmonë për të detyruar përpiluesin të ndryshojë vendimin në lidhje me joefikasitetin e vektorizimit të lakut (si automatikisht për IA-32 ashtu edhe SWP për IA-64), bazuar në një analizë të karakteristikave sasiore dhe cilësore të punës në secilin përsëritje.

#pragma novector bën gjithmonë të kundërtën e vektorit #pragma.

#pragma vector aligned përdoret për t'i treguar kompajlerit se të dhënat e përdorura në lak janë rreshtuar në një kufi prej 16 bajt. Kjo ju lejon të gjeneroni kode më efikase dhe/ose kompakte (për shkak të mungesës së kontrolleve të kohës së funksionimit).

Vektori #pragma i palinjuar bën të kundërtën e #pragma aligned. Është e vështirë të flasim për përfitime të performancës në këtë rast, por mund të mbështeteni në një kod më kompakt.

Pika e shpërndarjes #pragma përdoret brenda ciklit të programit në mënyrë që përpiluesi të mund të ndajë qarkun e shpërndarjes në këtë pikë në disa më të vogla. Për shembull, një "hinc" i tillë mund të përdoret kur përpiluesi nuk arrin të vektorizojë automatikisht qarkun e burimit (për shembull, për shkak të një varësie të të dhënave që nuk mund të injorohet as me #pragma ivdep), ndërsa secili (ose një pjesë) e rishtas ciklet e formuara mund të vektorizohen në mënyrë efikase.

#pragma loop count (N) përdoret për t'i thënë përpiluesit se vlera më e mundshme për numrin e përsëritjeve të ciklit do të jetë N. Ky informacion ndihmon për të vendosur mbi optimizimin më efektiv për këtë cikli (për shembull, nëse do të zhbëhet , nëse do të bëni SWP ose vektorizim automatik, nëse do të përdorni komandat e marrjes paraprake të të dhënave të softuerit, ...)

"Hint" _assume_aligned(p, bazë) përdoret për t'i treguar kompajlerit se rajoni i memories i lidhur me treguesin p është rreshtuar në një kufi bazë = 2^n bajt.

Kjo është larg nga listën e plotë"sugjerime" të ndryshme për kompajlerin, të cilat mund të ndikojnë ndjeshëm në efikasitetin e kodit të gjeneruar. Mund të lindë pyetja se si të përcaktohet se përpiluesi ka nevojë për një sugjerim.

Së pari, mund të përdorni diagnostifikimin e përpiluesit në formën e raporteve që ai i ofron programuesit. Për shembull, duke përdorur opsionin -Qvec_reportN (ku N varion nga 0 në 3 dhe përfaqëson nivelin e detajeve) mund të merrni një raport automatik vektorizimi. Programuesi do të ketë akses në informacionin se cilat sythe janë vektorizuar dhe cilat jo. Përndryshe, përpiluesi raporton arsyet pse dështoi vektorizimi. Le të supozojmë se shkaku ishte një varësi e supozuar në mënyrë konservative nga të dhënat. Në këtë rast, nëse programuesi është i sigurt se varësia nuk mund të ndodhë, atëherë mund të përdoret #pragma ivdep. Përpiluesi ofron aftësi të ngjashme (në krahasim me Qvec_reportN për IA-32) në IA-64 për të kontrolluar praninë dhe efektivitetin e SWP. Në përgjithësi, përpiluesit Intel ofrojnë mundësi të shumta për diagnostikimin e optimizimeve.

Së dyti, produkte të tjera softuerike (siç është profili Intel VTune) mund të përdoren për të gjetur pengesat e performancës në kod. Rezultatet e analizës mund ta ndihmojnë programuesin të bëjë ndryshimet e nevojshme.

Ju gjithashtu mund të përdorni listën e kodit të asamblerit të krijuar nga përpiluesi për analizë.


Figura 8


Figura 8 më sipër tregon procesin hap pas hapi të optimizimit të një aplikacioni duke përdorur një përpilues (dhe të tjera produkte softuerike) Intel në gjuhën Fortran për arkitekturën IA-64. Si shembull, konsiderohet një skemë jo-adiabatike e parashikimit rajonal për 48 orë të Roshydrometcenter (mund të lexoni për të, për shembull, në këtë artikull. Artikulli flet për kohën e llogaritjes prej rreth 25 minutash, por ndryshime të rëndësishme kanë ndodhur Që kur është shkruar. Performanca e kodit merret si pikënisje në një sistem Cray-YMP Kodi i pamodifikuar me opsionet e paracaktuara të përpiluesit (-O2) tregoi një rritje të performancës prej 20% në një sistem me 4 drejtime të bazuar në një Intel Itanium 2 900 MHz procesori Aplikimi i optimizimit më agresiv (-O3) rezultoi në një përshpejtim ~ 2,5x pa ndryshuar kodin kryesisht për shkak të analizës SWP dhe marrjes paraprake të të dhënave duke përdorur diagnostikimin e përpiluesit dhe profiluesi Intel VTune zbuloi disa pengesa Për shembull, përpiluesi nuk përpiloi në mënyrë programore disa performanca- sythe kritike, duke raportuar në raport që sugjeron varësinë e të dhënave. Ndryshimet e vogla në kod (direktiva ivdep) ndihmuan për të arritur efektin transmetim aktiv. Duke përdorur profiluesin VTune, u zbulua (dhe raporti i përpiluesit e konfirmoi këtë) se përpiluesi nuk e ndryshoi rendin e sytheve të mbivendosur (këmbimi i lakut) për përdorim më efikas të memories së memories. Arsyeja ishin përsëri supozimet konservatore për varësinë nga të dhënat. Janë bërë ndryshime në kodin burimor të programit. Si rezultat, arritëm të arrijmë një përshpejtim 4-fish në raport me versionin fillestar. Përdorimi i paralelizimit të qartë me direktivat OpenMP, dhe më pas kalimi në një sistem me më shumë se Frekuencë e lartë lejoi të reduktonte kohën e llogaritjes në më pak se 8 minuta, gjë që dha më shumë se 16 herë më shumë shpejtësi në krahasim me versionin fillestar.

Intel Visual Fortran

Intel Visual Fortran 8.0 përdor pjesën e përparme (pjesë e përpiluesit përgjegjës për konvertimin e programit nga teksti në gjuhën e programimit në përfaqësimin e brendshëm të përpiluesit, i cili është kryesisht i pavarur nga gjuha e programimit ose nga makina e synuar), përpiluesi CVF teknologjitë dhe komponentët e përpiluesit Intel, përgjegjës për një sërë optimizimesh dhe gjenerimi të kodeve.


Figura 9




Figura 10


Figurat 9 dhe 10 tregojnë grafikët e krahasimit Performanca e Intel Visual Fortran 8.0 me versionin e mëparshëm të Intel Fortran 7.1 dhe me përpilues të tjerë të famshëm në industri nga kjo gjuhë që funksionojnë nën sistemin operativ Familjet e Windows dhe Linux. Për krahasim, u përdorën teste, tekstet burimore të të cilave, duke përmbushur standardet F77 dhe F90, janë në dispozicion në http://www.polyhedron.com/. Në të njëjtin sajt, disponohet informacion më i detajuar për krahasimin e performancës së përpiluesit (Krahasimet e përpiluesit Win32 -> Fortran (77, 90) Standardet e kohës së ekzekutimit dhe krahasimet e përpiluesit Linux -> Fortran (77, 90) Standardet e kohës së ekzekutimit): më shumë përpilues të ndryshëm janë tregohet, dhe mesatarja gjeometrike jepet në lidhje me rezultatet individuale për çdo test.

Në numrin e mëparshëm të revistës, ne diskutuam produktet e familjes Intel VTune Performance Analyzer - mjete të analizës së performancës që janë mjaft të njohura me zhvilluesit e aplikacioneve dhe ju lejojnë të zbuloni në kod aplikacionet e ekipit, i cili konsumon shumë burime procesori, gjë që u jep zhvilluesve mundësinë për të identifikuar dhe eliminuar pengesat e mundshme që lidhen me seksione të tilla të kodit, duke përshpejtuar kështu procesin e zhvillimit të aplikacionit. Megjithatë, vini re se performanca e aplikacioneve varet kryesisht nga sa efikasë janë përpiluesit e përdorur në zhvillimin e tyre dhe cilat veçori harduerike përdorin kur gjenerojnë kodin e makinës.

Përpiluesit më të fundit të Intel C++ dhe Intel Fortran për Windows dhe Linux ofrojnë deri në 40% përfitime në performancën e aplikacionit për sistemet e bazuara në procesorët Intel Itanium 2, Intel Xeon dhe Intel Pentium 4 mbi përpiluesit ekzistues nga shitës të tjerë duke përdorur këto veçori të këtyre procesorë, si teknologjia Hyper-Threading.

Dallimet që lidhen me optimizimin e kodit nga kjo familje përpiluesish përfshijnë përdorimin e një pirg për të kryer operacione me pikë lundruese, optimizimin ndërprocedural (Optimizimi ndërprocedural, IPO), optimizimin në përputhje me profilin e aplikacionit (Optimizimi i udhëhequr nga profili, PGO), ngarkimi paraprak i të dhënave në cache (Data prefetching), i cili shmang vonesën që lidhet me aksesin në kujtesë, mbështetje për veçoritë karakteristike të procesorëve Intel (për shembull, shtesat për përpunimin e të dhënave të transmetimit Intel Streaming SIMD Extensions 2, specifike për Intel Pentium 4), paralelizimi automatik i ekzekutimit të kodit , krijimi i aplikacioneve, që funksionojnë në të shumëfishta tipe te ndryshme procesorët kur optimizohen për njërën prej tyre, mjetet e "parashikimit" të kodit pasues (parashikimi i degës), mbështetje e zgjeruar për të punuar me fijet e ekzekutimit.

Vini re se përpiluesit Intel përdoren në kompani të tilla të njohura si Alias/Wavefront, Oracle, Fujitsu Siemens, ABAQUS, Silicon Graphics, IBM. Bazuar në testimin e pavarur nga një numër kompanish, performanca e përpiluesve Intel tejkalon ndjeshëm përpiluesit nga prodhuesit e tjerë (shih, për shembull, http://intel.com/software/products/compilers/techtopics/compiler_gnu_perf.pdf).

Më poshtë do të shikojmë disa nga veçoritë versionet e fundit Përpiluesit Intel për desktop dhe server sistemet operative.

Përpiluesit për platformën Microsoft Windows

Përpiluesi Intel C++ 7.1 për Windows

Intel C++ Compiler 7.1 është një përpilues i lëshuar në fillim të këtij viti që ju lejon të arrini shkallë të lartë optimizimet e kodit për procesorët Intel Itanium, Intel Itanium 2, Intel Pentium 4 dhe Intel Xeon, si dhe për procesorin Intel Pentium M duke përdorur Teknologjia Intel Centrino dhe i projektuar për përdorim në pajisjet mobile.

Përpiluesi i specifikuar është plotësisht i pajtueshëm me mjetet e zhvillimit të Microsoft Visual C++ 6.0 dhe Microsoft Visual Studio .NET: Mund të ndërtohet në mjedise të përshtatshme zhvillimi.

Ky përpilues mbështet standardet ANSI dhe ISO C/C++.

Intel Fortran Compiler 7.1 për Windows

Intel Fortran Compiler 7.1 për Windows, i lëshuar gjithashtu në fillim të këtij viti, ju lejon të krijoni kod të optimizuar për procesorët Intel Itanium, Intel Itanium 2, Intel Pentium 4 dhe Intel Xeon, Intel Pentium M.

Ky përpilues është plotësisht i pajtueshëm me mjetet e zhvillimit të Microsoft Visual C++ 6.0 dhe Microsoft Visual Studio .NET, domethënë mund të integrohet në mjediset përkatëse të zhvillimit. Përveç kësaj, ky përpilues ju lejon të zhvilloni aplikacione 64-bit për sistemet operative që funksionojnë në procesorët Itanium / Itanium 2, me ndihmë nga Microsoft Visual Studio në një procesor Pentium 32-bit duke përdorur përpiluesin 64-bit Intel Fortran. Kur korrigjoni kodin, ky përpilues ju lejon të përdorni korrigjuesin për platformën Microsoft .NET.

Nëse keni të instaluar Compaq Visual Fortran 6.6, mund të përdorni përpiluesin Intel Fortran 7.1 në vend të përpiluesit origjinal sepse këta përpilues janë të përputhshëm në nivelin e kodit burimor.

Intel Fortran Compiler 7.1 për Windows është plotësisht në përputhje me standardin ISO Fortran 95 dhe mbështet ndërtimin dhe korrigjimin e aplikacioneve dygjuhëshe C dhe Fortran.

Përpiluesit për platformën Linux

Përpiluesi Intel C++ 7.1 për Linux

Një përpilues tjetër i lëshuar në fillim të vitit, Intel C++ Compiler 7.1 për Linux, ju lejon të arrini një shkallë të lartë të optimizimit të kodit për procesorët Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Ky përpilues është plotësisht i pajtueshëm me përpiluesin GNU C në nivelin e kodit burimor dhe moduleve të objektit, duke lejuar që aplikacionet e ndërtuara me GNU C të migrohen në të pa kosto shtesë. sistemet operative SCO, versionet e hershme të Sun Solaris, etj.), që do të thotë përputhshmëri e plotë me përpiluesi gcc 3.2 në nivelin binar. Më në fund, me përpiluesin Intel C++ 7.1 për Linux, mund të rikompiloni edhe kernelin Linux me disa ndryshime të vogla në kodin e tij burimor.

Përpiluesi Intel Fortran 7.1 për Linux

Përpiluesi Intel Fortran Compiler 7.1 për Linux ju lejon të krijoni kod të optimizuar për procesorët Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Ky përpilues është plotësisht i pajtueshëm me përpiluesin Compaq Visual Fortran 6.6 në nivelin e kodit burimor, duke lejuar ju të rikompiloni aplikacionet me të të krijuara me Compaq Visual Fortran, duke përmirësuar kështu performancën e tyre.

Për më tepër, përpiluesi i specifikuar është i pajtueshëm me programet e përdorura nga zhvilluesit, të tilla si redaktuesi i emacs, korrigjuesi i gabimeve gdb dhe mjeti për ndërtimin e aplikacionit make.

Ashtu si versioni Windows i këtij përpiluesi, Intel Fortran Compiler 7.1 për Linux është plotësisht i pajtueshëm me standardin ISO Fortran 95 dhe mbështet krijimin dhe korrigjimin e aplikacioneve që përmbajnë kod në dy gjuhë C dhe Fortran.

Duhet të theksohet se një kontribut i rëndësishëm në krijimin e përpiluesve të listuar Intel u dha nga specialistë Qendra Ruse Intel për zhvillimin e softuerit në Nizhny Novgorod. Më shumë informacion rreth përpiluesve Intel mund të gjenden në faqen e internetit të Intel në: www.intel.com/software/products/.

Pjesa e dytë e këtij artikulli do t'i kushtohet përpiluesve Intel që krijojnë aplikacione për pajisjet mobile.

Shembuj të hakimeve të vërteta: Përpiluesi Intel C++ 7.0 — Arkivi WASM.RU

…përpiluesi Intel C++ 7.0 u shkarkua vonë natën, rreth orës 5:00 të mëngjesit. Doja të flija jashtëzakonisht, por kurioziteti: nëse mbrojtja ishte forcuar apo jo, gjithashtu u copëtua. Duke vendosur që derisa të merrem me mbrojtjen, ende nuk do të bie në gjumë, unë, pasi u hap tastierë e re, dhe riinstalimi i variablave të sistemit TEMP dhe TMP në drejtorinë C:\TEMP, shtypi me nxitim emrin e instaluesit të gjatë në mënyrë të pahijshme W_CC_P_7.0.073.exe në linja e komandës(Nevoja për të vendosur variablat TEMP dhe TMP është për faktin se në Windows 2000 ato tregojnë si parazgjedhje në një direktori shumë të thellë, dhe instaluesi Intel C ++ - dhe jo vetëm ai - nuk mbështet shtigje kaq të mëdha) .

Menjëherë u bë e qartë se politika e mbrojtjes ishte rishikuar rrënjësisht dhe tani prania e një licence u kontrollua tashmë në fazën e instalimit të programit (në versionin 5.x, instalimi u krye pa probleme). OK, ne japim komandën dir dhe shikojmë përmbajtjen e asaj që duhet të luftojmë tani:

    Përmbajtja e dosjes 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

    shënime

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

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

    29/10/2002 11:25 AM 2,831 ccompindex.htm

    10/24/2002 08:12 126 976 ChkLic.dll

    18/10/2002 10:37 552 960 chklic.exe

    17/10/2002 04:29 PM 28,663 CLicense.rtf

    17/10/2002 04:35 PM 386 credist.txt

    16.10.2002 17:02 34 136 Crelnotes.htm

    19/03/2002 02:28 PM 4,635 PLSuite.htm

    21.02.2002 12:39 2 478 regjistër.htm

    02.10.2002 14:51 40 960 Setup.exe

    02.10.2002 10:40 151 Setup.ini

    10.07.2001 12:56 184 konfigurim.mwg

    19 skedarë 2,519,238 byte

    6 dosje 886 571 008 bajte falas

Aha! Instaluesi setup.exe merr vetëm dyzet e diçka kilobajt. Shume mire! Vështirë se mund të fshehësh mbrojtje serioze në një vëllim të tillë, dhe edhe nëse po, ky skedar i vogël nuk kushton asgjë për t'u analizuar në tërësinë e tij - deri në bajtin e fundit të listës së çmontimit. Sidoqoftë, nuk është fakt që kodi i sigurisë ndodhet saktësisht në setup.exe, ai mund të vendoset në një vend tjetër, për shembull ... ChkLic.dll / ChkLic.exe, të cilat së bashku zënë pak më pak se shtatëqind kilobajt . Prisni, çfarë është ChkLic? A është shkurt për Check License? Epo, djemtë në Intel padyshim që kanë probleme serioze me sensin e humorit. Do të ishte më mirë që ta quajnë këtë skedar "Hack Me" sinqerisht! Epo, duke gjykuar nga vëllimi, ChkLic është i njëjti FLEX lm, dhe ne e kemi hasur tashmë atë (shiko "Intel C++ 5.0 Compiler") dhe përafërsisht imagjinoni se si ta thyejmë atë.

Ne japim komandën "dumpbin / EXPORTS ChkLic.dll" për të ekzaminuar funksionet e eksportuara dhe ... mbajeni fort në Klava për të mos rënë nga karrigia:

    Hidh skedarin ChkLic.dll

  1. Seksioni përmban eksportet e mëposhtme për ChkLic.dll

    0 karakteristika

    3DB438B4 vula e datës kohore Hën 21 tetor 21:26:12 2002

  2. 1 numër funksionesh

    1 numër emrash

    udhëzim rendor Emër RVA

    1 0 000010A0_CheckValidLicense

Dreqin! Mbrojtja eksporton vetëm një funksion të vetëm me emrin e mrekullueshëm CheckValidLicense. "E shquar" - sepse qëllimi i funksionit bëhet i qartë nga emri i tij dhe bëhet e mundur të shmanget analiza e mundimshme e kodit të çmontimit. Epo, ata rimorën të gjithë interesin ... do të ishte më mirë nëse do ta eksportonin në një rendore ose diçka tjetër, ose të paktën ta pagëzonin me një lloj emri të frikshëm si DES Decrypt.

... duke ëndërruar! Mirë, kthehu te delet tona. Le të mendojmë logjikisht: nëse i gjithë kodi i sigurisë ndodhet direkt në ChkLic.dll (dhe, duke gjykuar nga natyra "e varur" e sigurisë, kjo është e vërtetë), atëherë e gjithë "mbrojtja" zbret në thirrjen e CheckValidLicense nga Setup.exe dhe duke kontrolluar rezultatin e kthyer prej tij. Prandaj, për të "hakuar" mjafton vetëm të patch ChkLic.dll, duke e detyruar funksionin ChekValidLicense të kthehet gjithmonë ... meqë ra fjala, çfarë duhet të kthejë? Më saktësisht: cila është saktësisht vlera e kthimit që korrespondon me një kontroll të suksesshëm të licencës? Jo, mos nxitoni të çmontoni setup.exe për ta zbuluar, sepse nuk ka aq shumë opsione të mundshme: ose FALSE ose TRUE. A jeni duke vënë bast për E VËRTETË? Epo, në një farë kuptimi, kjo është logjike, por nga ana tjetër: pse në fakt vendosëm që funksioni CheckValidLicense të kthejë saktësisht flamurin e suksesit të operacionit, dhe jo kodin e gabimit? Në fund të fundit, duhet të motivojë disi arsyet e refuzimit të instalimit të përpiluesit: skedari me licencë nuk u gjet, skedari është dëmtuar, licenca ka skaduar, etj? Mirë, le të përpiqemi të kthejmë një zero, dhe nëse kjo nuk funksionon, ne do të kthejmë një.

OK, shtrëngohu, le të shkojmë! Ne hapim HIEW, hapim skedarin ChkLic.dll (nëse nuk hapet, mbani mend gophers tre herë, kopjoni përkohësisht në rrënjë ose në ndonjë drejtori tjetër që nuk përmban karaktere të veçanta në emrin e tij që hiew "y" nuk i pëlqen Më pas, duke u kthyer sërish te tabela e eksportit e marrë duke përdorur dumpbin, përcaktojmë adresën e funksionit CheckValidLicense (në këtë rast, 010A0h) dhe përmes "10A0" kalojmë në fillimin e tij. Tani, e presim drejtpërdrejt, duke e mbishkruar. mbi kodin e vjetër "XOR EAX, EAX / RETN 4. Pse pikërisht "REN 4", dhe jo vetëm "RET"? Po, sepse funksioni mbështet konventën stdcall, që mund të zbulohet duke parë epilogun e tij në HIEW " e (thjesht lëvizni poshtë ekranit të çmontimit derisa të takoni RET).

Po kontrollohet... Punon!!! Pavarësisht mungesës së licencës, instaluesi fillon instalimin pa bërë shumë pyetje! Pra, mbrojtja ka rënë. Oh, nuk mund ta besojmë se gjithçka është kaq e thjeshtë dhe për të mos u ulur, duke ngulur sytë bosh në monitor ndërsa presim të përfundojë procesi i instalimit të programit, vendosëm çmontuesin tonë të preferuar IDA në setup.exe. Gjëja e parë që ju bie në sy është mungesa e CheckValidLicense në listën e funksioneve të importuara. Ndoshta ajo nis disi skedarin ChkLic.exe? Le të përpiqemi të gjejmë lidhjen e duhur midis vargjeve të njohura automatikisht: "~View aNames", "ChkLic"... po, vargu "Chklic.exe" nuk është fare këtu, por "Chklic.dll" gjendet. Po, e shoh, kjo do të thotë që biblioteka ChkLic ngarkohet nga një lidhje e qartë përmes LoadLibrary. Dhe ndjekja e referencës së kryqëzuar konfirmon këtë:

    Teksti:0040175D push offset aChklic_dll ; lpLibEmri iFile

    Teksti:00401762 telefononi ds:LoadLibraryA

    Teksti:00401762 ; ngarkoni ChkLic.dll ^^^^^^^^^^^^^^^^^

    Teksti:00401762 ;

    Teksti:00401768 mov esi,eax

    Teksti:0040176A shtytje offset a_checkvalidlic ; lpProcName

    Teksti:0040176F push esi ; hModuli

    Teksti:00401770 telefononi ds:GetProcAddress

    Teksti:00401770 ; merrni adresën e funksionit CheckValidLicense

    Teksti:00401770 ;

    Teksti:00401776 cmp esi, ebx

    Teksti:00401778 jz loc_40192E

    Teksti:00401778 ; nëse nuk ka një bibliotekë të tillë, atëherë dilni nga instaluesi

    Teksti:00401778 ;

    Teksti:0040177E cmp eax, ebx

    Teksti:00401780 jz loc_40192E

    Teksti:00401780 ; nëse nuk ka një funksion të tillë në bibliotekë, atëherë dilni nga instalimi

    Teksti:00401780 ;

    Teksti:00401786 push ebx

    Teksti:00401787 telefononi ak

    Teksti:00401787 ; thirrni funksionin CheckValidLicense

    Teksti:00401787 ;

    Teksti:00401789 provë eax, eax

    Teksti:0040178B jnz loc_4019A3

Teksti:0040178 ; nëse funksioni kthehet jo zero, atëherë dilni nga instaluesi

Në mënyrë të pabesueshme, kjo mbrojtje tmerrësisht primitive është ndërtuar pikërisht kështu! Për më tepër, skedari gjysmë metër ChkLic.exe nuk nevojitet fare! Dhe pse ia vlente ta tërhiqte zvarrë nga interneti? Nga rruga, nëse vendosni të ruani shpërndarjen e përpiluesit (vëmendje: nuk thashë "shpërnda"!), atëherë për të kursyer hapësirën në disk, mund të fshini ChkLic. ChkLic.dll, i cili eksporton funksionin stdcall CheckValidLicence të formularit: int CheckValidLicence(int some_flag) (kthimi 0;)

Pra, ndërsa ne po diskutonim të gjitha këto, instaluesi përfundoi instalimin e përpiluesit dhe përfundoi me sukses punën e tij. Nëse është interesante nëse përpiluesi do të fillojë apo gjithçka më interesante fillon vetëm? Ne zbresim me ethe poshtë hierarkisë së degëzuar të dosjeve të mbivendosur, gjejmë icl.exe, i cili, siç pritej, ndodhet në drejtorinë e koshit, klikoni dhe ... Përpiluesi natyrisht nuk fillon, duke iu referuar faktit se "icl: gabim: nuk mund të arkëtonte licencën FLEX lm” pa të cilën ai nuk mund të vazhdojë punën e tij.

Rezulton se Intel aplikoi mbrojtje me shumë nivele dhe niveli i parë doli të ishte një mbrojtje e ashpër kundër budallenjve. Epo! Ne e pranojmë këtë sfidë dhe, bazuar në përvojën tonë të mëparshme, kërkojmë automatikisht skedarin LMGR*.DLL në drejtorinë e përpiluesit. E padobishme! Këtë herë, nuk ka një skedar të tillë këtu, por rezulton se icl.exe ka fituar shumë peshë, duke tejkaluar shenjën prej gjashtëqind kilobajt ... Ndal! Por a e lidhën zhvilluesit e përpiluesit pikërisht këtë FLEX lm me një lidhje statike? Ne shikojmë: në Intel C++ 5.0, shuma e madhësive të lmgr327.dll dhe icl.exe ishte 598 KB, dhe tani vetëm icl.exe merr 684 KB. Pas përshtatjes për "obezitetin" natyral senile, numrat konvergjojnë shumë mirë. Pra, në fund të fundit, FLEX lm! Oh oh! Por tani, pa emrat simbolikë të funksioneve, do të jetë shumë më e vështirë për të thyer mbrojtjen ... Megjithatë, le të mos kemi panik para kohe! Le të mendojmë me qetësi! Nuk ka gjasa që ekipi i zhvillimit të rishkruajë plotësisht të gjithë kodin që ndërvepron me këtë mbrojtje "zarf". Me shumë mundësi, "përmirësimi" i tij duke ndryshuar vetëm llojin e paraqitjes përfundoi. Dhe nëse po, atëherë shanset për të hakuar programin janë akoma të mëdha!

Duke pasur parasysh se hera e fundit është futur kodi i sigurisë funksionet kryesore, ne, pasi përcaktuam adresën e tij, thjesht vendosëm një pikë ndërprerjeje dhe, pasi prisnim që korrigjuesi të shfaqet, gjurmojmë marrëzi kodin, duke hedhur një vështrim në mënyrë alternative ose në korrigjuesin ose në dritaren e daljes së programit: a u shfaq një mesazh abuziv atje? Në të njëjtën kohë, ne shënojmë të gjitha kërcimet e kushtëzuara që hasim në një copë letre të veçantë (ose e lëmë mënjanë në kujtesën tonë, nëse dëshironi), duke mos harruar të tregojmë nëse çdo kërcim i kushtëzuar është kryer apo jo. .. Ndalo! Ne biseduam diçka, por mesazhi abuziv tashmë është shfaqur! OK mirë! Le të shohim se çfarë tranzicioni i kushtëzuar korrespondonte me të. Të dhënat tona tregojnë se dega e fundit e hasur ishte dega e kushtëzuar JNZ, e vendosur në adresën 0401075h dhe "reagon" ndaj rezultatit të kthyer nga sub_404C0E:

  • Teksti:0040107F loc_40107F: ; KODI XREF: _main+75^j

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

    Teksti:00401084 mov edx, 21h

    Teksti:00401089 telefononi sub_404C0E

    Teksti:0040108E provë eax, eax

    Teksti:00401090 jnz shkurt loc_40109A

    Natyrisht, sub_404C0E është e njëjta procedurë mbrojtëse që kontrollon licencën për praninë e saj. Si ta mashtroni atë? Epo, ka shumë opsione... Së pari, mund të analizoni me kujdes dhe me përpikëri përmbajtjen e sub_404C0E për të zbuluar: çfarë saktësisht dhe si kontrollon saktësisht. Së dyti, thjesht mund të zëvendësoni JNZ loc_40107F të shkurtër me JZ të shkurtër loc_40107F ose edhe NOP, NOP. Së treti, komanda për kontrollin e rezultatit të kthimit TEST EAX, EAX mund të shndërrohet në një komandë vendosjeje zero: XOR EAX, EAX. Së katërti, vetë sub_404C0E mund të rregullohet në mënyrë që të kthehet gjithmonë zero. Nuk e di për ju, por më pëlqeu metoda numër tre. Ndryshojmë dy bajt dhe nisim kompajlerin. Nëse nuk ka kontrolle të tjera të "licensimit" të tij në mbrojtje, atëherë programi do të funksionojë dhe, në përputhje me rrethanat, anasjelltas. (Siç kujtojmë, në versionin e pestë kishte dy kontrolle të tilla). Është e mahnitshme, por përpiluesi nuk betohet dhe funksionon më!!! Në të vërtetë, siç pritej, zhvilluesit e tij nuk e forcuan aspak mbrojtjen, por, përkundrazi, madje e dobësuan atë! Chris Kaspersky



  • Po ngarkohet...
    Top