Избегайте операций многословных в сгенерированном коде

Этот пример показывает, как избежать операций многословных в сгенерированном коде при помощи функции accumpos вместо простого сложения в вашем алгоритме MATLAB®. Точно так же можно использовать accumneg для вычитания.

Этот пример требует лицензии MATLAB Coder™.

Запишите простой алгоритм MATLAB, который добавляет два числа и возвращает результат.

function y = my_add1(a, b)
y = a+b;

Запишите второй алгоритм MATLAB, который добавляет два числа с помощью accumpos и возвращает результат.

function y = my_add2(a, b)
y = accumpos(a, b); % floor, wrap

accumpos добавляет a и b с помощью типа данных a. b брошен в тип данных a. Если a является объектом fi, по умолчанию, accumpos устанавливает округляющийся режим на 'Floor' и действие переполнения к 'Wrap'. Это игнорирует свойства fimath a и b.

Сравните выходные параметры двух функций в MATLAB.

a = fi(1.25, 1, 32,5);
b = fi(0.125, 0, 32);
%%
y1 = my_add1(a, b)
y2 = my_add2(a, b)
y1 = 

    1.3750

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 62
        FractionLength: 34

y2 = 

    1.3750

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 5

Для простого сложения растет размер слова, но использование accumpos, размер слова результата совпадает с размером слова a.

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

hw = coder.HardwareImplementation;
hw.ProdHWDeviceType = 'Generic->32-bit Embedded Processor';
hw.ProdLongLongMode = false;
hw.ProdBitPerLong = 32;
cfg = coder.config('lib');
cfg.HardwareImplementation = hw;
codegen my_add1 -args {a,b} -report  -config cfg

MATLAB Coder генерирует статическую библиотеку C и обеспечивает ссылку на отчет генерации кода.

Просмотрите сгенерированный код для простого сложения. Щелкните по ссылке View report, чтобы открыть отчет генерации кода и затем прокрутить к коду для функции my_add1.

/* Function Declarations */
static void MultiWordAdd(const unsigned long u1[], const unsigned long u2[],
 unsigned long y[], int n);
static void MultiWordSignedWrap(const unsigned long u1[], int n1, unsigned int
  n2, unsigned long y[]);
static void sLong2MultiWord(long u, unsigned long y[], int n);
static void sMultiWord2MultiWord(const unsigned long u1[], int n1, unsigned long
  y[], int n);
static void sMultiWord2sMultiWordSat(const unsigned long u1[], int n1, unsigned
  long y[], int n);
static void sMultiWordShl(const unsigned long u1[], int n1, unsigned int n2,
  unsigned long y[], int n);
static void sMultiWordShr(const unsigned long u1[], int n1, unsigned int n2,
  unsigned long y[], int n);
static void uLong2MultiWord(unsigned long u, unsigned long y[], int n);

Сгенерированный код C содержит несколько операций многословных.

Сгенерируйте код С для функционального my_add2.

codegen my_add2 -args {a,b} -report -config cfg

Просмотрите сгенерированный код для сложения с помощью accumpos. Щелкните по ссылке View report, чтобы открыть отчет генерации кода и затем прокрутить к коду для функции my_add2.

int my_add2(int a, unsigned int b)
{
  int y;
  y = a + (int)(b >> 29);
  /* floor, wrap */
  return y;
}

Для этой функции сгенерированный код не содержит операций многословных.