Intel хөрвүүлэгчийн найм дахь хувилбар. Microsoft Windows платформд зориулсан хөрвүүлэгч

Чи боол биш!
Элит бүлгийн хүүхдүүдэд зориулсан хаалттай сургалт: "Дэлхийн жинхэнэ зохицуулалт".
http://noslave.org

Википедиа, чөлөөт нэвтэрхий толь

Intel C++ хөрвүүлэгч
170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).
Төрөл
Зохиогч

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

Хөгжүүлэгч
Хөгжүүлэгчид

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

Бичсэн

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

Интерфэйс

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

үйлдлийн систем
Интерфейсийн хэлүүд

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

Анхны хэвлэл

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

Техник хангамжийн платформ
Хамгийн сүүлийн үеийн хувилбар
нэр дэвшигчийг чөлөөлөх

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

бета хувилбар

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

альфа хувилбар

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

Туршилтын хувилбар

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

Унших боломжтой файлын форматууд

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

Үүсгэсэн файлын форматууд

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

муж

170-р мөрөнд Module:Wikidata дээрх Луа алдаа: "wikibase" талбарыг индексжүүлэх оролдлого (тэг утга).

Тусгай зөвшөөрөл

Гол онцлог:

  • SSE , SSE2 , SSE3 , SSE4-ийн векторжуулалт

Хөрвүүлэгч нь зэрэгцээ програм бичих OpenMP 3.0 стандартыг дэмждэг. Энэ нь мөн OpenMP-ийн Cluster OpenMP нэртэй өөрчлөлтийг агуулсан бөгөөд үүний тусламжтайгаар та OpenMP-ийн дагуу бичсэн програмуудыг MPI ашиглан кластерууд дээр ажиллуулж болно.

Intel C++ Compiler нь Edison Design Group-ийн урд талын хэсгийг (эмхэтгэж буй програмыг задлан шинжлэх хөрвүүлэгчийн хэсэг) ашигладаг. Үүнтэй ижил урд хэсгийг SGI MIPSpro, Comeau C++, Portland Group хөрвүүлэгчид ашигладаг.

Энэхүү хөрвүүлэгч нь SPEC CPU-ийн жишиг үзүүлэлтүүдийг эмхэтгэхийн тулд өргөн хэрэглэгддэг.

Intel-ээс хөрвүүлэгч агуулсан 4 цуврал бүтээгдэхүүн байдаг:

  • Intel C++ Compiler Professional Edition
  • Intel Cluster Toolkit (Хэвлэгчийн хувилбар)

Хөрвүүлэгчийн Линукс хувилбарын сул тал нь C хэлний GNU өргөтгөлүүдтэй хэсэгчлэн үл нийцэх (GCC хөрвүүлэгчээр дэмжигддэг) бөгөөд энэ нь зарим програмыг хөрвүүлэхэд асуудал үүсгэдэг.

Туршилтын хувилбарууд

Хөрвүүлэгчийн дараах туршилтын хувилбаруудыг нийтлэв.

  • 2007 оны 9-р сарын 17-ны Intel STM Compiler Prototype Edition. Програм хангамжийн гүйлгээний санах ой (STM) дэмжлэг. Зөвхөн Linux болон Windows-д зориулагдсан, IA-32 (x86 процессорууд);
  • C/C++ 0.3-д зориулсан Intel-ийн зэрэгцээ цуглуулгууд, 2008 оны 9-р сар. Зэрэгцээ C++ программ бичихэд туслах механизмуудыг агуулсан.

Гол тугнууд

Windows Линукс, Mac OSX Тодорхойлолт
/од -O0 Оновчлолыг идэвхгүй болгох
/O1 -О1 Гүйцэтгэх боломжтой файлын хэмжээг багасгахын тулд оновчтой болгох
/O2 -O2 Хурдны хувьд оновчтой болгох. Зарим оновчлолыг оруулсан болно
/O3 -O3 O2-аас бүх оновчлолыг идэвхжүүлнэ. Мөн эрчимтэй давталтын оновчлолыг гүйцэтгэнэ
/Ойп -Өө Файл бүрийн процедур хоорондын оновчлолыг идэвхжүүлэх
/Oipo -Ойпо Глобал процедур хоорондын оновчлолыг идэвхжүүлэх
/QxO -хО Аливаа компанийн үйлдвэрлэсэн процессоруудад SSE3, SSE2 болон SSE өргөтгөлүүдийг ашиглахыг зөвшөөрөх
/хурдан - хурдан "Түргэн горим". Windows дээрх "/O3 /Qipo /QxHost /no-prec-div" болон Линукс дээрх "-O3 -ipo -static -xHOST -no-prec-div"-тэй тэнцүү. "-xHOST" туг нь хөрвүүлэгч ажиллаж байгаа процессорыг оновчтой болгох гэсэн үг гэдгийг анхаарна уу.
/Qprof-gen -проф_ген Гүйцэтгэлийн профайлыг угсрах програмын хэрэглүүртэй хувилбарыг үүсгэ
/Qprof-хэрэглэх -prof_use prof_gen тугаар эмхэтгэсэн программын нээлтийн профайлын мэдээллийг ашиглаарай.

"Intel C++ хөрвүүлэгч" нийтлэлд сэтгэгдэл бичээрэй

Тэмдэглэл

бас үзнэ үү

Холбоосууд

Intel C++ хөрвүүлэгчийг тодорхойлсон ишлэл

