このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
複数のコアにおけるコシミュレーション コンポーネントの実行
Simulink® は、ローカル ソルバーを使用する、またはシミュレーション ツールを含むコンポーネント間のコシミュレーションをサポートしています。たとえば、コシミュレーションには、Simulink とサードパーティ製のツールまたはカスタム コードの間にコシミュレーション ゲートウェイとして実装される S-Function を含めることができます。また、コシミュレーション モードで Simulink または Model ブロック (アクセラレータ モードの場合) にインポートされる FMU を含めることもできます。
以下の場合、パフォーマンスを向上させるために、コシミュレーション ブロック (コンポーネント) を含むモデルをマルチスレッドで実行することを検討してください。
複数のコシミュレーション コンポーネントを統合する場合
コンポーネント レベルの統合にかかる計算負荷が高い場合
このトピックは、マルチスレッドのプログラミングと概念を熟知していることを前提としています。
Simulink では、スレッドセーフである場合、マルチスレッドで C MEX S-Function ブロック、コシミュレーション FMU ブロック、およびアクセラレータ モード用に構成された Model ブロックを実行できます。スレッドセーフであるとは、ブロックが共有データ、リソース、オブジェクトに競合なしでアクセスしながら、マルチスレッドを扱うことができることを意味します。
また、モデルに非直達ブロックとその後に続く直達ブロックがある場合、モデルをマルチスレッドで実行できます (シングルスレッド シミュレーションとマルチスレッド シミュレーションを参照)。直達とは、ブロックの出力端子信号が同じタイム ステップでその入力端子信号の値から計算されることを意味します。
メモ
Level-2 MATLAB S-Function ブロックのマルチスレッド コシミュレーションはサポートされていません。
既定の設定では、Simulink はすべてのモデルをマルチスレッドで実行するよう設定します。パフォーマンスが向上する場合、Simulink はすべてのモデルを自動的にマルチスレッドで実行します。しかし、すべてのモデルが複数のスレッドで実行できるコシミュレーション コンポーネントを持つわけではなく、すべてのモデルがマルチスレッド実行のメリットを活用できるわけでもありません。
シングルスレッド シミュレーションとマルチスレッド シミュレーション
マルチスレッド実行用のシステムでモデルの同時実行が可能かどうかを評価するにあたり、Simulink はグラフベースのアルゴリズムを使用して、使用可能なブロック間のデータ依存性を解析し、複数のタスク グループを形成します。このアルゴリズムにより、それぞれのタスク グループは必ず次のようになります。
互いにデータ依存性がない
複数のコアを使用して並列で実行できる
たとえば、Simulink は、非直達ブロックとその後に続く直達ブロックを探します。後に続く直達ブロックが非直達ブロックのみに依存している場合、それらのブロックを並列実行用に同じ分岐にグループ化できます。
この例では、並列実行用に分割された一連のブロックの逐次実行を比較します。
複数のコアでシミュレーションを高速化するためのマルチスレッド シミュレーションの使用
Graph-Based Multithread Simulation
の例について考えます。この例では、4 つの非直達ブロックとその後に続く 4 つの直達ブロックを使用しています。直達とは、ブロックの出力端子信号が同じタイム ステップでその入力端子信号の値から計算されることを意味します。
Simulink でデータ依存性が解析され、4 つの分岐が形成されます。各分岐に非直達ブロックとその後に続く直達ブロックが含まれます。次に、Simulink はマルチスレッディングを使用してこれらの 4 つの分岐を実行します。これにより、Simulink は、同じマシンで行うシングルスレッドのシミュレーションと比べて、4 つ以上のコア マシンでシミュレーションをほぼ 4 倍に高速化できます。MultithreadedSim
パラメーターを変更する前後にモデルのシミュレーションを手動で測定することもできます。
次のコードは、Graph-Based Multithread Simulation
の例のシミュレーションを測定する方法を示しています。
openExample('slexGraphBasedMultiThreadSimExample');... set_param(gcs,'MultithreadedSim','off'); tic;sim('slexGraphBasedMultiThreadSimExample');toc
Elapsed time is 39.406743 seconds.
set_param(gcs,'MultithreadedSim','on'); tic;sim('slexGraphBasedMultiThreadSimExample'); toc
Elapsed time is 13.619744 seconds.
この例では、4 つのコア マシンで速度が約 3 倍 (4 倍でなく) になっています。これは、オペレーティング システムのスレッド コンテキスト切り替えで発生する余分なオーバーヘッドによるものです。
MultithreadedSim
パラメーターの使用
MultithreadedSim
パラメーターを使用すると、モデル全体をマルチスレッドで実行するよう指定するか、特定のブロックをマルチスレッドで実行するよう指定することができます。モデル内のすべてのコシミュレーション ブロックがスレッドセーフである場合、モデル全体をマルチスレッドで実行するよう指定します。一部のブロックはスレッドセーフであるが、すべてではない場合、そのブロックのみをマルチスレッドで実行するよう特定します。モデルとブロックは MultithreadedSim
パラメーターを次のように用います。
設定 | 説明 |
---|---|
| (既定) ブロックがマルチスレッドで実行できるかどうかを Simulink に判定させる。 |
| ブロックまたはモデルのマルチスレッド実行を無効にする。 |
a Starting in R2021a, when you open a model created in a previous release, Simulink interprets the |
MultithreadedSim
パラメーターを有効にしたとしても、ブロックまたはモデルがマルチスレッドでシミュレーションされるとは限りません。マルチスレッド シミュレーションは、MultithreadedSim
が有効であり、かつ以下の場合に行われます。
ブロックおよび/またはモデルがシングル レートで動作する。
ブロックおよび/またはモデルがスレッドセーフである (たとえば、静的データまたはグローバル データを使用していない)。
ブロックおよび/またはモデルに例外がない。S-Function ブロックには、関数
ssSetOptions
を使用してSS_OPTION_EXCEPTION_FREE_CODE
を設定します。
マルチスレッドではソルバー リセット チェックは許可されず、したがって関数 ssSetSolverNeedsReset
と ssBlockStateForSolverChangedAtMajorStep
の使用はスキップされます。一方、アクセラレータ モードでは、これらの関数が使用されるか、連続状態である場合、マルチスレッドは自動的にオフになります。
S-Function ブロックによるシングル スレッドまたはマルチスレッド実行の設定
S-Function ブロックがシングル スレッドで実行されるかマルチスレッドで実行されるかは、MultithreadedSim
パラメーターの値と関数 ssSetRuntimeThreadSafetyCompliance
に依存します。
MultithreadedSim の設定 | ssSetRuntimeThreadSafetyCompliance の設定 | シングル スレッドまたはマルチスレッド |
---|---|---|
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN | シングル スレッド |
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE | マルチスレッド |
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE | シングル スレッド |
'off' | — | 設定は無視され、S-Function ブロックはシングル スレッドで実行される |
複数のスレッドによるコシミュレーションの制限とガイドライン
アクセラレータ モードとラピッド アクセラレータ モードではシミュレーションはシングル スレッドで実行されます。マルチスレッディングが有効になるのはシミュレーション モードがノーマルのときです。
モデルのシミュレーション モードをノーマルに設定します。
コシミュレーション コンポーネントでは、コード生成は行われません。
定数のサンプル時間をもつブロックでは、マルチスレッディングは有効になりません。
Simulink デバッガーがオンのとき、マルチスレッディングは有効になりません。
Simulink デバッガーをオフにします。
スレッドセーフでないブロックに依存するブロックはマルチスレッドにできません。Unit Delay ブロックを使用するなどして、依存関係を破棄することを検討してください。
S-Function ブロックの制限
シングル レートでなければならない。
モデルを修正して、マルチレート コンポーネントを個別のシングルレート コンポーネントに分割することを検討してください。
S-Function が可変サンプル時間をもつ場合、マルチスレッディングは有効にならない。
異なるサンプル時間の使用を検討してください (サンプル時間の指定を参照)。
S-Function が連続状態をもち、ソルバーが固定ステップであり、それらが合わさって連続状態の整合性のチェックをトリガーする場合、マルチスレッディングは有効にならない。連続状態の整合性のチェックを無効にするには、関数
ssSetSkipContStatesConsistencyCheck
を使用します。スレッド セーフであること —
ssSetRuntimeThreadSafetyCompliance(SimStruct *S,int_T val)
では、val
をRUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE
にしなければなりません。詳細については、Guidelines for Writing Thread-Safe S-Functionsを参照してください。
例外なしであること —
ssSetOptions(SimStruct *S,uint_T options)
では、options
にSS_OPTION_EXCEPTION_FREE_CODE
を含めなければなりません。詳細については、Guidelines for Writing Thread-Safe S-Functionsを参照してください。
S-Function アナライザーがオンのとき、マルチスレッディングは有効にならない。ノーマル モードでマルチスレッディングを試してください。
S-Function が連続サンプル時間をもつとき、マルチスレッディングは有効にならない。異なるサンプル時間の使用を検討してください (サンプル時間の指定を参照)。
マルチスレッディングでは出力メソッドと更新メソッドが同時に実行される。ブロックには出力メソッドまたは更新メソッドがなければなりません。
FMU Import ブロックの制限
コシミュレーション モードでなければならない。
FMU モードを Model Exchange から Co-Simulation に切り替えることを検討してください。
スレッドセーフでなければならない。たとえば、複数の FMU は同時に同じファイルにアクセスできない。
FMU ブロックのログ記録が MATLAB® コマンド ウィンドウに表示されるとき、マルチスレッディングは有効にならない。次を使用して FMU ブロックのログ記録をファイルにリダイレクトしてください。
set_param(blockName,'FMUDebugLoggingRedirect','File')
FMU がプロセス外で実行されている場合、マルチスレッディングはサポートされない。この設定を無効にするには、次を使用します。
set_param(blockName,'DebugExecutionForFMUViaOutOfProcess','off')
Model ブロックの制限
Model ブロックにイベント端子があるとき、マルチスレッディングは有効にならない。
For Each Subsystem ブロック内に存在することはできない。
Model ブロックを For Each Subsystem ブロックの外に移動することを検討してください。
アクセラレータ モードでなければならない。
シングル レートでなければならない。
モデルを修正して、マルチレート コンポーネントを個別のシングルレート コンポーネントに分割することを検討してください。
可変サンプル時間をもつブロックは使用できない。
異なるサンプル時間の使用を検討してください (サンプル時間の指定を参照)。
連続状態をもつことはできない。
Unit Delay ブロックを使用するなどして、ブロック間の依存関係を破棄することを検討してください。
固定ステップ ソルバーをもたなければならない。
どのグローバルなデータ ストアにもアクセスできない。
モデルに Simulink Function ブロックが含まれているとき、マルチスレッディングは有効にならない。
いずれの Simulink 関数または呼び出し元ブロックも使用できない。
To File ブロックを含めることはできない。詳細については、シミュレーション データの保存を参照してください。
From File ブロックを含めることはできない。
最上位モデルからの Inport 経由で参照モデルにデータを入力することを検討してください。
参考
FMU | S-Function | ssSetRuntimeThreadSafetyCompliance
| ssGetRuntimeThreadSafetyCompliance