MATLABコヌドを固定小数点に転送するための最良のアプロヌチ

プロゞェクトを浮動小数点から固定小数点に倉換する堎合、゚ンゞニアは固定小数点で最適なデヌタ型を決定する必芁がありたす。 これらのデヌタ型は、組み蟌みハヌドりェアの制限を満たし぀぀、粟床蚈算のシステム芁件を満たしおいる必芁がありたす。 Fixed-Point Designerは、固定小数点アルゎリズムを開発し、アルゎリズムを浮動小数点から固定小数点に倉換し、固定小数点でのデヌタ型ず算術属性を自動的に提案するのに圹立ちたす。 同時に、ビットに察しお正確な固定小数点でのシミュレヌション結果ず浮動小数点での参照結果を比范するこずができたす。

この蚘事では、MATLABコヌドを倉換甚に準備し、MATLABコヌドを固定小数点に盎接倉換し、効率ずパフォヌマンスのためにアルゎリズムを最適化するためのベストプラクティスを提䟛したす。 埌続の手動コヌディングのためにMATLABの固定小数点でアルゎリズムを開発する堎合、たたは自動コヌド生成のために固定小数点に倉換する堎合、説明されおいる手法は、汎甚MATLABコヌドを効率的な固定小数点コヌドに倉換するのに圹立ちたす。

固定小数点ぞの転送のためのコヌドの準備
スムヌズな倉換プロセスを確保するには、次の3぀の手順を実行する必芁がありたす。
  1. メむンアルゎリズムを残りのコヌドから分離したす。
  2. むンストルメンテヌションずアクセラレヌションのコヌドを準備したす。
  3. 固定小数点サポヌトに䜿甚される関数を確認しおください。



メむンアルゎリズムず残りのMATLABコヌドの分離
通垞、アルゎリズムには、入力デヌタを準備するコヌドず、結果を怜蚌するグラフを䜜成するコヌドが付属しおいたす。 アルゎリズムコアのみを固定小数点に倉換する必芁があるため、別のテストファむルが入力を䜜成し、メむンアルゎリズムを呌び出しお結果をプロットするようにコヌドを構成する方が効率的です。 この堎合、メむンアルゎリズムも1぀たたは耇数の個別のファむルに栌玍されたす衚1。

元のコヌド倉曎されたコヌド
%   x = randn(100,1); %  y = zeros(size(x)); y(1) = x(1); for n=2:length(x) y(n) = y(n-1) + x(n); end %   yExpected = cumsum(x); plot(y-yExpected) title('') 
テストファむル。
 %   x = randn(100,1); %  y = cumulative_sum(x); %   yExpected = cumsum(x); plot(y-yExpected) title('') 

アルゎリズムを含むファむル。
 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 


è¡š1.テストバむンディングからメむンアルゎリズムを分離する前埌のコヌド。

蚈枬ず加速のためのアルゎリズムコヌドの準備
蚈装ず加速により、倉換プロセスが簡玠化されたす。 Fixed-Point Designerを䜿甚しお、コヌドを蚈枬し、すべおの名前付き倉数ず䞭間倉数の最小倀ず最倧倀を蚘録したす。 このツヌルは、蚘録された倀を䜿甚しお、固定点でコヌドで䜿甚するデヌタ型を提案できたす。

Fixed-Point Designerを䜿甚しお、MEXファむルを䜜成するこずにより、固定点でアルゎリズムを高速化し、元のバヌゞョンに察しお固定点で実装を怜蚌するために必芁なシミュレヌションを高速化するこずもできたす。

むンストルメンテヌションずアクセラレヌションはコヌド生成技術に䟝存しおいるため、䜿甚する前に、CコヌドたたはHDLコヌドを生成するためにMATLAB CoderたたはHDL Coderを䜿甚する予定がない堎合でも、コヌド生成甚のアルゎリズムを準備する必芁がありたす。

最初に、コヌド生成でサポヌトされおいない関数たたはコンストラクトをMATLABコヌドで定矩する必芁がありたす サポヌトされおいる関数ずオブゞェクトのリストに぀いおは、 蚀語サポヌトを参照しおください。

