Работоспособность технологии Hyper-Threading в играх. Еще раз о Hyper-Threading

Программы 07.01.2024
Программы

В прошлом мы рассказывали о технологии одновременной многопоточности (Simultaneous Multi-Threading - SMT), которая применяется в процессорах Intel. И хотя первоначально она создавалась под кодовым именем "технология Джексона" (Jackson Technology) как возможный, вероятный вариант, Intel официально анонсировала свою технологию на форуме IDF прошлой осенью. Кодовое имя Jackson было заменено более подходящим Hyper-Threading. Итак, для того чтобы разобраться, как работает новая технология, нам нужны кое-какие первоначальные знания. А именно, нам нужно знать, что такое поток, как выполняются эти потоки. Почему работает приложение? Как процессор узнает, какие операции и над какими данными он должен совершать? Вся эта информация содержится в откомпилированном коде выполняемого приложения. И как только приложение получает от пользователя какую-либо команду, какие-либо данные, – процессору сразу же отправляются потоки, в результате чего он и выполняет то, что должен выполнить в ответ на запрос пользователя. С точки зрения процессора, поток – это набор инструкций, которые необходимо выполнить. Когда в вас попадает снаряд в Quake III Arena, или когда вы открываете документ Microsoft Word, процессору посылается определенный набор инструкций, которые он должен выполнить.

Процессор точно знает, где брать эти инструкции. Для этой цели предназначен редко упоминаемый регистр, называемый счетчиком команд (Program Counter, PC). Этот регистр указывает на место в памяти, где хранится следующая для выполнения команда. Когда поток отправляется на процессор, адрес памяти потока загружается в этот счетчик команд, чтобы процессор знал, с какого именно места нужно начать выполнение. После каждой инструкции значение этого регистра увеличивается. Весь этот процесс выполняется до завершения потока. По окончании выполнения потока, в счетчик команд заносится адрес следующей инструкции, которую нужно выполнить. Потоки могут прерывать друг друга, при этом процессор запоминает значение счетчика команд в стеке и загружает в счетчик новое значение. Но ограничение в этом процессе все равно существует – в каждую единицу времени можно выполнять лишь один поток.

Существует общеизвестный способ решения данной проблемы. Заключается он в использовании двух процессоров – если один процессор в каждый момент времени может выполнять один поток, то два процессора за ту же единицу времени могут выполнять уже два потока. Отметим, что этот способ не идеален. При нем возникает множество других проблем. С некоторыми, вы уже, вероятно, знакомы. Во-первых, несколько процессоров всегда дороже, чем один. Во-вторых, управлять двумя процессорами тоже не так-то просто. Кроме того, не стоит забывать о разделении ресурсов между процессорами. Например, до появления чипсета AMD 760MP, все x86 платформы с поддержкой многопроцессорности разделяли всю пропускную способность системной шины между всеми имеющимися процессорами. Но основной недостаток в другом – для такой работы и приложения, и сама операционная система должны поддерживать многопроцессорность. Способность распределить выполнение нескольких потоков по ресурсам компьютера часто называют многопоточностью. При этом и операционная система должна поддерживать многопоточность. Приложения также должны поддерживать многопоточность, чтобы максимально эффективно использовать ресурсы компьютера. Не забывайте об этом, когда мы будем рассматривать ещё один подход решения проблемы многопоточности, новую технологию Hyper-Threading от Intel.

Производительности всегда мало

Об эффективности всегда много говорят. И не только в корпоративном окружении, в каких-то серьезных проектах, но и в повседневной жизни. Говорят, homo sapiens лишь частично задействуют возможности своего мозга. То же самое относится и к процессорам современных компьютеров.

Взять, к примеру, Pentium 4. Процессор обладает, в общей сложности, семью исполнительными устройствами, два из которых могут работать с удвоенной скоростью – две операции (микрооперации) за такт. Но в любом случае, вы бы не нашли программы, которая смогла бы заполнить инструкциями все эти устройства. Обычные программы обходятся несложными целочисленными вычислениями, да несколькими операциями загрузки и хранения данных, а операции с плавающей точкой остаются в стороне. Другие же программы (например, Maya) главным образом загружают работой устройства для операций с плавающей точкой.

Чтобы проиллюстрировать ситуацию, давайте вообразим себе процессор с тремя исполнительными устройствами: арифметико-логическим (целочисленным – ALU), устройством для работы с плавающей точкой (FPU), и устройством загрузки/хранения (для записи и чтения данных из памяти). Кроме того, предположим, что наш процессор может выполнять любую операцию за один такт и может распределять операции по всем трем устройствам одновременно. Давайте представим, что к этому процессору на выполнение отправляется поток из следующих инструкций:

Рисунок ниже иллюстрирует уровень загруженности исполнительных устройств (серым цветом обозначается незадействованное устройство, синим – работающее устройство):

Итак, вы видите, что в каждый такт используется только 33% всех исполнительных устройств. В этот раз FPU остается вообще незадействованным. В соответствии с данными Intel, большинство программ для IA-32 x86 используют не более 35% исполнительных устройств процессора Pentium 4.

Представим себе ещё один поток, отправим его на выполнение процессору. На этот раз он будет состоять из операций загрузки данных, сложения и сохранения данных. Они будут выполняться в следующем порядке:

И снова загруженность исполнительных устройств составляет лишь на 33%.

Хорошим выходом из данной ситуации будет параллелизм на уровне инструкций (Instruction Level Parallelism - ILP). В этом случае одновременно выполняются сразу нескольких инструкций, поскольку процессор способен заполнять сразу несколько параллельных исполнительных устройств. К сожалению, большинство x86 программ не приспособлены к ILP в должной степени. Поэтому приходится изыскивать другие способы увеличения производительности. Так, например, если бы в системе использовалось сразу два процессора, то можно было бы одновременно выполнять сразу два потока. Такое решение называется параллелизмом на уровне потоков (thread-level parallelism, TLP). К слову сказать, такое решение достаточно дорогое.

Какие же ещё существуют способы увеличения исполнительной мощи современных процессоров архитектуры x86?

Hyper-Threading

Проблема неполного использования исполнительных устройств связана с несколькими причинами. Вообще говоря, если процессор не может получать данные с желаемой скоростью (это происходит в результате недостаточной пропускной способности системной шины и шины памяти), то исполнительные устройства будут использоваться не так эффективно. Кроме того, существует ещё одна причина – недостаток параллелизма на уровне инструкций в большинстве потоков выполняемых команд.

В настоящее время большинство производителей улучшают скорость работы процессоров путем увеличения тактовой частоты и размеров кэша. Конечно, таким способом можно увеличить производительность, но все же потенциал процессора не будет полностью задействован. Если бы мы могли одновременно выполнять несколько потоков, то мы смогли бы использовать процессор куда более эффективно. Именно в этом и заключается суть технологии Hyper-Threading.

Hyper-Threading – это название технологии, существовавшей и ранее вне x86 мира, технологии одновременной многопоточности (Simultaneous Multi-Threading, SMT). Идея этой технологии проста. Один физический процессор представляется операционной системе как два логических процессора, и операционная система не видит разницы между одним SMT процессором или двумя обычными процессорами. В обоих случаях операционная система направляет потоки как на двухпроцессорную систему. Далее все вопросы решаются на аппаратном уровне.

В процессоре с Hyper-Threading каждый логический процессор имеет свой собственный набор регистров (включая и отдельный счетчик команд), а чтобы не усложнять технологию, в ней не реализуется одновременное выполнение инструкций выборки/декодирования в двух потоках. То есть такие инструкции выполняются поочередно. Параллельно же выполняются лишь обычные команды.

