非正規数の実行速度
非正規数は,浮動小数点の文献で以前は非正規化数と呼ばれており,浮動小数点演算においてゼロ周辺のアンダーフローのギャップを埋めます。非正規値とは,0.0
に近すぎるため正規化値として表記できない,特殊なカテゴリの浮動小数点値です。非正規数の仮数の先頭はゼロです。浮動小数点の加算と減算を行うときに,非正規数によってアンダ,フロ,が回避されます。
非正規数の使用によって正規表現を上回る精度が提供されます。仮数の先頭にゼロを使用することで,正規表現がその最小指数に達した後のさらに小さい値を表現します。値が0.0
に近づくと,拡張範囲と精度がトレ,ドオフされます。アプリケーションで追加の範囲が必要である場合、非正規数は便利です。
ただし,リアルタイムシステムで非正規数を使用すると,実行のレイテンシが著しく増加し,設計マージンが過剰になり,リアルタイムのオーバーランが発生します。シミュレーションまたは生成コードが非正規数を生成または使用する計算を実行すると,正規数による類似計算よりも実行速度が50倍遅くなる可能性があります。非正規数計算の実際のシミュレーションまたはコード実行時間は,コンピューターの動作環境によって異なります。通常,デスクトッププロセッサの場合,非正規数計算の実行時間は,正規数の同様の計算より5倍かかります。
非正規数計算のレイテンシのために実行に時間がかかったり,オーバーランする可能性を低減するために,以下のいずれかを行います。
モデルでのウォッシュアウト,フィルターなどの入力や主な演算では,入力または計算された非正規値はすべて手動で削除してゼロにします。例にいては,非正規数をゼロにフラッシュするを参照してください。
単精度の32ビット浮動小数点数の非正規値を検出するには,次の手順に従います。
MATLAB®ホストで最小正規数を検出します。コマンドウィンドウで以下のように入力します。
>> smallstnormalsingle = realmin('single')
float.h
で定義されたFLT_MIN
は最小正浮点数(单)
と等価です。以下の範囲内で値を検索します。
0 < fabsf(x) < smallstnormalsingle
倍精度の64ビット浮動小数点数の非正規値を検出するには,次の手順に従います。
Matlabホストで最小正規数を検出します。コマンドウィンドウで以下のように入力します。
>> smallstnormaldouble = realmin('double')
float.h
で定義されたDBL_MIN
は最小正浮点数(双)
と等価です。非正規値を検出するため,以下の範囲内で値を検索します。
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秒。
非正規数をゼロにフラッシュする
この例では,単精度非正規数をゼロにフラッシュする方法を示します。
モデルex_flush_to_zeroを開きます。
重复序列楼梯
は2の0乗から2の-165乗の値までの数列を生成します。数列はゼロに近くなります。ConditionRealScalar
は,最小正浮点数(单)
より小さい非正規の単精度値をゼロにフラッシュします。Matlab関数ブロック
log2
は重复序列楼梯
出力の2を底とする対数を生成します。具体的には,log2
は0から-165の数値を生成します。
[シミュレ,ション]、[ステップを戻す]、[シミュレ,ションステップの設定]ペ@ @ンで次を実行します。
[ステップを戻す機能を有効にする]を選択します。
[次の時間に達したときにシミュレ,ションを一時停止]を選択して
121
と入力します。
モデルウィンドウで,シミュレ,ションを実行します。シミュレ,ションは
T = 121
で停止します。表示される値は次のとおりです。ConditionRealScalar
出力がゼロに近づきます。重复序列楼梯输出
がゼロに近づきます。
シミュレ,ションを
T = 127
まで進めます。ConditionRealScalar
は非正規値出力を重复序列楼梯
からゼロにフラッシュします。引き続きシミュレ,ションを進めます。
ConditionRealScalar
は非正規単精度値出力を重复序列楼梯
からゼロにフラッシュします。T = 150
の場合,重复序列楼梯
の出力自体はゼロです。