Гэсэн хэдий ч тэр Цагаан шидтэнг сүүлчийн удаа харахын тулд буцаж ирэв ... Түүний нөхөр, хэзээ ч мартаж чадахгүй байсан хамгийн үнэнч найз. Зүрх сэтгэлдээ тэр түүнийг уучилсан. Гэвч тэрээр түүнд Магдалын өршөөлийг авчирч чадаагүйдээ харамсаж байна .... Тэгэхээр, Исидора, таны харж байгаагаар "уучлал" хэмээх Христийн шашны агуу үлгэр нь гэнэн итгэгчдийн хувьд ямар ч зүйлийг хийхийг зөвшөөрөх гэсэн хүүхэд шиг худал зүйл юм. Хилэнцүүд, тэд юу ч хийсэн, эцэст нь уучлагдах болно гэдгийг мэддэг. Гэхдээ та үнэхээр өршөөгдөх ёстой зүйлийг л уучилж чадна. Хүн ямар ч муу үйлдсэнийхээ төлөө хариулах ёстой гэдгээ ойлгох ёстой... Мөн ямар нэгэн нууцлаг Бурханы өмнө биш, харин өөрийгөө хэрцгийгээр зовоодог. Магдалена Владикаг маш их хүндэлж, чин сэтгэлээсээ хайрладаг байсан ч уучлаагүй. Яг л тэр Радомирын аймшигт үхлийн төлөө бид бүгдийг уучилж чадаагүй шиг. Эцсийн эцэст, ТЭР нь хамгийн сайн ойлгосон - бид түүнд тусалж, түүнийг харгис хэрцгий үхлээс аварч чадна ... Гэхдээ бид хүсээгүй. Цагаан шидтэний гэм бурууг дэндүү харгис гэж үзээд түүнийг хоромхон зуур ч мартсангүй, энэ гэм буруутайгаа хамт амьдрахаар орхив... Тэр түүнд амархан уучлал үзүүлэхийг хүссэнгүй. Бид түүнийг дахиж хэзээ ч хараагүй. Тэдний хүүхдүүдийг хэзээ ч харж байгаагүй. Ариун сүмийнхээ баатруудын нэг болох манай илбэчин Магдалена бидэн рүү буцах хүсэлтийнхээ хариуг Их Эзэнд дамжуулж: "Нар нэг өдөрт хоёр удаа манддаггүй ... Таны ертөнцийн баяр баясгалан (Радомир) хэзээ ч гарахгүй. Чамдаа эргэж ирээрэй, яг л би чам руу буцахгүй, би ч гэсэн... ИТГЭЛ, ҮНЭНЭЭ олсон, тэд АМЬД, чинийх ҮХСЭН... Хөвгүүдээ гашуудал - тэд чамд хайртай байсан. Тэдний үхлийг би амьд байгаа цагт чинь хэзээ ч уучлахгүй. Мөн таны гэм буруу чамтай хамт үлдэх болтугай. Хэзээ нэгэн цагт тэр танд гэрэл, уучлалыг авчрах байх ... Гэхдээ надаас биш. Магус Жонны толгойг ижил шалтгаанаар Метеора руу авчирсангүй - Ариун сүмийн баатруудын хэн нь ч бидэн рүү буцаж ирэхийг хүсээгүй ... Бид тэднийг ойлгохыг хүсээгүй олон хүнийг нэг бус удаа алдсан тул бид тэднийг алдсан. Хохирогчдыг маань хүлээж аваарай ... Яг чам шиг хэн бэ - тэд биднийг буруушааж орхив.
Би толгой эргэх шиг боллоо!.. Цангаж, мэдлэгээр мөнхийн өлсгөлөнгөө дарж, Умардын өгөөмрөөр өгсөн гайхалтай мэдээллийн урсгалыг шунахайн сэтгэлээр шингээж авлаа... Тэгээд би илүү ихийг хүсч байна!.. Би бүх зүйлийг эцсээ хүртэл мэдэхийг хүссэн. . Өвдөлт, золгүй явдалд шатсан цөлийн цэнгэг усны амьсгал байв! Тэгээд би хангалттай ууж чадаагүй ...
Надад мянган асуулт байна! Гэхдээ цаг хугацаа үлдсэнгүй ... Би яах ёстой вэ, Север? ..
- Асуу, Исидора!.. Асуу, би чамд хариулахыг хичээх болно...
-Сэвер, надад хэлээч, яагаад энэ өгүүллэгт ижил төстэй үйл явдлуудтай нийлсэн амьдралын хоёр түүхийг холбож, нэг хүний ​​амьдрал мэт харуулсан юм шиг санагдаж байна вэ? Эсвэл миний буруу байна уу?
- Чиний зөв, Исидора. Би түрүүн хэлсэнчлэн хүн төрөлхтний хуурамч түүхийг бүтээсэн “энэ ертөнцийн хүчирхэг хүмүүс” нэг жил хагасын өмнө амьдарч байсан еврей зөнч Иошуагийн харь гаригийн амьдралыг Христийн жинхэнэ амьдралд “өмссөн”. (Хойд зүгийн түүхээс хойш). Зөвхөн өөрөө ч биш, гэр бүл, хамаатан садан, найз нөхөд, найз нөхөд, дагалдагчид нь. Эцсийн эцэст, энэ бол бошиглогч Иошуагийн эхнэр, еврей Мариа Марта, ах Лазар, ээжийнх нь эгч Мария Якоби болон бусад хүмүүс Радомир, Магдалена хоёрын ойролцоо байгаагүй юм. Тэдний хажууд Паул, Матай, Петр, Лук болон бусад "элч нар" байхгүй байсан шиг ...
Энэ бол нэг хагас мянган жилийн өмнө Бошиглогч Иошуагийн гэр бүл байсан бөгөөд тэр үед Массалиа нь Грекийн Массалиа (одоогийн Марсель) хот байсан тул Прованс руу (тэр үед Галл (Гаул Галли) гэж нэрлэдэг байсан) нүүсэн юм. Европ, Азийг холбосон "гарц" байсан бөгөөд энэ нь бүх "хавчлагдсан" хүмүүсийн хавчлага, золгүй байдлаас зайлсхийх хамгийн хялбар арга байв.

Танилцуулга 2003 оны сүүлээр Intel компани хөрвүүлэгч цуглуулгынхаа 8.0 хувилбарыг танилцуулсан. Шинэ хөрвүүлэгч нь сервер, ширээний компьютер дээр ажиллаж байгаа програмуудын гүйцэтгэлийг сайжруулах зорилготой юм хөдөлгөөнт системүүд(зөөврийн компьютер, гар утас болон PDA) дээр суурилсан Intel процессорууд. Энэхүү бүтээгдэхүүнийг Нижний Новгородын Intel програм хангамж хөгжүүлэх төвийн ажилтнууд болон Саровын Intel-ийн мэргэжилтнүүдийн идэвхтэй оролцоотойгоор бүтээснийг тэмдэглэхэд таатай байна.

Шинэ цувралд Windows болон Linux-д зориулсан C++ болон Fortran-д зориулсан Intel хөрвүүлэгч, мөн Windows CE .NET-д зориулсан C++-д зориулсан Intel хөрвүүлэгч багтсан болно. Эмхэтгэгчид нь Intel Itanium 2, Intel Xeon, Intel Pentium 4, гар утас болон PDA-д зориулсан Intel Personal Internet Client Architecture процессорууд, гар утасны компьютерт зориулсан Intel Pentium M процессор (Intel Centrino технологийн бүрэлдэхүүн хэсэг) зэрэг Intel процессорууд дээр суурилсан системийг хөрвүүлэгчид чиглүүлдэг. гар утсанд). PC).

Windows-д зориулсан Intel Visual Fortran Compiler нь өндөр хүчин чадалтай тооцоолох шинэ үеийн эмхэтгэлийн технологиор хангадаг. Энэ нь Compaq Visual Fortran (CVF) хэлний функцийг Intel-ийн эмхэтгэх, код үүсгэх оновчлолын технологийн ачаар гүйцэтгэлийн сайжруулалттай хослуулж, зөөвөрлөх ажлыг хялбаршуулдаг. эх код, CVF-тэй хамтран Intel Visual Fortran орчинд хөгжүүлсэн. Энэхүү хөрвүүлэгч нь Intel Itanium процессорын гэр бүлд суурилсан 32 битийн Intel систем болон системүүдийн аль алинд нь CVF функцийг хэрэгжүүлсэн анхных юм. Windows орчин. Нэмж дурдахад энэхүү хөрвүүлэгч нь 32 битийн Intel процессор болон Intel Itanium процессорын гэр бүлд суурилсан Линукс систем дээр CVF хэлний функцийг хэрэгжүүлэх боломжийг олгодог. 2004 онд энэхүү хөрвүүлэгчийн өргөтгөсөн хувилбар болох Windows-д зориулсан Intel Visual Fortran Compiler Professional Edition хөрвүүлэгчийг гаргахаар төлөвлөж байгаа бөгөөд үүнд Visual Numerics, Inc-ийн боловсруулсан IMSL Fortran 5.0 номын сан багтах болно.


"Шинэ хөрвүүлэгчид нь график болон видео гүйцэтгэлийг сайжруулах шинэ командуудыг өгдөг Prescott код нэртэй Intel-ийн удахгүй гарах процессоруудыг дэмждэг. Мөн бусад гүйцэтгэлийг сайжруулдаг. Тэд мөн дэмждэг. шинэ технологи Mobile MMX(tm) нь гар утас болон PDA-д зориулсан график, дуу, видео програмуудын гүйцэтгэлийг мөн адил сайжруулдаг гэж Нижний Новгород дахь Intel програм хангамж хөгжүүлэх төвийн захирал Алексей Одиноков хэлэв. - Эдгээр хөрвүүлэгчид програм хөгжүүлэгчдэд шинэ програм бүтээх нэг багц хэрэгслээр хангадаг утасгүй сүлжээнүүд Intel архитектур дээр суурилсан. Intel-ийн шинэ хөрвүүлэгчид мөн Intel-ийн Hyper-Threading технологи болон удирдамжийн хэрэглээг тодорхойлдог OpenMP 2.0 салбарын тодорхойлолтыг дэмждэг. өндөр түвшинпрограмууд дахь зааврын урсгалыг хянах".

Хөрвүүлэгчид багтсан шинэ хэрэгслүүдийн дунд Intel Code Coverage болон Intel Test Prioritization хэрэгслүүд орно. Эдгээр хэрэгслүүд хамтдаа туршилтын процессыг сайжруулснаар програмын хөгжлийг хурдасгаж, хэрэглээний чанарыг сайжруулахад тусалдаг. програм хангамж.

