2014-09-03 3 views
4

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

Я знаю, что скорость обучения меняется совсем немного, но я думаю, что некоторые из вас по крайней мере могут использовать эмпирическое правило или просто испытать. :)

условные операторы

Если я должен использовать условия, switch должен быть быстрее, чем if/else if блок, правильно? Существуют ли различия между использованием двух if -значений или if-else? Где-то я читал, что следует избегать else, но я не знаю, почему.

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

//something could be an int either 1 or 0: 
if(something) { 
    signal += something_else; 
} 
// or: 
signa+ += something*something_else; 

функция и функция-указатели

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

Я также задаюсь вопросом, влияет ли функция вызова. Если это так, следует избегать бокс-функций, правильно?

переменных

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

расчеты Есть ли порядок расчета типов с точки зрения времени их выполнения? Я уверен, что это сильно зависит от контекста, но эмпирическое правило будет приятным. Я часто читал, что люди считают только умножение в алгоритме. Это потому, что дополнения происходят быстро? Имеет ли разница между умножением и делением? (*0.5 или /2.0)

Я надеюсь, что вы сможете поделиться опытом использования soem.

Приветствия

+3

Внедрите сначала, оптимизируйте второй. То есть, не беспокойтесь о производительности, пока у вас не будет рабочего кода.Затем проанализируйте свой рабочий код и оптимизируйте узкие места. – dohashi

+1

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

+0

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

ответ

1

компиляторы DSP, как правило, хороши в оптимизации for петли, которые не содержат функции-вызовов.

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

Если ваш DSP является процессором с фиксированной точкой, операции с плавающей запятой реализуются SW.

Это означает, что каждая такая операция существенно заменяется компилятором с библиотечной функцией.

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

Препроцессор должен обеспечить специальный #pragma для числа итераций for цикла:

  • Минимальное число итераций
  • Максимальное число итераций
  • Кратность числа итераций

Используйте это #pragma, где это возможно, чтобы помочь компилятору выполнить loop-unrol если возможно.

И, наконец, DSP обычно поддерживают набор уникальных операций для повышения производительности.

В качестве примера, рассмотрим _dotpu4 на Texas Instruments C64xx, который вычисляет скалярное-произведение двух целых чисел src1 и src2: Для каждой пары 8-битных значений в src1 и src2, 8-битное значение из src1 умножается на 8-битное значение от src2, и четыре продукта суммируются вместе.

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

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

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

+0

Yay! другого программиста C64xx в stackoverflow. –

+0

@NilsPipenbrinck: Ха-ха, приятно познакомиться :) Я думал, что я остался один (хотя я действительно должен признать, что в прошлый раз я использовал его где-то около 2005 года). –

1

вот часть ответов:

расчеты (говорить о родной точности процессора для примера 32bits):

  • Большинства DSP микропроцессоров имеют одинарные мультипликатор цикла, что означает умножение стоит точно так же, как добавление в срок циклов.
  • и умножение его обычно быстрее, чем деление.

условные операторы:

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

, но в целом, если возможно, вам следует избегать, если/else в петле, чтобы улучшить подкладку трубы.

удачи.

+0

Привет, Эти примечания также сохраняются для обычных процессоров x86/x64? Я разрабатываю для Windows, в общем, забыл, что DSP относится к «процессору» и «обработке». :/ –

+0

В этом примечании конкретно рассматриваются DSP – shoham

Смежные вопросы