Поглед в процесора Част 2 – архитектурата Core




Поглед в процесора Част 2 – архитектурата Core

PCMagazine, Брой 4
Категория: Хардуер , Процесори
Етикети: процесор , cpu
Добрил Доков
17.4.2008

Поглед в процесора Част 2 – архитектурата Core


В предишния брой разгледахме откъде произхожда архитектурата, използвана в днешните процесори с висока производителност, нейните недостатъци и начините за заобикалянето или елиминирането им. Тъй като пътищата, по които може да се тръгне за усъвършенстването на производителността на днешните процесори, не са малко, в тази статия ще разгледаме конкретно използваната от Intel архитектура при процесорите Core 2. В нея компанията прави своеобразен „преврат“ в своите виждания и проекти за бъдещите си продукти, като за разлика от NetBurst в този случай успехът в резултат на тези действия беше, меко казано, огромен.

В много отношения Core 2 беше, а и все още е революционно различен от използваната дотогава NetBurst архитектура от Intel. Изненадващата промяна в архитектурата и възгледите на компанията донесе на Intel огромен успех, като напълно обърна дотогавашната ситуация, в която Intel „догонваше“ AMD по отношение на върховата (а и не само) производителност. Всичко това звучи много добре, а и вече е в миналото, но на какво точно се дължи огромният скок в производителността на Core 2?
Макар с всеки нов продукт (в случая процесор) компанията производител да обявява, че това е окончателното и възможно най-добро превъплъщение на технологията като цяло, винаги има още една стъпка напред, която може да се направи. В случая с Core 2 Intel не само направи тази стъпка по отношение на архитектурата, но също така въведе няколко иновационни техники и усъвършенства вече използваните до момента. Ако трябва да посочим конкретните промени, водещи до високата производителност на Core 2, най-основните от тях са следните: техниката Macro-Op/Micro-Op Fusion; суперскаларност от ново ниво – възможност за изпълняване на 4 (в някои случаи дори 5) инструкции за такт; конвейер за неподредено изпълнение на инструкциите с дълбочина от 14 стъпки (за сравнение NetBurst в последните си версии използваше конвейер с дълбочина от 31 стъпки!); интелигентно предсказване на преходите и кеширане; възможност за неподреден достъп до паметта и кеша (Memory Disambiguation); усъвършенстван SSE модул с възможност за изпълнение на една SIMD операция на такт (за сравнение NetBurst изпълняваше по една SIMD операция на 2 такта) и др.
Macro/Micro-Ops Fusion, 4/5-Wide Superscalar

Някои от най-интересните нововъведения в Core 2 са именно наречената от Intel функция Macro-Op/Micro-Op Fusion. Преди да поясним какво на практика представлява тя, трябва да разгледаме самите макро- и микрооперанди, с които тази функция работи. Разделянето на инструкциите, изпълнявани от процесора, на два типа възниква по времето, когато семейството процесори, базирани на архитектурата х86, преминава към RISC структуриран модел. Най-общо казано, разликата между CISC и RISC процесорите може да се дефинира по следния начин– при CISC (Complex Instruction Set Computer) моделите всяка инструкция има възможност да извършва няколко различни операции. По тази причина CISC инструкциите са доста „обемисти“, като работата с тях изисква допълнително усложняване на декодиращите модули.
За разлика от тях при RISC (Reduced Instruction Set Computer) структурираните процесори всяка една инструкция върши строго определена задача. За да се запази висока производителност, съперничеща, а по-късно превъзхождаща тази на CISC моделите, е необходимо RISC инструкциите да се изпълняват изключително бързо една след друга. Тук в уравнението влиза конвейерната им обработка, като в крайна сметка около средата на 90-те години се оказва, че RISC подобните процесори са все по-бързи и превъзхождат дотогава използвания CISC подход.
Тъй като преходът от CISC към RISC изисква цялостно пренаписване на програмния код, простият преход към RISC архитектура е невъзможен. Ето защо производителите на процесори осъществяват прехода по много елегантен начин – най-общо казано, те вграждат един допълнителен модул, конвертиращ сложната CISC инструкция на няколко по-прости RISC такива. Именно декодираните от CISC към RISC инструкции носят името Micro-Ops, като една CISC инструкция понякога може да съдържа два, три или дори повече микрооперанда.
Нека се върнем към Core 2 и по-конкретно към функцията Micro-Op Fusion. Конвейерното изпълнение на инструкциите понякога води до повтарящо се изпълнение на една и съща инструкция спрямо различни изходни данни или пък, в други случаи, изпълняване на близки или много подобни една на друга операции. Техниката, разработена от Intel под името Micro-Op Fusion, комбинира близките или подобни инструкции в конвейера в една обща операция, за чието изпълнение е нужен само един вместо два такта. Благодарение на това в някои случаи става възможно сериозното ускоряване на работата, извършвана от процесора.
Използването на техниката Micro-Op Fusion позволява виртуално „разширяване“ на суперскаларния конвейер на Core 2, като прави възможно при определени обстоятелства процесорът да извършва по 4+1 инструкции за такт. В този ред на мисли за разлика от К7/К8 фамилията на AMD, които са суперскаларни процесори с широчина от по 3 инструкции за такт, Core 2 поначало има 4 декодиращи модула, което го прави суперскаларен процесор с широчина от 4 инструкции за такт, с потенциална възможност за 5 за такт.
Тъй като подобна суперскаларност на процесора е, меко казано, безсмислена без отлична логика за захранване на декодиращите модули с инструкции, в Core 2 разполагаме със значително по-усъвършенствана схема за предварителна обработка на инструкциите. Всяко от ядрата при процесорите Core 2 Duo разполага с 3 собствени модула за извличане и обработка – два за данни и един за инструкции, а освен тях имаме още 2 отделни модула, обслужващи само и единствено L2 кеша. Сумарно за един двуядрен процесор разполагаме с 8 модула, занимаващи се само с извличането на инструкциите и предварителната им обработка, което лесно би задръстило и без това тясната FSB шина. За да се избегне подобна сит уация, Intel добавят специален управляващ диспечерен блок, приоритизиращ нуждите на изпълняваната програма преди тези на обслужващите модули.