Официально технология была объявлена на форуме Intel Developer Forum прошлой осенью. Технология демонстрировалась на процессоре Xeon, где проводился рендеринг с помощью Maya. В этом тесте Xeon с Hyper-Threading показал на 30% лучшие результаты, чем стандартный Xeon. Приятный прирост производительности, но больше всего интересно то, что технология уже присутствует в ядрах Pentium 4 и Xeon, только она выключена.

Технология пока ещё не выпущена, однако те из вас, кто приобрел 0,13 мкм Xeon, и установил этот процессор на платы с обновленным BIOS, наверняка были удивлены, увидев в BIOS опцию включения/отключения Hyper-Threading.

А пока Intel будет оставлять опцию Hyper-Threading отключенной по умолчанию. Впрочем, для ее включения достаточно просто обновить BIOS. Все это касается рабочих станций и серверов, что же до рынка персональных компьютеров, в ближайшем будущем у компании планов касательно этой технологии не имеется. Хотя возможно, производители материнских плат предоставят возможность включить Hyper-Threading с помощью специального BIOS.

Остается очень интересный вопрос, почему Intel хочет оставить эту опцию выключенной?

Углубляемся в технологию

Помните те два потока из предыдущих примеров? Давайте на этот раз предположим, что наш процессор оснащен Hyper-Threading. Посмотрим, что получится, если мы попытаемся одновременно выполнить эти два потока:

Как и ранее, синие прямоугольники указывают на выполнение инструкции первого потока, а зеленые - на выполнение инструкции второго потока. Серые прямоугольники показывают незадействованные исполнительные устройства, а красные - конфликт, когда на одно устройство пришло сразу две разных инструкции из разных потоков.

Итак, что же мы видим? Параллелизм на уровне потоков дал сбой – исполнительные устройства стали использоваться ещё менее эффективно. Вместо параллельного выполнения потоков, процессор выполняет их медленнее, чем если бы он выполнял их без Hyper-Threading. Причина довольно проста. Мы пытались одновременно выполнить сразу два очень похожих потока. Ведь оба они состоят из операций по загрузке/сохранению и операций сложения. Если бы мы параллельно запускали "целочисленное" приложение и приложение, работающее с плавающей точкой, мы бы оказались куда в лучшей ситуации. Как видим, эффективность Hyper-Threading сильно зависит от вида нагрузки на ПК.

В настоящий момент, большинство пользователей ПК используют свой компьютер примерно так, как описано в нашем примере. Процессор выполняет множество очень схожих операций. К сожалению, когда дело доходит до однотипных операций, возникают дополнительные сложности с управлением. Случаются ситуации, когда исполнительных устройств нужного типа уже не осталось, а инструкций, как назло, вдвое больше обычного. В большинстве случаев, если бы процессоры домашних компьютеров использовали технологию Hyper-Threading, то производительность бы от этого не увеличилась, а может быть, даже снизилась на 0-10%.

На рабочих же станциях возможностей для увеличения производительности у Hyper-Threading больше. Но с другой стороны, все зависит от конкретного использования компьютера. Рабочая станция может означать как high-end компьютер для обработки 3D графики, так и просто сильно нагруженный компьютер.

Наибольший же прирост в производительности от использования Hyper-Threading наблюдается в серверных приложениях. Главным образом это объясняется широким разнообразием посылаемых процессору операций. Сервер баз данных, использующих транзакции, может работать на 20-30% быстрее при включенной опции Hyper-Threading. Чуть меньший прирост производительности наблюдается на веб-серверах и в других сферах.

Максимум эффективности от Hyper-Threading

Вы думаете, Intel разработала Hyper-Threading только лишь для своей линейки серверных процессоров? Конечно же, нет. Если бы это было так, они бы не стали впустую тратить место на кристалле других своих процессоров. По сути, архитектура NetBurst, использующаяся в Pentium 4 и Xeon, как нельзя лучше подходит для ядра с поддержкой одновременной многопоточности. Давайте ещё раз представим себе процессор. На этот раз в нем будет ещё одно исполнительное устройство – второе целочисленное устройство. Посмотрим, что случится, если потоки будут выполняться обоими устройствами:

С использованием второго целочисленного устройства, единственный конфликт случился только на последней операции. Наш теоретический процессор в чем-то похож на Pentium 4. В нем имеется целых три целочисленных устройства (два ALU и одно медленное целочисленное устройство для циклических сдвигов). А что ещё более важно, оба целочисленных устройства Pentium 4 способны работать с двойной скоростью – выполнять по две микрооперации за такт. А это, в свою очередь, означает, что любое из этих двух целочисленных устройств Pentium 4/Xeon могло выполнить те две операции сложения из разных потоков за один такт.

Но это не решает нашей проблемы. Было бы мало смысла просто добавлять в процессор дополнительные исполнительные устройства с целью увеличения производительности от использования Hyper-Threading. С точки зрения занимаемого на кремнии пространства это было бы крайне дорого. Вместо этого, Intel предложила разработчикам оптимизировать программы под Hyper-Threading.

Используя инструкцию HALT, можно приостановить работу одного из логических процессоров, и тем самым увеличить производительность приложений, которые не выигрывают от Hyper-Threading. Итак, приложение не станет работать медленнее, вместо этого один из логических процессоров будет остановлен, и система будет работать на одном логическом процессоре – производительность будет такой же, что и на однопроцессорных компьютерах. Затем, когда приложение сочтет, что от Hyper-Threading оно выиграет в производительности, второй логический процессор просто возобновит свою работу.

На веб-сайте Intel имеется презентация , описывающая, как именно необходимо программировать, чтобы извлечь из Hyper-Threading максимум выгоды.

Выводы

Хотя мы все были крайне обрадованы, когда до нас дошли слухи об использовании Hyper-Threading в ядрах всех современных Pentium 4/Xeon, все же это не будет бесплатной производительностью на все случаи жизни. Причины ясны, и технологии предстоит преодолеть ещё многое, прежде чем мы увидим Hyper-Threading, работающую на всех платформах, включая домашние компьютеры. А при поддержке разработчиков, технология определенно может оказаться хорошим союзником Pentium 4, Xeon, и процессорам будущего поколения от Intel.

При существующих ограничениях и при имеющейся технологии упаковки, Hyper-Threading кажется более разумным выбором для потребительского рынка, чем, например, подход AMD в SledgeHammer – в этих процессорах используется целых два ядра. И до тех пор, пока не станут совершенными технологии упаковки, такие как Bumpless Build-Up Layer , стоимость разработки многоядерных процессоров может оказаться слишком высокой.

Интересно заметить, насколько разными стали AMD и Intel за последние несколько лет. Ведь когда-то AMD практически копировала процессоры Intel. Теперь же компании выработали принципиально иные подходы к будущим процессорам для серверов и рабочих станций. AMD на самом деле проделала очень длинный путь. И если в процессорах Sledge Hammer действительно будут использоваться два ядра, то по производительности такое решение будет эффективнее, чем Hyper-Threading. Ведь в этом случае кроме удвоения количества всех исполнительных устройств снимаются проблемы, которые мы описали выше.

Hyper-Threading ещё некоторое время не появится на рынке обычных ПК, но при хорошей поддержке разработчиков, она может стать очередной технологией, которая опустится с серверного уровня до простых компьютеров.

15.03.2013

Технология Hyper-Threading появилась в процессорах Intel, страшно сказать, уже больше 10 лет назад. И в данный момент она является важным элементов процессоров Core. Однако вопрос в необходимости HT в играх все еще до конца не понятен. Мы решили провести тест, чтобы понять, нужен ли геймерам Core i7, или лучше обойтись Core i5. А также выяснить насколько Core i3 лучше Pentium.