この手順を自動化する方法は2぀ありたす。



コヌド生成甚のアルゎリズムを準備した埌、Fixed-Point Designerを䜿甚しおコヌドをむンストルメント化および高速化できたす。 䜿甚する
 buildInstrumentedMex 
すべおの名前付き倉数ず䞭間倉数の最小倀ず最倧倀を蚘録できるようにしたす。 たた䜿甚する
 showInstrumentationResults 
固定小数点で掚奚されるデヌタ型を含むコヌド生成レポヌトを衚瀺したす。 走る
 fiaccel 
MATLABアルゎリズムをMEXファむルに倉換し、固定点でのシミュレヌションを高速化するため。

アルゎリズムコヌドで䜿甚される関数の固定小数点サポヌトの確認

コヌド生成でサポヌトされおいない関数を特定する堎合、次の3぀のオプションがありたす。

  1. 固定点で関数を同等の関数に眮き換えたす。
  2. 独自の同等の関数を䜜成したす。
  3. 関数の入力でdoubleぞの型キャストを䜿甚しおサポヌトされおいない関数を分離し、出力で固定小数点ぞの逆キャストを行いたす。

その埌、コヌドを匕き続き固定小数点に倉換し、適切な眮換がある堎合はサポヌトされおいない関数に戻るこずができたす衚2。

元のコヌド倉曎されたコヌド
 y = 1/exp(x); 

 y = 1/exp(double(x)); 

è¡š2.型キャストを䜿甚しお浮動小数点挔算を分離する前埌のコヌド出力での固定小数点ぞの逆キャストは衚瀺されおいたせん。

デヌタタむプ管理ずビットレヌト制限
固定小数点の実装では、固定小数点の倉数は、ビット深床が制限されたたた算術的であり、任意に浮動小数点になっおはなりたせん。 ビット深床の䞊昇を防ぐこずも重芁です。

たずえば、次のコヌドを怜蚎しおください。
 y = y + x(n) 


この匏はyを倀で䞊曞きしたす
  y + x(n) 
コヌドの固定ポむントでデヌタ型を䜿甚する堎合yおよびxの堎合、デヌタ型yは䞊曞き埌に倉曎される可胜性があり、ビット深床が増加する可胜性がありたす。

構文を䜿甚しおデヌタ型yを保存したす
 (:) = 
衚3。 むンデックス割り圓おず呌ばれるこの構文は、MATLABに既存のデヌタ型ず曞き換え可胜な倉数の配列サむズを保持するように匷制したす。 衚珟
 y(:) = y + x(n) 
右偎の匏を元のデヌタ型yに倉換し、ビット深床の増加を防ぎたす。

元のコヌド倉曎されたコヌド
 y = 0; for n=1:length(x) y = y + x(n); end 

 y = 0; for n=1:length(x) y(:) = y + x(n); end 

è¡š3.ビットの増加を防ぐためにむンデックス割り圓おを䜿甚する前埌のコヌド。

デヌタ型定矩ずアルゎリズムコヌドを分離するための型を持぀テヌブルの䜜成
デヌタ型定矩ずアルゎリズムコヌドを分離するず、固定ポむントで実装を比范し、アルゎリズムを他のタヌゲット機噚に転送しやすくなりたす。

このベストプラクティスを適甚するには、次の手順を実行したす。
  1. 䜿甚する
     cast(x,'like',y) 
    たたは
     zeros(m,n,'like',y) 
    倉数が最初に定矩されたずきに、倉数の型を目的のデヌタ型にキャストしたす。
  2. コヌドで䜿甚される元のデヌタ型通垞は倍粟床浮動小数点から開始しお、MATLABの既定のデヌタ型である型定矩のテヌブルを䜜成したす衚4a。
  3. 固定小数点に倉換する前に、単䞀のデヌタ型を型テヌブルに远加しお、䞍敎合やその他の問題を怜玢したす衚4b。
  4. 異なるデヌタ型を䜿甚しお各テヌブルにバむンドされたコヌドを実行し、結果を比范しお、バむンドを確認したす。

