Осмата версия на компилаторите на Intel. Компилатори за платформата Microsoft Windows

Ти не си роб!
Затворен образователен курс за деца от елита: "Истинското устройство на света."
http://noslave.org

От Уикипедия, свободната енциклопедия

Компилатор на Intel C++
Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).
Тип
Автор

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

Разработчик
Разработчици

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

Написано в

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

Интерфейс

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

операционна система
Интерфейсни езици

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

Първо издание

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

Хардуерна платформа
последна версия
кандидат за освобождаване

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

бета версия

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

алфа версия

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

Тестова версия

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

Четими файлови формати

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

Генерирани файлови формати

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

състояние

Lua грешка в Module:Wikidata на ред 170: опит за индексиране на полето „wikibase“ (нулева стойност).

Разрешително

Основни функции:

  • Векторизация за SSE, SSE2, SSE3, SSE4

Компилаторът поддържа стандарта OpenMP 3.0 за писане на паралелни програми. Той също така съдържа модификация на OpenMP, наречена Cluster OpenMP, с която можете да стартирате приложения, написани според OpenMP, на клъстери, използващи MPI.

Компилаторът Intel C++ използва интерфейс (частта от компилатора, която анализира програмата, която се компилира) от Edison Design Group. Същият интерфейс се използва от компилаторите SGI MIPSpro, Comeau C++, Portland Group.

Този компилатор се използва широко за компилиране на SPEC CPU бенчмаркове.

Има 4 серии продукти от Intel, съдържащи компилатора:

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

Недостатъците на Linux версията на компилатора включват частична несъвместимост с GNU разширенията на езика C (поддържани от GCC компилатора), което може да причини проблеми при компилирането на някои програми.

Експериментални варианти

Публикувани са следните експериментални версии на компилатора:

  • Intel STM Compiler Prototype Edition от 17 септември 2007 г. Поддръжка на софтуерна транзакционна памет (STM). Издаден само за Linux и Windows, IA-32 (процесори x86);
  • Intel Concurrent Collections за C/C++ 0.3, септември 2008 г. Съдържа механизми, които улесняват писането на паралелни C++ програми.

Основни знамена

Windows Linux, Mac OSX Описание
/од -О0 Деактивирайте оптимизациите
/O1 -O1 Оптимизирайте, за да намалите размера на изпълнимия файл
/O2 -O2 Оптимизирайте за скорост. Включени са някои оптимизации
/O3 -O3 Активирайте всички оптимизации от O2. Също така извършвайте интензивни оптимизации на цикъла
/Oip -Ойп Активиране на междупроцедурна оптимизация по файл
/Oipo -Ойпо Активиране на глобална междупроцедурна оптимизация
/QxO -xO Разрешете използването на SSE3, SSE2 и SSE разширения за процесори, произведени от всяка компания
/бърз -бърз "Бърз режим". Еквивалентно на "/O3 /Qipo /QxHost /no-prec-div" в Windows и "-O3 -ipo -static -xHOST -no-prec-div" в Linux. Имайте предвид, че флагът "-xHOST" означава оптимизация за процесора, на който работи компилаторът.
/Qprof-ген -проф_ген Създайте инструментална версия на програмата, която ще сглоби профила на изпълнение
/Qprof-употреба -професионална_употреба Възползвайте се от информация за профила от стартирания на програми, компилирани с флага prof_gen.

Напишете отзив за статията "Компилатор на Intel C++"

Бележки

Вижте също

Връзки

Откъс, характеризиращ компилатора Intel C++

И все пак тя се завърна, за да види за последен път Белия Маг... Нейния съпруг и най-верен приятел, когото никога не можеше да забрави. В сърцето си тя му прости. Но, за негово голямо съжаление, тя не успя да му донесе прошката на Магдалена... Така че, както виждате, Исидора, великата християнска басня за "прошката" е просто детска лъжа за наивните вярващи, които им позволяват да правят каквото и да било Зли, знаещи, че каквото и да направят, накрая ще им бъде простено. Но можете да простите само това, което наистина е достойно за прошка. Човек трябва да разбере, че за всяко сторено зло трябва да отговаря... И не пред някакъв тайнствен Бог, а пред себе си, принуждавайки се да страда жестоко. Магдалена не прости на Владика, въпреки че дълбоко го уважаваше и искрено го обичаше. Така, както тя не успя да прости на всички ни ужасната смърт на Радомир. В крайна сметка ТЯ разбираше най-добре - можем да му помогнем, можем да го спасим от жестока смърт... Но ние не искахме. Смятайки вината на Белия маг за твърде жестока, тя го остави да живее с тази вина, без да я забравя нито за миг... Тя не искаше да му даде лесна прошка. Не я видяхме повече. Както никога не са виждали бебетата си. Чрез един от рицарите на своя храм - нашият магьосник - Магдалена предаде отговора на Господ на молбата му да се върне при нас: „Слънцето не изгрява два пъти в един ден ... Радостта на твоя свят (Радомир) никога няма върни се при теб, както аз няма да се върна при теб и аз... Намерих моята ВЯРА и моята ИСТИНА, те са ЖИВИ, твоята е МЪРТВА... Оплакайте синовете си - те ви обичаха. Никога няма да ти простя смъртта им, докато съм жив. И нека вината ви остане с вас. Може би някой ден тя ще ви донесе Светлина и Прошка ... Но не от мен. Главата на Йоан Магус не беше донесена в Метеора по същата причина - никой от рицарите на храма не искаше да се върне при нас ... Изгубихме ги, както загубихме много други повече от веднъж, които не искаха да разберат и приемете нашите жертви ... Кой е точно като вас - те си тръгнаха, осъждайки ни.
Зави ми се свят!.. Като жаден, задоволявайки вечния си глад за знания, лакомо поглъщах потока от удивителна информация, щедро дарявана от Севера... И исках много повече!.. Исках да знам всичко докрай . Беше глътка прясна вода в пустинята, обгорена от болка и нещастие! И не можех да пия достатъчно...
Имам хиляди въпроси! Но не остана време ... Какво да правя, Север? ..
- Питай, Изидора!.. Питай, ще се опитам да ти отговоря...
- Кажи ми, Север, защо ми се струва, че в тази история са свързани две истории от живота, преплетени с подобни събития, и те са представени като живота на един човек? Или не съм прав?
– Напълно си права, Изидора. Както ви казах по-рано, „силните на този свят“, които създадоха фалшива история на човечеството, „поставиха“ върху истинския живот на Христос извънземния живот на еврейския пророк Джошуа, живял преди хиляда и половина години (от историята на Севера). И не само себе си, но и семейството му, близките и приятелите му, приятелите и последователите му. Все пак това е съпругата на пророк Исус Навин, еврейката Мария, която има сестра Марта и брат Лазар, сестрата на майка му Мария Якобе и други, които никога не са били близо до Радомир и Магдалена. Така както не е имало други "апостоли" до тях - Павел, Матей, Петър, Лука и останалите...
Семейството на пророка Исус Навиев се премести преди хиляда и половина години в Прованс (което по това време се наричаше Галия (Трансалпийска Галия), в гръцкия град Масалия (сега Марсилия), тъй като Масалия по това време беше „врата“ между Европа и Азия и това беше най-лесният начин за всички „преследвани“ да избегнат преследвания и нещастия.

Въведение В края на 2003 г. Intel представи версия 8.0 на своята колекция от компилатори. Новите компилатори са предназначени да подобрят производителността на приложения, работещи на сървъри, настолни компютри и мобилни системи(лаптопи, мобилни телефони и PDA) на базата на Процесори на Intel. Имаме удоволствието да отбележим, че този продукт е създаден с активното участие на служители на Центъра за разработка на софтуер на Intel в Нижни Новгород и специалисти на Intel от Саров.

Новата серия включва компилатори на Intel за C++ и Fortran за Windows и Linux, както и компилатори на Intel за C++ за Windows CE .NET. Компилаторите са насочени към системи, базирани на следните процесори Intel: Intel Itanium 2, Intel Xeon, Intel Pentium 4, процесори Intel Personal Internet Client Architecture за мобилни телефони и PDA устройства и процесор Intel Pentium M за мобилни компютри (компонент на технологията Intel Centrino за мобилни телефони).PC).

