Main Content

固定小数点の自動変換のベスト プラクティス

固定小数点コンバーター アプリを使用して浮動小数点 MATLAB® コードを固定小数点コードに変換する場合は、次のベスト プラクティスに従ってください。

テスト ファイルの作成

コードの構造化のベスト プラクティスは、結果のテストと検証に使用する他のコードと、コア アルゴリズムを分離することです。元の MATLAB アルゴリズムと固定小数点バージョンのアルゴリズムを呼び出すテスト ファイルを作成します。たとえば、以下の表に示すように、入力データをアルゴリズムに供給するように設定し、それらのデータを処理した後に結果を確認するプロットを作成します。固定小数点に変換する必要があるのはアルゴリズム部分だけなので、入力の作成、アルゴリズムの呼び出し、結果のプロットを行うテスト ファイルと、コア プロセッシングを行う 1 つ (または複数) のファイルにコードを構造化するのがより効率的です。

元のコードベスト プラクティス変更されたコード
% TEST INPUT
x = randn(100,1);

% ALGORITHM
y = zeros(size(x));
y(1) = x(1);
for n=2:length(x)
  y(n)=y(n-1) + x(n);
end

% VERIFY RESULTS
yExpected=cumsum(x);
plot(y-yExpected)
title('Error')

問題点

テスト入力の生成および結果の確認がアルゴリズム コードと混在している。

修正法

アルゴリズムから分離したテスト ファイルを作成します。アルゴリズムを独自の関数に含めます。

テスト ファイル

% TEST INPUT
x = randn(100,1);

% ALGORITHM
y = cumulative_sum(x);

% VERIFY RESULTS
yExpected = cumsum(x);
plot(y-yExpected)
title('Error')

アルゴリズム独自の関数

function y = cumulative_sum(x)
  y = zeros(size(x));
  y(1) = x(1);
  for n=2:length(x)
    y(n) = y(n-1) + x(n);
  end
end

このテスト ファイルは以下の目的で使用できます。

  • 固定小数点に変換する前に浮動小数点アルゴリズムが期待どおりに動作することを検証します。浮動小数点アルゴリズムの動作は、固定小数点バージョンのアルゴリズムの動作と比較する際のベースラインとなります。

  • 固定小数点データ型を推奨します。

  • 固定小数点バージョンのアルゴリズムの動作を浮動小数点ベースラインと比較します。

  • 静的範囲の初期値の特定に役立ちます。

シミュレーション範囲が正確になるよう、テスト ファイルによってアルゴリズムが動作範囲全体にわたって実行されます。フィルターの現実的な入力の例としては、インパルス、正弦波の和、チャープ信号などがあります。これらの入力を線形理論で使用すると、出力が正しいことを確認できます。最大出力を生成する信号は、システムがオーバーフローしないことを検証するうえで役立ちます。推奨される固定小数点データ型の性質は、テスト ファイルが適切な精度でアルゴリズムの動作範囲をどの程度カバーしているかによって決まります。

既定では、固定小数点コンバーター アプリはコード カバレッジ結果を表示します。コード カバレッジの結果を確認すると、テスト ファイルがアルゴリズムを適切に実行しているか検証できます。赤いバーで示されたコード カバレッジを確認します。このコードは実行されていません。コード カバレッジが不適切な場合は、テスト ファイルを変更するか、テスト ファイルを追加してカバレッジを拡張してください。コード カバレッジを参照してください。

コード生成のためのアルゴリズムの準備

自動変換プロセスは、コードをインストルメント化し、データ型推奨を提供することでアルゴリズムを固定小数点に変換できるようにします。

固定小数点に自動的に変換する MATLAB アルゴリズムは、コード生成の要件と規則に準拠していなければなりません。コード生成でサポートされている MATLAB 言語のサブセットを確認するには、C/C++ コードの生成でサポートされている関数およびオブジェクトを参照してください。

