ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

複数のコアにおけるコシミュレーション コンポーネントの実行

Simulink® は、ローカル ソルバーを使用する、またはシミュレーション ツールを含むコンポーネント間のコシミュレーションをサポートしています。たとえば、コシミュレーションには、Simulink とサードパーティ製のツールまたはカスタム コードの間にコシミュレーション ゲートウェイとして実装される S-Function を含めることができます。また、コシミュレーション モードで Simulink にインポートされる FMU を含めることもできます。

以下の場合、パフォーマンスを向上させるために、コシミュレーション ブロック (コンポーネント) を含むモデルをマルチスレッドで実行することを検討してください。

  • 複数のコシミュレーション コンポーネントを統合する場合

  • コンポーネント レベルの統合にかかる計算負荷が高い場合

このトピックは、マルチスレッドのプログラミングと概念を熟知していることを前提としています。

Simulink では、以下の要件を満たす場合、マルチスレッドで C MEX S-Function ブロックとコシミュレーション FMU ブロックを実行できます。

  • ブロックが非直達であること

  • ブロックがスレッドセーフであること。つまり、ブロックが、共有データ、リソース、オブジェクトに競合なしでアクセスしながら、マルチスレッドを扱うことができること

メモ

Level-2 MATLAB S-Function ブロックのマルチスレッド コシミュレーションはサポートされていません。

既定の設定では、Simulink はすべてのモデルをマルチスレッドで実行するよう設定します。しかし、すべてのモデルが複数のスレッドで実行できるコシミュレーション コンポーネントを持つわけではなく、すべてのモデルがマルチスレッド実行のメリットを活用できるわけでもありません。モデルに、マルチスレッド実行によってメリットを受けられるコシミュレーション コンポーネントが含まれるかどうかを確認するには、以下の手順に従います。

  1. モデルを開きます。

  2. パフォーマンス アドバイザー ツールを起動します ([解析][パフォーマンス ツール][パフォーマンス アドバイザー])。

  3. [シミュレーション][シミュレーションの実行を必要とするチェック項目][マルチスレッド コシミュレーション設定のオン/オフを選択]をオンにします。

    このチェックは、モデルまたはブロックが最適に設定されており、マルチスレッドもしくはシングル スレッドの処理を有効に活用できることを確認します。構成が最適ではない場合、[パフォーマンス アドバイザー] に現在の設定が表示されるとともに、そのモデルがマルチスレッド実行の候補としては不適切であることを示す警告が表示されます。

  4. 選択したチェックを実行します。

または、MultiThreadCoSim パラメーターを変更する前後にモデル シミュレーションを手動で測定することもできます。次に例を示します。

tic; sim('sfunction_components'); toc
Elapsed time is 2.323264 seconds.
get_param(gcs,'MultiThreadCoSim')
ans =
 'on'
set_param(gcs,'MultiThreadCoSim','off')
tic; sim('sfunction_components'); toc
Elapsed time is 4.112674 seconds.

複数のコアでコシミュレーション コンポーネントを実行する例については、slexCoSimPrimeExample モデルを参照してください。

MultiThreadCoSim パラメーターの使用

MultiThreadCoSim パラメーターを使用すると、モデル全体をマルチスレッドで実行するよう指定するか、特定のブロックをマルチスレッドで実行するよう指定することができます。モデル内のすべてのコシミュレーション ブロックが非直達かつスレッドセーフである場合、モデル全体をマルチスレッドで実行するよう指定します。一部のブロックは非直達かつスレッドセーフであるが、すべてではない場合、そのブロックのみをマルチスレッドで実行するよう特定します。モデルとブロックは MultiThreadCoSim パラメーターを次のように用います。

設定モデルブロック説明

'on'

 

(既定) モデルはマルチスレッドで実行できる。

'off'

ブロックまたはモデルのマルチスレッド実行を無効にする。

'auto'

 

(既定) ブロックがマルチスレッドで実行できるかどうかを Simulink に判定させる。