Hyper-Threading Technology, разработанная компанией Intel, и эксклюзивно используемая в процессорах компании, начиная с достопамятного Pentium 4, в данный момент является чем-то само собой разумеющимся. Ею оснащено значительное число процессоров текущего и предыдущих поколений. Будет она использоваться и в ближайшем будущем.

И необходимо признать, что технология Hyper-Threading полезна, и позитивно влияет на производительность, иначе Intel не стала бы использовать ее для позиционирования своих процессоров внутри линейки. Причем не как второстепенный элемент, а один из важнейших, если не самый важный. Чтобы было понятно, о чем мы говорим, мы подготовили табличку, которая позволяет легко оценить принцип сегментирования процессоров Intel.


Как видите отличий между Pentium и Core i3, а также между Core i5 и Core i7 совсем мало. Фактически модели i3 и i7, отличаются от Pentium и i5 только размером кэша третьего уровня приходящимся на одного ядро (не считая тактовой частоты, конечно). У первой пары это 1,5 мегабайта, а у второй – 2 мегабайта. Это отличие не может коренным образом повлиять на производительность процессоров, так как разница в объеме кэша сильно мала. Именно поэтому Core i3 и Core i7 получили поддержку технологии Hyper-Threading, которая и является главным элементом, позволяющим этим процессорам иметь преимущество в производительности над Pentium и Core i5, соответсвенно.

В итоге чуть больший кэш и поддержка Hyper-Threading позволят выставлять значительно более высокие цены на процессоры. Для примера процессоры линейки Pentium (около 10 тыс. тенге) примерно в два раза дешевле, чем Core i3 (около 20 тыс. тенге), и это притом, что физически, на аппаратном уровне они абсолютно одинаковы, и, соответсвенно, имеют одинаковую себестоимость. Разница в цене между Core i5 (около 30 тыс. тенге) и Core i7 (около 50 тыс. тенге) также очень велика, хоть и меньше двух крат в младших моделях.


Насколько обоснована такая прибавка в цене? Какой реальный прирост дает Hyper-Threading? Ответ давно известен: прирост бывает разный – все зависит от приложения и его оптимизации. Мы решили проверить, что дает HT в играх, как одним из самых требовательных “бытовых” приложений. К тому же данный тест будет отличным дополнением к нашему предыдущему материалу посвященному влиянию количества ядер в процессоре на игровую производительность .

Перед тем как переходить к тестам, давайте вспомним (ну или узнаем), что такое Hyper-Threading Technology. Как высказывалась сама Intel, представляя данную технологию много лет назад, ничего особенно сложного в ней нет. Фактически, все что нужно для внесения HT на физическом уровне – это добавление к одному физическому ядру не одного набора регистров и контроллера прерываний, а двух. В процессорах Pentium 4 эти дополнительные элементы увеличивали количество транзисторов всего на пять процентов. В современных ядрах Ivy Bridge (равно как и в Sandy Bridge, и будущем Haswell) дополнительные элементы даже для четырех ядер не увеличивают кристалл даже на 1 процент.


Дополнительные регистры и контроллер прерываний, вкупе с программной поддержкой позволяют операционной системе видеть не одно физическое ядро, а два логических. При этом обработка данных двух потоков, которые отправляются системой все также идет на одном ядре, но с некоторыми особенностями. В распоряжении одного потока все также остается весь процессор, но как только какие-то блоки CPU освобождаются и простаивают, то они тут, же отдаются в распоряжение второго потока. Благодаря этому удалось задействовать все блоки процессора одновременно, и тем самым увеличить его эффективность. Как заявляла сама Intel, прирост производительности в идеальных условиях может доходить до 30 процентов. Правда, данные показатели верны только для Pentium 4 с его очень длинным конвейером, у современных процессоров выгода от HT меньше.

Но идеальные условия для Hyper-Threading бывают далеко не всегда. И что самое важное – худший результат работы HT – это не отсутствие прироста производительности, а ее снижение. То есть при определенных условиях, производительность процессора с HT будет падать относительно процессора без HT из-за того, что накладные расходы на разделение потоков и организацию очереди будут значительно превышать прирост от обсчета параллельных потоков, который возможен в данном конкретном случае. И такие случаи встречаются гораздо чаще, чем хотелось бы Intel. Причем многие годы использования Hyper-Threading не улучшили ситуацию. Особенно это касается игр, весьма сложных и отнюдь нешаблонных с точки зрения обсчета данных, приложений.

Для того чтобы выяснить влияние Hyper-Threading на игровую производительность, мы вновь использовали наш многострадальный тестовый процессор Core i7-2700K, и симулировали с помощью отключения ядер и включения/выключения HT, сразу четыре процессора. Условно их можно назвать Pentium (2 ядра, HT выключен), Core i3 (2 ядра, HT включен), Core i5 (4 ядра, HT выключен), и Core i7 (4 ядра, HT включен). Почему условно? Прежде всего, потому, что по некоторым характеристикам они не соответствуют реальным продуктам. В частности отключение ядер не ведет к соответствующему урезанию объема кэша третьего уровня – его объем для всех равен 8 мегабайтам. А, кроме того, все наши “условные” процессоры работают на одинаковой частоте 3,5 гигагерца, которая пока достигнута не всеми процессорами линейки Intel.


Впрочем, это даже к лучшему, так как благодаря неизменности всех важных параметров мы сможем выяснить реальное влияние Hyper-Threading на игровую производительность без каких-либо оговорок. Да и процентная разница в производительности между нашими “условными” Pentium и Core i3 будет близка к разнице между реальными процессорами при условии равных частот. Также не должно смущать то, что мы используем процессор с архитектурой Sandy Bridge, так как наши тесты эффективности, о которых вы можете прочитать в статье “Голая производительность - Исследуем эффективность ALU и FPU ”, показали, что влияние Hyper-Threading в последних поколениях процессоров Core остается неизменным. Скорее всего, актуальным данный материал окажется и для грядущих процессоров Haswell.

Ну что же, вроде все вопросы относительно методики тестирования, а также особенностей функционирования Hyper-Threading Technology обсуждены, а потому пора переходить к самому интересному – тестам.

Еще в тесте, в котором мы изучали влияние количества процессорных ядер на игровую производительность, мы выяснили, что 3DMark 11 совершенно спокойно относится к производительности CPU, отлично работая даже на одном ядре. Такое же “мощное” влияние оказал и Hyper-Threading. Как видите, тест абсолютно не замечает различий между Pentium и Core i7, не говоря уже о промежуточных моделях.

Metro 2033

А вот Metro 2033 явно заметила появление Hyper-Threading. И отреагировала на него негативно! Да, именно так: включение HT в данной игре оказывает негативное влияние на производительность. Небольшое влияние, конечно – 0,5 кадра в секунду при четырех физических ядрах, и 0,7 при двух. Но этот факт дает все основания заявить, что в Metro 2033 Pentium быстрее, чем Core i3, а Core i5 лучше, чем Core i7. Вот оно подтверждение того факта, что Hyper-Threading показывает свою эффективность не всегда и не везде.

Crysis 2

