このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
金宝app®は,ローカルソルバーを使用する,またはシミュレーションツールを含むコンポーネント間のコシミュレーションをサポートしています。たとえば,コシミュレーションには,金宝app仿真软件とサードパーティ製のツールまたはカスタムコードの間にコシミュレーションゲートウェイとして実装されるs函数を含めることができます。また,コシミュレーションモードで仿真金宝app软件にインポートされるFMUを含めることもできます。
以下の場合,パフォーマンスを向上させるために,コシミュレーションブロック(コンポーネント)を含むモデルをマルチスレッドで実行することを検討してください。
複数のコシミュレーションコンポーネントを統合する場合
コンポーネントレベルの統合にかかる計算負荷が高い場合
このトピックは,マルチスレッドのプログラミングと概念を熟知していることを前提としています。
金宝app仿真软件では,以下の要件を満たす場合,マルチスレッドでC墨西哥人s函数ブロックとコシミュレーションFMUブロックを実行できます。
ブロックが非直達であること
ブロックがスレッドセーフであること。つまり,ブロックが,共有データ,リソース,オブジェクトに競合なしでアクセスしながら,マルチスレッドを扱うことができること
メモ
2级MATLAB函数ブロックのマルチスレッドコシミュレーションはサポートされていません。
既定の設定では,金宝app仿真软件はすべてのモデルをマルチスレッドで実行するよう設定します。しかし,すべてのモデルが複数のスレッドで実行できるコシミュレーションコンポーネントを持つわけではなく,すべてのモデルがマルチスレッド実行のメリットを活用できるわけでもありません。モデルに,マルチスレッド実行によってメリットを受けられるコシミュレーションコンポーネントが含まれるかどうかを確認するには,以下の手順に従います。
モデルを開きます。
パフォーマンスアドバイザーツールを起動します([デバッグ]タブで[パフォーマンスアドバイザー]をクリック)。
[シミュレーション]、[シミュレーションの実行を必要とするチェック項目)、[マルチスレッドコシミュレーション設定のオン/オフを選択]をオンにします。
このチェックは,モデルまたはブロックが最適に設定されており,マルチスレッドもしくはシングルスレッドの処理を有効に活用できることを確認します。構成が最適ではない場合,[パフォーマンスアドバイザー]に現在の設定が表示されるとともに,そのモデルがマルチスレッド実行の候補としては不適切であることを示す警告が表示されます。
選択したチェックを実行します。
または,MultithreadedSim
パラメーターを変更する前後にモデルシミュレーションを手動で測定することもできます。次に例を示します。
抽搐;sim卡(“sfunction_components”);toc
运行时间为2.323264秒。
get_param (gcs,“MultithreadedSim”)
ans = '在'
set_param (gcs,“MultithreadedSim”,“关闭”)
抽搐;sim卡(“sfunction_components”);toc
运行时间为4.112674秒。
複数のコアでコシミュレーションコンポーネントを実行する例については,slexCoSimPrimeExample
モデルを参照してください。
MultithreadedSim
パラメーターの使用MultithreadedSim
パラメーターを使用すると,モデル全体をマルチスレッドで実行するよう指定するか,特定のブロックをマルチスレッドで実行するよう指定することができます。モデル内のすべてのコシミュレーションブロックが非直達かつスレッドセーフである場合,モデル全体をマルチスレッドで実行するよう指定します。一部のブロックは非直達かつスレッドセーフであるが,すべてではない場合,そのブロックのみをマルチスレッドで実行するよう特定します。モデルとブロックはMultithreadedSim
パラメーターを次のように用います。
設定 | モデル | ブロック | 説明 |
---|---|---|---|
|
(既定)モデルはマルチスレッドで実行できる。 |
||
|
ブロックまたはモデルのマルチスレッド実行を無効にする。 |
||
|
(既定)ブロックがマルチスレッドで実行できるかどうかを仿真金宝app软件に判定させる。 |
MultithreadedSim
パラメーターを有効にしたとしても,ブロックまたはモデルがマルチスレッドでシミュレーションされるとは限りません。マルチスレッドシミュレーションは,MultithreadedSim
が有効であり,かつ以下の場合に行われます。
ブロックおよび/またはモデルがシングルレートで動作する。
ブロックおよび/またはモデルがスレッドセーフである(たとえば,静的データまたはグローバルデータを使用していない)。
ブロックおよび/またはモデルが非直達である。
s函数ブロックには,関数ssSetInputPortDirectFeedThrough
を使用します。
FMUブロックの場合,FMUモデル記述ファイルのFMUModelStructure /输出
およびModelStructure / InitialUnknowns
フィールドで依赖关系
属性を空のままにします。この属性は(”“
)でなければなりません。
ブロックおよび/またはモデルに例外がない。s函数ブロックには,関数ssSetOptions
を使用してSS_OPTION_EXCEPTION_FREE_CODE
を設定します。
マルチスレッドではソルバーリセットチェックは許可されず,したがって関数ssSetSolverNeedsReset
とssBlockStateForSolverChangedAtMajorStep
の使用はスキップされます。一方,アクセラレータモードでは,これらの関数が使用されるか,連続状態である場合,マルチスレッドは自動的にオフになります。
s函数ブロックがシングルスレッドで実行されるかマルチスレッドで実行されるかは,MultithreadedSim
パラメーターの値と関数ssSetRuntimeThreadSafetyCompliance
に依存します。
MultithreadedSim の設定 |
ssSetRuntimeThreadSafetyCompliance の設定 |
シングルスレッドまたはマルチスレッド |
---|---|---|
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN |
シングルスレッド |
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE |
マルチスレッド |
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE |
シングルスレッド |
“关闭” |
- - - - - - | 設定は無視され,s函数ブロックはシングルスレッドで実行される |
アクセラレータモードとラピッドアクセラレータモードではシミュレーションはシングルスレッドで実行されます。マルチスレッディングが有効になるのはシミュレーションモードがノーマルのときです。
モデルのシミュレーションモードをノーマルに設定します。
コシミュレーションコンポーネントでは,コード生成は行われません。
ブロックに以下の設定がなされている場合,コシミュレーションはサポートされません。
定数のサンプル時間をもつブロックでは,マルチスレッディングは有効になりません。
金宝app仿真软件デバッガーがオンのとき,マルチスレッディングは有効になりません。
金宝app仿真软件デバッガーをオフにします。
スレッドセーフでないブロックに依存するブロックはマルチスレッドにできません。单位延迟ブロックを使用するなどして,依存関係を破棄することを検討してください。
シングルレートでなければならない。
モデルを修正して,マルチレートコンポーネントを個別のシングルレートコンポーネントに分割することを検討してください。
s函数が可変サンプル時間をもつ場合,マルチスレッディングは有効にならない。
異なるサンプル時間の使用を検討してください(サンプル時間の指定を参照)。
s函数が連続状態をもち,ソルバーが固定ステップであり,それらが合わさって連続状態の整合性のチェックをトリガーする場合,マルチスレッディングは有効にならない。連続状態の整合性のチェックを無効にするには,関数ssSetSkipContStatesConsistencyCheck
を使用します。
直達端子を含めないこと-ssSetInputPortDirectFeedThrough(SimStruct *S,int_T端口,int_T dirFeed)
では,各入力端子のdirFeed
を0
にしなければなりません。
单位延迟ブロックを使用するなどして,ブロック間の依存関係を破棄することを検討してください。
スレッドセーフであること-ssSetRuntimeThreadSafetyCompliance (SimStruct * S, int_T val)
では,瓦尔
をRUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE
にしなければなりません。
詳細については,编写线程安全的s -函数的指南を参照してください。
例外なしであること-ssSetOptions (SimStruct * S, uint_T选项)
では,选项
にSS_OPTION_EXCEPTION_FREE_CODE
を含めなければなりません。
詳細については,编写线程安全的s -函数的指南を参照してください。
s函数アナライザーがオンのとき,マルチスレッディングは有効にならない。ノーマルモードでマルチスレッディングを試してください。
s函数が連続サンプル時間をもつとき,マルチスレッディングは有効にならない。異なるサンプル時間の使用を検討してください(サンプル時間の指定を参照)。
マルチスレッディングでは出力メソッドと更新メソッドが同時に実行される。ブロックには出力メソッドまたは更新メソッドがなければなりません。
コシミュレーションモードでなければならない。
联合仿真FMUモードを模型交换からに切り替えることを検討してください。
スレッドセーフでなければならない。たとえば,複数のFMUは同時に同じファイルにアクセスできない。
FMUブロックのログ記録がMATLAB®コマンドウィンドウに表示されるとき,マルチスレッディングは有効にならない。次を使用してFMUブロックのログ記録をファイルにリダイレクトしてください。
set_param (blockName“FMUDebugLoggingRedirect”,“文件”)
FMUがプロセス外で実行されている場合,マルチスレッディングはサポートされない。この設定を無効にするには,次を使用します。
set_param (blockName“DebugExecutionForFMUViaOutOfProcess”,“关闭”)
模型ブロックにイベント端子があるとき,マルチスレッディングは有効にならない。
为每个子系统ブロック内に存在することはできない。
模型ブロックを为每个子系统ブロックの外に移動することを検討してください。
アクセラレータモードでなければならない。
シングルレートでなければならない。
モデルを修正して,マルチレートコンポーネントを個別のシングルレートコンポーネントに分割することを検討してください。
可変サンプル時間をもつブロックは使用できない。
異なるサンプル時間の使用を検討してください(サンプル時間の指定を参照)。
連続状態をもつことはできない。
どの入力端子でも直達をもつことはできない。
单位延迟ブロックを使用するなどして,ブロック間の依存関係を破棄することを検討してください。
固定ステップソルバーをもたなければならない。
どのグローバルなデータストアにもアクセスできない。
モデルに金宝app仿真软件的功能ブロックが含まれているとき,マルチスレッディングは有効にならない。
いずれの仿金宝app真软件関数または呼び出し元ブロックも使用できない。
到文件ブロックを含めることはできない。詳細については,シミュレーションデータのエクスポートを参照してください。
从文件ブロックを含めることはできない。
最上位モデルからの尺寸経由で参照モデルにデータを入力することを検討してください。
FMU|功能|ssSetRuntimeThreadSafetyCompliance
|ssGetRuntimeThreadSafetyCompliance