Эффективность ММХ-вычислений

Эффективность ММХ-вычислений

Эффективность вычислений на ММХ-процессорах в первую очередь определяется теми средствами параллельной обработки, которые заложены в их аппаратуру.

Эти средства делятся на два класса:

— векторной обработки по системе SIMD, которые основаны на новых типах данных и 57 новых командах целочисленной арифметики;

— суперскалярной обработки, свойственные всем процессорам семейства Pentium благодаря наличию двух целочисленных конвейеров.

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

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

Многие приложения содержат участки кода, насыщенные вычислениями. Например, алгоритм компрессии речи, фильтры, процедуры обработки видео и другие. Обычно они представляют из себя небольшие повторяющиеся циклы, которые работают с 8-, 16-битовыми целочисленными данными и занимают большую часть процессорного времени. Это как раз для ММХ-процессоров. Включение таких процедур в специальные библиотеки функций MMX даст большую гибкость при написании программ для MMX- и не ММХ-процессоров.

Pentium также является и суперскалярным процессором, содержащим два целочисленных конвейера общего назначения и конвейеризированный блок для работы с числами с плавающей точкой. Все это позволяет выполнять до двух целочисленных команд одновременно. Так, процессор Pentium может выполнять две команды за такт, по одной в каждом конвейере. Первый конвейер обозначается как U, а второй — V.

Для обеспечения ММХ-вычислений в целочисленный конвейер добавлены новые ступени, что позволяет также одновременно выполнять две ММХ-команды или одну ММХ- и одну целочисленную команду.

Ниже в таблице представлены некоторые возможности ММХ-конвейера.

Операция Число функциональных устройств Задержка Производительность Конвейеры
АЛУ 2 1 1 U и V
Умножение 1 3 1 U или V
Сдвиг, упаковка, распаковка 1 1 1 U или V
Доступ к памяти 1 1 1 только U
Доступ к целочисленным регистрам 1 1 1 только V
Существует множество об щих рекомендаций по оптимальному программированию для конвейеров суперскалярных процессоров Intel. Эти рекомендации представлены в Optimization for Intel's 32 bit Processors, Application Note, Order Number 242816. Однако нами далее будут рассмотрены не общие, а специфические для суперскалярных процессоров методы повышения быстродействия за счет параллельного выполнения двух целочисленных или ММХ-команд.

Существуют определенные ограничения на одновременное выполнение двух команд. Так, в обычном процессоре семейства Pentium одновременно могут выполняться только "простые" команды, то есть такие, которые благодаря аппаратной реализации выполняются за один такт. Таких команд большинство.

При одновременном выполнении двух ММХ-команд основные ограничения таковы:

1. Две MMX-команды, использующие MMX-устройство сдвига (упаковка, распаковка и команды сдвига), не могут выполняться параллельно, так как имеется только одно такое устройство.

2. MMX-команды, использующие устройство умножения (команды типа pmull, pmadd), не могут выполняться параллельно, так как имеется только одно устройство умножения.

3. MMX-команды, содержащие обращение в память или к целочисленным регистрам, могут выполняться только в U-конвейере.

4. MMX-регистр, являющийся приемником команды из U-конвейера, не должен выступать в качестве источника или приемника команды из V-конвейера (проверка на зависимость по данным).

Если в одном из конвейеров выполняется целочисленная команда, а в другом ММХ-команда, то их одновременное выполнение разрешается только в том случае, если ММХ-команда не обращается в память или к целочисленным регистрам.

Все MMX-команды конвейеризированы, включая и команду умножения. Все команды выполняются за один такт, за исключением умножения. Ему требуется 3 такта, поэтому его результат может быть использован только 3 такта спустя, вследствие этого не рекомендуется ставить зависимые команды в пару, следующую непосредственно за умножением.

Если в программе используются ММХ-команды, следует иметь в виду, что 8 MMX-регистров — это переименованные регистры для арифметики ПТ. Переход от MMX к ПТ может занимать до 50 тактов, поэтому необходимо так распланировать размещение MMX-команд и команд арифметики ПТ в программе, чтобы приложение подольше оставалось в любом из этих режимов. Это снизит простои из-за переключений.

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

Геннадий Шпаковский, по материалам фирмы Intel


Компьютерная газета. Статья была опубликована в номере 18 за 1997 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета