ПК с мощными графическими ускорителями успешно вытесняют с рынка 3D-приложений "классические" рабочие станции с RISC-процессорами даже такого признанного гранда, как Silicon Graphics. Последняя, как известно, объявила о планах выпуска Visual PC — рабочей станции на базе Intel x86 (вероятно, в варианте Katmai).

  
Мультимедиа-расширение системы команд 3DNow!

Первые серьезные шаги в этом направлении сделала именно Intel, когда начала поставки микропроцессоров с расширением системы команд MMX, а затем предложила поддержку порта AGP для графических ускорителей. Однако эти нововведения еще не закрыли все потенциально узкие места архитектуры персональных компьютеров при работе с 3D-приложениями, и Intel планирует выпустить в 1999 году микропроцессоры с расширенной системой команд — Katmai. Новые команды будут ориентированы в первую очередь на поддержку 3D-приложений и работать с операндами с плавающей запятой одинарной точности.

Ответ на эту инициативу Intel от давнего конкурента — AMD прозвучал как гром среди ясного неба: ее просто-напросто опередили!

AMD не только анонсировала, но и начала выпуск х86-совместимых процессоров К6-2, cодержащих расширение системы команд х86 — 3Dnow!, способствующее кардинальному увеличению производительности 3D-приложений. Операндами этих команд выступают 32-разрядные числа с плавающей запятой. При работе с такими числами AMD K6-2 достигает пиковой производительности 1,4 GFLOPS для новейших 350-мегагерцевых процессоров (при увеличении тактовой частоты эта характеристика растет пропорционально). Это — уровень самых быстрых сегодня процессоров Alpha 21264. Воистину, на то и AMD на рынке, чтобы Intel не дремала.

Команды 3DNow!

В AMD исходят из того, что 3D-акселераторы развиваются сегодня быстрее, чем микропроцессоры, и поскольку увеличивается разрыв между их производительностью, процессоры не успевают "насытить" данными быстродействующие акселераторы. Мне это утверждение не представляется столь уж очевидным, хотя, если ограничиться х86-совместимыми процессорами, то прогресс их производительности в области данных с плавающей запятой не так впечатляет, как для целочисленных данных.

Вот как AMD представляет "графический конвейер" (см. рис. 1). На первой стадии происходит расчет физической модели реального мира и его объектов, выполняемый в процессоре. На второй стадии процессор осуществляет преобразование физико-математического представления модели в 3D-представление. В процессе этого преобразования интенсивно используются операции с плавающей запятой.

Для представления 32-разрядных чисел с плавающей запятой в командах 3DNow! используется стандарт IEEE-754, в котором мантисса имеет 23 разряда. Этот стандарт требует поддержки четырех режимов округления, в то время как 3DNow! поддерживает только один - или округление "до ближайшего", или округление "до нуля" (усечение, truncation в английском оригинале). В K6-2 поддерживается первый из этих режимов. В командах преобразования из целых в числа с плавающей запятой и обратно всегда используется режим усечения.

Максимальное представимое число в данном случае равно 2**127. При использовании 3DNow! все команды, выполнение которых приводит к переполнению, должны давать это самое "ольшое положительное число ли"о плюс "есконечность. То же справедливо для самого "ольшого по модулю отрицательного числа. Вы"ор варианта определяется реализацией 3DNow!; в K6-2 арифметическое переполнение генерирует максимально допустимое число с верным знаком.

Наименьшее по модулю представимое число равно 2-126. Все числа, меньшие его по модулю, представляются нулем. Операнды NaN ("не число"), Inf и -Inf (плюс-минус бесконечность соответственно) в 3DNow! не поддерживаются.

Подо"но ММХ, команды 3DNow! не генерируют численных прерываний и не устанавливают никаких флагов состояния; вся проверка исходных операндов и результатов возложена на программиста.

 

На третьей стадии, которую AMD назвала "настройкой" (setup), процессор запускает процедуру создания "перспективы", требуемой для трехмерного изображения, а графический акселератор эту процедуру завершает. На последней, четвертой стадии, происходит рендеринг — когда графический акселератор применяет текстуры для "сгенерированного" объекта, для каждого пиксела проводит расчеты цвета, положения и т. д.

Следует различать 3DNow! как расширение архитектуры х86 и конкретную его реализацию в AMD K6-2. Рассмотрим сначала архитектурные аспекты.

Расширение 3DNow! содержит 21 команду. Эти команды включают в себя операцию предварительной выборки в кэш первого уровня; операцию переключения режима работы — между x87-командами и ММХ/3DNow!; 15 команд с плавающей запятой; две команды преобразования из целых чисел в числа с плавающей запятой и обратно; две специальные команды для работы с целочисленными операндами.

Конечно же, все эти команды являются не обычными, реализованными в большинстве микропроцессоров, а специализированными. Так, почти все команды с плавающей запятой являются векторными. Таким образом, архитектура SIMD, для которой типичными являются операции с векторами, из суперкомпьютеров перекочевала в графические ускорители, а затем добралась и до массовых x86-совместимых процессоров. Впрочем, впервые это произошло не в 3DNow!, а в ММХ, хотя в последней и используются целочисленные векторы. Формально команды 3DNow!, как и команды ММХ, имеют традиционный для x86 двухадресный формат "регистр-регистр" или "регистр-память".