Кодын хамрах хэрэгсэл нь програмыг туршихдаа програмын логик ашиглалт болон програмын эх кодонд ашигласан хэсгүүдийн байршлын талаарх бүрэн мэдээллийг өгдөг. Хэрэв програмд ​​өөрчлөлт оруулсан эсвэл энэ туршилт нь програмын хөгжүүлэгчийн сонирхсон хэсгийг шалгахыг зөвшөөрөхгүй бол Туршилтын тэргүүлэх чиглэлийн хэрэгсэл нь сонгосон хэсгийн ажиллагааг шалгах боломжийг танд олгоно. програмын код.

Intel-ийн шинэ хөрвүүлэгчид 399 доллараас 1499 долларын хооронд янз бүрийн тохиргоотой. Тэдгээрийг өнөөдөр Intel корпорациас эсвэл дэлхийн өнцөг булан бүрт байгаа борлуулагчдаас худалдаж авах боломжтой бөгөөд тэдгээрийн жагсаалтыг сайт дээр байрлуулсан болно. http://www.intel.com/software/products/reseller.htm#Russia.

Prescott процессоруудын дэмжлэг

Хөрвүүлэгчийн найм дахь хувилбарт Intel Pentium 4 (Prescott) процессорыг дэмжих нь дараах байдалтай байна.

1. SSE3 командуудыг дэмжих (эсвэл PNI, Prescott New Instructions). Энд онцлох гурван арга бий:

А. Ассемблерийн оруулга (Inline угсралт). Жишээлбэл, хөрвүүлэгч _asm(addsubpd xmm0, xmm1) SSE3 командын дараах хэрэглээг таних болно. Тиймээс доод түвшний оновчлолыг сонирхож буй хэрэглэгчид ассемблер командуудад шууд хандах боломжтой.

б. C/C++ хөрвүүлэгчид ассемблерийн оруулга ашиглахаас илүү өндөр түвшний шинэ зааварчилгааг авах боломжтой. Тухайлбал, суурилагдсан функцээр дамжуулан (дотоод функцууд):

Суулгасан функцууд

суурилуулсан функцҮүсгэсэн тушаал
_мм_addsub_psНэмэлт нэмэлтүүд
_мм_хадд_psХадпс
_mm_hsub_psMsubps
_mm_moveldup_psMovsldup
_mm_movehdup_psМовшдуп
_mm_addsub_pdAddsubpd
_мм_хадд_pdХаддпд
_mm_hsub_pdhsubpd
_mm_loaddup_pdmovddup xmm, m64
_мм_шилжсэн_pdmovddup reg, reg
_mm_lddqu_si128Lddqu

Хүснэгтэнд SSE3 багцаас суулгасан функцууд болон холбогдох ассемблерийн зааврыг харуулав. MMX\SSE\SSE2 багцын командуудад ижил дэмжлэг байдаг. Энэ нь программистад ассемблер хэлний програмчлалыг ашиглахгүйгээр доод түвшний кодын оновчлолыг хийх боломжийг олгодог: хөрвүүлэгч өөрөө суулгасан функцуудыг процессорын холбогдох зааварт буулгах ("e" зураглал) болон регистрүүдийн оновчтой ашиглалтыг хариуцдаг. шинэ зааврын багцыг үр дүнтэй ашиглах алгоритмыг бий болгоход анхаарлаа төвлөрүүл.

В. Хөрвүүлэгчийн шинэ командуудыг автоматаар үүсгэх. Өмнөх хоёр арга нь програмист шинэ командуудыг ашиглах явдал юм. Гэхдээ хөрвүүлэгч нь C/C++ болон Fortran кодын SSE3 багцаас шинэ зааварчилгааг автоматаар үүсгэх боломжтой (зохих сонголтуудыг ашиглан - доорх 3-р хэсгийг үзнэ үү). Жишээлбэл, оновчтой тохируулаагүй ачаалах тушаал (lddqu), энэ нь танд 40% хүртэл гүйцэтгэлийн өсөлтийг авах боломжийг олгодог (жишээлбэл, видео болон аудио кодчилолд). SSE3 багцын бусад командууд нь 3D графикийн даалгавар эсвэл нарийн төвөгтэй тоо ашиглан тооцоолох даалгавруудыг ихээхэн хурдасгах боломжийг танд олгоно. Жишээлбэл, SPEC CPU2000 FP багцын 168.wupwise програмын хувьд SSE3 зааврыг автоматаар үүсгэснээр хурдассан хурд ~25% байсныг доорх 3.1-р хэсгийн графикаас харж болно. Энэ програмын гүйцэтгэл нь комплекс тооны арифметикийн хурдаас ихээхэн хамаардаг.

2. Прескотт процессорын бичил архитектурын давуу талыг ашиглах. Код үүсгэх үед хөрвүүлэгч нь шинэ процессорын бичил архитектурын өөрчлөлтийг харгалзан үздэг. Жишээлбэл, зарим үйлдлүүд (бүхэл тоо шилжүүлэх, бүхэл тоог үржүүлэх, эсвэл SSE2 дахь өөр өөр хөвөгч цэгийн форматуудын хооронд тоо хөрвүүлэх гэх мэт) өмнөх хувилбаруудтай харьцуулахад шинэ процессор дээр илүү хурдан байдаг (жишээ нь, бүхэл тоо шилжүүлэх нь одоо нэг процессорын циклийг дөрвөн процессор хийдэг. өмнөх хувилбар).Intel Pentium 4 процессор). Ийм командыг илүү эрчимтэй ашиглах нь програмуудыг ихээхэн хурдасгах боломжийг олгодог.
Микроархитектурын өөрчлөлтийн өөр нэг жишээ бол дэлгүүр дамжуулах механизмыг сайжруулсан (урьд нь санах ойд хадгалагдсан өгөгдлийг хурдан ачаалах); Бодит хадгаламж нь кэш санах ойд ч явагдахгүй, харин завсрын хадгалах буферт явагддаг бөгөөд энэ нь өгөгдөлд маш хурдан нэвтрэх боломжийг олгодог. Архитектурын ийм онцлог нь жишээлбэл, програмын кодын автомат векторжуулалтыг илүү түрэмгий хийх боломжийг олгодог.
Хөрвүүлэгч нь эхний болон хоёрдугаар түвшний кэш санах ойн хэмжээг ихэсгэдэг.

3. Hyper-Threading технологийн дэмжлэгийг сайжруулсан. Энэ зүйл нь өмнөхтэй нь холбоотой байж магадгүй юм - бичил архитектурын өөрчлөлтүүд, тэдгээрийг эмхэтгэгчид ашиглах. Жишээлбэл, OpenMP салбарын тодорхойлолтыг дэмждэг ажиллах цагийн номын санг шинэ процессор дээр ажиллуулахаар оновчтой болгосон.

Гүйцэтгэл

Хөрвүүлэгчийг ашиглах нь Intel процессорын архитектурын давуу талыг ашиглах хялбар бөгөөд үр дүнтэй арга юм. Доор, хөрвүүлэгчийг ашиглах хоёр аргыг нөхцөлт (маш) онцлон тэмдэглэв: a) програмуудыг дахин эмхэтгэх. боломжит өөрчлөлтхөрвүүлэгчийн тохиргоо, б) хөрвүүлэгчийн тохиргоо болон эх бичвэрийн аль алиныг нь өөрчилснөөр дахин эмхэтгэх, түүнчлэн байнгын оновчлолд зориулж хөрвүүлэгчийн оношилгоог ашиглах болон бусад боломжит ашиглах боломжтой. програм хангамжийн хэрэгслүүд(жишээлбэл, профайлчид).


1.1 Хөрвүүлэгчийн тохиргоог дахин эмхэтгэх, өөрчлөх замаар программуудыг оновчтой болгох


Ихэнхдээ шинэ оновчтой хөрвүүлэгч рүү шилжих эхний алхам бол үүнийг анхдагч тохиргоотой ашиглах явдал юм. Дараагийн логик алхам бол илүү түрэмгий оновчтой болгох сонголтуудыг ашиглах явдал юм. 1, 2, 3, 4-р зурагт Intel хөрвүүлэгчийн 8.0 хувилбар руу шилжих нь бусад салбарт тэргүүлэгч бүтээгдэхүүнүүдтэй харьцуулахад үр нөлөөг харуулж байна (-O2 - хөрвүүлэгчийн анхдагч тохиргоо, суурь - тохиргоо хамгийн их гүйцэтгэл). Харьцуулалтыг 32 ба 64 битийн Intel архитектурууд дээр хийсэн. SPEC CPU2000 программуудыг туршилтын багц болгон ашигладаг.