MATLAB コード内のサポートされていない関数または構造体を特定するには、MATLAB ファイルの先頭に %#codegen プラグマを追加します。MATLAB コード アナライザーにより、コード生成でサポートされていない MATLAB 言語のサブセット内で使用できない関数と構造体にフラグが付けられます。このアドバイスは、MATLAB エディターでコードを編集する際にリアルタイムで表示されます。詳細は、MATLAB コード アナライザーを使用したコードのチェックを参照してください。ソフトウェアにより、コード生成でサポートされていない関数への呼び出しやデータ型の使用を特定するレポートへのリンクが提供されます。詳細は、コード生成の準備状態ツールを使用したコードのチェックを参照してください。

アルゴリズム内で使用される関数の固定小数点サポートの確認

アルゴリズム内で検出されたサポートされない関数呼び出しは、[関数の置き換え] タブで報告されます。たとえば、固定小数点がサポートされていない関数 fft を使用している場合は、ツールによってこのタブのテーブルにエントリが追加され、固定小数点の演算に使用する置換関数を指定する必要があることが示されます。

追加の置換関数を指定できます。たとえば、sincossqrt などの関数は固定小数点をサポートする場合もありますが、効率を高めるためにルックアップ テーブルや CORDIC ベースのアルゴリズムなど、別の実装の検討が必要になる場合もあります。アプリには、元の MATLAB コードに含まれるステートのない単入力、単出力の連続関数について、ルックアップ テーブルの近似を生成するオプションがあります。ルックアップ テーブルの近似を使用した関数の置き換えを参照してください。

データ型の管理とビット成長の抑制

固定小数点の自動変換プロセスはデータ型の管理とビット成長の抑制を自動的に行います。ツールは、生成されたコード内で添字による代入、つまりコロン (:) 演算子を使用する代入を使用してビット成長を抑制します。添字による代入を使用する場合、MATLAB は左辺引数の値を上書きしますが、既存のデータ型と配列サイズは保持します。ビット成長を回避できるだけでなく、添字による代入は生成された固定小数点コード内のキャスト数を削減し、コードの可読性を向上させます。

固定小数点への変換

固定小数点へ変換する目的

変換を開始する前に、固定小数点に変換する目的を考慮します。アルゴリズムを C または HDL に実装するのか。ターゲットの制約は何か。これらの質問への回答により、使用可能な語長、小数部の長さおよび算術モードなどの多くの固定小数点プロパティ、ならびに使用可能な数学ライブラリが決定されます。

これらのプロパティを設定するには [詳細設定] の設定を使用します。

詳細は、[型の推奨] オプションの指定を参照してください。

固定小数点型を使用した実行および結果の比較

固定小数点に変換する前に浮動小数点アルゴリズムが期待どおりに機能することを検証するテスト ファイルを作成します。これと同じテスト ファイルを使用して、固定小数点データ型の推奨を得て、変換後に固定小数点の結果を浮動小数点のベースラインと比較することができます。詳細については、シミュレーションの実行を参照してください。

ヒストグラムを使用したデータ型の設定の微調整

固定小数点型の設定を微調整するには、ヒストグラムを使用します。詳細は、ヒストグラムのデータの記録を参照してください。

アプリでヒストグラムのデータを記録するには、[解析] 矢印 をクリックして [ヒストグラム データを記録] を選択します。

シミュレーションと静的解析の終了後、以下を実行できます。

  • 変数のヒストグラムを表示するには、[変数] タブでその変数の [推奨された型] フィールドをクリックします。

    [ヒストグラム] ウィンドウ内の境界ボックスの端をドラッグして推奨されたデータ型を変更し、[符号付き] オプションを選択または選択解除することで、推奨されたデータ型の変更による効果を表示できます。

  • 値がオーバーフローを発生し、範囲が推奨されたデータ型に適合しない場合、テーブルには推奨型が赤で表示されます。

ツールによってデータ型が適用されると、オーバーフローの情報を提供し、オーバーフローを赤で強調表示した html レポートが生成されます。推奨されたデータ型を確認します。

アルゴリズムの最適化

C または HDL の最適な型の取得のための fimath の使用

fimath プロパティは、fi オブジェクトに数式、丸めおよびオーバーフロー プロパティを含む算術演算を実行するためのルールを定義します。fimathProductMode および SumMode プロパティを使用して C および HDL の最適なデータ型を保持できます。HDL では、生成された HDL コードで任意の語長の型を使用できますが、C はコンテナー型 (uint8uint16uint32) を必要とします。[詳細設定] の設定を使用します。[型の推奨] オプションの指定を参照してください。

