| |
Pentium4 Extreme Edition
30.01.`04
Доставчик: Intel
Автор:GeniusLoci
|
Hyper Threading...
Около тази технология се изприказваха много приказки.
С две думи мога да ги "класифицирам" като умерени хвалби
и пълно отрицание, като второто при всички положения идва основно
от феновете на конкурента AMD. От известно време работя основно
на Интел платформа и вече имам някакви наблюдения за представянето
на процесорите с и без използването на НТ.
Колкото и да се отрича, положителен ефект при
включването на НТ има - основно при използване на две или повече
програми, изискващи постоянни ресурси постоянно. Когато получим
3.4 GHz-овият Р4 ще направя по-подробни тестове в това отношение.
Следващите приложения, които получават, макар и неголям (зависи
много от приложението) прираст са така наречените multithreaded
(нека да ог преведем "нишка"). Cinema4D е добър пример
в това отношение - рендерирането в нея се извършва значително по-бързо,
отколкото когато е изключен НТ. Подобно е положението и при други
приложения, стига да имат оптимизации за работа с два процесора.
Същевременно според Intel прираст трябва да получат дори и неоптимизираните
за SMP (symmetric multiprocessing), защото разпределянето на изчислителната
мощ става на ниво операционна система и процесор. Тук вече обаче
има проблеми с някои приложения, като първото, което ми идва наум
е RegCleaner (само за пример). Ползвам тази програма от много време,
но и двата пъти, когато съм я опитвал на двупроцесорни машини това
доведе или до тотален срив на Windows, или до срив на самата програма
(Dual Xeon, Dual AthlonMP). При работа с Р4 НТ понякога има проблем,
друг път програмата тръгва, но при опит да се сканира Registry забива.
Втори пример - наскоро излязлата игра Deus Ex 2 - зареждането на
нивата с такъв процесор е доста по-дълго, за което не виждам основателна
причина, но...
Същевременно си е удобство да може да ползвате точно 50% от ресурсите
(или по-скоро от процесорното време) на системата като зададете
affinity само към един от двата логически процесора. Минуса при
ползване на две приложения идва от това, че реално не съществуват
две отделни процесорни ядра - разделянето е чисто логическо, като
двата "процесора" използват едни и същи ресурси, съответно
когато един от тях използва някаква съществена част от тях, остатъка
е недостатъчен за втория. това води и до понижаване на производителността
в някои приложения, но това се случва по-рядко, както ще обясня
малко по-нататък.
За да дам някаква, макар и бегла представа за
някои предимства и недостатъци от чисто теоретична гледна точка
ще се опитам да обясня част от действието на НТ. Реално в една истинска
двупроцесорна система двата налични процесора се държат като два
отделни, независими процесора и могат да изпълняват код от едно
и също приложение (т.е. две нишки) едновременно при наличие на приложение
с повече от една нишка. В такъв случай обаче остава един съществен
проблем - когато процесора не е разделен логически (или при два
процесора - физически, макар и тогава да имаме два отделни процесора)
той изпълнява подадените му инструкции в определен ред. Независимо
от всичко, в опашката от инструкции и данни (нека да я нареча конвейер,
макар че е терминологията е труднопреводима на български и това
не е правилното название - по-долу с него ще наричам съвсем друго
нещо, но опашка определено не ми звучи по-правилно ;)) винаги се
получават празнини, предизвикани от грешките в предсказването. В
този случай процесора поема на всеки такт единствено подадената
информация - като забележете, говорим не за процесорно ядро, а за
отделните изчислителни блокове. Така при всеки такт остава неизползвана
изчислителна мощ, която няма начин да се използва без въвеждането
на още по-съвършени механизми за предсказване на преходите и предварително
извличане на данните. Един процесор може да изпълнява само една
нишка, като всеки процес, независимо от броя (а той тук е един)
нишки получава само определен срок от време (slice) или тактове,
през които се изпълнява. Моменталното превключване към друга нишка
е реално моментално единствено за изчислителните блокове, които
поемат подадените им инструкции без да се интересуват от това на
чие приложение (процес) принадлежат. Когато имаме два физически
процесора това се повтаря, въпреки че двата могат реално да изчисляват
две съвсем различни нишки - както на един процес, така и на два
отделни, немногонишкови процеса. За съжаление във втория случай
вече взима роля и ОС, като разпределя ресурсите (процесорното време
на двата процесора) между отделните приложения - така може да се
получи, че дадено приложение се обръща към един от процесорите в
зависимост от реализацията на поддръжката от ОС. При един процесор
подобен проблем отсъства, тъй като всички приложения се изпълняват
на едни и същи изчислителни блокове. За потребителя това изглежда
като едновременно изпълнение на повече от една задача, но реално
всички процеси се редуват според организирането, наложено от ОС
и от самия процесор (който превключва между различните процеси,
но не и между различни нишки). най-просто казано - в изчислителните
блокове винаги се пресмятат инструкциите на само едан единствена
нишка, докато тези на следващата изчакват своя time slice (бедният
ми български...;)). Както и да го погледнем, ако може да се направи
така, че две нишки да се изпълняват паралелно без загуба на излишни
тактове когато остават неизползвани изчислителни блокове на процесора
това ще е най-добрият авриант. Нyper Threading е сериозна стъпка
в тази насока. Процесоар се разделя логически на два процесора -
реално те използват едни и същи изчислителни блокове, един и същи
кеш и регистри. Предимството е, че блоковете нямат идея, че изпълняват
части от различни нишки, грешките в предсказването намаляват драстично
- макар и да не изчезват, са по-редки и не толкова фатални, че да
има нужда от повторно подреждане на данните - просто ще се изпълняват
инструкциите на другото приложение, а блоковете изчисляват паралелно
инструкции на повече от една нишка. По този начин (при положение,
че средната предсказуемост се приеме за 50%, макар практиката да
показва други цифри) се подобрява значително скоростта на изчисление.
Дори когато има множество пропуски при извличането на данните се
получава далеч по плътен поток данни за изчисление, а още повече
- осигурява се едновремена обработка на два процеса, което иначе
може да получим само с два физически процесора. С други думи така
се уплътнява свободната изчислителна мощ на един процесор. Именно
това бе причината тази технология първо да бъде възприета при многопроцесорните
Xeon. Двойно подобрение естествено не може да има, все пак не говорим
за два процесора, нали (а няма, дори на теория няма такова). Най-големия
минус обаче остават споделените ресурси. Такива са както изчислителните
блокове, така и кеша и дори потока данни към процесора. И докато
последния трудно би могъл дабъде иззет изцяло от едно приложение,
освен в случаите по-долу, пречка (и то каква) е неправилното използване
на наличните ресурси от само един процес. Проблеми идват от това,
че се разчита на коректната работа на приложенията, но това не пречи
на един процес да изземе всички налични ресурси в даден момент.
При това положение се получава познатата от работата на процесор
с едно логическо ядро производителност - всички празнини (пропуски
при предсказването на преходите) в конвейра водят до изхабяване
на изчислителна мощ, както и до неизпълнение на втората нишка. НТ
процесорите не използват функцията със задаването на определено
време на даден процес, след което превключват на втори и т.н. по
простата причина, че изпълняват два едновременно. Както може да
се досетите за да се получат опчти идеални условия двата изпълними
процеса трябва да имат поравно разпределено време (или различно
разпределено според изискванията - един от тях може да изисква повече
ресурси). Проблем две - използването на един и същи кеш и регистри
- когато един процес отнеме всички ресурси отново се спира или забавя
изпълнението на втория.
При всички положения се оказва, че Intel са заложили на правилната
архитектура, но тя е много зависима от приложенията, които използвате
- при много от тях може да доведе до забавяне спрямо процесор без
НТ, но при оптимизираните (или да ги наречем коректно написани)
такива води до осезаем прираст в производителността. Без да се замислям
отново ще дам Cinema4D като пример за подобно приложение - използването
на НТ при рендериране с тази програма води най-често до над 20-25%
прираст в производителността! Да се надяваме, че това няма да е
изолиран случай и приложенията масово ще започнат да се възползват
от внедрената от Интел технология (вече има дори игри с включена
съответната оптимизация).
<<Назад<<
>>Следва>>
OldNavy
|
|
|