Быстродействия никогда не бывает много! Пока еще не создано (да и вряд ли когда-нибудь будет) вычислительное устройство, способное решить любую задачу за отведенное время. Если решение существует, то, скорее всего, оно будет найдено, однако, в прикладных задачах цифровой обработки сигналов время решения является обязательным исходным параметром, без которого формулировка задачи будет не полной.

В задачах ЦОС, как правило, приходится проводить обработку непрерывно поступающего дискретного сигнала, и время решения задачи ограничивается временем накопления (приема) количества отсчетов сигнала, достаточного для получения требуемого результата. Однако с ростом частоты дискретизации объем входных данных увеличивается (при неизменном времени накопления), что приводит к увеличению количества вычислений. Поэтому задачей создания вычислительных устройств является обеспечение заданной производительности, а именно, решение поставленной задачи за отведенное время.

Производители процессоров стремятся повысить их производительность, увеличивая тактовую частоту и внося изменения и дополнения в архитектуру процессора.

Быстродействие и производительность

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

Под "быстродействием" в рамках данной статьи мы будем понимать то, насколько быстро выполняется одна команда (действие), а "производительность" характеризует число действий, производимых в единицу времени. О быстродействии цифровых сигнальных процессоров можно судить по их тактовой частоте: чем больше частота, тем выше быстродействие. Единицей измерения производительности являются MIPS – число операций/инструкций в секунду, а также MFLOPS – число миллионов операций с плавающей точкой в секунду.

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

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

В качестве примера рассмотрим внутренний цикл КИХ-фильтра, математически представленный в следующем виде:

pic1,                                                                                                     (1)

где x[n-j] – значение отсчета входного сигнала, y[n] – значение на выходе фильтра, h[j] – коэффициент j-го фильтра и N – число коэффициентов.

Процессор TMS320C6203 имеет частоту 300 МГц и способен выполнить до 8 команд за такт. Таким образом, его производительность составляет 2400 MIPS, – что в 10 раз больше, чем у процессора Motorola DSP56321 с частотой 240 МГц. Несмотря на такое различие в MIPS TMS320C6203 выполняет данный алгоритм всего лишь примерно в 3 раза быстрее, чем DSP56321 (по данным тестирования BDTI). Это расхождение между заявленным числом MIPS и реальной производительностью является результатом впечатляющего различия в функциональности одной команды, выполняемой каждым процессором за 1 такт.

Процессоры семейства Motorola DSP56321 реализуют внутренний цикл КИХ-фильтра следующим набором команд:

MOVE ADDR, R0                                  ; загрузка адреса данных в R0
MOVE #HADDR, R4              ; загрузка адреса коэффициентов в R4
REP #N                  ; повторение следующей операции N раз
MAC X0, Y0, A   X:(R0)+, X0   Y:(R4)+, Y0 ; умножение с накоплением отсчета и коэффициента

Так как DSP563xx имеет аппаратную реализацию циклов, два генератора адреса, расширенную Гарвардскую архитектуру и специализированную систему команд, процессор может реализовать внутренний цикл, выполняя N операций умножения с накоплением. За один такт DSP563xx может умножать отсчет на соответствующий коэффициент, загружать следующие множители в регистры и инкрементировать указатели памяти.

В процессорах TMS320C62xx внутренний цикл КИХ-фильтра реализуется следующими командами:

loop:
ADD .L1       A0, A3, A0    ; A0 = A0 + A3
||   ADD .L2       B1, B7, B1    ; B1 = B1 + B7
||   MPYHL .M1X    A2, B2, A3    ; A3 = A2(hi)*B2(lo)
||   MPYLH .M2X    A2, B2, B7    ; B7 = A2(lo)*B2(hi)
||   LDW .D2       *B4++, B2     ; загрузка в B2
||   LDW .D1       *A7--, A2     ; загрузка в A2
||   ADD .S2       -1, B0, B0    ; уменьшение счетчика
||   [B0]          B.S1 loop     ; на начало цикла, если B0≠0

 

TMS320C62xx имеет архитектуру сверхдлинного командного слова (VLIW – Very Long Instruction Word), которая позволяет выполнить до 8 команд одновременно. Его пара умножителей и пара сумматоров позволяют выполнить операцию умножения с накоплением для двух отводов фильтра за 1 такт. Таким образом, 8 команд, приведенных выше, должны выполняться N/2 раз каждая. Заметим, однако, что TMS320C62xx требует наличия отдельных команд для управления циклом и загрузкой в память, в то время как DSP563xx может выполнить эти команды одновременно с умножением.

Тактовая частота TMS320C62xx равная 300 МГц и способность выполнить две операции умножения с накоплением (МАС) одновременно дают ему преимущество в быстродействии примерно 3.4 к 1 над DSP563xx, работающим на частоте 240 МГц. Тот факт, что коэффициент "полезности" одной команды TMS320C6xx относительно невелик по сравнению с DSP563xx, объясняет подобное несоответствие между отношением MIPS 10 к 1 и производительностью 3.4 к 1, показанной в данном тесте. Такое сравнение поясняет проблему в использовании упрощенных метрик типа MIPS и показывает, почему MIPS не годится в качестве показателя производительности процессора.

Изменения в архитектуре процессора

Работа процессора на каждом такте заключается в выполнении команд. Начиная с сигнальных процессоров первого поколения, их перечень практически не изменился. По-прежнему основными командами являются сложение, умножение, битовые операции и пересылка данных в памяти. Поэтому неотъемлемой частью любого процессора являются исполнительные устройства, выполняющие перечисленные выше команды: арифметико-логическое устройство (АЛУ), умножитель, устройство сдвига. Для выполнения любой команды также необходимо наличие операндов, над которыми будут совершены те или иные действия. Следовательно, каждое из исполнительных устройств должно иметь связь с запоминающим устройством (памятью), в котором хранятся обрабатываемые данные.

Таким образом, выполнение одной вычислительной операции потребует нескольких процессорных тактов. Например, сложение или умножение требует два такта на пересылку параметров и один такт на считывание кода команды и ее выполнение (рис. 1).

 

Именно так выглядела обработка числовых данных в процессорах общего назначения. Подобная архитектура процессора называется фон Неймановской (Принстонской).

Сократить на один такт выполнение операции сложения можно было бы в том случае, если бы код команды считывался в одном такте с пересылкой операнда в АЛУ (рис. 2). Но для этого необходимо разделить память на участки, содержащие команды и данные, а также организовать связь каждого из них с АЛУ при помощи дополнительной шины. Такая архитектура процессора получила название Гарвардской по месту ее разработки.

 

Если бы существовала возможность передавать в АЛУ оба операнда одновременно, то команда сложения выполнялась бы за 1 такт. Такую возможность предоставляет модифицированная гарвардская архитектура, отличительной особенностью которой является то, что память программ может содержать не только команды, но и данные (рис. 3). При такой организации памяти в одном такте в АЛУ поступают два операнда: один – из памяти данных, а второй – из памяти программ. Однако в этом же такте необходимо выбрать еще и команду. Возникает конфликт доступа к памяти программ.

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

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

Изменения, произведенные в архитектуре процессора, позволили выполнять любую команду за 1 такт. Такое стало возможно благодаря тому, что процессор в одном такте из разных участков памяти получает два операнда и код команды для их обработки. Конечно же, быстрее чем за такт выполнить команду невозможно, однако, еще более повысить производительность можно, выполнив в одном такте несколько команд. Есть два способа осуществить такую операцию: во-первых, можно в одном слове данных пересылать несколько операндов и выполнять команду, код которой считывается процессором из памяти программ. А, во-вторых, можно в одной команде закодировать несколько вычислительных операций, в качестве операндов которых использовать процессорные регистры общего назначения. В первом случае говорят о параллелизме на уровне данных, а во втором – на уровне команд.

Одновременная загрузка нескольких операндов

 В одном такте процессор с модифицированной гарвардской архитектурой имеет возможность прочитать из памяти два значения: одно – из памяти данных, второе – из памяти программ. И главная проблема в повышении производительности заключается в невозможности (или нежелательности) повторного обращения к памяти в этом же такте с целью чтения операндов для выполнения следующей команды. Для ее решения поступают следующим образом: считают, что за один такт из памяти в процессор передается не два операнда, а два слова данных, например, по 32 разряда в каждом (для 32-разрядной шины данных). Следовательно, есть возможность в одном 32-разрядном слове "упаковать" два 16-разрядных или четыре 8-разрядных операнда и сформулировать команду таким образом, чтобы процессор знал, как обрабатывать полученные данные (рис. 4). Такая технология получила название SIMD (Single Instruction Multiple Data – "Одна Инструкция Несколько Данных") и используется во многих современных процессорах.