Компилаторът Intel Visual Fortran за Windows предоставя технологии за компилиране от следващо поколение за високопроизводителни изчисления. Той съчетава функционалността на езика Compaq Visual Fortran (CVF) с подобренията в производителността, станали възможни благодарение на технологиите за оптимизация на компилация и генериране на код и опростява задачата за пренасяне програмен код, разработен с CVF, в средата на Intel Visual Fortran. Този компилатор е първият, който прилага CVF функции както за 32-битови системи на Intel, така и за системи, базирани на семейството процесори Intel Itanium, работещи в Windows среда. В допълнение, този компилатор ви позволява да внедрявате езикови функции CVF на Linux системи, базирани на 32-битови процесори Intel и фамилията процесори Intel Itanium. През 2004 г. се планира да се пусне разширена версия на този компилатор - компилаторът Intel Visual Fortran Compiler Professional Edition за Windows, който ще включва библиотеката IMSL Fortran 5.0, разработена от Visual Numerics, Inc.


„Новите компилатори също поддържат предстоящите процесори на Intel с кодово име Prescott, които предоставят нови команди за подобряване на графичната и видео производителност, както и други подобрения на производителността. Те също така поддържат нова технология Mobile MMX(tm), който по подобен начин подобрява производителността на графични, звукови и видео приложения за мобилни телефони и PDA, - каза Алексей Одиноков, съдиректор на Центъра за разработка на софтуер на Intel в Нижни Новгород. - Тези компилатори предоставят на разработчиците на приложения единен набор от инструменти за изграждане на нови приложения безжични мрежибазиран на архитектурата на Intel. Новите компилатори на Intel също така поддържат технологията Hyper-Threading на Intel и индустриалната спецификация OpenMP 2.0, която дефинира използването на директиви високо нивоза контролиране на потока от инструкции в приложенията“.

Сред новите инструменти, включени в компилаторите, са инструментите Intel Code Coverage и Intel Test Prioritization. Заедно тези инструменти помагат за ускоряване на разработването на приложения и подобряване на качеството на приложението чрез подобряване на процеса на тестване. софтуер.

Инструментът за покритие на кода, когато тества приложение, предоставя пълни подробности за използването на логиката на приложението и местоположението на областите, използвани в изходния код на приложението. Ако се направят промени в приложението или ако този тест не позволява проверка на частта от приложението, която представлява интерес за разработчика, инструментът за тестване на приоритети ви позволява да проверите работата на избраната област програмен код.

Новите компилатори на Intel се предлагат в различни конфигурации, вариращи от $399 до $1499. Те могат да бъдат закупени днес от Intel Corporation или от дистрибутори по целия свят, чийто списък се намира на сайта. http://www.intel.com/software/products/reseller.htm#Russia.

Поддръжка на процесори Prescott

Поддръжката на процесора Intel Pentium 4 (Prescott) в осмата версия на компилатора е както следва:

1. Поддръжка на SSE3 команди (или PNI, Prescott New Instructions). Има три начина за подчертаване тук:

А. Вложки за асемблер (вграден монтаж). Например, компилаторът ще разпознае следното използване на командата SSE3 _asm(addsubpd xmm0, xmm1). По този начин потребителите, които се интересуват от оптимизация на ниско ниво, могат директно да имат достъп до командите на асемблера.

b. В C/C++ компилатора новите инструкции са достъпни от по-високо ниво от използването на вмъквания на асемблер. А именно чрез вградени функции (вътрешни функции):

Вградени функции

вградена функцияГенерирана команда
_mm_addsub_psAddsubps
_mm_hadd_psHaddps
_mm_hsub_psMsubps
_mm_moveldup_psMovsldup
_mm_movehdup_psMovshdup
_mm_addsub_pdAddsubpd
_mm_hadd_pdHaddpd
_mm_hsub_pdhsubpd
_mm_loaddup_pdmovddup xmm, m64
_mm_movedup_pdmovddup reg, reg
_mm_lddqu_si128Lddqu

