Нравится? Делимся информацией!

пятница, 1 февраля 2013 г.

TMS320 c28x: Операция “остаток от деления”, %. Исследование.


Статья по исследованию других операций: Сравнение производительности стандартных функций из rts2800_fpu32 и rts2800_fpu32_fast_supplement библиотек

Проверил производительность вычисления остатка на процессоре TMS320F28335:
int i = 1000;

int module = 990;
int res; 
<...>
res
= i % module;
<...>


В режиме View → Mixed Source/ASM

:

Примечание! FFC XAR7,22bitAddr Fast function call
Результаты профилирования в CCStudio:


Вывод: реализация модулярной арифметики будет занимать 42 процессорных такта. Про смысл значений в таблице можно почитать тут. Означают они то, что профилируемый участок кода выполнялся 7 раз, на это ушло в итоге 294 такта, на одно выполнение профилируемой области максимально тратится 42 такта. На выполнение той же области, но исключая время, затраченное на подпрограммы, ушло 7 тактов, т.к. asm команда FFC - это команда вызова функции (вызывает какую-то встроенную, ассемблерную функцию).
На подобную конструкцию в коде затрачивается 49 тактов процессора:
Теперь попробую свой вариант.

/* modulo.h */


#ifndef MODULO_H
#define MODULO_H


namespace dsp {


typedef int int32;int32 modulo(const int32 &num, const int32 &module);


}

#endif // MODULO_H

/* modulo.cpp */


#include "modulo.h"


namespace dsp {


int32 modulo(const int32 &num, const int32 &module) {


return ( num - ( module * (int)(num/module) ) );

}
}
// dsp::

Результаты сравнения:
Вывод: реализованная функция в два раза медленней сгенерированной  компилятором CCStudio функции. Однозначно, смело можно пользоваться средствами С++, компилятора и run-time support library с поддержкой FPU . Обе функции будут компилироваться без проблем на любой платформе, только вот скорость их выполнения будет зависеть от железа и оптимизации кода под это железо. Для процессоров С28х TI постаралось перегрузить оператор  взятия остатка %, спрятав в библиотеку реализацию этого способа (скорее всего, при помощи ассемблера производилась оптимизация  кода для С2000 семейства).
Примечание! При использовании Fast RTS Library (rts2800_fpu32_fast_supplement.lib) результаты производительности точно такие же.
Примечание! Статья появилась с целью осознать издержки при использовании остатка от деления в циклических буферах, а фактически, в КИХ фильтрах.

Комментариев нет:

Отправить комментарий