生成コードでのマルチワード処理の回避
この例では、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;
}この関数の場合、生成されたコードにマルチワード処理は含まれません。