В главе 5 на примере процессора Itanium 2 мы уже сталкивались с архитектурой VLIW. Теперь познакомимся с другим VLIW-процессором — TriMedia производства компании Philips. TriMedia — это встроенный процессор для устройств обработки изображений, а также аудио- и видеустройств, таких как CD-, DVD-и МРЗ-плееры, устройства записи CD и DVD, интерактивные телевизоры, цифровые фотокамеры, видеокамеры и т. д. Учитывая специализацию, нет ничего удивительного в многочисленных отличиях TriMedia от Itanium 2 — универсального процессора для высокопроизводительных серверов.

В состав одной TriMedia-команды может входить до пяти операций. В полностью оптимальных условиях за тактовый цикл запускается одна команда и выбирается пять операций. Номинальная тактовая частота процессора составляет 266 или 366 МГц, но так как за один цикл может выполняться до пяти операций, фактическое быстродействие в пять раз больше. При дальнейшем изложении мы будем исходить из характеристик реализации ТМ3260 процессора. Другие версии TriMedia имеют ряд малозначительных отличий.

Стандартная TriMedia-команда изображена на рис. 8.3. По своему характеру команды варьируются от общераспространенных 8-, 16- и 32-разрядных целочисленных команд до команд с плавающей точкой стандарта IEEE 754 и команд параллельной обработки мультимедиа. Исполнение пяти операций за цикл и наличие команд параллельной обработки мультимедийных данных позволяют процессору TriMedia программно декодировать потоковое цифровое видео, поступающее с видеокамеры, сохраняя исходные размер и частоту кадров.

В TriMedia используется память с байтовой организацией, а регистры ввода-вывода отображаются на пространство памяти. Полуслова (16 бит) и полные слова (32 бит) выравниваются по естественным границам. Порядок следования байтов может быть как прямым, так и обратным — в зависимости от бита слова состояния программы, выставляемого операционной системой. Этот бит определяет механизм передачи данных операций загрузки и сохранения между памятью и регистрами. В процессоре предусмотрена разделенная 8-входовая ассоциативная кэш-память с одинаковой длиной строки (64 байт) в кэшах команд и данных. Емкость кэша команд составляет 64 Кбайт; емкость кэша данных — 16 Кбайт.

Существует 128 универсальных 32-разрядных регистров. Значения регистров R0 и R1 равны аппаратным нулю и единице, соответственно. Остальные 126 регистров функционально эквивалентны и могут применяться для любых целей. Кроме того, предусмотрены четыре специализированных 32-разрядных регистра: счетчик команд, регистр слова состояния программы и два регистра, связанные с прерываниями. Наконец, один 64-разрядный регистр подсчитывает число циклов процессора с момента последнего сброса. При тактовой частоте 300 МГц полный цикл счетчика составляет 2000 лет.

В процессоре ТМ3260 есть 11 функциональных блоков, предназначенных для выполнения арифметических, логических и управляющих операций (также есть блок управления кэшем, но его мы рассматривать не будем). Все они перечислены в табл. 8.1. В первых двух столбцах приводятся имя блока и краткое описание выполняемых им функций. В третьем столбце указывается число аппаратных копий блока. Четвертый столбец содержит значение ожидания (точнее число циклов) до завершения операции. В этом контексте нелишне отметить, что все функциональные блоки, за исключением блока извлечения квадратного корня и деления чисел с плавающей точкой, конвейеризированы. Хотя ожидание говорит о том, сколько нужно ждать до завершения операции, не следует забывать, что в каждом новом цикле можно начинать новые операции. Так, в каждой из трех последовательных команд может содержаться по две операции загрузки, а значит, одновременно на разных этапах исполнения может находиться шесть операций загрузки.

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

Функциональный блок операций с константами применяется при выполнении операций с непосредственной адресацией, например, при загрузке числа из поля операции в регистр. АЛУ для исполнения целочисленных операций осуществляет сложение, вычитание, стандартные логические операции, а также операции упаковки и распаковки. Блок операций сдвига может выполнять сдвиги регистра на указанное число битов в обоих направлениях.

Блок загрузки и сохранения считывает слова из памяти в регистры и записывает их обратно. По большому счету, TriMedia — это RISC-процессор с расширенной функциональностью, поэтому обычные операции выполняются с регистрами, а обращения к памяти осуществляются при помощи функционального блока загрузки и сохранения. Передавать можно по 8, 16 или 32 бит. При исполнении арифметических и логических команд обращение к памяти не осуществляется.

Блок умножения выполняет операции как с целыми числами, так и с числами с плавающей точкой. Следующие три блока ответственны за сложение и вычитание чисел с плавающей точкой, сравнение, извлечение квадратных корней и деление.

Операции перехода выполняются функциональным блоком ветвлений. За переходом следует фиксированная задержка величиной в 3 цикла, за время которых всегда выполняются 3 команды (то есть до 15 операций). Так происходит лаже при безусловных переходах.

Наконец, мы дошли до двух блоков, предназначенных для выполнения специальных мультимедийных операций. Фактически, мультимедийные операции зыполняет обработчик цифровых сигналов (Digital Signal Processor, DSP). Следует сразу заметить, что, в отличие от целочисленных операций, основывающихся на арифметике с дополнением до двух, в мультимедийных операциях используется арифметика с насыщением (saturated arithmetic). Если результат операции нельзя выразить из-за переполнения, вместо вызова исключения или возвращения в качестве результата «мусора» подставляется ближайшее корректное число. К примеру, применительно к 8-разрядным числам без знака в результате сложения 130 и 130 может получиться 255.