Одной из самых распространенных операций в цифровой обработке сигналов считается умножение с накоплением. Рассмотрим, как выполняется данная операция в процессорах с SIMD архитектурой. Предположим, задачей процессора является вычисление значения z по формуле:

z = x[0]*y[0] + x[1]*y[1] + x[2]*y[2] + x[3]*y[3].

Процессор с модифицированной гарвардской архитектурой без технологии SIMD решит эту задачу за 7 тактов (рис. 5,а), в то время как SIMD- процессору достаточно четырех (рис. 5,б). В обоих случаях в процессе вычислений потребуется 4 внутренних регистра процессора для хранения промежуточных результатов (R0, R1, R2, R3).

 

Как видно, данная архитектура увеличивает производительность процессоров в векторно-ориентированных приложениях. Однако у нее есть и свои ограничения. Она позволяет добиться увеличения производительности лишь в тех случаях, когда данные могут обрабатываться параллельно. В алгоритмах, которые являются последовательными, например, которые используют результат одной операции как входные данные к другой, SIMD в основном не применяется.

Более того, программирование процессоров с такой архитектурой может потребовать дополнительных усилий. Для эффективного использования технологии SIMD при написании программ на языках высокого уровня, таких как C++, необходимо наличие компилятора, способного использовать все архитектурные возможности процессора, поскольку языки высокого уровня не предполагают наличие команд для параллельной обработки. При программировании же на ассемблере программист должен самостоятельно определять команды и пересортировывать данные в памяти для параллельного выполнения, что увеличивает трудоемкость и время написания программы.

Параллельное выполнение нескольких команд

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

При выполнении операции умножения с накоплением процессоров с подобной архитектурой появилась возможность одновременного выполнения операций умножения и сложения (рис. 7).

Проблема 1. Использование памяти.

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

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

Проблема 2. Трудности при программировании.

Другой проблемой, возникающей при работе с процессорами, построенными на подобной архитектуре, является сложность их программирования на низком уровне. В настоящее время существуют два подхода построения архитектуры процессора с возможностью параллельных вычислений – суперскалярный и VLIW (Very Long Instruction Word – Сверхдлинное Командное Слово). В основном оба подхода различаются тем, каким образом команды группируются для параллельного выполнения. При программировании процессоров с VLIW архитектурой программист, пишущий программы на ассемблере, либо компилятор должен самостоятельно определить, какие команды будут выполняться параллельно. В то же время, при программировании процессора с суперскалярной архитектурой данные операции выполняет специальное аппаратное обеспечение, основываясь на своих внутренних ресурсах. Причем выбор команд происходит по ходу выполнения программы.

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

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

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

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

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

Проблема 3. Условные переходы и ветвления в программе.

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

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

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

Для ускорения определения направления условного перехода применяется так называемое предсказание ветвлений. Процессор определяет наиболее вероятное направление перехода либо статически (по заранее заданным правилам), либо динамически — по собираемой им статистике выполнения этого ветвления за прошедшее время (так как часто переход выполняется более одного раза). А в некоторых моделях и программисту оставлена возможность указать, куда переход более вероятен! Декларируемая вероятность правильного определения переходов в современных процессорах — 90-95%.

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

Однако что делать с возможными переходами в "правильной" ветке конвейера или обработкой аппаратных прерываний, момент появления которых по большому счету случаен?

Аппаратная реализация часто используемых операций

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

Умножение с накоплением