Разбира се, всички тези нововъведения съвсем не правят Core 2 директно 33-50% по-бърз от К8 фамилията на AMD, когато сравняваме процесорите директно такт за такт. Въпреки това за разлика от NetBurst, където резултатът от 31 стъпковия конвейер можеше да се появи единствено при специално оптимизирани програми или такива с лесно предсказуеми преходи, Core 2 се справя много добре с вече съществуващия софтуер, показващ значително превъзходство над другите архитектури. Конкретно, що се отнася до причината за това Core 2 да е само с около 5-10% по-бърз от еквивалентните му процесорни дизайни, то на нея ще се спрем по-обстойно след малко.
Core 2 кеш памет и Smart Memory Access
Друга област, в която Intel са направили сериозни промени, е използваният в процесора кеш от второ ниво. Ядрата на процесора разполагат с огромен от гледна точка на кеш паметта общ L2 кеш с обем от 4МВ! Освен големия си обем той представлява и наистина сериозно инженерно постижение откъм комуникация с него – всяко от ядрата може да получи достъп до L2 кеша за време от 12 до 14 процесорни цикъла. Последното е от особено голямо значение, тъй като по този начин сериозно се понижава изчакването на ядрата, когато имат нужда от данни, които се намират в кеша. За разлика от NetBurst тук Intel са предпочели да не използват разработената от тях технология на име Trace Cache, която, накратко казано, представлява нещо като обратен кеш за предварително декодираните инструкции. При изключително дълбокия конвейер на NetBurst Trace Cache беше от важно значение, но със завръщането към 14-стъпковия конвейер в Core 2 неговото използване се обезсмисля.

Освен общия L2 с обем от 4МВ за двете ядра всяко от тях разполага със собствена кеш памет от първо ниво със сумарен обем от 64KB и латентност на достъпа от едва 3 процесорни цикъла. Тези 64КВ са разделени на два отделни кеша, служещи съответно за кеширане на инструкции и данни (32/32КВ). Любопитното тук е това как е осъществен достъпът до кеша от 1-во ниво – докато при К7/К8 AMD той е 2-way set associative, при Core 2 се използва доста близък от гледна точка на производителността 8-way set associative, което при определени ситуации носи преимущества. Вероятно ще се запитате какво всъщност означава терминът associative при процесорния кеш.
Когато диспечера на кешът копира данни или инструкции от паметта на системата в кеша, той може да прави това по два начина – първият е, когато за всеки адрес от паметта отговаря само и единствено един адрес от кеша. Този тип архитектура на кеширането се нарича direct mapped. Вторият случай е този, при който за всяка клетка от паметта, която диспечерът реши да кешира, може да избере произволен адрес от кеша, в който да я постави. В такъв случай кеширащата техника носи името fully associative. Изработката и използването на fully associative кеш памет е излишно трудоемка задача, тъй като при обръщение към кеша процесорът не знае къде да търси нужните му данни и се налага претърсването на всички заети клетки от паметта на кеша, докато се намери нужната информация. Това отнема не само време за изпълнение на всяка от операциите, но също така води до излишно натоварване на процесора и кеша от енергийна гледна точка, като нищо не ни гарантира, че в кеша ще намерим данните, които търсим.
В съвременните кеш архитектури производителите на процесори използват компромисен вариант, при който диспечерът на кешираната информация разполага с повече от една клетка, в която може да запише данните, но не и в произволна такава. При употребата на 2-way set associative кеш памет (AMD K8) диспечерът може да нанесе данните от паметта в 2 произволни клетки на кеша. В процесорите, използващи 8-way set associative кеш памет, какъвто е случаят с Core 2, диспечерът има достъп до 8 произволни клетки, в които да запише данните.
Увеличаването на асоциативността на кеша обаче далеч не ни носи линейно нарастване на производителността му – правилото, прието за стандарт, гласи следното: удвояването на асоциативността на кеша (например от direct mapped към 2-way или от 2 към 4-way) има приблизително същия ефект, какъвто би имало удвояването на размера на кеша до достигането на 4-way ниво. Използването на нива над граничното 4-way set associative има значително по-малък или почти никакъв ефект над производителността на кеша за сметка на сериозното оскъпяване на продукта като цяло.
Друга специфична техника, приложена от Intel в Core 2, е т.нар. Smart Memory Access. При тази технология процесорът има възможност за неподреден достъп до паметта, в случай че в изпълняваната в момента поредност от операции имаме изчакване. Това позволява непоследователен достъп до паметта, гарантиращ независимост на отделните ядра в процесора, както и на различните инструкции, изпълнявани към момента, в който имаме изчакване.
За да стане възможно безпроблемното вграждане на тази технология, от Intel са усъвършенствали значително модулите, занимаващи се с проверка на зависимостите, както и на тези, които предсказват наличието на изчакване в конвейера.
                 