Эта игра показала очень интересные результаты. Прежде всего, отметим, что влияние Hyper-Threading хорошо заметно в двуядерных процессорах – Core i3 опередил Pentium почти на 9 процентов, что для этой игры совсем немало. Победа HT и Intel? Не совсем, так как Core i7 не показал никакого прироста относительно заметно более дешевого Core i5. Но этому есть разумное объяснение – Crysis 2 не умеет использовать больше четырех потоков данных. Из-за этого мы видим хороший прирост у двуядерника с HT – все же лучше четыре потока, хоть и логических, чем два. С другой стороны, дополнительные потоки Core i7 девать уже было некуда, там вполне хватало четырех физических ядер. Так что по результатам данного теста можно отметить положительное влияние HT в Core i3, который здесь заметно лучше Pentium. А вот среди четырехядерников Core i5 вновь выглядит более разумным решением.

Battlefield 3

Здесь результаты очень странные. Если в тесте на количество ядер, battlefield был образцом микроскопического, но линейного прироста, то включение Hyper-Threading внесло в результаты хаос. По факту можно констатировать, что Core i3, со своими двумя ядрами и HT оказался лучшим из всех, опередив даже Core i5 и Core i7. Странно, конечно, но, в то же время, Core i5 и Core i7 вновь оказались на одном уровне. Чем это объясняется не ясно. Скорее всего тут сыграла свою роль методика тестирования в этой игре, которая дает большие погрешности, нежели стандартные бенчмарки.

В прошлом тесте F1 2011 проявила себя как одна из игр, очень критично относящихся к количеству ядер, а в этом вновь удивила отменным влиянием на производительность технологии Hyper-Threading. Причем вновь, как и в Crysis 2, очень хорошо включение HT показало себя на двуядерных процессорах. Посмотрите на разницу между нашими условными Core i3 и Pentium – она более чем двукратная! Явно видно, что игре очень сильно не хватает двух ядер, и при этом ее код так хорошо распараллеливается, что эффект получился потрясающим. С другой стороны, против четырех физических ядер не попрешь – Core i5 заметно быстрее Core i3. А вот Core i7, вновь, как и в предыдущих играх не показал ничего выдающегося на фоне Core i5. Причина все та же – игра не умеет использовать больше 4 потоков, а накладные расходы на работу HT снижают производительность Core i7 ниже уровня Core i5.

Старому вояке Hyper-Threading не нужнее, чем ежу футболка – его влияние отнюдь не так ярко заметно как в F1 2011 или Crysis 2. При этом все же отметим, что 1 лишний кадр включение HT на двуядерном процессоре принесло. Этого конечно маловато, чтобы сказать, что Core i3 лучше, чем Pentium. По крайней мере, это улучшение явно не соответствует разнице в цене этих процессоров. А уж о разнице в цене между Core i5 и Core i7 даже вспоминать не стоит, так как процессор без поддержки HT вновь оказался быстрее. Причем заметно быстрее – на 7 процентов. Как ни крути, а вновь констатируем факт, что четыре потока это максимум для этой игры, а потому HyperThreading в данном случае не помогает Core i7, а мешает.

Одним из важнейших элементов в позиционировании процессоров Intel внутри линеек, является технология Hyper-Threading . А точнее, ее отсутствие в процессоре, или наличие. За что же отвечает эта технология? Intel Hyper-Threading , это технология для эффективного использования ресурсов ядер процессора (CPU), позволяя одновременно обрабатывать несколько потоков на одно ядро.

Попробуем привести пример аналогичной системы из жизни. Представьте себе пограничный пост с контролем каждой машины, множеством таможенников и одной полосой на подъезд для автомобилей. Скапливается пробка, процесс тормозится сам по себе даже вне зависимости от скорости работы сотрудников. А учитывая, что полоса одна, то половина сотрудников просто скучает. И тут внезапно открывают еще одну полосу для автотранспорта и автомобили начинают подъезжать в два потока. Скорость работы увеличивается, свободные сотрудники начинают работать, а пробка из желающих пересечь границу становится значительно меньше. Как итог, не увеличивая размеров таможни и количества сотрудников, увеличилась пропускная способность и эффективность работы одного поста.

Даже самое мощное процессорное ядро должно получать информацию без задержек, чтобы оперативно обрабатывать ее. Как только на входе образуется «пробка» из данных, процессор начинает простаивать, ожидая, когда же до него дойдет та, или иная информация для обработки.

Чтобы избежать этого, в далеком 2002 году появилась технология Hyper-Threading , которая имитировала появление второго ядра в системе, благодаря чему, заполнение мощностей ядра происходило оперативней.

Как показала практика, мало кто знает, как на самом деле работает технология Intel Hyper-Threading . Большинство уверено, что у них в процессоре просто живет несколько дополнительных виртуальных ядер. Но на самом деле, количество ядер не изменяется, изменяется именно количество потоков, и это критически важно. Просто у каждого ядра появляется дополнительный канал ввода-вывода информации. Ниже видео, как оно работает на самом деле.

Как же устроена технология HT, и откуда берутся дополнительные потоки? На самом деле, все достаточно просто. Для реализации этой технологии, к каждому ядру дополняется один контроллер и набор регистров. Таким образом, как только поток данных становится больше, чем пропускная способность одного канала, подключается второй канал. Таким образом, устраняется простой незадействованных блоков процессора.

В эпоху одноядерных процессоров (Intel Pentium 4), технология HT стала спасением для тех, кто не мог купить более дорогой процессор (Pentium D). Но сегодня известны случаи снижения производительности при активации HT. Почему так происходит? Все довольно просто. Для распараллеливания данных, и правильной обработки процесса тоже уходят некоторые мощности процессора. И как только физических ядер становится достаточно для обработки информации без простоя блоков, производительность немного снижается из-за отобранных технологией HT ресурсов. Поэтому самый худший вариант работы Hyper-Threading, это не отсутствие увеличения производительности, а ее снижение. Но на практике такое случается очень редко.

С выходом восьмитысячной линейки процессоров Intel семейства Core, этот вопрос стал особенно актуален – а нужен ли Hyper-Threading вообще? Ведь даже процессоры Core i5 несут в себе полноценные шесть ядер. Если не говорить о профессиональных приложениях по обработке графики, рендеринге и т.д., то есть вероятность, что шесть физических ядер хватит на все офисные приложения и игры. Поэтому, если изначально считалось, что технология HT прибавляет процессору до 30% производительности, то теперь это не аксиома, и все будет зависеть от вашего стиля работы за компьютером и набора пользуемых утилит.

Разумеется, текст был бы неполным без тестирования. Поэтому мы возьмём имеющиеся у нас процессоры Intel Core i7 8700K и 7700K , и проверим в нескольких играх и приложениях производительность процессоров с активированным Hyper-Threading , и деактивированным. По итогу тестирования станет понятно, в каких приложениях виртуальные ядра добавляют производительности, а в каких остаются незамеченными.

Популярный 3DMark не особо охотно откликается на увеличение ядер и потоков. Прирост есть, но он ничтожный.

В различного рода вычислениях и обработке ядра и потоки всегда рулили. Здесь Hyper-Threading просто необходим, он очень сильно увеличивает производительность.

В играх ситуация проще. В большинстве случаев увеличение количества потоков не дает результатов, т.е. играм достаточно 4 физических ядер, а в большинстве случаев, даже меньше. Исключение составил лишь GTA5, которая очень хорошо отозвалась на отключение НТ, и прибавила 7% производительности, и только на шестиядерном процессоре 8700К. Отключение многопоточности на 7700К не дало никаких результатов. Мы несколько раз перепрогнали бенчмарки и результаты были неизменны. Но это скорее исключение из правил. Все протестированные игр легко довольствуются четырьмя ядрами.