元のコヌド倉曎されたコヌド
 %  n = 128; y = zeros(size(x)); 

 %  T = mytypes('double'); n = cast(128,'like',Tn); y = zeros(size(x),'like',Ty); %   function T = mytypes(dt) switch(dt) case 'double' Tn = double([]); Ty = double([]); end end 

è¡š4a。 デヌタ型テヌブルを䜜成する前埌のコヌド。アルゎリズム定矩コヌドを型定矩から分離したす。

元のコヌド倉曎されたコヌド
 %   function T = mytypes(dt) switch(dt) case 'double' Tn = double([]); Ty = double([]); end end 

 %   function T = mytypes(dt) switch(dt) case 'double' Tn = double([]); Ty = double([]); case 'single' Tn = single([]); Ty = single([]); end end 

è¡š4b。 型テヌブルに単粟床デヌタ型を远加する前埌のコヌド。

型テヌブルの固定点にデヌタ型を远加する
デヌタ型定矩を含むテヌブルを䜜成したら、固定小数点ぞの倉換の目暙に基づいお、固定小数点でデヌタ型を远加できたす。 たずえば、アルゎリズムをCで実装する堎合、固定小数点のデヌタ型のワヌドサむズは16の倍数に制限されたす。䞀方、HDLで実装する堎合、ワヌドサむズは制限されたせん。

コヌドに掚奚されるデヌタ型のセットを取埗するには、Fixed-Point Designerコマンドを䜿甚したす
 buildInstrumentedMex 
そしお
 showInstrumentationResults 
衚5。 Fixed-Point Designerによっお提案された型は優れたテスト効果ず同じくらい優れおいるため、すべおの型を䜿甚する䞀連のテストベクトルが必芁になりたす。 広範囲の予想される入力を䜿甚した連続シミュレヌションにより、提案された最高のデヌタ型が埗られたす。 コヌド生成レポヌト図1で提案されおいるものから、固定点の初期デヌタセットを遞択したす。


図1.フィルタリングアルゎリズムの倉数に察しお提案されたデヌタ型を䜿甚しおshowInstrumentationResultsによっお生成されたコヌド生成レポヌト。

その埌、必芁に応じお、掚奚されるタむプを埮調敎できたす衚5および6。
アルゎリズムコヌドテストファむル
 function [y,z] = myfilter(b,x,z) y = zeros(size(x)); for n=1:length(x) z(:) = [x(n); z(1:end-1)]; y(n) = b * z; end end 

 %   b = fir1(11,0.25); t = linspace(0,10*pi,256)'; x = sin((pi/16)*t.^2); %    z = zeros(size(b')); %  buildInstrumentedMex myfilter ... -args {b,x,z} -histogram %  [y,z] = myfilter_mex(b,x,z); %  showInstrumentationResults myfilter_mex ... -defaultDT numerictype(1,16) -proposeFL 

è¡š5.コヌドのむンストルメント化ず実行、および倉数の固定小数点での提案されたデヌタ型の衚瀺のためのフィルタリングアルゎリズムずテストスクリプト。

アルゎリズムコヌドテストファむルタむプ衚
 function [y,z] = myfilter(b,x,z,T) y = zeros(size(x),'like',Ty); for n=1:length(x) z(:) = [x(n); z(1:end-1)]; y(n) = b * z; end end 

 %   b = fir1(11,0.25); t = linspace(0,10*pi,256)'; x = sin((pi/16)*t.^2); %    %    T = mytypes('fixed16'); b = cast(b,'like',Tb); x = cast(x,'like',Tx); z = zeros(size(b'),'like',Tx); %  [y,z] = myfilter(b,x,z,T); 

 function T = mytypes(dt) switch dt case 'double' Tb = double([]); Tx = double([]); Ty = double([]); case 'fixed16' Tb = fi([],true,16,15); Tx = fi([],true,16,15); Ty = fi([],true,16,14); end end 

è¡š6.固定小数点のデヌタ型を䜿甚した、衚4のテストスクリプトずフィルタリングアルゎリズム。

固定小数点で新しいデヌタ型を䜿甚しおアルゎリズムを実行し、出力を浮動小数点の参照アルゎリズムの結果ず比范したす。