Зураг 1




Зураг 2




Зураг 3




Зураг 4


Зарим сонголтуудыг доор жагсаав (цаашид Windows үйлдлийн системийн гэр бүлийн сонголтууд; Linux үйлдлийн системийн гэр бүлийн хувьд ижил нөлөөтэй сонголтууд байдаг боловч нэр нь өөр байж болно; жишээлбэл, Windows-д зориулсан -Od эсвэл QxK нь Linux-д зориулсан -O0 эсвэл -xK-тэй төстэй нөлөө, илүү их дэлгэрэнгүй мэдээлэл Intel хөрвүүлэгчээр дэмжигдсэн хөрвүүлэгчийн гарын авлагаас олж болно.


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

Процедур хоорондын оновчлол: -Qip (нэг файл дотор) болон -Qipo (хэд хэдэн эсвэл бүх төслийн файл дотор). Байнга хэрэглэгддэг кодыг шугамаар солих (функц/процедурыг дуудах зардлыг бууруулах) гэх мэт оновчлолуудыг багтаасан болно. Оновчлолын бусад үе шатуудын мэдээллийг төлөөлдөг - жишээлбэл, давталтын дээд хязгаарын тухай мэдээлэл (хэрэв энэ нь нэг файлд тодорхойлогдсон эмхэтгэх хугацааны тогтмол бөгөөд олон файлд ашиглагддаг бол) эсвэл санах ой дахь өгөгдлийн зэрэгцүүлэх тухай мэдээлэл (олон MMX) \SSE\SSE2\SSE3 командууд операндуудыг санах ойд 8 эсвэл 16 байтын хязгаарт зэрэгцүүлсэн тохиолдолд илүү хурдан ажиллана). Санах ойг хуваарилах процедурын дүн шинжилгээ (төслийн файлуудын аль нэгэнд хэрэгжсэн/дуудагдсан) нь энэ санах ойг ашигладаг функц/процедурууд руу шилждэг (энэ нь хөрвүүлэгчид өгөгдлийг санах ойд зөв тохируулаагүй гэсэн консерватив таамаглалаас татгалзахад тусална; нэмэлт мэдээлэл байхгүй үед таамаглал нь консерватив байх ёстой). Хоёрдмол утгагүй, өгөгдлийг өөрчилсөн дүн шинжилгээ нь өөр нэг жишээ болж чадна: нэмэлт мэдээлэл байхгүй, огтлолцол байхгүй гэдгийг нотлох боломжгүй тохиолдолд хөрвүүлэгч нь огтлолцол байдаг гэсэн консерватив таамаглалаас гардаг. Ийм шийдвэр нь жишээлбэл, IA-32 дээрх автомат векторжуулалт эсвэл IA-64 дээрх програм хангамжийн дамжуулах хоолой (програм хангамжийн дамжуулах хоолой эсвэл SWP) гэх мэт оновчлолын чанарт сөргөөр нөлөөлж болно. Процедур хоорондын оновчлол нь санах ойн огтлолцол байгаа эсэхийг шинжлэхэд тусална.

Профайлыг оновчтой болгох: Гурван үе шаттай. 1) -Qprof_gen сонголтыг ашиглан багажжсан код үүсгэх. 2) үүссэн кодыг төлөөллийн өгөгдөл дээр ажиллуулж, ажиллаж байх үед кодын гүйцэтгэлийн янз бүрийн шинж чанаруудын талаар мэдээлэл цуглуулдаг (жишээлбэл, шилжилтийн магадлал эсвэл давталтын давталтын тооны ердийн утга). 3) -Qprof_use сонголтоор дахин эмхэтгэх бөгөөд энэ нь хөрвүүлэгч өмнөх алхамд цуглуулсан мэдээллийг ашиглахыг баталгаажуулдаг. Тиймээс хөрвүүлэгч нь зөвхөн програмын чухал шинж чанаруудын статик тооцоог төдийгүй програмыг бодитоор ажиллуулах явцад олж авсан өгөгдлийг ашиглах чадвартай байдаг. Энэ нь тодорхой оновчлолын дараагийн сонголтод тусалж чадна (жишээлбэл, аль салбарыг ямар давтамжтайгаар гүйцэтгэсэн тухай мэдээлэлд үндэслэн програмын янз бүрийн салбаруудын санах ойд илүү үр дүнтэй зохион байгуулалт хийх; эсвэл мэдээлэлд үндэслэн давталт дээр оновчлол хийх гэх мэт). доторх давталтын ердийн тоо). Профайлыг оновчлох нь програмын ирээдүйн хэрэглээний хамгийн энгийн тохиолдлуудыг сайн харуулсан жижиг боловч төлөөлөх өгөгдлийн багцыг (2-р алхамын хувьд) сонгох боломжтой үед ялангуяа ашигтай байдаг. Зарим сэдвээр ийм төлөөлөгчийн багцыг сонгох нь нэлээд боломжтой юм. Жишээлбэл, DBMS хөгжүүлэгчид профайлын оновчлолыг ашигладаг.

Дээр дурдсан оновчлолууд нь ерөнхий төрлийнх, өөрөөр хэлбэл. үүсгэсэн код нь гэр бүлийн бүх өөр өөр процессорууд дээр ажиллах болно (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 командуудыг ашиглах, microarchitecture specifics) ), QxP (Prescott; SSE, SSE2, SSE3 командуудыг ашиглах, микроархитектурын онцлог). Энэ тохиолдолд эдгээр тохируулгуудыг ашиглан үүсгэсэн код нь процессорын гэр бүлийн бусад төлөөлөгчдөд ажиллахгүй байж болно (жишээлбэл, -QxW код нь Intel Pentium-III дээр суурилсан систем дээр хэрэгжсэн тохиолдолд хүчингүй тушаалыг гүйцэтгэхэд хүргэж болно. процессор). Эсвэл хамгийн их үр ашигтай ажиллахгүй (жишээлбэл, бичил архитектурын ялгаатай байдлаас шалтгаалан Pentium 4 процессор дээрх -QxB код). Эдгээр сонголтуудын тусламжтайгаар тодорхой процессорын зааварчилгааг ашиглан оновчтой ажиллах цагийн санг ашиглах боломжтой. Зорилтот процессор дээр код бодитоор хэрэгжиж байгаа эсэхийг хянахын тулд диспетчерийн механизм (cpu-dispatch) хэрэгждэг: програмыг гүйцэтгэх явцад процессорыг шалгах. Янз бүрийн нөхцөлд энэ механизмыг идэвхжүүлж болно, үгүй ​​ч болно. -Qax(KWNP) сонголтын хувилбарыг ашигласан тохиолдолд Dispatch-ийг үргэлж ашигладаг. Энэ тохиолдолд кодын хоёр хувилбар үүсдэг: тодорхой процессор болон "ерөнхий" (ерөнхий) оновчтой хувилбарууд, сонголт нь програмыг гүйцэтгэх явцад тохиолддог. Тиймээс кодын хэмжээг нэмэгдүүлснээр шугамын бүх процессор дээр програмын гүйцэтгэл, зорилтот процессор дээр оновчтой гүйцэтгэлд хүрэх боломжтой. Өөр нэг сонголт бол шугамын өмнөх төлөөлөгчийн кодын оновчлолыг ашиглах бөгөөд энэ кодыг энэ болон дараагийн процессоруудад ашиглах явдал юм. Жишээлбэл, -QxN код нь Northwood болон Prescott цөмтэй Pentium 4 дээр ажиллах боломжтой. Кодын хэмжээ нэмэгдэхгүй. Энэ аргын тусламжтайгаар та Нортвүүд дээр оновчтой гүйцэтгэлтэй Prescott процессортой систем дээр сайн боловч оновчтой бус гүйцэтгэлийг олж авах боломжтой (Учир нь SSE3 ашиглагдаагүй бөгөөд бичил архитектурын ялгааг тооцдоггүй). Үүнтэй төстэй сонголтууд IA-64 архитектурын процессоруудад бас байдаг. Асаалттай Энэ мөчтэдгээрийн хоёр нь байдаг: -G1 (Itanium) ба -G2 (Itanium 2; анхдагч сонголт).