Таблицата показва вградените функции и съответните инструкции за асемблер от комплекта SSE3. Същата поддръжка съществува за команди от наборите MMX\SSE\SSE2. Това позволява на програмиста да извършва оптимизация на кода на ниско ниво, без да прибягва до програмиране на асемблер: самият компилатор се грижи за картографирането (mapping "e) на вградените функции към съответните инструкции на процесора и оптималното използване на регистрите. Програмистът може концентрирайте се върху създаването на алгоритъм, който ефективно използва нови набори от инструкции.

V. Автоматично генериране на нови команди от компилатора. Предишните два метода включват използването на нови команди от програмиста. Но компилаторът също така може (използвайки подходящи опции - вижте раздел 3 по-долу) автоматично да генерира нови инструкции от набора SSE3 за C/C++ и Fortran код. Например оптимизираната команда за неподравнено зареждане (lddqu), която ви позволява да получите увеличение на производителността до 40% (например при задачи за видео и аудио кодиране). Други команди от набора SSE3 ви позволяват да получите значително ускорение при задачи с 3D графика или изчислителни задачи, използващи комплексни числа. Например, графиката в раздел 3.1 по-долу показва, че за приложението 168.wupwise от пакета SPEC CPU2000 FP, ускоряването, получено от автоматичното генериране на инструкции SSE3, е ~25%. Ефективността на това приложение до голяма степен зависи от скоростта на аритметиката на комплексните числа.

2. Използване на микроархитектурните предимства на процесора Prescott. При генериране на код компилаторът взема предвид микроархитектурните промени в новия процесор. Например, някои операции (като целочислени смени, целочислени умножения или преобразувания на числа между различни формати с плаваща запетая в SSE2) са по-бързи на новия процесор в сравнение с предишните версии (да речем, целочислената промяна сега отнема един цикъл на процесора срещу четири за предишна версия).процесор Intel Pentium 4). По-интензивното използване на такива команди ви позволява да получите значително ускорение на приложенията.
Друг пример за микроархитектурни промени е подобреният механизъм за препращане на магазин (бързо зареждане на данни, които преди това са били съхранени в паметта); истинското записване дори не се извършва в кеш паметта, а в някакъв междинен буфер за запис, който след това позволява много бърз достъп до данните. Такава характеристика на архитектурата позволява например да се извърши по-агресивна автоматична векторизация на програмния код.
Компилаторът взема предвид и увеличеното количество кеш памет на първо и второ ниво.

3. Подобрена поддръжка за технологията Hyper-Threading. Този елемент може да е свързан с предишния - микроархитектурни промени и тяхното използване в компилатора. Например, библиотека за изпълнение, която поддържа индустриалната спецификация на OpenMP, е оптимизирана да работи на новия процесор.

производителност

Използването на компилатори е лесен и ефективен начин да се възползвате от процесорните архитектури на Intel. По-долу са условно (много) подчертани два начина за използване на компилатори: а) повторно компилиране на програми с възможна промянанастройки на компилатора, б) повторно компилиране с промяна както в настройките на компилатора, така и в изходния текст, както и използване на диагностика на компилатора за текущи оптимизации и възможното използване на други софтуерни инструменти(например профайлери).


1.1 Оптимизиране на програми чрез повторно компилиране и промяна на настройките на компилатора


Често първата стъпка в мигрирането към нов оптимизиращ компилатор е да го използвате с настройките по подразбиране. Следващата логична стъпка е използването на опции за по-агресивна оптимизация. Фигури 1, 2, 3 и 4 показват ефекта от преминаването към компилатора на Intel версия 8.0 в сравнение с използването на други водещи в индустрията продукти (-O2 - настройки на компилатора по подразбиране, база - настройки на максимална производителност). Сравнението е направено на 32-битови и 64-битови архитектури на Intel. Приложенията от SPEC CPU2000 се използват като тестов набор.


Снимка 1




Фигура 2




Фигура 3




Фигура 4


Някои от опциите са изброени по-долу (по-нататък опциите са за семейството на Windows OS; за семейството на Linux OS има опции със същия ефект, но името може да се различава; например -Od или QxK за Windows имат подобен ефект с -O0 или -xK съответно за Linux, повече подробна информацияможе да се намери в ръководството на компилатора), поддържан от компилатора на Intel.


Контрол на нивата на оптимизация: Опции -Od (без оптимизации; използва се за отстраняване на грешки в програми), -O1 (максимална скорост при минимизиране на размера на кода), -O2 (оптимизация за скоростта на изпълнение на кода; използва се по подразбиране), -O3 (разрешава най-агресивните оптимизации за изпълнение на кода скорост; в някои случаи може да доведе до обратен ефект, т.е. до забавяне; трябва да се отбележи, че при IA-64 използването на -O3 води до ускорение в повечето случаи, докато положителният ефект при IA-32 е по-слабо изразен ). Примери за оптимизации, активирани от -O3, са обмен на контури, сливане на контури, разпределение на контури (оптимизиране на обратно сливане на контури), софтуерно предварително извличане на данни. Причината, поради която забавянето е възможно при използване на -O3, може да е, че компилаторът е използвал евристичен подход, за да избере агресивна оптимизация за конкретен случай, без да има достатъчно информация за програмата (например генерирани инструкции за предварително извличане на данните, използвани в цикъла, вярвайки, че цикълът се изпълнява голям брой пъти, докато всъщност има само няколко повторения). Оптимизацията на междупроцедурното профилиране, както и различни "подсказки" на програмиста (вижте раздел 3.2) могат да помогнат в тази ситуация.

Междупроцедурна оптимизация: -Qip (в рамките на един файл) и -Qipo (в рамките на няколко или всички файлове на проекта). Включва такива оптимизации като, например, вградено заместване на често използван код (намаляване на разходите за извикване на функция/процедура). Представлява информация за други етапи на оптимизация - например информация за горната граница на цикъла (да речем, ако е константа по време на компилиране, дефинирана в един файл, но използвана в много) или информация за подравняването на данните в паметта (много MMX Командите \SSE\SSE2\SSE3 работят по-бързо, ако операндите са подравнени в паметта на граница от 8 или 16 байта). Анализът на процедурите за разпределяне на памет (имплементирани/извиквани в един от файловете на проекта) се предава на тези функции/процедури, където се използва тази памет (това може да помогне на компилатора да изостави консервативното предположение, че данните не са правилно подравнени в паметта; и предположението трябва да е консервативно, когато няма допълнителна информация). Разграничаване на недвусмислието, анализ на псевдоним на данни може да служи като друг пример: при липса на допълнителна информация и невъзможност да се докаже липсата на пресичане, компилаторът изхожда от консервативното предположение, че има пресичане. Подобно решение може да повлияе негативно на качеството на такива оптимизации като например автоматична векторизация на IA-32 или софтуерна конвейерна обработка (софтуерна конвейерна обработка или SWP) на IA-64. Междупроцедурната оптимизация може да помогне при анализирането на наличието на пресичания на паметта.