C.  ProductMode および SumModeKeepLSB 設定は C 言語の整数演算の動作をモデル化し、KeepMSB は多数の DSP デバイスの動作をモデル化します。丸め手法の種類によって、必要なオーバーヘッド コードの量が異なります。RoundingMethod プロパティを Floor に設定 (2 の補数切り捨てと同等の設定) すると、丸めの実装が最も効率的になります。同様に、オーバーフローを処理する標準的な方法は、モジュロ演算を使用してラップすることです。他のオーバーフローの処理方法は過剰なロジックを作成します。可能な限り、OverflowActionWrap に設定してください。

MATLAB コードベスト プラクティス生成した C コード

コンパイルするコード

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

メモ

アプリで、[既定の語長]16 に設定します。

問題点

[既定の語長] が fimath の既定の設定の 16 である場合、飽和オーバーフロー、最も近い整数への丸め、および完全精度の演算を実装するために追加のコードが生成される。

int adder(short a, short b)
{
  int y;
  int i;
  int i1;
  int i2;
  int i3;
  i = a;
  i1 = b;
  if ((i & 65536) != 0) {
    i2 = i | -65536;
  } else {
    i2 = i & 65535;
  }

  if ((i1 & 65536) != 0) {
    i3 = i1 | -65536;
  } else {
    i3 = i1 & 65535;
  }

  i = i2 + i3;
  if ((i & 65536) != 0) {
    y = i | -65536;
  } else {
    y = i & 65535;
  }

  return y;
}

修正法

生成される C コードをより効率的にするには、使用するプロセッサの種類に一致した固定小数点の算術設定を選択します。

固定小数点の型推奨をカスタマイズするには、アプリの [設定] を使用します。[fimath] を選択し、以下を設定します。

int adder(short a, short b)
{
  return a + b;
}
丸め手法Floor
オーバーフロー アクションWrap
乗算モード KeepLSB
加算モードKeepLSB
乗算の語長32
加算の語長32

HDL.  HDL コード生成について以下を設定します。

  • ProductMode および SumModeFullPrecision

  • Overflow actionWrap

  • Rounding methodFloor

組み込み関数のより効率的な固定小数点の実装への置換

一部の MATLAB 組み込み関数は、固定小数点の実装向けにより効率的にすることができます。たとえば、組み込み関数をルックアップ テーブルの実装で置き換えたり、反復的なシフト加算の演算のみを必要とする CORDIC の実装で置き換えたりできます。詳細は、関数の置換を参照してください。

除算演算の再実装 (可能な場合)

多くの場合、除算はハードウェアによって完全にサポートされておらず、処理が低下する場合があります。アルゴリズムで除算が必要な場合、以下のオプションのいずれかで置き換えることを考慮してください。

  • 分母が 2 のべき乗の場合はビット シフトを使用。たとえば、x/8 の代わりに bitsra(x,3) を使用します。

  • 分母が定数の場合は逆数で乗算。たとえば、x/5 の代わりに x*0.2 を使用します。

  • 除数が定数でない場合は除算に一時変数を使用。この結果、より効率的なデータ型の推奨が達成され、オーバーフローが発生した場合にオーバーフローしている式を確認しやすくなります。

浮動小数点変数の排除

コードをより効率的にするため、固定小数点の自動変換プロセスでは浮動小数点変数が排除されます。唯一の例外はループのインデックスです。これは、通常、インデックスは整数型になるためです。変換後に固定小数点コードを検査して、生成された固定小数点コード内に浮動小数点変数がないことを確認するようお勧めします。

明示的な double 型および single 型のキャストの回避

自動化されたワークフローでは、固定小数点のデータ型をサポートしない関数を分離するために MATLAB アルゴリズム内で明示的な double 型または single 型のキャストを使用しないでください。自動変換ツールはこれらのキャストをサポートしません。

キャストを使用する代わりに、置換関数を指定してください。詳細は、関数の置換を参照してください。

参考

| | | |