Так как некоторые операции и командные слоты несовместимы, зачастую в команду включается меньше пяти операций. Если тот или иной слот не используется, для минимизации потребляемого пространства он подлежит сжа-тию. Присутствующие в команде операции могут занимать 26, 34 или 42 бита В зависимости от числа фактически содержащихся в TriMedia-команде операций, ее размер составляет от 2 до 28 байт (включая служебные данные фиксированного размера).

Проверка входящих в TriMedia-команду операций на совместимость в период исполнения не проводится. Поэтому операции выполняются даже в случае их несовместимости, что порождает неверный результат. Решение отказаться от проверок было принято разработчиками для экономии времени и транзисторов. В процессорах Pentium проверка совместимости суперскалярных операций проводится, однако в результате усложняется решение, растут временные затраты и увеличивается число применяемых транзисторов. В TriMedia задача планирования передается компилятору, который без лишних временных ограничений может оптимизировать размещение операций в словах команд. Однако если для выполнения операции требуется недоступный функциональный блок, вся команда вынуждена ждать вплоть до того момента, как он вновь станет доступным.

Как и в Itanium 2, в TriMedia операции прогнозируются. Каждая операция (за двумя незначительными исключениями) задает регистр, подлежащий проверке перед выполнением этой операции. Если младший бит этого регистра установлен, операция выполняется; в противном случае она пропускается. Каждая из пяти (или менее) операций прогнозируется индивидуально. Вот пример спрогнозированной операции:

IF R2 IADD R4. R5 -> R8

Здесь тестируется регистр R2, и если значение его младшего бита равно единице, содержимое регистров R4 и R5 складывается и сохраняется в R8. Операцию можно сделать безусловной, если в качестве предикатного регистра использовать R1 (его значение всегда равно 1). Регистр R0 (аппаратный ноль) делает операцию пустой.

Мультимедийные операции в TriMedia подразделяются на 15 групп, перечисленных в табл. 8.2. Во многих из этих операций применяется отсечение — методика, в которой операнд «загоняется» в определенный диапазон, исходя из минимальных или максимальных значений операндов вне этого диапазона. Отсечение осуществимо в отношении 8-, 16- и 32-разрядных операндов. К примеру, в результате отсечения значений от 40 до 340 по диапазону от 0 до 255 остаются значения от 40 до 255. Операции отсечения проводятся в группе отсечения.

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

Мультимедийные операции довольно редко выполняются с 32-разрядными целыми числами. Связано это с тем, что изображения обычно строятся в цветовой модели RGB (Red, Green, Blue — красный, зеленый, синий) с 8-разрядными значениями пикселов красного, зеленого и синего цветов. При обработке (например, сжатии) изображения оно выражается тремя компонентами, по одному на каждый цвет (в пространстве RGB), или в логически эквивалентной форме (в пространстве YUV, которое мы обсудим далее). В любом случае, основной объем вычислений проводится для прямоугольных матриц 8-разрядных целых чисел без знака.

Для эффективной обработки таких матриц в TriMedia предусмотрены многочисленные специализированные операции. В качестве простого примера рассмотрим верхний левый угол матрицы 8-разрядных значений, сохраненной в памяти с прямым порядком следования байтов (рис. 8.4, а). Блок 4 х 4 в этом углу содержит 16 8-разрядных значений от А до Р. Предположим, что в результате транспонирования изображения получилась матрица, изображенная на рис. 8.4, б. Как достигается этот результат?

Транспонирование можно провести за 12 операций, каждая из которых загружает байты в новые регистры, после которых должно быть выполнено еще 12 операций, помещающих эти байты по назначению (отметьте, что четыре диагональных байта при транспонировании не перемещаются). Проблема в том, что эта схема требует 24 длинных и длительных операций, обращающихся к памяти.

Есть и другой способ. Сначала выполняются четыре операции, каждая из которых загружает одно слово в четыре разных регистра — от R2 до R5 (как показано на рис. 8.4, в). Затем с помощью операций маскирования и сдвига четыре получившихся слова объединяются, и формируется желаемый результат (рис. 8.4, г). В конце слова сохраняются в памяти. Несмотря на значительное сокращение числа обращений к памяти (с 24 до 8), эффективность этого метода не высока из-за маскирования и сдвига — для извлечения и размещения всех байтов в нужных местах требуется слишком много операций.

В TriMedia реализован более удачный метод. Во-первых, четыре слова размещаются в регистрах. При этом результат формируется не маскированием и сдвигами, а специализированными операциями для извлечения и размещения байтов в регистрах. Таким образом, для транспонирования изображения достаточно восьми специальных мультимедийных операций и такого же числа обращений к памяти. Код начинается с двух операций загрузки в сегменты 4 и 5 для размещения слов в регистры R2 и R3, за которыми следуют аналогичные операции для загрузки в регистры R4 и R5. Команды, в составе которых находятся эти операции, могут задействовать сегменты 1, 2 и 3 для любых других целей. После загрузки всех слов 8 специальных мультимедийных операций вместе с двумя операциями сохранения можно упаковать в две команды, формирующие выходные данные. В конечном счете, требуются всего 6 команд, причем 14 из 30 слотов остаются доступными для других операций, а значит, при решении поставленной задачи число слотов соответствует примерно трем командам. Другие мультимедийные операции столько же эффективны. Благодаря этим операциям, а также разделению команды на пять слотов, процессор TriMedia оказывается высокоэффективным инструментом обработки мультимедийных данных.