生成コードでのマルチワード処理の回避
この例では、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
accumpos
は a
のデータ型を使用して a
と b
を加算します。b
は a
のデータ型にキャストされます。a
が fi
オブジェクトである場合、既定では accumpos
は丸めモードを 'Floor'
に、オーバーフロー アクションを 'Wrap'
に設定します。a
と b
の fimath
プロパティは無視されます。
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; }
この関数の場合、生成されたコードにマルチワード処理は含まれません。