Оптимизация на профилиране: Включва три етапа. 1) генериране на инструментален код с помощта на опцията -Qprof_gen. 2) полученият код се изпълнява върху представителни данни, като по време на изпълнение се събира информация за различни характеристики на изпълнение на кода (например вероятности за преход или типична стойност за броя на повторенията на цикъла). 3) Повторно компилиране с опцията -Qprof_use, която гарантира, че компилаторът използва информацията, събрана в предишната стъпка. По този начин компилаторът има способността да използва не само статични оценки на важни характеристики на програмата, но и данни, получени по време на реално изпълнение на програмата. Това може да помогне при последващия избор на определени оптимизации (например по-ефективно подреждане в паметта на различни клонове на програмата, въз основа на информация за това кои клонове са били изпълнени с каква честота; или прилагане на оптимизация към цикъл въз основа на информация за типичния брой повторения в него). Оптимизацията на профилирането е особено полезна, когато е възможно да се избере малък, но представителен набор от данни (за стъпка #2), който добре илюстрира най-типичните бъдещи случаи на използване на програмата. В някои предметни области изборът на такъв представителен набор е напълно възможен. Например оптимизирането на профилирането се използва от разработчиците на СУБД.

Изброените по-горе оптимизации са от общ тип, т.е. генерираният код ще работи на всички различни процесори от семейството (да речем, в случай на 32-битова архитектура, на всички от следните процесори: Intel Pentium-III, Pentium 4, включително ядрото Prescott, Intel Pentium M). Има и оптимизации за определен процесор.

Специфични оптимизации на процесора: -QxK (Pentium-III; използване на SSE команди, специфики на микроархитектурата), -QxW и -QxN (Pentium 4; използване на SSE и SSE2 команди, специфики на микроархитектурата), -QxB (Pentium M; използване на SSE и SSE2 команди, специфики на микроархитектурата)), QxP (Prescott; използване на команди SSE, SSE2 и SSE3, характеристики на микроархитектурата). В този случай кодът, генериран с помощта на тези опции, може да не работи на други представители на фамилията процесори (например код -QxW може да доведе до изпълнение на невалидна команда, ако се изпълнява на система, базирана на Intel Pentium-III процесор). Или не работете с максимална ефективност (например -QxB код на процесор Pentium 4 поради разлики в микроархитектурата). С тези опции също е възможно да се използват библиотеки за изпълнение, оптимизирани за конкретен процесор, като се използва неговия набор от инструкции. За да се контролира, че кодът действително се изпълнява на целевия процесор, е внедрен механизъм за изпращане (cpu-dispatch): проверка на процесора по време на изпълнение на програмата. В различни ситуации този механизъм може да бъде активиран или не. Изпращането се използва винаги, ако се използва вариантът на опцията -Qax(KWNP). В този случай се генерират две версии на кода: оптимизиран за конкретен процесор и "общ" (генеричен), изборът става по време на изпълнение на програмата. По този начин, чрез увеличаване на размера на кода, е възможно да се постигне изпълнение на програмата на всички процесори на линията и оптимално изпълнение на целевия процесор. Друг вариант е да използвате оптимизация на кода за предишния представител на линията и да използвате този код на този и следващите процесори. Например кодът -QxN може да работи на Pentium 4 с ядра Northwood и Prescott. Няма увеличение на размера на кода. С този подход можете да получите добра, но все още не оптимална производителност на система с процесор Prescott (тъй като SSE3 не се използва и разликите в микроархитектурата не се вземат предвид) с оптимална производителност на Northwood. Подобни опции съществуват и за процесори с архитектура IA-64. На този моментима две от тях: -G1 (Itanium) и -G2 (Itanium 2; опция по подразбиране).

Графиката по-долу (Фигура 5) показва ускоряването (на базата на едно - без ускоряване) от използването на някои от оптимизациите, изброени по-горе (а именно -O3 -Qipo -Qprof_use -Qx(N,P)) на процесор Prescott в сравнение с настройките по подразбиране (-O2). Използването на -QxP помага в някои случаи да получите ускорение в сравнение с -QxN. Най-голямото ускоряване се постига в приложението 168.wupwise, вече споменато в предишния раздел (поради интензивната оптимизация на сложна аритметика с помощта на инструкции SSE3).


Фигура 5


Фигура 6 по-долу показва съотношението (в пъти) на скоростта на кода с оптимални настройкив сравнение с напълно неоптимизиран код (-Od) на процесори Pentium 4 и Itanium 2. Вижда се, че Itanium 2 зависи много повече от качеството на оптимизацията. Това е особено ясно изразено при изчисленията с плаваща запетая (FP), където съотношението е около 36 пъти. Изчисленията с плаваща запетая са силна страна IA-64 архитектури, но трябва да се внимава да се използват най-ефективните настройки на компилатора. Получената печалба в производителността плаща за труда, изразходван за намирането им.


Фигура 6. Ускорение при използване на най-добрите опции за оптимизация SPEC CPU200


Компилаторите на Intel поддържат индустриалната спецификация OpenMP за изграждане на многонишкови приложения. Поддържат се явно (опция -Qopenmp) и автоматично (-Qparallel) паралелизиране. В случай на явен режим, програмистът е отговорен за правилното и ефективно използване на стандарта OpenMP. В случай на автоматично паралелизиране, компилаторът има допълнителна тежест, свързана с анализа на програмния код. Поради тази причина в момента автоматичното паралелизиране работи ефективно само върху сравнително прости кодове.

Графиката на Фигура 7 показва ускорението от използване на изрично паралелизиране върху инженерна (предпроизводствена) примерна система, базирана на процесор Intel Pentium 4 (Prescott) с поддръжка на технологията Hyper-Threading: 2,8 GHz, 2 GB RAM, 8K L1-Cache, 512K L2-кеш . SPEC OMPM2001 се използва като набор от тестове. Този комплект се фокусира върху малки и средни SMP системи, консумацията на памет е до два гигабайта. Приложенията бяха компилирани с помощта на Intel 8.0 C/C++ и Fortran с два набора от опции: -Qopenmp -Qipo -O3 -QxN и -Qopenmp -Qipo -O3 -QxP, с всеки от които приложенията стартираха с активиран и деактивиран Hyper-Threading . Стойностите на ускорението на графиката са нормализирани към производителността на еднопоточната версия с деактивирана Hyper-Threading.


Фигура 7: Приложения от пакета SPEC OMPM2001 на процесор Prescott


Може да се види, че в 9 от 11 случая използването на явно паралелизиране с помощта на OpenMP дава тласък на производителността, когато технологията Hyper-Threading е активирана. Едно приложение (312.swim) изпитва забавяне. Известен факт е, че това приложение се характеризира с висока степен на зависимост от честотна лентапамет. Както при SPEC CPU2000, wupwise се възползва значително от оптимизациите на Prescott (-QxP).


1.2 Оптимизиране на програми с промени в изходния код и използване на диагностика на компилатора