Доорх график (Зураг 5) нь дээр дурдсан зарим оновчлолыг (тухайлбал -O3 -Qipo -Qprof_use -Qx(N,P)) Prescott процессор дээр анхдагч тохиргоотой харьцуулахад ашиглах хурдыг (нэг дээр суурилсан - хурдасгахгүй) харуулж байна. (-O2). -QxP-ийг ашиглах нь зарим тохиолдолд -QxN-тэй харьцуулахад хурдыг нэмэгдүүлэхэд тусалдаг. Өмнөх хэсэгт дурдсан 168.wupwise програмд ​​хамгийн их хурдыг олж авсан (SSE3 зааврыг ашиглан нарийн төвөгтэй арифметикийг эрчимтэй оновчтой болгосны улмаас).


Зураг 5


Доорх 6-р зурагт кодын хурдны харьцааг (хугацаагаар) харуулав оновчтой тохиргоо Pentium 4 болон Itanium 2 процессорууд дээрх бүрэн оновчгүй кодтой (-Od) харьцуулбал Itanium 2 нь оновчлолын чанараас илүү хамааралтай болохыг харж болно. Энэ нь ялангуяа хөвөгч цэгийн (FP) тооцоололд тод илэрдэг бөгөөд харьцаа нь ойролцоогоор 36 дахин их байдаг. Хөвөгч цэгийн тооцоо нь хүчтэй цэг IA-64 архитектур, гэхдээ хамгийн үр дүнтэй хөрвүүлэгчийн тохиргоог ашиглахад анхаарах хэрэгтэй. Үүний үр дүнд бүтээмжийн өсөлт нь тэдгээрийг олоход зарцуулсан хөдөлмөрийн хөлсийг төлдөг.


Зураг 6. SPEC CPU200 оновчтой хувилбаруудыг ашиглах үед хурдатгал


Intel хөрвүүлэгчид олон урсгалтай програмуудыг бүтээхэд зориулсан OpenMP салбарын тодорхойлолтыг дэмждэг. Тодорхой (сонголт -Qopenmp) болон автомат (-Qparallel) зэрэгцүүлэлтийг дэмждэг. Тодорхой горимын хувьд програмист нь OpenMP стандартыг зөв, үр ашигтай ашиглах үүрэгтэй. Автомат параллелчлалын хувьд хөрвүүлэгч нь програмын кодыг шинжлэхтэй холбоотой нэмэлт ачаалалтай байдаг. Ийм учраас одоогийн байдлаар автомат параллелчлал нь зөвхөн энгийн кодууд дээр үр дүнтэй ажилладаг.

Зураг 7-д байгаа график нь Hyper-Threading технологийн дэмжлэгтэй Intel Pentium 4 процессор (Prescott) дээр суурилсан инженерийн (үйлдвэрлэлийн өмнөх) загвар систем дээр тодорхой параллелчлалыг ашиглах хурдатгалыг харуулж байна: 2.8GHz, 2GB 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: Prescott процессор дээрх SPEC OMPM2001 багцын програмууд


11 тохиолдлын 9-д нь Hyper-Threading технологи идэвхжсэн үед OpenMP ашиглан илэрхий параллелчлалыг ашиглах нь гүйцэтгэлийг нэмэгдүүлдэг болохыг харж болно. Нэг аппликешн (312.swim) удаашралтай байна. Энэхүү програм нь өндөр хамааралтай гэдгээрээ алдартай байдаг нь мэдэгдэж байна зурвасын өргөнсанах ой. SPEC CPU2000-ийн нэгэн адил wupwise Prescott оновчлолоос (-QxP) ихээхэн ашиг хүртдэг.


1.2 Эх кодын өөрчлөлт бүхий программуудыг оновчтой болгох, хөрвүүлэгчийн оношлогоог ашиглах


Өмнөх хэсгүүдэд бид хөрвүүлэгчийн (болон түүний тохиргоо) кодын гүйцэтгэлийн хурдад үзүүлэх нөлөөг авч үзсэн. Үүний зэрэгцээ Intel хөрвүүлэгчид зөвхөн тохиргоог өөрчлөхөөс илүү кодыг оновчтой болгох боломжийг олгодог. Ялангуяа хөрвүүлэгчид программист программист программ кодонд "санамж" өгөх боломжийг олгодог бөгөөд энэ нь гүйцэтгэлийн хувьд илүү үр дүнтэй код үүсгэх боломжийг олгодог. C/C++ хэлний зарим жишээг доор харуулав (Fortran хэлний ижил төстэй хэрэгслүүд байдаг бөгөөд зөвхөн синтаксаар ялгаатай).

#pragma ivdep (үүнд ivdep гэдэг нь вектор хамаарлыг үл тоомсорлох гэсэн үг) програмын давталтаас өмнө хөрвүүлэгчид өгөгдлийн хамаарал байхгүй гэдгийг хэлэхийн тулд ашигладаг. Энэхүү зөвлөмж нь хөрвүүлэгч (шинжилгээнд үндэслэн) ийм хамаарал байж болно гэж консерватив байдлаар (хэрэв хөрвүүлэгч нь шинжилгээний үр дүнд хамаарал байгааг нотолж чадвал "санамж" ямар ч нөлөө үзүүлэхгүй), харин код зохиогч нь ажилладаг. ийм хамаарал үүсэх боломжгүй гэдгийг мэддэг. Энэхүү зөвлөмжийг ашиглан хөрвүүлэгч илүү үр дүнтэй код үүсгэж чадна: IA-32-д автомат векторжуулалт (C/C++ болон Fortran програмын гогцоонд зориулсан MMX\SSE\SSE2\SSE3 багцын вектор зааврыг ашиглан; та энэ аргын талаар илүү ихийг мэдэх боломжтой. жишээ нь, дараагийн Intel Technology Journal-д гарсан нийтлэл), IA-64-ийн програм хангамжийн шугам хоолой (SWP).

#прагма векторыг ажлын тоон болон чанарын шинж чанарт дүн шинжилгээ хийсний үндсэн дээр (IA-32-д автомат, IA-64-ийн SWP хоёулаа) давталтын векторчлолын үр ашиггүй байдлын талаарх шийдвэрийг өөрчлөхөд хөрвүүлэгчийг албадах зорилгоор үргэлж ашигладаг. давталт.

#pragma novector үргэлж #прагма векторын эсрэгээр хийдэг.

#pragma vector aligned нь давталтанд ашигласан өгөгдөл нь 16 байт хил дээр зэрэгцэж байгааг хөрвүүлэгчид хэлэхийн тулд ашигладаг. Энэ нь танд илүү үр ашигтай ба/эсвэл авсаархан (ажиллах хугацааны шалгалт байхгүйгээс) код үүсгэх боломжийг олгодог.

#pragma вектор unaligned нь #pragma aligned-ийн эсрэг үйлдлийг гүйцэтгэдэг. Энэ тохиолдолд гүйцэтгэлийн өсөлтийн талаар ярихад хэцүү байдаг, гэхдээ та илүү авсаархан код дээр найдаж болно.

#pragma түгээх цэгийг программын гогцоонд ашигладаг бөгөөд хөрвүүлэгч энэ цэг дэх түгээлтийн давталтыг хэд хэдэн жижиг хэсгүүдэд хувааж болно. Жишээлбэл, хөрвүүлэгч эх гогцоог автоматаар векторчлох боломжгүй үед (жишээ нь, #pragma ivdep-тэй ч үл тоомсорлох боломжгүй өгөгдлийн хамаарлын улмаас) ийм "санамж"-ийг ашиглаж болно. үүссэн циклүүдийг үр дүнтэй векторчлох боломжтой.

#pragma loop count (N) нь давталтын давталтын тооны хамгийн их магадлалтай утга нь N байх болно гэдгийг хөрвүүлэгчид хэлэхийн тулд ашигладаг. Энэ мэдээлэл нь энэ давталтын хамгийн үр дүнтэй оновчлолыг (жишээлбэл, задлах эсэх) шийдэхэд тусална. , SWP эсвэл автомат векторжуулалт хийх эсэх, програм хангамжийн өгөгдлийг урьдчилан татах командуудыг ашиглах эсэх, ...)