Одним из важнейших элементов в позиционировании процессоров Intel внутри линеек, является технология Hyper-Threading. А точнее, ее отсутствие в процессоре, или наличие. За что же отвечает эта технология? Intel Hyper-Threading, это технология для эффективного использования ресурсов ядер процессора (CPU), позволяя одновременно обрабатывать несколько потоков на одно ядро. Попробуем привести пример аналогичной системы из жизни. Представьте себе пограничный пост с контролем каждой машины, множеством таможенников и одной полосой на подъезд для автомобилей. Скапливается пробка, процесс тормозится сам по себе даже вне зависимости от скорости работы сотрудников. А учитывая, что полоса одна, то половина сотрудников просто скучает. И тут внезапно открывают еще одну полосу для автотранспорта и автомобили начинают подъезжать в два потока. Скорость работы увеличивается, свободные сотрудники начинают работать, а пробка из желающих пересечь границу становится значительно меньше. Как итог, не увеличивая размеров таможни и количества сотрудников, увеличилась пропускная способность и эффективность работы одного поста. Даже самое мощное процессорное ядро должно получать информацию без задержек, чтобы оперативно обрабатывать ее. Как только на входе образуется «пробка» из данных, процессор начинает простаивать, ожидая, когда же до него дойдет та, или иная информация для обработки. Чтобы избежать этого, в далеком 2002 году появилась технология Hyper-Threading, которая имитировала появление второго ядра в системе, благодаря чему, заполнение мощностей ядра происходило оперативней. Как показала практика, мало кто знает, как на самом деле работает технология Intel Hyper-Threading. Большинство уверено, что у них в процессоре просто живет несколько дополнительных виртуальных ядер. Но на самом деле, количество ядер не изменяется, изменяется именно количество потоков, и это критически важно. Просто у каждого ядра появляется дополнительный канал ввода-вывода информации. Ниже видео, как оно работает на самом деле. Как же устроена технология HT, и откуда берутся дополнительные потоки? На самом деле, все достаточно просто. Для реализации этой технологии, к каждому ядру дополняется один контроллер и набор регистров. Таким образом, как только поток данных становится больше, чем пропускная способность одного канала, подключается второй канал. Таким образом, устраняется простой незадействованных блоков процессора. В эпоху одноядерных процессоров (Intel Pentium 4), технология HT стала спасением для тех, кто не мог купить более дорогой процессор (Pentium D). Но сегодня известны случаи снижения производительности при активации HT. Почему так происходит? Все довольно просто. Для распараллеливания данных, и правильной обработки процесса тоже уходят некоторые мощности процессора. И как только физических ядер становится достаточно для обработки информации без простоя блоков, производительность немного снижается из-за отобранных технологией HT ресурсов. Поэтому самый худший вариант работы Hyper-Threading, это не отсутствие увеличения производительности, а ее снижение. Но на практике такое случается очень редко. С выходом восьмитысячной линейки процессоров Intel семейства Core, этот вопрос стал особенно актуален – а нужен ли Hyper-Threading вообще? Ведь даже процессоры Core i5 несут в себе полноценные шесть ядер. Если не говорить о профессиональных приложениях по обработке графики, рендеринге и т.д., то есть вероятность, что шесть физических ядер хватит на все офисные приложения и игры. Поэтому, если изначально считалось, что технология HT прибавляет процессору до 30% производительности, то теперь это не аксиома, и все будет зависеть от вашего стиля работы за компьютером и набора пользуемых утилит. Разумеется, текст был бы…

Здравствуйте любители компов и железа.

Хотели бы вы в своем компьютере иметь высокопроизводительный процессор, молниеносно выполняющий много задач одновременно? Кто бы отказался, верно? Тогда предлагаю вам познакомиться с технологией hyper threading: что это и как действует, вы узнаете из данной статьи.


Объяснение понятия

Hyper-threading переводится с английского как «гиперточность». Такое громкое название технология получила не просто так. Ведь оснащенный ею один физический процессор операционная система принимает за два логических ядра. Следовательно, обрабатывается больше команд, а производительность при этом не падает.

Как такое возможно? Благодаря тому, что процессор:

  • Сохраняет информацию сразу о нескольких выполняемых потоках;
  • На каждый логический проц приходится по одному набору регистров - блоков быстрой внутренней памяти, а также по одному блоку прерываний. Последний отвечает за последовательное выполнение запросов от разных устройств.

Как это выглядит на деле? Допустим, сейчас физический процессор обрабатывает команды первого логического проца. Но в последнем произошел какой-то сбой, и ему, к примеру, нужно подождать данные из памяти. Физический не будет терять время зря и сразу переключится на второй логический процессор.

О повышении производительности

КПД физического проца, как правило, составляет не более 70 %. Почему? Часто некоторые блоки просто не нужны для осуществления той или иной задачи. К примеру, когда CPU выполняет банальные вычислительные действия, блок инструкций и SIMD расширения не задействованы. Бывает, что происходит сбой в модуле предсказания переходов или при обращении к кэшу.

В подобных ситуациях Hyper-threading заполняет «пробелы» другими задачами. Таким образом, эффективность технологии заключается в том, что полезная работа не простаивает и отдается бездействующим устройствам.

Появление и реализация

Можно считать, что Hyper-threading уже отметила 15-летний юбилей. Ведь она разработана на базе технологии суперпоточности (англ. super-threading), которая выпущена в 2002 году и впервые начала работу в продуктах Xeon, затем в том же году была интегрирована в Pentium 4. Авторское право на эти технологии принадлежит компании Intel.

HT реализована в процессорах, работающих на микроархитектуре NetBurst, которая отличается высокими тактовыми частотами. Поддержка технологии внедрена в модели семейств Core vPro, M и Xeon. Однако в сериях Core 2 («Duo», «Quad») не интегрирована. Схожая по принципу действия технология реализована в процах Atom и Itanium.

Как включить ее? У вас должен быть не только один из вышеперечисленных процессоров, но также поддерживающая технологию операционная система и биос, в котором есть опция включения и выключения HT. Если ее нет, обновите BIOS.

Плюсы и минусы Hyper-threading

О некоторых преимуществах технологии вы уже могли сделать вывод из вышеизложенной информации. Добавлю к ним еще пару слов:

  • Стабильное действие нескольких программ параллельно;
  • Уменьшенное время отклика в процессе интернет-серфинга или работы с приложениями.

Как вы понимаете, не обошлось и без ложки дегтя. Прироста производительности может не быть по таким причинам:

  • Недостаточно кеш-памяти. Например, в 4-ядерных процессорах i7 кэша 8 Мб, но и логических ядер столько же. Получаем всего 1 Мб на ядро, чего для выполнения вычислительных задач большинству программ не хватает. Из-за этого производительность не просто стоит на месте, а даже падает.

  • Зависимость данных. Допустим, первый поток незамедлительно требует информацию со второго, но она еще не готова или стоит в очередь в другой поток. Также бывает, что циклическим данным нужны определенные блоки для быстрого выполнения задачи, но они уже заняты другой работой.
  • Перегрузка ядра. Случается, что ядро может быть уже чрезмерно нагружено, но, несмотря на это, модуль предсказания все равно посылает ему данные, вследствие чего компьютер начинает тормозить.

Где нужна Hyper-threading?

Технология будет полезна при использовании ресурсоемких программ: аудио-, видео- и фоторедакторов, игр, архиваторов. К ним можно отнести Photoshop, Maya, 3D’s Max, Corel Draw, WinRar и пр.

Важно, чтобы ПО было оптимизировано для работы с Hyper-threading. В противном случае могут возникать задержки. Дело в том, что проги считают логические ядра физическими, поэтому могут посылать разные задачи одному и тому же блоку.

Ждем вас в гостях моего блога.

