Main Content

生成コードでのマルチワード処理の回避

この例では、MATLAB® アルゴリズムにおいて、単純な加算の代わりに関数accumpos を使用して、生成コード内でマルチワード処理を回避する方法を示します。同様に、減算にも accumneg を使用できます。

この例には MATLAB Coder™ のライセンスが必要です。

2 つの数値を加算して結果を返す、単純な MATLAB アルゴリズムを記述します。

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

accumpos を使用して 2 つの数値を加算し、結果を返す、別の MATLAB アルゴリズムを記述します。

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

accumposa のデータ型を使用して ab を加算します。ba のデータ型にキャストされます。afi オブジェクトである場合、既定では accumpos は丸めモードを 'Floor' に、オーバーフロー アクションを 'Wrap' に設定します。abfimath プロパティは無視されます。

MATLAB で 2 つの関数の出力を比較します。

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: 63
        FractionLength: 34

y2 = 

    1.3750

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

単純な加算の場合は語長が大きくなりますが、accumpos を使用すると結果の語長は a と同じになります。

関数 my_add1 の C コードを生成します。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 の C コードを生成します。

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;
}

この関数の場合、生成されたコードにマルチワード処理は含まれません。