Выполнение операции умножения с накоплением в процессорах с модифицированной гарвардской архитектурой займет 2 такта: один на умножение и второй – на сложение (без использования SIMD и VLIW). При этом основная причина выполнения этой операции за 2 такта, а не за 1 заключается в необходимости повторного обращения к памяти программ для считывания кода операции сложения и адреса результата из памяти данных. Поскольку данная операция очень часто встречается в алгоритмах цифровой обработки сигналов и состоит всего из двух элементарных вычислений, разработчики процессоров обработки сигналов выполнили ее аппаратную реализацию в виде специального регистра-накопителя и присвоили ей отдельный код в системе команд. Более того, поскольку иногда возникает необходимость производить несколько умножений с накоплением одновременно, например, для действительной и мнимой частей комплексного сигнала, в процессоре присутствует несколько таких регистров.

В процессорах Analog Devices с использованием регистра-накопителя операция умножения с накоплением выполняется за 1 такт:

MRF = MRF + R0 * R4

При этом данная операция может выполняться параллельно с обращением к памяти программ и памяти данных.

Циклы с нулевыми потерями

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

ЕСЛИ (<счетчик_цикла> > 0)
TО <декремент_счетчика_цикла> и
<переход_к_началу_цикла>

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

Циклические буферы

При реализации внутреннего цикла КИХ-фильтра (1) возникает необходимость периодического продолжения сигнала справа, поскольку окно с импульсной характеристикой фильтра, "скользящее" по отсчетам сигнала, частично выходит за его пределы. Выполнение подобных операций на каждом шаге преобразования и для каждого отрезка сигнала потребует значительных временных затрат. Для решения данной проблемы в цифровых сигнальных процессорах существует аппаратная возможность организации циклических буферов. Генератор адреса программируется таким образом, что при достижении указателем памяти конца циклического буфера, он перемещается на его начало без временных потерь.

Многопроцессорная поддержка

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

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

Данные могут пересылаться с использованием контролера DMA (Direct Memory Access – Прямой Доступ в Память). Это особенно важно для тех VLIW процессоров, у которых оптимизированное выполнение внутренних циклов не может быть прервано для обслуживания операций ввода-вывода или управления данными. Переключение между задачами может привести к вынужденной задержке, связанной с очисткой конвейера. Данные между процессорами также могут быть переданы через линк-порты, соединяющие процессоры, либо посредством широковещательной записи (одновременная запись во внутреннюю память всех процессоров в кластере).

Помимо обмена данными между процессорами, при решении задач ЦОС происходит ввод-вывод данных в саму вычислительную систему и из нее. В зависимости от частоты дискретизации входного сигнала и числа приемных каналов, по-разному может быть организован ввод данных в МПС.

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

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

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

Заключение

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

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

Повышения производительности удалось добиться за счет параллельного выполнения нескольких команд. При этом процессоры по реализации параллелизма разделились на два фронта: в одном поддерживается выполнение одной и той же команды для нескольких наборов операндов, а в другом – параллельное выполнение нескольких команд, операндами для которых являются внутренние регистры процессора. Оригинальный подход к параллельным вычислениям продемонстрировала компания Analog Devices. При создании ADSP-2116x компания модифицировала свой стандартный процессор с плавающей точкой ADSP-2106x, добавив дополнительный набор исполняющих устройств, полностью дублирующий основной. Каждый набор исполняемых устройств в ADSP-2116x включает умножитель-накопитель, АЛУ, устройство сдвига и каждый имеет собственный набор регистров. ADSP-2116x может сформировать единую команду и выполнить ее параллельно для обоих наборов различных данных, что эффективно удваивает производительность в некоторых алгоритмах.

Наконец, аппаратная реализация операций часто используемых в цифровой обработке сигналов, таких как умножение с накоплением, увеличивает производительность при их вычислении как минимум вдвое (за счет того, что данная операция выполняется за 1 такт, а не за 2) по сравнению с процессорами, не поддерживающими такую возможность.

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

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

Литература

1. Jennifer Eyre. The Digital Signal Processor Derby – www.bdti.com

2. The BDTImark2000: A Summary Measure of DSP Speed – www.bdti.com

3. М. Лень, И. Вайцман. VLIW: старая архитектура нового поколения – www.ixbt.com

4. А. И. Толкачёв. Подходы к программированию для вычислительных систем с распределенными ресурсами.

5. Ian Main. TMS320C67x vs. ADSP-21160: Which Floating-Point DSP Offers Highest Performance? – www.techonline.com