В предишните раздели разгледахме влиянието на компилатора (и неговите настройки) върху скоростта на изпълнение на кода. В същото време компилаторите на Intel предоставят повече възможности за оптимизиране на кода, отколкото просто промяна на настройките. По-специално, компилаторите позволяват на програмиста да прави "намеци" в програмния код, което позволява генерирането на по-ефективен код по отношение на производителността. По-долу са някои примери за езика C/C++ (има подобни инструменти за езика Fortran, различаващи се само по синтаксис).

#pragma ivdep (където ivdep означава игнориране на векторни зависимости) се използва преди програмни цикли, за да се каже на компилатора, че вътре няма зависимости от данни. Тази подсказка работи, когато компилаторът (въз основа на анализа) консервативно допуска, че такива зависимости могат да съществуват (ако компилаторът може да докаже, че зависимостта съществува в резултат на анализа, тогава „подсказката“ няма ефект), докато авторът на кода знае, че такива зависимости не могат да възникнат. С тази подсказка компилаторът може да генерира по-ефективен код: автоматична векторизация за IA-32 (използвайки векторни инструкции от наборите MMX\SSE\SSE2\SSE3 за програмни цикли на C/C++ и Fortran; можете да научите повече за тази техника, за пример, следващ статия в Intel Technology Journal), софтуерна конвейерна обработка (SWP) за IA-64.

#pragma vector винаги се използва, за да принуди компилатора да промени решението за неефективността на векторизацията на цикъла (както автоматично за IA-32, така и SWP за IA-64), въз основа на анализ на количествените и качествени характеристики на работата при всяка повторение.

#pragma novector винаги прави обратното на #pragma vector.

#pragma vector aligned се използва, за да каже на компилатора, че данните, използвани в цикъла, са подравнени на граница от 16 байта. Това ви позволява да генерирате по-ефективен и/или компактен (поради липсата на проверки по време на изпълнение) код.

#pragma vector unaligned прави обратното на #pragma aligned. Трудно е да се говори за повишаване на производителността в този случай, но можете да разчитате на по-компактен код.

#pragma distribute point се използва вътре в цикъла на програмата, така че компилаторът да може да раздели цикъла на разпространение в тази точка на няколко по-малки. Например, такъв "подсказка" може да се използва, когато компилаторът не успее автоматично да векторизира изходния цикъл (например поради зависимост от данни, която не може да бъде игнорирана дори с #pragma ivdep), докато всеки (или част) от ново образуваните цикли могат да бъдат ефективно векторизирани.

#pragma loop count (N) се използва, за да каже на компилатора, че най-вероятната стойност за броя итерации на цикъла ще бъде N. Тази информация помага да се вземе решение за най-ефективната оптимизация за този цикъл (например дали да се развърти , дали да се направи SWP или автоматична векторизация, дали да се използват команди за предварително извличане на софтуерни данни, ...)

„Подсказката“ _assume_aligned(p, base) се използва, за да каже на компилатора, че областта на паметта, свързана с указателя p, е подравнена на база = 2^n байтова граница.

Това е далеч от пълен списъкразлични "намеци" към компилатора, които могат значително да повлияят на ефективността на генерирания код. Може да възникне въпросът как да се определи, че компилаторът се нуждае от подсказка.

Първо, можете да използвате диагностиката на компилатора под формата на отчети, които предоставя на програмиста. Например, като използвате опцията -Qvec_reportN (където N варира от 0 до 3 и представлява нивото на детайлност), можете да получите автоматичен отчет за векторизация. Програмистът ще има достъп до информация за това кои цикли са векторизирани и кои не. В противен случай компилаторът съобщава причините, поради които векторизацията е неуспешна. Да приемем, че причината е консервативно приета зависимост от данните. В този случай, ако програмистът е сигурен, че зависимостта не може да възникне, тогава може да се използва #pragma ivdep. Компилаторът предоставя подобни (в сравнение с Qvec_reportN за IA-32) възможности на IA-64 за контрол на присъствието и ефективността на SWP. Като цяло, компилаторите на Intel предоставят широки възможности за диагностициране на оптимизации.

Второ, други софтуерни продукти (като Intel VTune Profiler) могат да се използват за намиране на тесни места в производителността в кода. Резултатите от анализа могат да помогнат на програмиста да направи необходимите промени.

Можете също така да използвате списъка с код на асемблер, генериран от компилатора за анализ.


Фигура 8