"…И мы горды — и враг наш горд
Рука, забудь о лени. Посмотрим,
кто у чьих ботфорт в конце
концов склонит свои колени…"
© х/ф "Д"артаньян и три мушкетера"

Некоторое время назад автор позволил себе "слегка поворчать" по поводу новой парадигмы от Intel — Hyper Threading. К чести корпорации Intel, недоумение автора не осталось ею незамеченной. А посему автору предложили помощь в выяснении (как деликатно дали оценку менеджеры корпорации ) "настоящей" ситуации с технологией Hyper Threading. Ну что же — желание выяснить истину можно только похвалить. Не так ли, уважаемый читатель? По крайней мере, именно так звучит одна из прописных истин: правда — это хорошо . Что ж, будем стараться действовать в соответствии с данной фразой. Тем более, что действительно появилось некоторое количество новых сведений.

Для начала сформулируем, что же именно мы знаем про технологию Hyper Threading:

1. Данная технология предназначена для увеличения эффективности работы процессора. Дело в том, что, по оценкам Intel, большую часть времени работает всего 30% (кстати, достаточно спорная цифра — подробности ее вычисления неизвестны ) всех исполнительных устройств в процессоре. Согласитесь, это достаточно обидно. И то, что возникла идея каким-то образом "догрузить" остальные 70% — выглядит вполне логично (тем более что сам по себе процессор Pentium 4, в котором и внедрят эту технологию, отнюдь не страдает от избыточной производительности на мегагерц ). Так что эту идею автор вынужден признать вполне здравой.

2. Суть технологии Hyper Threading состоит в том, что во время исполнения одной "нити" программы простаивающие исполнительные устройства могут заняться исполнением другой "нити" программы (или "нити" другой программы ). Или, например, исполняя одну последовательность команд, ожидать данных из памяти для исполнения другой последовательности.

3. Естественно, выполняя различные "нити", процессор должен каким-либо образом отличать, какие команды к какой "нити" относятся. Значит, есть какой-то механизм (некая метка ), благодаря которой процессор отличает, к какой "нити" относятся команды.

4. Ясно также, что, учитывая небольшое количество регистров общего назначения в архитектуре х86 (всего 8 ), у каждой нити свой набор регистров. Впрочем, это уже давно не новость — данное ограничение архитектуры уже довольно давно обходится при помощи "переименования регистров". Другими словами, физических регистров намного больше, чем логических. В процессоре Pentium III их 40. Наверняка это число для Pentium 4 больше — у автора есть ничем не обоснованное (кроме соображений "симметрии" :-) мнение, что их порядка сотни. Никаких достоверных сведений об их количестве найти не удалось. По неподтвержденным пока данным, их 256 . По другим данным — другое число. В общем, полная неопределенность…. Кстати, позиция Intel по этому поводу совершенно непонятна:-(— автору непонятно, чем вызвана подобная секретность .

5. Также известно, что в случае, когда несколько "нитей" претендуют на одни и те же ресурсы, либо одна из "нитей" ждет данных — во избежание падения производительности программисту необходимо вставлять специальную команду — "pause". Естественно, это потребует очередной перекомпиляции программ.

6. Также понятно, что возможны ситуации, когда попытки одновременного исполнения нескольких "нитей" приведут к падению производительности. Например, из-за того, что размер кэша L2 не бесконечный, а активные "нити" будут пытаться загрузить кэш — возможна ситуация, когда такая "борьба за кэш" приведет к постоянной очистке и перезагрузке данных в кэше второго уровня.

7. Intel утверждает, что при оптимизации программ под данную технологию выигрыш будет составлять до 30%. (Вернее, Intel утверждает, что на сегодняшних серверных приложениях и сегодняшних системах до 30% ) Гм…. Это более чем достаточный стимул для оптимизации.

Ну что же, некоторые особенности мы сформулировали. Теперь давайте попробуем обдумать некоторые следствия (по возможности опираясь на известные нам сведения ). Что же можно сказать? Ну, во-первых, необходимо тщательнее разобраться, что же именно нам предлагают. Так ли "бесплатен" этот сыр? Для начала разберемся, как именно будет происходить "одновременная" обработка нескольких "нитей". Кстати, что подразумевает корпорация Intel под словом "нить"?

У автора сложилось впечатление (возможно, ошибочное ), что в данном случае имеется ввиду программный фрагмент, который мультизадачная операционная система назначает на исполнение одному из процессоров мультипроцессорной аппаратной системы. "Постойте!" — заявит внимательный читатель — "это же одно из определений! Что тут нового?". А ничего — в данном вопросе автор на оригинальность не претендует. Разобраться бы, что "наоригинальничала" Intel:-). Ну что же — примем в качестве рабочей гипотезы.

Далее — исполняется некоторая нить. Тем временем декодер команд (кстати, полностью асинхронный и не входящий в пресловутые 20 стадий Net Burst ) осуществляет выборку и дешифрацию (со всеми взаимозависимостями ) в микроинструкции . Здесь надо пояснить, что автор подразумевает под словом "асинхронный" — дело в том, что результат "разваливания" х86 команд в микроинструкции происходит в блоке дешифрации. Каждая команда х86 может быть декодирована в одну, две, или более микроинструкций. При этом на стадии обработки выясняются взаимозависимости, доставляются необходимые данные по системной шине. Соответственно, скорость работы этого блока часто будет зависеть от скорости доступа данных из памяти — и в худшем случае определяется именно ею. Было бы логично "отвязать" его от того конвейера, в котором, собственно, и происходит выполнение микроопераций. Это было сделано путем помещения блока дешифрации перед trace cache. Чего мы этим добиваемся? А добиваемся мы при помощи такой "перестановки блоков" местами простой вещи — если в trace cache есть микроинструкции для исполнения — процессор работает более эффективно. Естественно, этот блок работает на частоте процессора — в отличие от Rapid Engine. Кстати, у автора сложилось впечатление, что данный декодер представляет собой нечто вроде конвейера длиной до 10–15 стадий. Таким образом, от выборки данных из кэша до получения результата проходит, по всей видимости, порядка 30 — 35 стадий (включая конвейер Net Burst , см. Microdesign Resources August2000 Microprocessor report Volume14 Archive8, page12).

Полученный набор микроинструкций вместе со всеми взаимозависимостями накапливается в trace cache — в том самом, который приблизительно 12 000 микроопераций. По приблизительным оценкам источник такой оценки — строение микроинструкции P6; дело в том, что принципиально длина инструкций вряд ли кардинально поменялась (считая длину микроинструкции вместе со служебными полями порядка 100 бит ) размер trace cache получается от 96 КБ до 120 КБ!!! Однако! На фоне этого кэш данных размером 8 КБ выглядит как-то несимметрично:-)… и бледно. Конечно, при увеличении размера увеличиваются задержки доступа (к примеру, при увеличении до 32КБ задержки вместо двух тактов составят 4 ). Но неужели так важна скорость доступа в этот самый кэш данных, что увеличение задержки на 2 такта (на фоне общей длины всего конвейера ) делает такое увеличение объема невыгодным? Или дело просто в нежелании увеличивать размер кристалла? Но тогда при переходе на 0.13 мкм первым делом стоило увеличить именно этот кэш (а не кэш второго уровня ). Сомневающимся в данном тезисе стоило бы припомнить переход с Pentium на Pentium MMX — благодаря увеличению кэша первого уровня вдвое практически все программы получали 10 — 15% прироста производительности. Что же говорить об увеличении вчетверо (особенно учитывая, что скорости процессоров выросли до 2ГГц, а коэффициент умножения — с 2.5 до 20 )? По неподтвержденным данным, в следующей модификации ядра Pentium4 (Prescott) кэш первого уровня таки увеличат до 16 или 32 КБ. Также увеличится кэш второго уровня. Впрочем, на сегодняшний момент все это не более чем слухи. Откровенно говоря, слегка непонятная ситуация. Хотя — оговоримся — автор вполне допускает, что подобной идее мешает некая конкретная причина. Как пример — подойдут некие требования по геометрии расположения блоков или банальная нехватка свободного места вблизи конвейера (ясно ведь, что необходимо расположить кэш данных поближе к ALU ).