"Хинт" _assume_aligned(p, base) нь p заагчтай холбоотой санах ойн муж нь суурь = 2^n байт хил дээр зэрэгцэж байгааг хөрвүүлэгчид хэлэхийн тулд ашигладаг.

Энэ нь хол байна бүрэн жагсаалтхөрвүүлэгчийн янз бүрийн "санамжууд" нь үүсгэсэн кодын үр ашигт ихээхэн нөлөөлдөг. Хөрвүүлэгчид зөвлөгөө хэрэгтэй гэдгийг хэрхэн тодорхойлох вэ гэсэн асуулт гарч ирж магадгүй юм.

Нэгдүгээрт, та хөрвүүлэгчийн оношлогоог программист өгсөн тайлан хэлбэрээр ашиглаж болно. Жишээлбэл, -Qvec_reportN сонголтыг ашиглан (n нь 0-ээс 3 хооронд хэлбэлзэж, нарийвчилсан түвшнийг илэрхийлнэ) та автомат векторжуулалтын тайланг авч болно. Программист ямар гогцоо векторжуулсан, аль нь хийгээгүй талаарх мэдээллийг авах боломжтой болно. Үгүй бол хөрвүүлэгч векторжуулалт амжилтгүй болсон шалтгааныг мэдээлдэг. Үүний шалтгаан нь өгөгдлөөс хамааралтай байсан гэж бодъё. Энэ тохиолдолд хэрэв програмист хамаарал үүсэх боломжгүй гэдэгт итгэлтэй байвал #pragma ivdep ашиглаж болно. Хөрвүүлэгч нь IA-64 дээр ижил төстэй (IA-32-ийн Qvec_reportN-тэй харьцуулах) SWP-ийн оршихуй, үр нөлөөг хянах боломжийг олгодог. Ерөнхийдөө Intel хөрвүүлэгчид оновчлолыг оношлох өргөн боломжийг олгодог.

Хоёрдугаарт, бусад програм хангамжийн бүтээгдэхүүнүүд (жишээ нь Intel VTune profiler) код дахь гүйцэтгэлийн саатлыг олоход ашиглаж болно. Шинжилгээний үр дүн нь программист шаардлагатай өөрчлөлтийг хийхэд тусална.

Та мөн хөрвүүлэгчийн үүсгэсэн ассемблер кодын жагсаалтыг шинжилгээнд ашиглаж болно.


Зураг 8


Дээрх зураг 8 нь хөрвүүлэгч (болон бусад) ашиглан програмыг оновчтой болгох алхам алхмаар үйл явцыг харуулж байна програм хангамжийн бүтээгдэхүүн) IA-64 архитектурт зориулсан Fortran хэл дээрх Intel. Жишээлбэл, Рогидрометцентрийн 48 цагийн адиабат бус бүс нутгийн урьдчилсан мэдээний схемийг авч үзэх болно (жишээлбэл, та энэ нийтлэлээс энэ талаар уншиж болно. Нийтлэлд тооцоолох хугацаа 25 минут орчим байдаг боловч мэдэгдэхүйц өөрчлөлт гарсан байна. Энэ нь бичигдсэнээс хойш. Cray-YMP систем дээр кодын гүйцэтгэлийг эхлэлийн цэг болгон авдаг Өгөгдмөл хөрвүүлэгчийн сонголттой (-O2) өөрчлөгдөөгүй код нь Intel Itanium 2 900 MHz дээр суурилсан 4 талын систем дээр гүйцэтгэлийн 20%-ийн өсөлтийг харуулсан. процессор Илүү түрэмгий оновчлолыг (-O3) ашигласнаар SWP болон өгөгдлийг урьдчилан татаж авах зэргээс шалтгаалан кодыг өөрчлөхгүйгээр ~2.5 дахин хурдасгасан. Хөрвүүлэгчийн оношлогоо, Intel VTune профайлыг ашиглан хийсэн шинжилгээ нь зарим саад бэрхшээлийг илрүүлсэн Жишээ нь, хөрвүүлэгч хэд хэдэн гүйцэтгэлийг программчлаагүй эгзэгтэй гогцоонууд, тайланд өгөгдлийн хамаарлыг санал болгож байна гэж тайлагнаж байна. Кодын жижиг өөрчлөлтүүд (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 Хөрвүүлэгчийн харьцуулалт -> Fortran (77, 90) Гүйцэтгэлийн цагийн жишиг ба Linux хөрвүүлэгчийн харьцуулалт -> Fortran (77, 90) Гүйцэтгэлийн цагийн жишиг): өөр өөр хөрвүүлэгчид байдаг. харуулсан ба геометрийн дундаж утгыг туршилт бүрийн үр дүнтэй хослуулан өгсөн болно.

Сэтгүүлийн өмнөх дугаарт бид Intel VTune Performance Analyzer-ийн гэр бүлийн бүтээгдэхүүнүүдийн талаар ярилцсан - програм хөгжүүлэгчдийн дунд маш их алдартай бөгөөд кодыг илрүүлэх боломжийг олгодог гүйцэтгэлийн шинжилгээний хэрэгслүүдийн талаар. багийн програмууд, энэ нь процессорын хэт их нөөцийг зарцуулдаг бөгөөд энэ нь хөгжүүлэгчдэд кодын ийм хэсгүүдтэй холбоотой болзошгүй саад бэрхшээлийг тодорхойлох, арилгах боломжийг олгодог бөгөөд ингэснээр програм боловсруулах үйл явцыг хурдасгадаг. Гэсэн хэдий ч програмын гүйцэтгэл нь тэдгээрийг боловсруулахдаа ашигласан хөрвүүлэгчид хэр үр ашигтай байх, машины код үүсгэх үед ямар техник хангамжийн функцуудыг ашиглахаас ихээхэн хамаардаг гэдгийг анхаарна уу.

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

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

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 платформд зориулсан хөрвүүлэгч

Windows-д зориулсан Intel C++ Compiler 7.1

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++ стандартуудыг дэмждэг.

Windows-д зориулсан Intel Fortran Compiler 7.1

Энэ оны эхээр гарсан Windows-д зориулсан Intel Fortran Compiler 7.1 нь Intel Itanium, Intel Itanium 2, Intel Pentium 4 болон Intel Xeon, Intel Pentium M процессоруудад оновчтой код үүсгэх боломжийг танд олгоно.

Энэхүү хөрвүүлэгч нь Microsoft Visual C++ 6.0 болон Microsoft Visual Studio .NET хөгжүүлэлтийн хэрэгслүүдтэй бүрэн нийцдэг, өөрөөр хэлбэл түүнийг холбогдох хөгжүүлэлтийн орчинд нэгтгэх боломжтой. Нэмж дурдахад энэхүү хөрвүүлэгч нь Itanium / Itanium 2 процессор дээр ажилладаг үйлдлийн системд зориулсан 64 битийн програмуудыг боловсруулах боломжийг олгодог. Microsoft-ын тусламж 64 битийн Intel Fortran хөрвүүлэгчийг ашиглан 32 битийн Pentium процессор дээр Visual Studio. Кодыг дибаг хийх үед энэ хөрвүүлэгч нь Microsoft .NET платформд дибаглагчийг ашиглах боломжийг олгодог.

Хэрэв танд Compaq Visual Fortran 6.6 суулгасан бол эдгээр хөрвүүлэгч нь эх кодын түвшинд нийцтэй байдаг тул та анхны хөрвүүлэгчийн оронд Intel Fortran Compiler 7.1-ийг ашиглаж болно.

Windows-д зориулсан Intel Fortran Compiler 7.1 нь ISO Fortran 95 стандартад бүрэн нийцдэг бөгөөд C болон Fortran хоёр хэл дээрх програмуудыг бүтээх, дибаг хийхийг дэмждэг.

Линукс платформд зориулсан хөрвүүлэгч

Linux-д зориулсан Intel C++ Compiler 7.1

Оны эхээр гарсан өөр нэг хөрвүүлэгч болох Linux-д зориулсан Intel C++ Compiler 7.1 нь Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M процессоруудад зориулсан кодын оновчлолыг өндөр түвшинд гаргах боломжийг олгодог. Энэхүү хөрвүүлэгч нь бүрэн боломжтой. GNU C хөрвүүлэгчийн түвшний эх код болон объектын модулиудад нийцэж байгаа нь GNU C-ээр бүтээгдсэн програмуудыг нэмэлт зардалгүйгээр түүн рүү шилжүүлэх боломжийг олгодог. үйлдлийн системүүд SCO, Sun Solaris-ийн анхны хувилбарууд гэх мэт) нь бүрэн нийцтэй гэсэн үг юм. хоёртын түвшний gcc 3.2 хөрвүүлэгч. Эцэст нь Linux-д зориулсан Intel C++ Compiler 7.1-ийн тусламжтайгаар та Линуксийн цөмийг эх кодод нь цөөн хэдэн өөрчлөлт оруулан дахин эмхэтгэх боломжтой.

