|
Процессор Pentium 4 3.06 и технология HyperThreadingОдной из полезных особенностей архитектуры процессора Pentium 4 является возможность достижения очень высоких тактовых частот. Почему это стало возможным? Не будем вдаваться в детали: поскольку исполнительный конвейер у этого процессора длиннее, чем у предшественников и конкурирующих процессоров, общее время выполнения одной команды поделено на несколько коротких этапов, каждый из которых может выполняться достаточно быстро. Сокращение длины одного такта - это ничто иное, как увеличение тактовой частоты. Поэтому, отлаживая технологию производства, корпорация Intel может постепенно наращивать частоту процессора. Что она и делает, с завидной периодичностью объявляя все новые и новые модели Pentium 4. Осенью 2002 года увидел свет очередной процессор, тактовая частота которого достигла значения 3 ГГц. Но не только в круглой цифре (ну, почти круглой :) его уникальность. Это - первый настольный (то есть предназначенный для обычных ПК) процессор, обладающий поддержкой HyperThreading. Эта статья посвящена теории и практике применения этой уникальной технологии, позволяющей реализовать многопроцессорную обработку на обычных персоналках. ИдеяДля чего применяется многопроцессорная обработка - понятно: если в системе имеются два и более вычислительных устройства, их можно загрузить работой и тем самым увеличить быстродействие системы. Вопрос только в том, как разбить задачу на несколько независимых подзадач, которые можно выполнять параллельно. Но современные операционные системы уже являются многозадачными и многопоточными - они одновременно выполняют множество служебных и прикладных задач. Очевидно, что выигрыш от наличия нескольких процессоров, хотя бы теоретический, должен получить любой компьютер, работающий под управлением многозадачной ОС. Однако добавление второго процессора многократно увеличивает сложность, а, следовательно, и стоимость системы. Для сервера, постоянно загруженного работой, это оправданно. Но не для персоналки. Но было найдено простое и эффективное решение. В его основе лежит использование особенностей современных процессоров. Они, как известно, являются конвейерными и суперскалярными, то есть выполнение команд в них идет параллельно, по этапам и на нескольких конвейерах сразу. Для того чтобы разбить команды на параллельные потоки, процессору необходимо проанализировать зависимость их друг от друга и расположить их в таком порядке, чтобы логика программы не искажалась. Понятно, что если программа не скомпилирована с расчетом на параллельное выполнение команд, или ее оптимизация не подходит под архитектуру процессора, большинство дублирующихся вычислительных блоков процессора будет простаивать. Если бы в процессор поступали потоки независимых команд, он мог бы обрабатывать их параллельно, или иногда заполнять свободные блоки подходящими командами из другого, независимого потока. Каким образом организовать поступление в процессор нескольких потоков команд, позволяющих оптимальнее использовать его ресурсы? А если возложить эту задачу на программное обеспечение, например, на операционную систему. Скажем, заставить ее думать, что в системе имеется не один, а два процессора. Тогда команды станут поступать в двух не зависимых друг от друга потоках, гарантированно подходящих для параллельной обработки. Процессор сможет выделять потокам ресурсы по мере их освобождения, выполняя работу за двоих. Прирост скорости будет обусловлен тем, что процессор будет работать эффективнее. Преимущества и недостаткиПроцессор, поддерживающий HyperThreading, эмулирует в системе работу двух одинаковых логических процессоров, принимая команды, идущие для каждого из них. На самом деле внутри процессора нет двух вычислительных ядер, как, например, в серверном процессоре IBM POWER4. Удвоены только массивы регистров - как общего назначения, так и служебных. Получается, что оба логических процессора конкурируют за ресурсы одного вычислительного ядра и потому используют его более эффективно, нежели одно ядро, как в процессорах, не поддерживающих HyperThreading. Процессор рассматривает оба потока команд и по очереди запускает на выполнение команды то из одного, то из другого, или сразу их двух, если есть свободные вычислительные ресурсы. Нельзя сказать, что один из потоков является приоритетным - процессор старается обработать оба. Если один из потоков команд останавливается в ожидании события или зацикливается, то процессор просто переключается на второй поток команд. С этим связан эффект ускорения низкоуровневых операций (доступ к подсистемам ввода-вывода), когда работающий драйвер не вызывает блокировки системы. Однако один процессор не может работать с такой же скоростью, как два процессора. Он может лишь более эффективно использовать свои внутренние ресурсы. Это особенно хорошо заметно, если потоки команд, грубо говоря, не похожи друг на друга, то есть содержат разные типы команд. Тогда обработка одного потока может совмещаться с замедленной обработкой другого, то есть процессор за одно и то же время будет успевать делать полтора дела. Несколько одновременно запущенных приложений, использующих разные алгоритмы обработки данных, будут получать серьезный выигрыш от HyperThreading. И в то же время не стоит забывать, что эффективность новой технологии зависит от работы операционной системы. Разделять команды на потоки будет именно она. И если операционка будет нагружать один из процессоров своими внутренними, системными задачами, то даже одно приложение сможет ускорить работу благодаря HyperThreading. От приложения тоже зависит, сможет ли оно использовать новые возможности новой технологии. Оно должно выполняться в нескольких потоках, причем эти потоки должны быть спроектированы так, чтобы не пересекаться и не зависеть друг от друга. Ведь если, например, один поток ждет результата работы второго, то HyperThreading может давать отрицательный эффект из-за того, что один поток может забрать почти все ресурсы и не давать работать второму. В общем, прирост скорости сильно зависит от выполняемых задач. В некоторых случаях он может достигать 25-35% (по данным Intel). Или, например, "заточенные" под многозадачность программы ускоряются на 15-20%. А в других случаях разница не будет заметна или вообще будет отрицательной. ПоддержкаНа самом деле технология HyperThreading не так уж и нова. Ее поддержка была заложена в самые первые процессоры семейства Pentium 4 (те самые, с ядром Willamette), но до последнего времени не работала. В смежном рынке серверов и рабочих станций, на процессорах Xeon она была включена раньше, более года назад. Однако на настольном рынке ее появление было задержано. И только после объявления Pentium 4 3.06 было решено, что в обновленной линейке процессоров, как младших, так и старших, еще не вышедших, HyperThreading будет поддерживаться в обязательном порядке. (HyperThreading не была включена раньше потому, что до последнего времени на настольном рынке доминировала ОС Windows 9x/ME, которая принципиально не способна поддерживать многопроцессорный режим работы. Только с распространением Windows XP появилась возможность задействовать HyperThreading в обычных условиях). Кроме процессора, необходимо позаботиться о поддержке новой технологии со стороны других компонентов системы. Так, нужен подходящий чипсет материнской платы. Согласно данным, полученным от представителей Intel, технология HyperThreading поддерживается следующими чипсетами:
(* - Чипсет i845G помечен потому, что изначально он не имел поддержки HyperThreading. Новый степпинг чипсета исправляет эту проблему. Тем не менее, не стоит рассчитывать на то, что ваша уже купленная плата на i845G будет на новом степпинге - это очень популярный и массовый чипсет, и старые чипы еще долго будут использоваться в производстве). О чипсетах других производителей есть следующие сведения:
Кроме чипсета, о HyperThreading должна знать и BIOS платы. Это нужно для того, чтобы была подготовлена таблица конфигурации и произведена инициализация "второго процессора". У производителей плат первого звена уже вышли необходимые обновления BIOS. Для работы новой технологии нужна также одна из двух операционных систем - либо Windows XP (Home или Pro - не важно), либо Linux с новым ядром, поддерживающим HyperThreading. ТестированиеИ вот, достав все необходимые компоненты - процессор (Pentium 4 3.06), плату (Intel D845PEBT2, i845PE), BIOS (P06) и операционную систему (Windows XP Professional), я решил проверить, какой реальный прирост обеспечивает новая технология. Использовать для этого какие-то специфические приложения я не стал, поскольку меня интересовала работа системы в обычных условиях дома или офиса. То, что профессиональные приложения можно "заточить" под HyperThreading, не вызывает сомнений, однако с ними работает далеко не каждый пользователь. А вот в игры, например, играют многие. После включения HyperThreading в BIOS пришлось переустановить операционку, чтобы заменить ядро (HAL) на поддерживающее многопроцессорность, поскольку обычное ACPI-ядро Windows XP успешно определят два процессора, но использует только один из них. В принципе, можно обойтись и без переустановки - замена ядра подробно описана в различных FAQ по Windows 2000/XP.
Получилась такая красивая картинка в Task Manager - работает только один процессор, второй отдыхает. Далее я прогнал обычный набор своих тестов.
И ни один из них не сообщил о заметном увеличении производительности, кроме, разве что, SYSmark2002 Content Creation - около 1% прироста, что, в принципе, можно списать на погрешность измерений. Очевидно, что методика измерения скорости выполнения тестов не рассчитана на многозадачность - в частности, тесты полагается запускать после полной перезагрузки, сняв все лишние задачи и службы и т.п. Кроме того, выполнение одного приложения, "захватывающего" все ресурсы системы, может замедляться из-за того, что операционка "думает", что у нее есть второй свободный процессор, хотя на самом деле процессор только один, и он уже занят по полной программе. Этим я и объясняю снизившиеся из-за HyperThreading результаты некоторых тестов (Quake3, Serious Sam, Winstone2001). Попробуем другой метод. Сымитируем типичную ситуацию, когда нам хочется больше скорости. Самыми неприятными из-за своей длительности задачами, которые мне известны, являются архивация данных и сжатие аудио/видео. Во время их выполнения, пока бежит полоска прогресса, хочется заниматься чем-либо другим, но при этом скорость работы сильно падает… Тут бы и помогла технология HyperThreading. Я взял:
И все это скомбинировал следующим образом. Сначала измерил скорость работы первых четырех приложений независимо друг от друга. Потом запустил Media Player (который ругают за "тормознутость"), в нем - звуковой файл и "тяжелый" для процессора спектральный анализатор "Rotating Particles. И следом по очереди запустил каждое из приложений. И вот какие результаты получились.
Работа одиночных приложений от включения HyperThreading, как и в случае с тестами, не изменилась - разве что VirtualDub сжал видео на 8% быстрее.
Добавление Media Player при отсутствии HyperThreading привело к снижению скорости на 20-25% (в случае SPECviewperf - на 10%). А если HyperThreading включена, то потери стали меньше на 5% (в случае SPECviewperf - на 3,5%). Это не такой уж замечательный результат, но он есть. А потом, для эксперимента, я попробовал запаковать архив на фоне сжатия видео, чтобы проверить, как HyperThreading справится с двумя приложениями, каждое из которых загружает процессор практически на 100%. Как ни странно, HyperThreading значительно ускоряла WinRAR, замедляя при этом второе приложение. Причем результат зависел от того, окно какого приложения являлось активным. Наиболее приемлемый вариант - когда активно окно Media Encoder. В этом случае WinRAR отработал за 116 секунд против 157 при отключенной HyperThreading - на 25% быстрее, или всего на треть медленнее, чем в одиночном режиме. А Media Encoder со своей задачей справился тоже на треть медленнее, чем в одиночку, но в отсутствии HyperThreading в паре с WinRAR он работал на 10% быстрее. Можно придумать множество объяснений такой избирательности новой технологии - обвинить в этом операционку, авторов приложений, процессор, собственные руки и т.д. ИтогЯсно только, что HyperThreading - неоднозначное и очень оригинальное техническое решение, которое позволяет с минимальными затратами реализовать, хоть и не совсем настоящую, но все же многопроцессорность на однопроцессорной машине. Осталось только решить вопрос, как добиться выигрыша от ее применения. По материалам сайта hw.by Powered by X-ray.Издательство"Самопал"©2004 |