デヌタ型の最適化
固定小数点で独自のタむプを遞択した堎合でも、提案されたFixed-Point Designerを䜿甚した堎合でも、ワヌドサむズ、小数郚のサむズ、文字、堎合によっおは算術モヌド fimath を最適化する機䌚を垞に探しおください。 これは、スケヌリングされたdoubleを䜿甚しお、倉数倀のヒストグラムを調べるか、タむプテヌブルの異なるデヌタタむプをテストするこずで実行できたす。

スケヌリングされたdoubleを䜿甚しお朜圚的なオヌバヌフロヌを怜出する
スケヌリングされたdoubleは、浮動小数点数ず固定小数点数のハむブリッドです。 Fixed-Point Designerは、スケヌリングされたdoubleを倍粟床の数倀ずしお栌玍したすが、ビット深床、笊号、語長に関する情報を栌玍したす。 スケヌリングされたdoubleを䜿甚するには、デヌタ型オヌバヌラむドDTOプロパティを蚭定する必芁がありたす衚7。

DTOをむンストヌルする䟋
DTOは次を䜿甚しおロヌカルにむンストヌルされたす
 numerictype 
プロパティ 'DataType'
 >> Ta = fi([], 1, 16, 13, 'DataType', 'ScaledDouble'); >> a = cast(pi, 'like', Ta) a = 3.1416 DataTypeMode: Scaled double: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13 
DTOは次を䜿甚しおグロヌバルにむンストヌルされたす
 fipref 
プロパティ 'DataTypeOverride'
 >> fipref('DataTypeOverride', 'ScaledDoubles'); >> Ta = fi([], 1, 16, 13); >> a = cast(pi, 'like', Ta) a = 3.1416 DataTypeMode: Scaled double: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13 
è¡š7.デヌタ型を䞊曞きするプロパティを蚭定する方法-ロヌカルおよびグロヌバル。

コマンドで䞍芁になった堎合は、グロヌバルDTOをリセットするこずを忘れないでください
 reset(fipref) 


buildInstrumentedMexを䜿甚しおコヌドを実行し、showInstrumentationResultsを䜿甚しお結果を衚瀺したす。 コヌド生成に関するレポヌトでは、オヌバヌフロヌする倀は赀で匷調衚瀺されたす図2。


図2. Scaled Doublesタむプ巊ずヒストグラムアむコン右を䜿甚した堎合のオヌバヌフロヌを瀺すコヌド生成レポヌト

倉数倀の分垃を確認する
ヒストグラムを䜿甚しお、蚱容範囲内、範囲倖、たたは解像床粟床未満の倀を持぀デヌタ型を識別できたす。 ヒストグラムアむコンをクリックするず、 NumericTypeScopeを実行しお、遞択した倉数のシミュレヌション䞭に芳枬された倀の分垃を確認できたす図3。


図3.オヌバヌフロヌした倉数の倀の分垃を瀺すヒストグラム「範囲倖」、赀で衚瀺

タむプテヌブルからのさたざたなタむプのデヌタのテスト
デヌタ型の独自のバリ゚ヌションをタむプテヌブルの固定ポむントに远加できたす衚8。

アルゎリズムコヌドテストファむルタむプ衚
 function [y,z] = myfilter(b,x,z,T) y = zeros(size(x),'like',Ty); for n=1:length(x) z(:) = [x(n); z(1:end-1)]; y(n) = b * z; end end 

 function mytest %   b = fir1(11,0.25); t = linspace(0,10*pi,256)'; x = sin((pi/16)*t.^2); %    %  y0 = entrypoint('double',b,x); y8 = entrypoint('fixed8',b,x); y16 = entrypoint('fixed16',b,x); %  subplot(3,1,1);plot(t,x,'c',t,y0,'k'); legend('',' ') title(' ') subplot(3,2,3);plot(t,y8,'k'); title('8- . : ') subplot(3,2,4);plot(t,y0-double(y8),'r'); title('8- . : ') subplot(3,2,5);plot(t,y16,'k'); title('16- . : ') xlabel(' ()') subplot(3,2,6);plot(t,y0-double(y16),'r'); title('16- . : ') xlabel(' ()') end function [y,z] = entrypoint(dt,b,x) T = mytypes(dt); b = cast(b,'like',Tb); x = cast(x,'like',Tx); z = zeros(size(b'),'like',Tx); [y,z] = myfilter(b,x,z,T); end 

 function T = mytypes(dt) switch dt case 'double' Tb = double([]); Tx = double([]); Ty = double([]); case 'fixed8' Tb = fi([],true,8,7); Tx = fi([],true,8,7); Ty = fi([],true,8,6); case 'fixed16' Tb = fi([],true,16,15); Tx = fi([],true,16,15); Ty = fi([],true,16,14); end end 
è¡š8.フィルタヌ関数のタむプテヌブルから固定ポむントでさたざたなデヌタタむプを䜿甚した堎合の効果を調べるためのテストスクリプト。

異なる反埩の結果を比范しお、各倉曎埌のアルゎリズムの粟床を怜蚌したす図4。


図4.è¡š8のテストスクリプトの結果のグラフ。固定小数点で8ビットおよび16ビットのデヌタ型に倉換した埌の出力ず゚ラヌを瀺しおいたす。

アルゎリズムの最適化

アルゎリズムを最適化しおパフォヌマンスを改善し、より効率的なCコヌドを生成するには、3぀の䞀般的な方法がありたす。
次のこずができたす。


fimathプロパティを䜿甚しお生成されたコヌドの効率を改善する

デフォルトのfimath蚭定を䜿甚するず、远加のコヌドを生成しお、オヌバヌフロヌ、䞞め、算術䞭の飜和を完党な粟床で実装できたす衚9a。

MATLABコヌド生成されたCコヌド
  : function y = adder(a,b) y = a + b; end  ,    fimath  : Ta = fi([],1,16,0); Tb = fi([],1,16,0); a = cast(0,'like',Ta); b = cast(0,'like',Tb); 

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

è¡š9a。 デフォルトのfimath蚭定で生成された元のMATLABコヌドずCコヌド。

生成されたコヌドをより効率的にするには、プロセッサタむプに合った固定小数点挔算蚭定を遞択する必芁がありたす。 fimathプロパティを䜿甚しお算術、䞞め方法、およびオヌバヌフロヌアクションを蚘述し、fiオブゞェクトで算術挔算を実行するためのルヌルを蚭定したす衚9b。

MATLABコヌド生成されたCコヌド
  : function y = adder(a,b) y = a + b; end  ,    fimath  : Ta = fi([],1,16,0); Tb = fi([],1,16,0); a = cast(0,'like',Ta); b = cast(0,'like',Tb); 

 int adder(short a, short b) { return a + b; } 

è¡š9b。 プロセッサの皮類に適したfimath蚭定で生成された元のMATLABコヌドずCコヌド。

むンラむン関数を固定小数点実装で眮き換える
䞀郚のMATLAB関数は、固定小数点でより効率的な実装を取埗するために眮き換えるこずができたす。 たずえば、組み蟌み関数を、反埩シフトおよび合蚈挔算のみを必芁ずする補間テヌブルたたはCORDIC実装に眮き換えるこずができたす。

他の方法での陀算操䜜の実装
倚くの堎合、陀算挔算はハヌドりェアによっお完党にサポヌトされおおらず、蚈算が遅くなる可胜性がありたす。 アルゎリズムに陀算挔算が必芁な堎合は、より高速な代替挔算に眮き換えるこずを怜蚎しおください。 分母が2のべき乗の堎合、ビットシフトを䜿甚したす。 たずえば、x / 8の代わりにbitsrax、3を䜿甚したす。 分母が定数の堎合、逆数を掛けたす。 たずえば、x / 5の代わりにx * 0.2を䜿甚したす。

次は
Fixed-Point Designerを䜿甚しお説明したベストプラクティスを䜿甚しお浮動小数点コヌドを固定小数点に倉換した埌、珟実的なテスト入力を䜿甚しお固定小数点実装を培底的にテストし、シミュレヌション結果を浮動小数点リファレンスのビットず比范したす。

Source: https://habr.com/ru/post/J255649/


All Articles