Не отвлекаясь, смотрим на процесс дальше. Конвейер работает — пусть нынешние команды задействуют ALU. Ясно, что FPU, SSE, SSE2 и прочие при этом простаивают. Не тут-то было — вступает в действие Hyper Threading. Заметив, что готовы микроинструкции вместе с данными для новой нити, блок переименования регистров выделяет новой нити порцию физических регистров. Кстати, возможны два варианта — блок физических регистров общий для всех нитей, или же отдельный для каждого. Судя по тому, что в презентации Hyper Threading от Intel в качестве блоков, которые надо изменять, блок переименования регистров не указан — выбран первый вариант. Это хорошо или плохо? С точки зрения технологов — явно хорошо, ибо экономит транзисторы. С точки зрения программистов — пока неясно. Если количество физических регистров действительно 128, то при любом разумном количестве нитей ситуации "нехватка регистров" возникнуть не может. Затем они (микроинструкции ) отправляются в планировщик, который, собственно, направляет их на исполнительное устройство (если оно не занято ) или "в очередь", если данное исполнительное устройство сейчас недоступно. Таким образом, в идеале достигается более эффективное спользование имеющихся исполнительных устройств. В это время сам процессор с точки зрения ОС выглядит как два "логических" процессора . Гм… Неужели все так безоблачно? Давайте присмотримся к ситуации: часть оборудования (как-то кэши, Rapid Engine, модуль предсказания переходов ) являются общими для обоих процессоров. Кстати, точность предсказания переходов от этого, скорее всего, слегка пострадает . Особенно, если исполняемые одновременно нити не связаны друг с другом. А часть (например, MIS — планировщик последовательности микрокоманд — подобие ПЗУ, содержащее набор заранее запрограммированных последовательностей обычных операций и RAT — таблица переименования [псевдонимов] регистров ) блоков должна отличать различные нити, запущенные на "разных" процессорах. Попутно (из общности кэша ) следует, что, если две нити являются "жадными" к кэшу (то есть увеличение кэша дает большой эффект ), то применение Hyper Threading способно даже снизить скорость . Это происходит потому, что на сегодняшний момент реализован "конкурентный" механизм борьбы за кэш — "активная" в данный момент нить вытесняет "неактивную". Впрочем, механизм кэширования, по-видимому, может измениться. Также понятно, что скорость (по крайней мере, на текущий момент ) будет снижаться в тех приложениях, в которых она снижалась и в честном SMP. Как пример — SPEC ViewPerf обычно на однопроцессорных системах показывает более высокие результаты. А посему наверняка на системе с Hyper Threading результаты будут меньше, чем без нее. Собственно, результаты практического тестирования Hyper Threading можно посмотреть по .

Кстати, в интернет проскакивала информация о том, что ALU в Pentium 4 16 разрядные . Сначала автор относился к подобной информации весьма скептически — дескать, чего завистники удумали:-). А потом публикация подобной информации в Micro Design Report заставила таки задуматься — а вдруг правда? И, хотя информация об этом к теме статьи прямого отношения не имеет - трудно удержаться:-). Насколько автору "хватило понимания", суть в том, что ALU действительно 16-разрядный. Подчеркиваю — только ALU . К разрядности самого процессора это отношения не имеет. Таким образом, за полтакта (это называется тик, tick ) ALU (удвоенной частоты, как Вы помните ) вычисляет только 16 разрядов. Вторые 16 вычисляются за следующие полтакта. Отсюда, кстати, легко понятна необходимость сделать ALU вдвое быстрее — это необходимо для своевременного "перемалывания" данных. Таким образом, полных 32 разряда вычисляются за полный такт. На самом деле, по-видимому, необходимы 2 такта из-за необходимости "склеивать" и "расклеивать" разряды — но этот вопрос необходимо уточнить. Собственно, раскопки (про которые можно написать отдельную поэму) дали следующее: каждое ALU поделено на 2 16-разрядные половинки. Первые полтакта первая половинка обрабатывает 16 разрядов двух чисел и формируют биты переносов для вторых половинок. Вторая половинка в это время заканчивает обработку предыдущих чисел. Второй тик — первая половинка ALU обрабатывает 16 разрядов от следующей пары чисел и формирует их переносы. Вторая половинка обрабатывает старшие 16 разрядов первой пары чисел и получает готовый 32-разрядный результат. Задержка получения 1 результата — 1 такт, но потом каждые полтакта вылезает по 1 32-разрядному результату. Достаточно остроумно и эффективно. Почему же была выбрана именно такая модель ALU? По видимому, подобной организацией Intel убивает несколько "зайцев":

1. Ясно, что конвейер "шириной" 16 разрядов разгонять легче, чем шириной 32 разряда — просто по причине наличия перекрестных помех и К о

2. По-видимому, Интел счел операции целочисленного вычисления достаточно часто встречающимися, чтобы ускорять именно ALU, а не, скажем, FPU. Вероятно, при вычислении результатов целочисленных операций используются либо таблицы, либо схемы "с накоплением переноса". Для сравнения, одна 32-битная таблица это 2E32 адресов, т.е. 4гигабайта. Две 16-разрядные таблицы это 2х64кб или 128 килобайт — почувствуйте разницу! Да и накопление переносов в двух 16-разрядных порциях происходит быстрее, чем в одной 32-разрядной.

3. Экономит транзисторы и… тепло. Ведь ни для кого не секрет, что все эти архитектурные ухищрения греются. По видимому, это была достаточно большая (а, возможно, и главная ) проблема — чего стоит, к примеру, Thermal Monitor как технология! Ведь необходимости в подобной технологии как таковой не очень много — то есть, конечно, приятно, что она есть. Но давайте говорить честно — простой блокировки хватило бы для достаточной надежности. Раз такая сложная технология была предусмотрена — значит, всерьез рассматривался вариант, когда подобные изменения частоты на ходу были одним из штатных режимов работы. А, может, основным? Ведь не зря ходили слухи, что Pentium 4 задумывался с гораздо большим количеством исполнительных устройств. Тогда проблема тепла должна была стать просто основной. Вернее, по тем же слухам, тепловыделение должно было составить до 150 Вт . А тогда очень логично принять меры к тому, чтобы процессор работал "в полную силу" только в таких системах, где обеспечено нормальное охлаждение. Тем более, что большинство корпусов "китайского" происхождения продуманностью конструкции с точки зрения охлаждения отнюдь не блещут. Гм…. Далековато забрались:-)

Но все это теоретизирования. Есть ли сегодня процессоры, в которых применяется эта технология? Есть. Это Xeon (Prestonia ) и XeonMP. Причем, интересно, что XeonМР от Xeon отличается поддержкой до 4 процессоров (чипсеты типа IBM Summit поддерживают до 16 процессоров, методика приблизительно такая же, как и в чипсете ProFusion ) и наличием кэша третьего уровня объемом 512 КБ и 1 МБ, интегрированного в ядро. Кстати, а почему интегрировали кэш именно третьего уровня? Почему не увеличен кэш первого уровня ? Должна же быть какая-то разумная причина…. Почему не увеличили кэш второго уровня? Возможно, причина в том, что Advanced Transfer Cache нуждается в относительно небольших задержках. А увеличение объема кэша приводит к увеличению задержек. Посему кэш третьего уровня для ядра и кэша второго уровня вообще «представляется» как шина. Просто шина:-). Так что прогресс налицо — сделано все, чтобы данные подавались в ядро как можно быстрее (а, попутно, поменьше загружалась шина памяти ).