Фигура 8 по-горе показва стъпка по стъпка процеса на оптимизиране на приложение с помощта на компилатор (и други софтуерни продукти) Intel на език Fortran за IA-64 архитектура. Като пример се разглежда неадиабатна регионална прогнозна схема за 48 часа на Roshydrometcenter (можете да прочетете за това, например, в тази статия. Статията говори за времето за изчисление от около 25 минути, но са настъпили значителни промени Производителността на кода е взета като отправна точка на Cray-YMP система. Немодифициран код с опции на компилатора по подразбиране (-O2) показа увеличение на производителността от 20% на 4-посочна система, базирана на Intel Itanium 2 900 MHz процесор Прилагането на по-агресивна оптимизация (-O3) доведе до ~2,5 пъти ускорение без промяна на кода главно поради SWP и предварително извличане на данни. Анализът с помощта на диагностика на компилатора и Intel VTune Profiler разкри някои тесни места. Например, компилаторът не е направил програмно няколко производителни критични цикли, отчитайки в доклада, че предполага зависимост от данни. Малки промени в кода (директива ivdep) помогнаха за постигане на ефекта активно предаване. С помощта на профилиращия VTune беше установено (и докладът на компилатора потвърди това), че компилаторът не промени реда на вложените цикли (обмен на цикли) за по-ефективно използване на кеш паметта. Причината отново бяха консервативни предположения за зависимостта от данните. Направени са промени в изходния код на програмата. В резултат на това успяхме да постигнем 4-кратно ускорение спрямо първоначалната версия. Използване на изрично паралелизиране с OpenMP директиви и след това преминаване към система с повече от висока честотапозволи да се намали времето за изчисление до по-малко от 8 минути, което даде повече от 16 пъти ускорение в сравнение с първоначалната версия.

Intel Visual Fortran

Intel Visual Fortran 8.0 използва предния край (част от компилатора, отговорен за преобразуването на програмата от текст на езика за програмиране във вътрешното представяне на компилатора, което е до голяма степен независимо или от езика за програмиране, или от целевата машина), CVF компилатор технологии и компоненти на компилатора на Intel, отговорен за набор от оптимизации и генериране на код.


Фигура 9




Фигура 10


Фигури 9 и 10 показват сравнителни графики Производителност на Intel Visual Fortran 8.0 с предишната версия на Intel Fortran 7.1 и с други известни в индустрията компилатори от този език, работещи под операционната система Windows семействаи Linux. За сравнение са използвани тестове, чиито изходни текстове, отговарящи на стандартите F77 и F90, са достъпни на http://www.polyhedron.com/. На същия сайт е налична по-подробна информация за сравняване на производителността на компилатора (Сравнения на Win32 Compiler -> Fortran (77, 90) Сравнителни показатели за време на изпълнение и Сравнения на Linux компилатор -> Fortran (77, 90) Сравнителни показатели за време на изпълнение): повече различни компилатори са и средната геометрична стойност е дадена във връзка с индивидуалните резултати за всеки тест.

В предишния брой на списанието обсъдихме продуктите от семейството Intel VTune Performance Analyzer - инструменти за анализ на производителността, които са заслужено популярни сред разработчиците на приложения и ви позволяват да откривате в кода екипни приложения, което консумира твърде много ресурси на процесора, което дава възможност на разработчиците да идентифицират и премахнат потенциални затруднения, свързани с такива части от кода, като по този начин ускоряват процеса на разработка на приложения. Обърнете внимание обаче, че производителността на приложенията до голяма степен зависи от това колко ефективни са компилаторите, използвани при тяхното разработване, и какви хардуерни функции използват при генериране на машинен код.

Най-новите компилатори Intel C++ и Intel Fortran за Windows и Linux осигуряват до 40% подобрения в производителността на приложенията за системи, базирани на процесори Intel Itanium 2, Intel Xeon и Intel Pentium 4 спрямо съществуващи компилатори от други доставчици, като използват тези характеристики на тези процесори, като технологията Hyper-Threading.

Разликите, свързани с оптимизирането на кода от това семейство компилатори, включват използването на стек за извършване на операции с плаваща запетая, междупроцедурна оптимизация (Interprocedural Optimization, IPO), оптимизация в съответствие с профила на приложението (Profile Guided Optimization, PGO), предварително зареждане на данни в кеш (предварително извличане на данни), което избягва забавянето, свързано с достъпа до паметта, поддръжка на характерни характеристики на процесорите на Intel (например разширения за поточно обработване на данни Intel Streaming SIMD Extensions 2, специфични за Intel Pentium 4), автоматично паралелизиране на изпълнението на код , създаване на приложения, работещи на множество различни видовепроцесори при оптимизиране за един от тях, средства за "предсказване" на последващия код (предсказание на разклонения), разширена поддръжка за работа с нишки за изпълнение.

Имайте предвид, че компилаторите на Intel се използват в такива известни компании като Alias/Wavefront, Oracle, Fujitsu Siemens, ABAQUS, Silicon Graphics, IBM. Въз основа на независимо тестване от редица компании, производителността на компилаторите на Intel значително превъзхожда компилаторите на други производители (вижте например http://intel.com/software/products/compilers/techtopics/compiler_gnu_perf.pdf).

По-долу ще разгледаме някои от функциите най-новите версииКомпилатори на Intel за десктоп и сървър операционна система.

Компилатори за платформата Microsoft Windows

Intel C++ Compiler 7.1 за Windows

Intel C++ Compiler 7.1 е компилатор, пуснат по-рано тази година, който ви позволява да постигнете висока степеноптимизации на кода за процесорите Intel Itanium, Intel Itanium 2, Intel Pentium 4 и Intel Xeon, както и за процесора Intel Pentium M, използвайки Технология на Intel Centrino и предназначени за използване в мобилни устройства.

Посоченият компилатор е напълно съвместим с инструментите за разработка на Microsoft Visual C++ 6.0 и Microsoft Visual Studio .NET: Може да бъде вграден в подходящи среди за разработка.

Този компилатор поддържа стандартите ANSI и ISO C/C++.

Intel Fortran Compiler 7.1 за Windows

Компилаторът Intel Fortran 7.1 за Windows, също пуснат по-рано тази година, ви позволява да създавате оптимизиран код за процесори Intel Itanium, Intel Itanium 2, Intel Pentium 4 и Intel Xeon, Intel Pentium M.

Този компилатор е напълно съвместим с инструментите за разработка Microsoft Visual C++ 6.0 и Microsoft Visual Studio .NET, т.е. може да бъде интегриран в съответните среди за разработка. В допълнение, този компилатор ви позволява да разработвате 64-битови приложения за операционни системи, работещи на процесори Itanium / Itanium 2, с помощ от Microsoft Visual Studio на 32-битов процесор Pentium, използващ 64-битов компилатор Intel Fortran. Когато дебъгвате код, този компилатор ви позволява да използвате дебъгера за платформата Microsoft .NET.

Ако имате инсталиран Compaq Visual Fortran 6.6, можете да използвате Intel Fortran Compiler 7.1 вместо оригиналния компилатор, защото тези компилатори са съвместими на ниво изходен код.

Компилаторът Intel Fortran 7.1 за Windows е напълно съвместим със стандарта ISO Fortran 95 и поддържа изграждане и отстраняване на грешки на двуезични приложения C и Fortran.

Компилатори за Linux платформата

Intel C++ Compiler 7.1 за Linux

Друг компилатор, пуснат в началото на годината, Intel C++ Compiler 7.1 за Linux, ви позволява да постигнете висока степен на оптимизация на кода за процесори Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Този компилатор е напълно съвместим с GNU C компилатора на ниво изходен код и обектни модули, което позволява на приложения, създадени с GNU C, да бъдат мигрирани към него без допълнителни разходи. операционни системи SCO, ранни версии на Sun Solaris и т.н.), което означава пълна съвместимост с компилаторът gcc 3.2 на двоично ниво. И накрая, с Intel C++ Compiler 7.1 за Linux можете дори да прекомпилирате ядрото на Linux с няколко незначителни промени в неговия изходен код.

Intel Fortran Compiler 7.1 за Linux

Компилаторът Intel Fortran Compiler 7.1 за Linux ви позволява да създавате оптимизиран код за процесори Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Този компилатор е напълно съвместим с компилатора Compaq Visual Fortran 6.6 на ниво изходен код, което позволява можете да прекомпилирате приложения с него, създадени с Compaq Visual Fortran, като по този начин подобрявате тяхната производителност.

Освен това посоченият компилатор е съвместим с помощни програми, използвани от разработчиците, като редактора на emacs, gdb дебъгера и помощната програма за създаване на приложение за създаване.

Подобно на Windows версията на този компилатор, Intel Fortran Compiler 7.1 за Linux е напълно съвместим със стандарта ISO Fortran 95 и поддържа създаването и отстраняването на грешки на приложения, съдържащи код на два езика C и Fortran.

Трябва да се подчертае, че значителен принос за създаването на изброените компилатори на Intel са направени от специалисти Руски център Intel за разработка на софтуер в Нижни Новгород. Повече информация за компилаторите на Intel можете да намерите на уеб сайта на Intel на адрес: www.intel.com/software/products/ .

Втората част на тази статия ще бъде посветена на компилаторите на Intel, които създават приложения за мобилни устройства.

Примери за реални хакове: Компилатор Intel C++ 7.0 — Архив на WASM.RU

… компилаторът Intel C++ 7.0 е изтеглен късно през нощта, около 5:00 сутринта. Исках да спя невероятно, но любопитството: дали защитата е засилена или не, също се разкъса. Решавайки, че докато не се справя със защитата, все още няма да заспя, като отворих нова конзола, и повторно инсталиране на системните променливи TEMP и TMP в директорията C:\TEMP, набързо въведе неприлично дългото име на инсталатора W_CC_P_7.0.073.exe в командна линия(Необходимостта да зададете променливите TEMP и TMP се дължи на факта, че в Windows 2000 те сочат към много дълбоко вложена директория по подразбиране, а инсталаторът на Intel C ++ - и не само той - не поддържа такива огромни пътища) .

Веднага стана ясно, че политиката за защита е била радикално преработена и сега наличието на лиценз се проверява още на етапа на инсталиране на програмата (във версия 5.x инсталацията беше извършена без проблеми). Добре, даваме командата dir и разглеждаме съдържанието на това, с което трябва да се борим сега:

    Съдържание на папката C:\TMP\IntelC++Compiler70

    17.03.2003 05:10

    html

    17.03.2003 05:11

    x86

    17.03.2003 05:11

    Итаний

    17.03.2003 05:11

    бележки

    05.06.2002 г. 10:35 45 056 AutoRun.exe

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

    29.10.2002 г. 11:25 ч. 2831 ccompindex.htm

    24.10.2002 08:12 126 976 ChkLic.dll

    18.10.2002 10:37 552 960 chklic.exe

    17.10.2002 г. 16:29 ч. 28 663 CLicense.rtf

    17.10.2002 г. 16:35 ч. 386 credist.txt

    16.10.2002 17:02 34 136 Crelnotes.htm

    19.03.2002 г. 14:28 ч. 4635 PLSuite.htm

    21.02.2002 12:39 2 478 register.htm

    02.10.2002 14:51 40 960 Setup.exe

    02.10.2002 10:40 151 Setup.ini

    10.07.2001 12:56 184 setup.mwg

    19 файла 2 519 238 байта

    6 папки 886 571 008 байта безплатно

Аха! Инсталаторът setup.exe отнема само четиридесет и нещо килобайта. Много добре! Едва ли можете да скриете сериозна защита в такъв обем, а дори и да е така, този мъничък файл не струва нищо за анализ в неговата цялост - до последния байт от списъка на дизасемблера. Не е факт обаче, че кодът за сигурност се намира точно в setup.exe, той може да се намира на друго място, например ... ChkLic.dll / ChkLic.exe, които заедно заемат малко по-малко от седемстотин килобайта . Чакай, какво е ChkLic? Това съкратено ли е от Check License? Хм, момчетата от Intel очевидно имат сериозни проблеми с чувството за хумор. Би било по-добре, ако нарекоха този файл "Hack Me" честно! Е, съдейки по силата на звука, ChkLic е същият FLEX lm и ние вече го срещнахме (вижте „Компилатор на Intel C++ 5.0“) и приблизително си представяме как да го разбием.

Даваме командата "dumpbin / EXPORTS ChkLic.dll", за да разгледаме експортираните функции и ... да се държим здраво за Клава, за да не паднем от стола:

    Дъмп на файла ChkLic.dll

  1. Разделът съдържа следните експорти за ChkLic.dll

    0 характеристики

    3DB438B4 клеймо за дата и време понеделник, 21 октомври 21:26:12 2002 г.

  2. 1 брой функции

    1 брой имена

    порядъчен намек RVA име

    1 0 000010A0_CheckValidLicense

Мамка му! Защитата експортира само една единствена функция с прекрасното име CheckValidLicense. „Забележително“ – защото целта на функцията става ясна от нейното име и става възможно да се избегне старателният анализ на кода на дизасемблера. Е, те върнаха целия интерес ... по-добре би било да го експортират в порядък или нещо подобно, или поне да го кръстят с някакво плашещо име като DES Decrypt.

...мечтая! Добре, обратно към нашите овце. Нека помислим логично: ако целият код за сигурност се намира директно в ChkLic.dll (и, съдейки по „закрепения“ характер на защитата, това е вярно), тогава цялата „защита“ се свежда до извикване на CheckValidLicense от Setup.exe и проверка на върнатия от него резултат. Следователно, за да "хакнете" е достатъчно просто да закърпите ChkLic.dll, принуждавайки функцията ChekValidLicense винаги да се връща ... между другото, какво трябва да върне? По-точно: каква точно е върнатата стойност, съответстваща на успешна проверка на лиценз? Не, не бързайте да разглобявате setup.exe, за да разберете, защото няма толкова много възможни опции: FALSE или TRUE. Залагате ли на TRUE? Е, в известен смисъл това е логично, но от друга страна: защо всъщност решихме, че функцията CheckValidLicense връща точно флага за успех на операцията, а не кода за грешка? В края на краищата трябва по някакъв начин да мотивира причините за отказа да инсталирате компилатора: файлът с лиценза не е намерен, файлът е повреден, лицензът е изтекъл и т.н.? Добре, нека се опитаме да върнем нула и ако това не проработи, ще върнем единица.

Добре, затягай се, да тръгваме! Стартираме HIEW, отваряме файла ChkLic.dll (ако не се отвори, запомнете gophers три пъти, временно го копирайте в корена или друга директория, която не съдържа специални знаци в името си, което hiew "y" не харесва След това, обръщайки се отново към таблицата за експортиране, получена с dumpbin, определяме адреса на функцията CheckValidLicense (в този случай 010A0h) и през "10A0" отиваме в началото й. Сега я изрязваме на живо, презаписвайки над стария код "XOR EAX, EAX / RETN 4. Защо точно "REN 4", а не само "RET"? Да, защото функцията поддържа конвенцията stdcall, което може да се разбере, като се погледне нейният епилог в HIEW " e (просто превъртете надолу екрана на разглобителя, докато срещнете RET).

Проверява се... Работи!!! Въпреки липсата на лиценз, инсталаторът стартира инсталацията, без да задава много въпроси! Така че защитата е паднала. О, не можем да повярваме, че всичко е толкова просто и за да не седим, гледайки празно в монитора, докато чакаме процеса на инсталиране на програмата да завърши, ние настроихме любимия си IDA disassembler на setup.exe. Първото нещо, което хваща окото ви, е липсата на CheckValidLicense в списъка с импортирани функции. Може би тя по някакъв начин стартира файла ChkLic.exe? Нека се опитаме да намерим подходящата връзка сред автоматично разпознатите низове: "~View aNames", "ChkLic"... да, низът "Chklic.exe" изобщо не е тук, но "Chklic.dll" е намерен. Да, разбирам, това означава, че библиотеката ChkLic се зарежда чрез изрично свързване чрез LoadLibrary. Следването на кръстосаната препратка потвърждава това:

    Text:0040175D push offset aChklic_dll; lpLibFileName

    Text:00401762 повикване ds:LoadLibraryA

    Текст:00401762 ; заредете ChkLic.dll ^^^^^^^^^^^^^^^^^^

    Текст:00401762 ;

    Текст:00401768 mov esi,eax

    Text:0040176A натискане на отместване a_checkvalidlic; lpProcName

    Текст:0040176F натиснете esi ; hModule

    Text:00401770 call ds:GetProcAddress

    Текст:00401770 ; вземете адреса на функцията CheckValidLicense

    Текст:00401770 ;

    Текст:00401776 cmp esi, ebx

    Текст: 00401778 jz loc_40192E

    Текст:00401778 ; ако няма такава библиотека, излезте от инсталатора

    Текст:00401778 ;

    Текст:0040177E cmp eax, ebx

    Текст: 00401780 jz loc_40192E

    Текст:00401780 ; ако в библиотеката няма такава функция, излезте от инсталацията

    Текст:00401780 ;

    Текст:00401786 натиснете ebx

    Текст:00401787 обадете се на eax

    Текст:00401787 ; извикайте функцията CheckValidLicense

    Текст:00401787 ;

    Текст:00401789 тест eax, eax

    Текст: 0040178B jnz loc_4019A3

Текст:0040178 ; ако функцията е върнала различна от нула, тогава излезте от инсталатора

Невероятно, но тази ужасно примитивна защита е изградена точно така! Освен това половинметровият файл ChkLic.exe изобщо не е необходим! И защо си струваше да го мъкнем от интернет? Между другото, ако решите да запазите дистрибуцията на компилатора (внимание: не казах "разпространявам"!), След това, за да спестите дисково пространство, можете да изтриете ChkLic.ChkLic.dll, който експортира функцията stdcall CheckValidLicence на формата: int CheckValidLicence(int some_flag) ( return 0;)

И така, докато обсъждахме всичко това, инсталаторът завърши инсталирането на компилатора и успешно завърши работата си. Независимо дали е интересно дали компилаторът ще се стартира или всичко най-интересно едва започва? Ние трескаво слизаме по разклонената йерархия на вложени папки, намираме icl.exe, който, както се очаква, се намира в директорията bin, щракваме и ... Компилаторът естествено не стартира, като се позовава на факта, че "icl: грешка: не можа да получи лиценз FLEX lm", без който не може да продължи работата си.

Оказва се, че интел са сложили многостепенна защита и първото ниво се оказа груба защита срещу глупаци. Добре! Ние приемаме това предизвикателство и, въз основа на нашия предишен опит, автоматично търсим файла LMGR*.DLL в директорията на компилатора. Безполезен! Този път тук няма такъв файл, но се оказва, че icl.exe е натрупал много тегло, надхвърляйки знака от шестстотин килобайта ... Спри! Но разработчиците на компилатора свързаха ли този FLEX lm със статична връзка? Гледаме: в Intel C++ 5.0 сумата от размерите на lmgr327.dll и icl.exe беше 598 KB, а сега само icl.exe отнема 684 KB. След коригиране на естественото сенилно "затлъстяване", числата се сближават много добре. И така, все пак FLEX lm! Ох ох! Но сега, без символичните имена на функции, ще бъде много по-трудно да се прекъсне защитата ... Въпреки това, нека не се паникьосваме преди време! Нека помислим спокойно! Малко вероятно е екипът за разработка да е пренаписал напълно целия код, който взаимодейства с тази защита на "обвивката". Най-вероятно неговото "подобряване" чрез просто промяна на типа на оформлението приключи. И ако е така, тогава шансовете за хакване на програмата все още са големи!

Имайки предвид, че последният път, когато кодът за сигурност е в основни функции, ние, след като определихме неговия адрес, просто зададохме точка на прекъсване и след като изчакахме изскачането на дебъгера, глупаво проследихме кода, последователно поглеждайки или към дебъгера, или към прозореца за извеждане на програмата: появи ли се злоупотребително съобщение? В същото време отбелязваме всички условни скокове, които срещаме, на отделен лист хартия (или го оставяме настрана в собствената си памет, ако желаете), като не забравяме да посочим дали всеки условен скок е извършен или не. .. Спри се! Побъбрихме нещо, но обидното съобщение вече изскочи! ОК добре! Да видим какъв условен преход съответства на това. Нашите записи показват, че последният срещнат клон е условният клон JNZ, разположен на адрес 0401075h и "реагиращ" на резултата, върнат от sub_404C0E:

  • Текст:0040107F loc_40107F: ; КОД XREF: _main+75^j

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

    Текст:00401084 mov edx, 21ч

    Текст:00401089 обадете се на sub_404C0E

    Текст:0040108E тест eax, eax

    Текст:00401090 jnz кратко loc_40109A

    Очевидно sub_404C0E е същата защитна процедура, която проверява лиценза за неговото присъствие. Как да я измамим? Е, има много опции... Първо, можете замислено и стриктно да анализирате съдържанието на sub_404C0E, за да разберете: какво точно и как точно проверява. Второ, можете просто да замените JNZ short loc_40107F с JZ short loc_40107F или дори NOP, NOP. Трето, командата за проверка на върнатия резултат TEST EAX, EAX може да се превърне в команда за настройка на нула: XOR EAX, EAX. Четвърто, самият sub_404C0E може да бъде коригиран, така че винаги да връща нула. Не знам за вас, но аз най-много харесах метод номер три. Променяме два байта и стартираме компилатора. Ако няма други проверки за неговата "лицензност" в защитата, тогава програмата ще работи и съответно обратното. (Както си спомняме, в петата версия имаше две такива проверки). Удивително е, но компилаторът вече не псува и работи!!! Всъщност, както се очакваше, неговите разработчици изобщо не засилиха защитата, а напротив, дори я отслабиха! Крис Касперски



  • Зареждане...
    Връх