MultiThreadCoSim パラメーターを有効にしたとしても、ブロックまたはモデルがマルチスレッドでシミュレーションされるとは限りません。マルチスレッド シミュレーションは、MultiThreadCoSim が有効であり、かつ以下の場合に行われます。

  • ブロックおよび/またはモデルがシングル レートで動作する。

  • ブロックおよび/またはモデルがスレッドセーフである (たとえば、静的データまたはグローバル データを使用していない)。

  • ブロックおよび/またはモデルが非直達である。

    • S-Function ブロックには、関数 ssSetInputPortDirectFeedThrough を使用します。

    • FMU ブロックの場合、FMU モデル記述ファイルの FMU ModelStructure/Outputs および ModelStructure/InitialUnknowns フィールドで dependencies 属性を空のままにします。この属性は (" ") でなければなりません。

  • ブロックおよび/またはモデルに例外がない。S-Function ブロックには、関数 ssSetOptions を使用して SS_OPTION_EXCEPTION_FREE_CODE を設定します。

S-Function ブロックによるシングル スレッドまたはマルチスレッド実行の設定

S-Function ブロックがシングル スレッドで実行されるかマルチスレッドで実行されるかは、MultiThreadCoSim パラメーターの値と関数 ssSetRuntimeThreadSafetyCompliance に依存します。

MultiThreadCoSim の設定ssSetRuntimeThreadSafetyCompliance の設定シングル スレッドまたはマルチスレッド
'auto'RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWNシングル スレッド
'auto'RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUEマルチスレッド
'auto'RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSEシングル スレッド
'off'設定は無視され、S-Function ブロックはシングル スレッドで実行される

複数のスレッドによるコシミュレーションの制限

  • アクセラレータ モードとラピッド アクセラレータ モードではシミュレーションはシングル スレッドで実行されます。

  • コシミュレーション コンポーネントでは、コード生成は行われません。

  • FMU ブロックに以下の設定がなされている場合、コシミュレーションはサポートされません。

S-Function ブロックの制限

  • シングル レートであること — 1 つの離散レートのみを登録するために ssSetSampleTime(SimStruct *S, int_T st_index, time_T period) を呼び出されなければなりません。

  • 固定サンプル時間をもつこと — time_T ssSetSampleTime(SimStruct *S, int_T st_index, time_T period) では、periodVARIABLE_SAMPLE_TIME にできません。

  • 連続状態にできない — ssSetNumContStates(SimStruct *S, int_T n) では、n0 にしなければなりません。

  • 直達端子を含めないこと — ssSetInputPortDirectFeedThrough(SimStruct *S, int_T port, int_T dirFeed) では、各入力端子の dirFeed0 にしなければなりません。

  • スレッド セーフであること — ssSetRuntimeThreadSafetyCompliance(SimStruct *S, int_T val) では、valRUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE にしなければなりません。

  • 例外なしであること — ssSetOptions(SimStruct *S, uint_T options) では、optionsSS_OPTION_EXCEPTION_FREE_CODE を含めなければなりません。

FMU Import ブロックの制限

  • コシミュレーション モードでなければならない。

  • スレッドセーフでなければならない。つまり、複数の FMU は同時に同じファイルにアクセスできない。

  • デバッグ ログは無効でなければならない。たとえば、set_param(block1,'FMUDebugLogging','on')

  • デバッグ ログのリダイレクト先がファイルに設定されている場合 — たとえば、set_param(block1,'FMUDebugLoggingRedirect','File')

Model ブロックの制限

  • スケジューリング用に IRT 端子は公開できない。

  • For Each Subsystem 内に配置することはできない。

  • アクセラレータ モードでなければならない。

  • シングル レートにする必要がある。

  • 可変サンプル時間をもつブロックは使用できない。

  • 連続状態をもつことはできない。

  • どの入力端子でも直達をもつことはできない。

  • 固定ステップ ソルバーをもたなければならない。

  • どのグローバルなデータ ストアにもアクセスできない。

  • いずれの Simulink 関数または呼び出し元ブロックも使用できない。

  • To/From File ブロックを含めることはできない。

参考

| | |

関連するトピック