主要内容

非正規数の実行速度

非正規数は,浮動小数点の文献で以前は非正規化数と呼ばれており,浮動小数点演算においてゼロ周辺のアンダーフローのギャップを埋めます。非正規値とは,0.0に近すぎるため正規化値として表記できない,特殊なカテゴリの浮動小数点値です。非正規数の仮数の先頭はゼロです。浮動小数点の加算と減算を行うときに,非正規数によってアンダ,フロ,が回避されます。

非正規数の使用によって正規表現を上回る精度が提供されます。仮数の先頭にゼロを使用することで,正規表現がその最小指数に達した後のさらに小さい値を表現します。値が0.0に近づくと,拡張範囲と精度がトレ,ドオフされます。アプリケーションで追加の範囲が必要である場合、非正規数は便利です。

ただし,リアルタイムシステムで非正規数を使用すると,実行のレイテンシが著しく増加し,設計マージンが過剰になり,リアルタイムのオーバーランが発生します。シミュレーションまたは生成コードが非正規数を生成または使用する計算を実行すると,正規数による類似計算よりも実行速度が50倍遅くなる可能性があります。非正規数計算の実際のシミュレーションまたはコード実行時間は,コンピューターの動作環境によって異なります。通常,デスクトッププロセッサの場合,非正規数計算の実行時間は,正規数の同様の計算より5倍かかります。

非正規数計算のレイテンシのために実行に時間がかかったり,オーバーランする可能性を低減するために,以下のいずれかを行います。

  • モデルでのウォッシュアウト,フィルターなどの入力や主な演算では,入力または計算された非正規値はすべて手動で削除してゼロにします。例にいては,非正規数をゼロにフラッシュするを参照してください。

    単精度の32ビット浮動小数点数の非正規値を検出するには,次の手順に従います。

    1. MATLAB®ホストで最小正規数を検出します。コマンドウィンドウで以下のように入力します。

      >> smallstnormalsingle = realmin('single')
      C言語では,float.hで定義されたFLT_MIN最小正浮点数(单)と等価です。

    2. 以下の範囲内で値を検索します。

      0 < fabsf(x) < smallstnormalsingle

    倍精度の64ビット浮動小数点数の非正規値を検出するには,次の手順に従います。

    1. Matlabホストで最小正規数を検出します。コマンドウィンドウで以下のように入力します。

      >> smallstnormaldouble = realmin('double')
      C言語では,float.hで定義されたDBL_MIN最小正浮点数(双)と等価です。

    2. 非正規値を検出するため,以下の範囲内で値を検索します。

      0 < fabs(x) < smallstnormaldouble

  • [非正規数に対するシミュレ,ションの動作]パラメ,タ,を刷新至零(自由贸易区)に設定して,算術演算からのすべての非正規結果についてのflush-to-zero動作をエミュレートします。詳細にいては,非正規数に対するシミュレ,ションの動作を参照してください。

  • プロセッサでは,flush-to-zeroモードを設定するか,コンパイラで非正規数を無効にするオプションを指定します。flush-to-zeroモードでは,非正規数が浮動小数点演算に対する入力である場合,非正規数は0として扱われます。アンダ,フロ,の例外は,冲零モ,ドでは起こりません。

    たとえば,英特尔®プロセッサでは,MXCSRレジスタのflush-to-zero(保税区)およびdenormals-are-zero(戴兹)フラグが浮動小数点計算を制御します。Linuxのgccコンパ主机ラの場合,-ffast-mathは突発的アンダ,フロ,(保税区)である冲零を設定しますが,o3 -ffast-mathは非正規数を使用して段階的アンダ,フロ,に戻します。

詳細は,ieee®標準754のIEEE浮点运算标准を参照してください。

非正規数を使用する場合と使用しない場合のシミュレ,ション時間

このモデルは,非正規数の使用によりシミュレ,ション時間が5倍に増加する様子を示します。

モデルex_subnormalを開きます。[ゲescン]は非正規値最小正浮点数(双)/ 2に設定されています。

シミュレ,ションを実行するには,コマンドウィンドウで”当k=1:5时,tic;sim(“ex_subnormal”);toc,结束と入力します。非正規値を使用するシミュレ,ションの経過時間を確認すると,以下のようになります。

>>k = 1:5,抽搐;sim卡(“ex_subnormal”);toc,结束运行时间9.909326秒。运行时间9.617966秒。运行时间9.797183秒。运行时间9.702397秒。运行时间9.893946秒。

[增益]を非正規値ではない数2に設定します。

> > set_param (“ex_subnormal /增益”“获得”' 2 ');

シミュレ,ションを実行するには,コマンドウィンドウで”当k=1:5时,tic;sim(“ex_subnormal”);toc,结束と入力します。非正規値を使用しないシミュレ,ションの経過時間を確認すると,以下のようになります。

>>k = 1:5,抽搐;sim卡(“ex_subnormal”);toc,结束运行时间2.045123秒。运行时间1.796598秒。运行时间1.758458秒。运行时间1.721721秒。运行时间1.780569秒。

非正規数をゼロにフラッシュする

この例では,単精度非正規数をゼロにフラッシュする方法を示します。

  1. モデルex_flush_to_zeroを開きます。

    • 重复序列楼梯は2の0乗から2の-165乗の値までの数列を生成します。数列はゼロに近くなります。

    • ConditionRealScalarは,最小正浮点数(单)より小さい非正規の単精度値をゼロにフラッシュします。

    • Matlab関数ブロックlog2重复序列楼梯出力の2を底とする対数を生成します。具体的には,log2は0から-165の数値を生成します。

  2. [シミュレ,ション][ステップを戻す][シミュレ,ションステップの設定]ペ@ @ンで次を実行します。

    • [ステップを戻す機能を有効にする]を選択します。

    • [次の時間に達したときにシミュレ,ションを一時停止]を選択して121と入力します。

  3. モデルウィンドウで,シミュレ,ションを実行します。シミュレ,ションはT = 121で停止します。表示される値は次のとおりです。

    • ConditionRealScalar出力がゼロに近づきます。

    • 重复序列楼梯输出がゼロに近づきます。

  4. シミュレ,ションをT = 127まで進めます。ConditionRealScalarは非正規値出力を重复序列楼梯からゼロにフラッシュします。

  5. 引き続きシミュレ,ションを進めます。ConditionRealScalarは非正規単精度値出力を重复序列楼梯からゼロにフラッシュします。T = 150の場合,重复序列楼梯の出力自体はゼロです。

関連するトピック