Усъвършенствано изпълнение на SSE
Още от времето, когато AMD и Intel обявиха съответно 3Dnow! и ММХ, софтуерът започна все по-сериозно да се възползва от възможностите на SIMD (Single Instruction, Multiple Data) операциите. Идеята, стояща зад тази реализация, по същество представлява изключително ефективна паралелна обработка, която в някои случаи превъзхожда тази на всеки суперскаларен процесор. Какво точно представляват SIMD инструкциите? Нека си представим случай, при който процесорът трябва да извърши множество повтарящи се операции с различни адреси от паметта. Ако използваме класически дизайн на последователност на работа, процесорът ще извърши последователно всяка от операциите, като за това ще му е необходимо съответното време.

При употребата на SIMD разширен процесор става възможно той да прочете инструкцията, която трябва да извърши еднократно, след което да я приложи едновременно върху данните от няколко адреса от паметта и за финал да запише резултатите. Подобна ситуация възниква изключително често, когато става въпрос за мултимедиа, към която категория спадат не само кодирането и декодирането на филми или музика, но също така и обработката на изображения например.
Подходящ пример за илюстриране на SIMD би бил случай, в който искаме да повишим яркостта на дадена снимка. Ако процесорът ни поддържа SIMD, тогава вместо да обработва последователно всеки пиксел от изображението, той може да прочете накуп няколко от тях (броят им зависи от архитектурата на конкретния процесор) и да приложи промяната в стойността им в една операция за всички. Благодарение на това в някои случаи ускорението в работата на процесорите,  поддържащи SIMD инструкции, може да е значително.
Как стои въпросът при Core 2? Тук разполагаме с цели 3 независими 64-битови декодера на SSE (SSE/SSE2/SSE3) инструкции, но което е много по-важно в случая – два от тях са симетрични. Най-просто казано, това позволява на процесора да изпълнява по една 128-битова SSE инструкция на такт благодарение на това, че SSE декодерите могат да „сглобят“ двете половини от по 64 бита на инструкцията. За разлика от Core 2 NetBurst и К8 могат да изпълняват по една 128-битова SSE инструкция за 2 процесорни такта, което дава доста сериозно предимство на Core 2 поне що се отнася до мултимедиата.

Core 2 в няколко думи за заключение
Погледнато в ретроспекция, архитектурата Core 2 определено е пряк наследник на използваната преди NetBurst – архитектурата Р6. На практика Core 2 представлява логичната следваща стъпка в развитието на Р6, след като елиминираме NetBurst от уравнението. В сравнение както с нея, така и с К7/К8 на AMD Core 2 е с по-висока степен на IPC, по-широка от гледна точка на суперскаларност и не на последно място по-добре оптимизирана от гледна точка на неподредено изпълнение на инс трукциите. В същото време добавяне то на функции като Micro/Macro-Op Fusion и възможността за изпълнение в един такт на 128-битови SIMD инструкции просто превърнаха Core 2 в логичния лидер на пазара за процесори.
Всъщност Core 2 процесорите направиха две изключително важни промени в „топографията“ на тогавашния пазар на процесори. Първата е предлагането на сериозна производителност (дори при ниските класове модели) на относително ниска цена, което спомогна за сериозен скок в мощността дори при бюджетните и съответно евтини системи. Казано с други думи, именно Core 2 беше процесорът, който буквално „измести“ областта на процесорите с висока производителност към ниския клас на пазара, като при това върховите модели не загубиха от това.
Втората и може би по-важна от двете промени беше фактът, че Core 2 на практика въведе в средния и ниския сегмент на потребителския пазар възможността за използване на двуядрен процесор на съвсем поносима цена. За справка – дотогавашните Х2 модели на AMD определено не можеха да се нарекат евтини.
Иронията в случая е, че именно AMD, сочещи се за своеобразния „Робин Худ“ в производството на процесори, предлагащи висока производителност на ниска цена, бяха изненадани от хода на Intel, постигнал реално обещаваните дотогава от тях промени. В този ред на мисли представената от AMD архитектура Barcelona до известна степен цели повтарянето на същата ситуация, макар и в случая да става въпрос за четири- и триядрени процесори. Що се отнася до това колко удачна е самата архитектура, както и особеностите и новостите в нея, този въпрос ще разгледаме в следващата, трета част, касаеща процесорните архитектури.

Съдържание: