主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

金宝app仿真软件加速器がコードを再生成している原因の特定

金宝app仿真软件®はアクセラレータモード(TM)でのシミュレーションの開始時にモデルのシミュレーションターゲットを再生成する場合がありますが,その理由は必ずしも明らかではありません。この例では,金宝app仿真软件MATLAB®®コマンドを使用して,仿真软件がアクセラレータモードのシミュレーション用にコードを再生成する理由を判断する方法を示しています。

金宝app仿真软件のアクセラレータモードは,シミュレーションターゲットと呼ばれる実行可能バージョンのモデルを作成して,ノーマルモードでのシミュレーション中と同様に,モデルを解釈する代わりにこのターゲットを実行することにより,モデルのシミュレーションの速度を向上させます。アクセラレータモードは,モデルからCコードを生成して,MATLAB®墨西哥人関数を呼び出し,生成されたコードをコンパイルして仿真软件に金宝app動的にリンクすることにより,シミュレーションターゲットを作成します。

コード生成およびコンパイルのプロセスは,最初にモデルをアクセラレータモードでシミュレーションするときに発生します。また,シミュレーション間でモデルが変更された場合(たとえば,ブロックの追加後)は特に,以降のシミュレーションでもコード生成が発生することがあります。コード生成は時間がかかるため,指定の時間範囲でのシミュレーション実行回数が最大となるよう,多くの場合にコード生成の回避が推奨されます。

金宝app仿真软件はモデルのチェックサムを使用して,コードを再生成する必要があるかどうかを判定します。このチェックサムは,モデルとそのモデルに含まれているブロックの属性に基づいて,md5チェックサムアルゴリズムを使用して計算される4つの整数の配列です。モデルが変更されたことによってチェックサムが変更されると,金宝app仿真软件はアクセラレータモード用のシミュレーションターゲットを再生成します。

どのようなモデルの変更によってチェックサムが変更され,コードが再生成されたのか不明な場合もあります。この例では,指定されたモデルおよび構成で実行されるアクセラレータモードでのシミュレーション用に仿真金宝app软件がコードを再生成しなければならない理由を調査する方法を示しています。

一時作業ディレクトリの作成

アクセラレータモードでシミュレーションするといくつかのファイルが作成されるため,まず,一時領域に移動します。

originalDir = pwd;tempDir = tempname;mkdir (tempDir) cd (tempDir)

モデル例を開く

この例ではシンプルなモデルslAccelDemoWhyRebuildを使用します。

模型=“slAccelDemoWhyRebuild”;open_system(模型)set_param(模型,“AccelVerboseBuild”“上”);

このモデルは,最初にアクセラレータモードで実行したときは,予期したとおりコードを生成してコンパイルします。

simOutput = evalc ([“sim(“”、模型“‘)’]);如果~ isempty (strfind (simOutput“为模型建立加速器目标”) disp ('Built 金宝appSimulink Accelerator mex file'其他的disp (“没有构建Simulink A金宝appccelerator mex文件”结束
建立Simu金宝applink加速器mex文件

モデルに変更を加えずにシミュレーションを再実行した場合,金宝app仿真软件は既存のコードを再利用できるため,コードを再生成する必要はないと予想されます。同じコマンドを実行して検証します。

simOutput = evalc ([“sim(“”、模型“‘)’]);如果~ isempty (strfind (simOutput“为模型建立加速器目标”) disp ('Built 金宝appSimulink Accelerator mex file'其他的disp (“没有构建Simulink A金宝appccelerator mex文件”结束
没有构建Simulink A金宝appccelerator mex文件

ここで,モデル内のいくつかのパラメーターを変更します。ブロック"Integrator" に対して次の設定を行います。[線形化時に出力制限とリセットの設定を無視] を [オン] に、[初期条件] を [5] に設定します。

set_param([模型,' /集成商'],“IgnoreLimit”“上”);set_param([模型,' /集成商'],“InitialCondition”“5”);

シミュレーションを再実行すると,金宝app仿真软件がコードを再生成することがわかります。

simOutput = evalc ([“sim(“”、模型“‘)’]);如果~ isempty (strfind (simOutput“为模型建立加速器目标”) disp ('Built 金宝appSimulink Accelerator mex file'其他的disp (“没有构建Simulink A金宝appccelerator mex文件”结束
建立Simu金宝applink加速器mex文件

その理由を確認していきましょう。

金宝app仿真软件は,以前に生成されたコードが現在のモデルコンフィギュレーションにまだ有効であるかどうかを判定するために,コードの生成に使用されたモデルのチェックサムと,現在のチェックサムを比較します。これらのチェックサムが等しい場合は,以前に生成されたコードがまだ有効であるため,金宝app仿真软件アクセラレータモードはそのコードを現在のシミュレーションに再利用します。チェックサムの値が異なっている場合は,金宝app仿真软件アクセラレータモードはコードを再生成してリビルドします。したがって,チェックサム計算の詳細を調べると,金宝app仿真软件がコードを再生成した原因を解明できます。

チェックサムの詳細の取得

次のコマンドによって,モデルのチェックサム計算の詳細が取得されます。

[cs1, csdet1]金宝app = Simulink.BlockDiagram.getChecksum(模型);

最初の出力は,モデルのチェックサム値そのものです。2つ目の出力は,チェックサム計算に入れられたものの詳細を示しています。

変更されたブロックパラメーターに元の値を設定し,この構成に関するチェックサムと詳細を取得してみましょう。

set_param([模型,' /集成商'],“IgnoreLimit”“关闭”);set_param([模型,' /集成商'],“InitialCondition”' 0 ');(cs2 csdet2] 金宝app= Simulink.BlockDiagram.getChecksum(模型);

これらの2つのチェックサム値を比較するということは,仿真金宝app软件加速器がコードを再生成するかどうかを判定するのと同じことです。金宝app仿真软件加速器が実行時に毎回コードを再生成するという事実に基づいて予想したとおり,これらのチェックサム値は異なっています。

如果(cs1 ~= cs2)校验和是不同的其他的disp ('校验和是相同的'结束
校验和是不同的

チェックサムが異なっていることがわかったので,次に問題となるのはその原因です。信号のデータ型,複数のブロックパラメーター値,ブロックの接続情報など,さまざまなものがチェックサム計算に入れられます。チェックサムが異なっている原因を理解するには,チェックサムの計算に使用された項目に関して,何が変更されているのかを確認する必要があります。2番目の引数として返されたチェックサム詳細に,その情報が示されています。

csdet1
csdet1 = struct with fields: ContentsChecksum: [1x1 struct] InterfaceChecksum: [1x1 struct] ContentsChecksumItems: [186x1 struct] InterfaceChecksumItems: [49x1 struct]

チェックサム詳細は構造体配列であり,4つのフィールドがあります。そのうちの2つのフィールドはモデルのチェックサムのコンポーネントチェックサムであり(ContentsChecksumおよびInterfaceChecksumと呼ばれる),残りの2つのフィールドは対応するチェックサム詳細です。これらの詳細は2つのコンポーネントチェックサムの計算に入れられたさまざまな情報に対応しています。モデルの(構造的)チェックサムはContentsChecksumおよびInterfaceChecksumの関数です。

まず,モデルの内容が異なっているのか,あるいはモデルのインターフェイスが異なっているのかを判断しましょう。

如果(csdet1.ContentsChecksum。值~ =csdet2.ContentsChecksum.Value) disp(“内容校验和不同”其他的disp ('内容校验和相同'结束如果(csdet1.InterfaceChecksum。值~ =csdet2.InterfaceChecksum.Value) disp(“接口校验和不同”其他的disp ('接口校验和相同'结束
内容校验和不同接口校验和相同

詳細を使用したチェックサム変更理由の判断

ContentsChecksumが変更されていることがわかったので,ContentsChecksumItemsを調べて,何が変更されているのかを確認できます。

idxForDifferences = [];idx = 1:长度(csdet1.ContentsChecksumItems)如果(~ strcmp (csdet1.ContentsChecksumItems .Handle (idx),...csdet2.ContentsChecksumItems (idx) .Handle)) idxForDifferences = [idxForDifferences idx];disp ([“处理不同的项目”num2str (idx)]);结束如果(~ strcmp (csdet1.ContentsChecksumItems .Identifier (idx),...csdet2.ContentsChecksumItems (idx) .Identifier) disp ([“项目标识符不同”num2str (idx)]);idxForDifferences = [idxForDifferences, idx];结束如果(ischar (csdet1.ContentsChecksumItems (idx) value))如果(~ strcmp (csdet1.ContentsChecksumItems (idx) value,...csdet2.ContentsChecksumItems (idx) value) disp (['项的字符串值不同'num2str (idx)]);idxForDifferences = [idxForDifferences, idx];结束结束如果(isnumeric (csdet1.ContentsChecksumItems (idx) value))如果(csdet1.ContentsChecksumItems (idx)。值~ =...csdet2.ContentsChecksumItems (idx) value) disp (['项目的数值是不同的'num2str (idx)]);idxForDifferences = [idxForDifferences, idx];结束结束结束
项目40的值不同

idxForDifferencesに示されているインデックスの項目が異なっていることがわかったので,2つの配列ContentsChecksumItems内にあるそれらの項目を調べることができます。

blk1 = csdet1.ContentsChecksumItems (idxForDifferences(1))。处理blk2 = csdet2.ContentsChecksumItems(idxForDifferences(1))。句柄id1 = csdet1.ContentsChecksumItems(idxForDifferences(1))。标识符id2 = csdet2.ContentsChecksumItems(idxForDifferences(1))
blk1 = 'slAccelDemoWhyRebuild/Integrator' blk2 = 'slAccelDemoWhyRebuild/Integrator' id1 = 'IgnoreLimit' id2 = 'IgnoreLimit'

どちらの項目もハンドルは“slAccelDemoWhyRebuild /集成商”です。これは,そのブロックのデータが変更されていることを示しています。どちらの項目も識別子は“IgnoreLimitです。これは,変更されたのがブロック設定であったことを示し,その結果モデルのチェックサムが異なっています。ブロックの初期条件の設定は,チェックサムの詳細には表示されません。そのため,初期条件の設定のみが変更された場合は,リビルドは発生しないと予想されます。

連続シミュレーションでのリビルドの回避

このワークフローにおいてチェックサムに違いを生じさせるパラメーターがわかったため,このパラメーターを一定に保ち,連続シミュレーションでリビルドが発生するかどうかを確認することで,この結果を検証できます。

モデルをアクセラレータモードで再度シミュレーションしてみましょう。上記のチェックサム計算でパラメーター(IgnoreLimit)を変更したため,このシミュレーションではリビルドが発生すると予想されます。

simOutput = evalc ([“sim(“”、模型“‘)’]);如果~ isempty (strfind (simOutput“为模型建立加速器目标”) disp ('Built 金宝appSimulink Accelerator mex file'其他的disp (“没有构建Simulink A金宝appccelerator mex文件”结束
建立Simu金宝applink加速器mex文件

次に,初期条件の設定のみを変更し,再度シミュレーションしてみましょう。今回はリビルドは発生しないと予想されます。

set_param([模型,' /集成商'],“InitialCondition”“3”);simOutput = evalc ([“sim(“”、模型“‘)’]);如果~ isempty (strfind (simOutput“为模型建立加速器目标”) disp ('Built 金宝appSimulink Accelerator mex file'其他的disp (“没有构建Simulink A金宝appccelerator mex文件”结束
没有构建Simulink A金宝appccelerator mex文件

チェックサム解析から予想されるとおり,“初期条件“のパラメーターを変更しても,アクセラレータモードでのシミュレーション用にコードが再生成されることはありません。

クリーンアップ

モデルを閉じて,生成されたファイルを削除します。

明确bdclose(模型)([模型,“_acc”]) cd (originalDir)删除文件夹(tempDir,“年代”