Принципиально важным является то, что команды 3DNow! используют те же восемь регистров, что и ММХ. Эти регистры, как известно, отображаются в регистры с плавающей запятой, то есть являются их "алиасами". Таким образом, 3DNow! оказывается естественным расширением ММХ, и переключение между ними не требует дополнительными накладными расходами. Такая реализация делает расширение 3DNow! "безопасным": при его внедрении не надо менять операционную систему — эти команды могут быть упрятаны в драйверах устройств, библиотеках ММХ и 3DNow! или в файлах DLL.

Команды 3DNow! работают с "упакованными" данными. Так, двухмерный вектор из двух чисел с плавающей запятой располагается либо в ММХ-регистре, либо в квадрослове оперативной памяти в соответствии с рис. 2, где D0 и D1 — 32-разрядные числа с плавающей запятой. Аналогичным образом в других командах 3DNow! упаковываются целочисленные операнды: 8-, 16- и 32-разрядные целые.

Для иллюстрации работы векторных команд рассмотрим команду сложения PFADD в регистровой форме:

PFADD mmr1, mmr2

После ее выполнения регистр mmr1 будет содержать следующий двухмерный вектор — пару чисел с плавающей запятой:

mmr1[31:0] = mmr1[31:0] + mmr2[31:0]

mmr1[63:32] = mmr1[63:32] + mmr2[63:32]

Кроме векторной команды сложения, в 3DNow! имеются аналогичные команды вычитания, умножения, сравнения, определения наибольшего и наименьшего из операндов и другие, также работающие с двухмерными векторами.

Cледует отметить также специальную команду, усредняющую восемь 8-разрядных целых без знака, предназначенную для усреднения пикселов при декодировании MPEG-2.

Что касается предварительной выборки, то она дает возможность выбрать из памяти строку в кэш первого уровня (32 байт для К6-2), не прерывая нормальную работу процессора. Это позволяет эффективнее организовать работу приложений, активно использующих оперативную память, что, в частности, типично для мультимедийных приложений с большими объемами данных. Подобные команды имеются и в других процессорах, например в Mips R10000.

3DNow! в К6-2

В процессоре AMD K6-2, как и К6, два исполнительных устройства — Х и Y, при этом за один такт в каждое устройство может выдаваться одна команда; ею может быть и команда 3DNow!, причем все такие команды полностью конвейеризированы и выполняются за три такта.

Собственно исполнительные блоки нижнего уровня, например два умножителя, используемые командами 3DNow!, могут разделяться устройствами Х и Y (рис. 3). Это не мешает одновременному запуску в исполнительные устройства любой пары команд. Если между этими командами возникает конкуренция, например между двумя одновременно запускаемыми командами умножения, то одна из них задерживается на один такт в первой стадии выполнения.

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

Таким образом, в К6-2 могут одновременно выполняться две команды 3DNow!, каждая из которых может за один такт выдавать один вектор, то есть два результата с плавающей запятой за такт. Это дает четыре результата с плавающей запятой за такт.

По имеющимся данным, в будущем процессоре Intel Katmai также планируется поддержка новых команд, работающих с 32-разрядными числами с плавающей запятой и ориентированных на приложения трехмерной графики. Соответствующий конвейер будет выдавать четыре результата с плавающей запятой за такт, то есть будет иметь ту же пиковую производительность, что и 3DNow!. Однако неизвестно, будет ли такой конвейер один. В отличие от 3DNow!, команды Katmai работают с новыми регистрами и могут поэтому выполняться параллельно с командами x87. Интересно, что компания Hitachi недавно создала специальный микропроцессор SH-4 для графических ускорителей, в котором за один такт выполняется уже семь операций с плавающей запятой.

Созрел ли плод?

Безусловно, 3DNow! выглядит привлекательно. Хотя основной областью приложений 3DNow! считаются игры, данная технология ускоряет любые 3D-приложения и может использоваться при работе с моделями VRML, презентационной графикой, трехмерным звуком, при распознавании речи, при декодировании MPEG-2, в системах САПР и т. д.

Хотя большинство наиболее сложных научно-технических приложений требуют чисел с плавающей запятой удвоенной точности, в некоторых приложениях можно обойтись и 32-разрядными числами. Насколько известно автору, это справедливо, например, для некоторых геофизических задач разведки месторождений.

Микропроцессоры от AMD, более дешевые, нежели продукция Intel, в России привлекают, естественно, особое внимание. Прямое кодирование с использованием команд 3DNow! приведет, однако, к несовместимости с процессорами Intel. Стоит ли овчинка выделки — решать должны разработчики приложений.

Полагаю, что AMD не побоялась пойти на такую несовместимость в первую очередь потому, что надеется "спрятать" все команды 3DNow! за графическими API-интерфейсами. Как в Microsoft DirectX 6.0, так и в SGI Open GL 1.2 SDK обещана поддержка 3DNow!.

Вопрос в том, созрел ли плод. Пора ли всем браться за трехмерные приложения уже сегодня или стоит подождать Katmai? Плод (3DNow!) вкусен и дешев, но на грядках х86 уже созревают и другие экзотические фрукты, и за Katmai будет AMD K7 с новыми графическими возможностями. Гурманы — вперед! u


Михаил Кузьминский — старший научный сотрудник Центра компьютерного обеспечения Института химических исследований РАН. С ним можно связаться по телефону (095) 135-6388.