Linux-д зориулсан Intel Fortran Compiler 7.1

Linux-д зориулсан Intel Fortran Compiler 7.1 хөрвүүлэгч нь Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M процессоруудад оновчтой код үүсгэх боломжийг олгодог. Энэхүү хөрвүүлэгч нь эх кодын түвшинд Compaq Visual Fortran 6.6 хөрвүүлэгчтэй бүрэн нийцдэг. Та Compaq Visual Fortran-аар үүсгэсэн программуудыг дахин эмхэтгэж, гүйцэтгэлийг нь сайжруулна.

Нэмж дурдахад, заасан хөрвүүлэгч нь emacs засварлагч, gdb дибаглагч, make application бүтээх хэрэгсэл зэрэг хөгжүүлэгчдийн ашигладаг хэрэгслүүдтэй нийцдэг.

Энэхүү хөрвүүлэгчийн Windows хувилбарын нэгэн адил Linux-д зориулсан Intel Fortran Compiler 7.1 нь 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 цагийн үед татаж авсан. Би гайхалтай унтмаар байсан ч сониуч зан: хамгаалалт бэхжсэн үү, үгүй ​​юу, бас урагдсан. Хамгаалалттай харьцах хүртлээ нойр хүрэхгүй гэж шийдээд нээлээ шинэ консол, мөн C:\TEMP санд TEMP болон TMP системийн хувьсагчдыг дахин суулгаж, 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

    тэмдэглэл

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

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

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

    2002 оны 10 сарын 24 08:12 126 976 ChkLic.dll

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

    2002-10-17 16:29 28,663 CLicense.rtf

    10/17/2002 16:35 386 credist.txt

    2002.10.16 17:02 34 136 Crelnotes.htm

    2002-03-19 14:28 4635 PLSuite.htm

    2002.02.21 12:39 2 478 бүртгэл.htm

    2002.10.02 14:51 40 960 Setup.exe

    2002.10.02 10:40 151 Setup.ini

    2001.07.10 12:56 184 тохиргоо.мв

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

    6 хавтас 886 571 008 байт үнэгүй

Аа! Setup.exe суулгагч нь ердөө дөч гаруй килобайт авдаг. Маш сайн! Та ийм хэмжээний ноцтой хамгаалалтыг нуух аргагүй бөгөөд тийм байсан ч энэ жижигхэн файлыг бүхэлд нь задлан шинжлэхэд ямар ч зардал гарахгүй - дизассемблерийн жагсаалтын сүүлийн байт хүртэл. Гэсэн хэдий ч хамгаалалтын код нь setup.exe-д яг байрладаг нь баримт биш бөгөөд үүнийг өөр газар байрлуулж болно, жишээлбэл ... ChkLic.dll / ChkLic.exe, хамтдаа долоон зуун килобайтаас бага зэрэг эзэлдэг. . Хүлээгээрэй, ChkLic гэж юу вэ? Энэ нь Check License гэсэн үгийн товчлол уу? Аан, Intel-ийн залуус хошин шогийн мэдрэмжтэй ноцтой асуудалтай байгаа нь ойлгомжтой. Тэд энэ файлыг шударгаар "Намайг Hack" гэж нэрлэсэн нь дээр байх болно! Эзлэхүүнээс харахад ChkLic нь ижил FLEX lm бөгөөд бид үүнтэй аль хэдийн тааралдсан ("Intel C++ 5.0 Compiler" -ийг үзнэ үү) мөн үүнийг хэрхэн яаж эвдэхээ төсөөлөөд үз дээ.

Бид "dumpbin / EXPORTS ChkLic.dll" командыг өгч, экспортлогдсон функцуудыг шалгаж, ... сандал дээрээс унахгүйн тулд Клаваг чанга барина уу:

    ChkLic.dll файлын хаягдал

  1. Хэсэг нь ChkLic.dll-д зориулсан дараах экспортуудыг агуулна

    0 шинж чанар

    3DB438B4 цагийн огнооны тамга 2002 оны 10 сарын 21 21:26:12

  2. 1 тооны функц

    1 тооны нэр

    дараалсан зөвлөмж RVA нэр

    1 0 000010A0_CheckValidLicense

Хараал ид! Хамгаалалт нь CheckValidLicense хэмээх гайхамшигтай нэртэй ганц функцийг экспортолдог. "Гайхалтай" - учир нь функцын зорилго нь нэрнээс нь тодорхой болж, дизассемблер кодын шаргуу дүн шинжилгээ хийхээс зайлсхийх боломжтой болно. За, тэд бүх ашиг сонирхлыг эргүүлэн татсан ... тэд үүнийг дараалал эсвэл ямар нэгэн зүйлээр экспортолж, эсвэл ядаж DES Decrypt гэх мэт аймшигтай нэрээр нэрлэсэн нь дээр байх болно.

... мөрөөдөж байна! За, манай хонь руу буцъя. Логикоор бодоцгооё: хэрэв бүх хамгаалалтын код нь ChkLic.dll-д шууд байрладаг бол (мөн хамгаалалтын "нугастай" шинж чанараас харахад энэ нь үнэн юм) бүх "хамгаалалт" нь Setup.exe-ээс CheckValidLicense руу залгахад ирдэг. түүгээр буцаж ирсэн үр дүнг шалгах. Тиймээс, "хакердах" тулд ChkLic.dll-ийг нөхөхөд л хангалттай бөгөөд ChekValidLicense функцийг үргэлж буцаахыг албаддаг ... дашрамд хэлэхэд, энэ нь юу буцаах ёстой вэ? Илүү нарийвчлалтай: амжилттай лицензийн шалгалтанд тохирох буцах утга нь яг юу вэ? Үгүй ээ, мэдэхийн тулд setup.exe-г задлах гэж яарах хэрэггүй, учир нь ХУДАЛ эсвэл ҮНЭН гэсэн сонголтууд тийм ч олон биш. Та ҮНЭН дээр бооцоо тавьж байна уу? Нэг ёсондоо энэ нь логик юм, гэхдээ нөгөө талаас: бид яагаад CheckValidLicense функц нь алдааны кодыг бус харин үйл ажиллагааны амжилтын далбааг буцаадаг гэж яагаад шийдсэн бэ? Эцсийн эцэст, энэ нь хөрвүүлэгчийг суулгахаас татгалзах шалтгааныг ямар нэгэн байдлаар өдөөх ёстой: лицензтэй файл олдоогүй, файл гэмтсэн, лицензийн хугацаа дууссан гэх мэт? За, тэгийг буцаахыг оролдъё, хэрэв энэ нь ажиллахгүй бол бид нэгийг буцаана.

За, хүлээсээ тат, явцгаая! Бид HIEW-г ажиллуулж, ChkLic.dll файлыг нээнэ үү (хэрэв нээгдэхгүй бол gophers-ийг гурван удаа санаж, эх эсвэл нэрэнд нь тусгай тэмдэгт агуулаагүй бусад лавлах руу түр хуулж, "y" нь таалагдахгүй байна. Маш их). Дараа нь хогийн сав ашиглан олж авсан экспортын хүснэгт рүү дахин эргэж, бид CheckValidLicense функцийн хаягийг (энэ тохиолдолд 010A0h) тодорхойлж, "10A0" -аар дамжуулан түүний эхлэл рүү очно. Одоо бид үүнийг шууд таслаж, дарж бичнэ. Хуучин код дээр "XOR EAX, EAX / RETN 4. Яагаад зөвхөн "RET" биш "REN 4" гэж? e (Зүгээр л дизассемблерийн дэлгэцийг RET-тэй уулзах хүртэл доош гүйлгэ).