Ну что же — получается, никаких особо узких мест и нет? Что же автор, так и не сможет "поворчать"? Один процессор - а ОС видит два. Хорошо! Два процессора — а ОС видит 4! Кррасота! Стоп! А какая это ОС у нас работает с 4-мя процессорами? Операционные системы от Микрософт, которые понимают больше двух процессоров, стоят совсем других денег. Например, 2000 Professional, XP Professional, NT4.0 понимают только два процессора. А, учитывая, что пока что данная технология предназначается на рынок рабочих станций (и серверов ) и есть только в соответствующих процессорах - получается просто чертовски обидно. На сегодня мы можем использовать процессора с такой технологией, только купив двухпроцессорную плату и поставив один процессор. Чем дальше, тем "страньше", как говаривала Алиса в стране чудес…. То есть, человек, жаждущий использовать данную технологию, просто вынужден покупать версии Server и Advanced Server нынешних операционных систем. Ох, и дороговат выходит "бесплатный" процессор…. Стоит добавить, пожалуй, что в настоящий момент Intel активно "общается" с Microsoft, пытаясь привязать политику лицензирования к физическому процессору. По крайней мере, согласно документу , новые операционные системы от Microsoft будут лицензироваться по физическим процессорам. По крайней мере, WindowsXP лицензируется именно по количеству физических процессоров.

Естественно, всегда можно обратиться к операционным системам других производителей. Да только будем откровенными — это не очень хороший выход из текущей ситуации…. Так что можно понять колебания Интел, которая довольно долго думала — использовать эту технологию, или нет.

Ну что же — не забываем достаточно важный вывод: применение Hyper Threading способно привести как к выигрышу, так и к проигрышу в производительности . Ну а поскольку проигрыш нами уже обсужден — попробуем понять, что же необходимо для выигрыша: а для выигрыша необходимо, чтобы об этой технологии знали:

  1. BIOS материнской платы
  2. Операционная система (!!!)
  3. Собственно, само приложение

Вот на этом моменте позвольте остановиться поподробнее — дело в том, что за BIOS дело не станет. Операционную систему мы обсудили чуть ранее. А вот в те нити, которые, например, ожидают данных из памяти — придется вводить специальную команду pause , чтобы не замедлять работу процессора; ведь при отсутствии данных нить способна блокировать те или иные исполнительные устройства. А чтобы вставить эту команду, приложения придется перекомпилировать — это не есть хорошо, но, с легкой руки Intel, к этому в последнее время все стали привыкать:-). Таким образом, основной (по мнению автора ) недостаток технологии Hyper Threading — это необходимость очередной компиляции. Основное преимущество такого подхода - подобная перекомпиляция попутно (и, скорее всего, более заметно:-) подымет производительность в "честных" двухпроцессорных системах — а это можно только приветствовать. Кстати, уже есть экспериментальные , которые подтверждают, что в большинстве случаев программы, оптимизированные под SMP , выигрывают от Hyper Threading от 15% до 18%. Это весьма неплохо. Кстати, там же можно увидеть, в каких случаях Hyper Threading приводит к падению производительности.

И напоследок давайте попробуем пофантазировать, что же может измениться (улучшиться ) в дальнейшем развитии этой идеи. Достаточно очевидно, что развитие данной технологии будет прямо связано с развитием ядра Pentium 4. Таким образом, представим себе потенциальные изменения в ядре. Что там у нас дальше по плану? 0.09 микронная технология, более известная как 90нм…. Автор склонен считать (на сегодняшний момент ), что развитие данного семейства процессоров пойдет сразу по нескольким направлениям:

  • Благодаря более "тонкому" техпроцессу частота процессора станет еще выше.
  • Будем надеяться, что кэш данных увеличат. Хотя бы до 32КБ.
  • Сделают "честное", 32 разрядное ALU. Это должно поднять производительность.
  • Увеличат скорость системной шины (впрочем, это уже в ближайших планах ).
  • Сделают двухканальную DDR память (опять же, ждать осталось относительно недолго ).
  • Возможно, введут аналог технологии х86-64, если данная технология (усилиями AMD ) приживется. При этом автор изо всех сил надеется, что этот аналог будет совместимым с х86-64. Хватит уже плодить несовместимых друг с другом расширений…. Опять же, небезынтересным для нас будет Джерри Сандерса, в котором тот заявил, что AMD и Intel в прошлом году договорились о кросс-лицензировании на все, кроме системной шины Pentium4. Значит ли это, что Intel встроит х86-64 в следующее ядро Pentium4 (Prescott), а AMD встроит в свои процессора Hyper Threading? Вопрос интересный….
  • Возможно, будет увеличено количество исполнительных устройств. Правда, как и предыдущий, это достаточно спорный пункт, поскольку требует практически полного перепроектирования ядра — а это долгий и трудоемкий процесс.

Интересно, будет ли развиваться идея Hyper Threading? Дело в том, что в количественном отношении ей развиваться особо некуда — понятно, что два физических процессора лучше трех логических. Да и позиционировать будет нелегко…. Интересно, что Hyper Threading может пригодиться и при интегрировании двух (или более ) процессоров на кристалл. Ну а под качественными изменениями автор имеет ввиду, что наличие такой технологии в обычных десктопах приведет к тому, что фактически большинство пользователей будут работать на [почти] двухпроцессорных машинах — что очень хорошо. Хорошо потому, что подобные машины работают не в пример "плавнее" и "отзывчивее" на действия пользователя даже под большой нагрузкой. Сие, с точки зрения автора, есть весьма хорошо.

Вместо послесловия

Автор должен признаться, что в течение работы над статьей его отношение к Hyper Threading неоднократно менялось. По мере того, как собиралась и обрабатывалась информация — отношение становилось то в целом положительным, то наоборот:-). На сегодняшний момент можно написать следующее:

есть только два способа повышать производительность — повышать частоту, и повышать производительность за такт. И, если вся архитектура Pentium4 рассчитана на первый путь, то Hyper Threading — как раз второй. Уже с этой точки зрения ее можно только приветствовать. Так же Hyper Threading несет несколько интересных следствий, как-то: изменение парадигмы программирования, привнесение многопроцессорности в массы, увеличение производительности процессоров. Однако, на этом пути есть несколько "больших кочек", на которых важно не "застрять": отсутствие нормальной поддержки со стороны операционных систем и, самое главное, необходимость перекомпиляции (а в некоторых случаях и смены алгоритма ) приложений, чтобы они в полной мере смогли воспользоваться преимуществами Hyper Threading. К тому же, наличие Hyper Threading сделало бы возможной действительно параллельную работу операционной системы и приложений — а не "кусками" по очереди, как сейчас. Конечно, при условии, что хватит свободных исполнительных устройств.

Автор хотел подчеркнуть бы свою признательность Максиму Леню (aka C.A.R.C.A.S.S.) и Илье Вайцману (aka Stranger_NN) за неоднократную и неоценимую помощь при написании статьи.
Также хотелось бы сказать спасибо всем участникам форума, которые неоднократно высказывали ценные замечания.

Рекомендуем почитать

Наверх