Шалгаж байна... Ажиллаж байна!!! Лиценз байхгүй ч суулгагч нь олон асуулт асуухгүйгээр суулгацыг эхлүүлдэг! Тиймээс хамгаалалт унасан. Өө, бүх зүйл маш энгийн гэдэгт бид итгэж чадахгүй байгаа бөгөөд програм суулгах процесс дуусахыг хүлээж монитор руу хоосон ширтэхгүйн тулд бид setup.exe дээр дуртай IDA дизассемблерээ суулгасан. Таны анхаарлыг татах хамгийн эхний зүйл бол импортын функцуудын жагсаалтад CheckValidLicense байхгүй байна. Магадгүй тэр ямар нэгэн байдлаар ChkLic.exe файлыг ажиллуулдаг болов уу? "~View aNames", "ChkLic"... тиймээ, "Chklic.exe" мөр энд огт байхгүй, харин "Chklic.dll" олдсон автоматаар танигдсан мөрүүдийн дунд тохирох холбоосыг хайж үзье. Тийм ээ, би ойлгож байна, энэ нь ChkLic номын сан LoadLibrary-ээр дамжуулан тодорхой холбоосоор ачаалагдсан гэсэн үг юм. Мөн хөндлөн лавлагаа нь үүнийг баталж байна:

    Текст: 0040175D түлхэх офсет aChklic_dll ; lpLibFileName

    Текст:00401762 руу залгана уу ds:LoadLibraryA

    Текст: 00401762 ; ChkLic.dll ^^^^^^^^^^^^^^^^ ачаалах

    Текст: 00401762 ;

    Текст:00401768 mov esi,eax

    Текст:0040176A түлхэх офсет a_checkvalidlic ; lpProcName

    Текст: 0040176F түлхэх esi ; hModule

    Текст:00401770 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 push 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) (0 буцаана;)

Ингээд бид энэ бүхнийг ярилцаж байх хооронд суулгагч хөрвүүлэгчийг суулгаж дуусгаад ажлаа амжилттай дуусгалаа. Хөрвүүлэгч эхлэх үү эсвэл хамгийн сонирхолтой нь дөнгөж эхэлж байна уу гэдэг нь сонирхолтой байна уу? Бид үүрлэсэн хавтаснуудын салбарласан шатлалыг халуухан уруудаж, хүлээгдэж байгаачлан хогийн санд байрлах icl.exe файлыг олж, товшоод ... Хөрвүүлэгч аяндаа эхлэхгүй байгаа нь "icl: алдаа: FLEX lm лицензийг шалгаж чадаагүй" гэсэн шалтгаанаар тэр ажлаа үргэлжлүүлэх боломжгүй.

Intel олон түвшний хамгаалалтыг ашигласан бөгөөд эхний түвшин нь тэнэгүүдийн эсрэг бүдүүлэг хамгаалалт болж хувирав. За! Бид энэ сорилтыг хүлээн зөвшөөрч, өмнөх туршлага дээрээ үндэслэн хөрвүүлэгчийн лавлахаас LMGR*.DLL файлыг автоматаар хайдаг. Ашгүй! Энэ удаад энд ийм файл байхгүй, гэхдээ icl.exe зургаан зуун килобайтаас хэтэрч маш их жин нэмсэн нь харагдаж байна ... Зогс! Гэхдээ хөрвүүлэгчийг хөгжүүлэгчид энэ FLEX lm-ийг статик холбоостой холбосон уу? Бид харж байна: Intel C++ 5.0-д lmgr327.dll болон icl.exe-ийн нийлбэр нь 598 КБ байсан бол одоо icl.exe дангаараа 684 КБ хэмжээтэй байна. Байгалийн хөгшрөлтийн "таргалалт" -ыг тохируулсны дараа тоо нь маш сайн нийлдэг. Эцсийн эцэст, FLEX lm! Өө өө! Харин одоо функцүүдийн бэлгэдлийн нэргүй бол хамгаалалтыг эвдэх нь илүү хэцүү байх болно ... Гэсэн хэдий ч цаг хугацаанаас нь өмнө сандрах хэрэггүй! Зүгээр л тайван бодъё! Хөгжлийн баг энэхүү "дугтуй" хамгаалалттай харьцдаг бүх кодыг бүрэн дахин бичсэн байх магадлал багатай юм. Байршлын төрлийг өөрчилснөөр түүний "сайжруулалт" дууссан байх магадлалтай. Хэрэв тийм бол програмыг хакердах магадлал өндөр хэвээр байна!

Аюулгүй байдлын код хамгийн сүүлд орсон гэдгийг санаарай үндсэн функцууд, бид түүний хаягийг тодорхойлсны дараа зүгээр л таслах цэгийг тавиад, дибаг гаргагч гарч ирэхийг хүлээсний дараа алдаа засах програм эсвэл програмын гаралтын цонх руу ээлжлэн хараад кодыг тэнэг байдлаар хайж байна: доромжилсон мессеж гарч ирэв үү? Үүний зэрэгцээ, бид тааралдсан бүх нөхцөлт үсрэлтүүдийг тусдаа цаасан дээр тэмдэглэж (эсвэл үүнийг өөрийн санах ойд үлдээх), нөхцөлт үсрэлт бүрийг гүйцэтгэсэн эсэхийг зааж өгөхөө мартаж болохгүй. .. Зогс! Бид ямар нэгэн зүйл ярьсан ч доромжилсон мессеж аль хэдийн гарч ирсэн! За яахав! Үүнд ямар нөхцөлт шилжилт тохирохыг харцгаая. Бидний бүртгэлээс харахад хамгийн сүүлд тааралдсан салбар нь 0401075h хаягт байрлах JNZ нөхцөлт салбар байсан бөгөөд sub_404C0E-ийн буцаасан үр дүнд "харилцаж" байна:

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

    Текст:0040107F mov eax, офсет aFfrps ; "FFrps"

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

    Текст:00401089 sub_404C0E руу залгана уу

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

    Текст:00401090 jnz short loc_40109A

    Мэдээжийн хэрэг, sub_404C0E нь лицензийг байгаа эсэхийг шалгадаг хамгаалалтын журам юм. Түүнийг яаж хуурах вэ? За, маш олон сонголт байна ... Эхлээд та sub_404C0E-ийн агуулгыг сайтар бодож, нягт нямбай задлан шинжилж болно: яг юу, яг яаж шалгадаг болохыг олж мэдээрэй. Хоёрдугаарт, та зүгээр л JNZ short loc_40107F-г JZ short loc_40107F эсвэл бүр NOP, NOP гэж сольж болно. Гуравдугаарт, TEST EAX, EAX буцах үр дүнг шалгах командыг тэг тохиргооны команд болгон хувиргаж болно: XOR EAX, EAX. Дөрөвдүгээрт, sub_404C0E өөрөө үргэлж тэгийг буцаадаг нөхөөс хийж болно. Би чамайг мэдэхгүй ч би гурав дахь арга хамгийн их таалагдсан. Бид хоёр байтыг сольж, хөрвүүлэгчийг эхлүүлнэ. Хэрэв хамгаалалтад "тусгай зөвшөөрөлтэй" эсэхийг шалгах өөр шалгалт байхгүй бол програм ажиллах болно, үүний дагуу эсрэгээр. (Бидний санаж байгаагаар тав дахь хувилбарт ийм хоёр шалгалт байсан). Гайхалтай, гэхдээ эмхэтгэгч нь харааж зүхээд ажиллахаа больсон!!! Үнэн хэрэгтээ, түүний хөгжүүлэгчид хүлээж байсанчлан хамгаалалтыг огтхон ч бэхжүүлээгүй, харин эсрэгээрээ бүр сулруулсан! Крис Касперский



  • Ачааж байна...
    Топ