主要内容

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

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

万博1manbetx®は,ローカルソルバーを使用する,またはシミュレーションツールを含むコンポーネント間のコシミュレーションをサポートしています。たとえば,コシミュレーションには,万博1manbetx仿真软件とサードパーティ製のツールまたはカスタムコードの間にコシミュレーションゲートウェイとして実装されるs函数を含めることができます。また,コシミュレーションモードで仿真万博1manbetx软件にインポートされるFMUを含めることもできます。

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

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

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

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

万博1manbetx仿真软件では,以下の要件を満たす場合,マルチスレッドでC墨西哥人s函数ブロックとコシミュレーションFMUブロックを実行できます。

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

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

メモ

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

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

  1. モデルを開きます。

  2. パフォーマンスアドバイザーツールを起動します([デバッグ]タブで[パフォーマンスアドバイザー]をクリック)。

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

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

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

または,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パラメーターを次のように用います。

設定 モデル ブロック 説明

“上”

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

“关闭”

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

“汽车”

(既定)ブロックがマルチスレッドで実行できるかどうかを仿真万博1manbetx软件に判定させる。

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

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

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

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

    • s函数ブロックには,関数ssSetInputPortDirectFeedThroughを使用します。

    • FMUブロックの場合,FMUモデル記述ファイルのFMUModelStructure /输出およびModelStructure / InitialUnknownsフィールドで依赖关系属性を空のままにします。この属性は(”“)でなければなりません。

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

マルチスレッドではソルバーリセットチェックは許可されず,したがって関数ssSetSolverNeedsResetssBlockStateForSolverChangedAtMajorStepの使用はスキップされます。一方,アクセラレータモードでは,これらの関数が使用されるか,連続状態である場合,マルチスレッドは自動的にオフになります。

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

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

MultithreadedSimの設定 ssSetRuntimeThreadSafetyComplianceの設定 シングルスレッドまたはマルチスレッド
“汽车” RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN シングルスレッド
“汽车” RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE マルチスレッド
“汽车” RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE シングルスレッド
“关闭” - - - - - - 設定は無視され,s函数ブロックはシングルスレッドで実行される

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

  • アクセラレータモードとラピッドアクセラレータモードではシミュレーションはシングルスレッドで実行されます。マルチスレッディングが有効になるのはシミュレーションモードがノーマルのときです。

    モデルのシミュレーションモードをノーマルに設定します。

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

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

  • 定数のサンプル時間をもつブロックでは,マルチスレッディングは有効になりません。

  • 万博1manbetx仿真软件デバッガーがオンのとき,マルチスレッディングは有効になりません。

    万博1manbetx仿真软件デバッガーをオフにします。

  • スレッドセーフでないブロックに依存するブロックはマルチスレッドにできません。单位延迟ブロックを使用するなどして,依存関係を破棄することを検討してください。

s函数ブロックの制限

  • シングルレートでなければならない。

    モデルを修正して,マルチレートコンポーネントを個別のシングルレートコンポーネントに分割することを検討してください。

  • s函数が可変サンプル時間をもつ場合,マルチスレッディングは有効にならない。

    異なるサンプル時間の使用を検討してください(サンプル時間の指定を参照)。

  • s函数が連続状態をもち,ソルバーが固定ステップであり,それらが合わさって連続状態の整合性のチェックをトリガーする場合,マルチスレッディングは有効にならない。連続状態の整合性のチェックを無効にするには,関数ssSetSkipContStatesConsistencyCheckを使用します。

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

    单位延迟ブロックを使用するなどして,ブロック間の依存関係を破棄することを検討してください。

  • スレッドセーフであること-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は同時に同じファイルにアクセスできない。

  • FMUブロックのログ記録がMATLAB®コマンドウィンドウに表示されるとき,マルチスレッディングは有効にならない。次を使用してFMUブロックのログ記録をファイルにリダイレクトしてください。

    set_param (blockName“FMUDebugLoggingRedirect”“文件”
  • FMUがプロセス外で実行されている場合,マルチスレッディングはサポートされない。この設定を無効にするには,次を使用します。

    set_param (blockName“DebugExecutionForFMUViaOutOfProcess”“关闭”

模型ブロックの制限

  • 模型ブロックにイベント端子があるとき,マルチスレッディングは有効にならない。

  • 为每个子系统ブロック内に存在することはできない。

    模型ブロックを为每个子系统ブロックの外に移動することを検討してください。

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

  • シングルレートでなければならない。

    モデルを修正して,マルチレートコンポーネントを個別のシングルレートコンポーネントに分割することを検討してください。

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

    異なるサンプル時間の使用を検討してください(サンプル時間の指定を参照)。

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

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

    单位延迟ブロックを使用するなどして,ブロック間の依存関係を破棄することを検討してください。

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

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

  • モデルに万博1manbetx仿真软件的功能ブロックが含まれているとき,マルチスレッディングは有効にならない。

  • いずれの仿万博1manbetx真软件関数または呼び出し元ブロックも使用できない。

  • 到文件ブロックを含めることはできない。詳細については,シミュレーションデータのエクスポートを参照してください。

  • 从文件ブロックを含めることはできない。

    最上位モデルからの尺寸経由で参照モデルにデータを入力することを検討してください。

参考

|||

関連するトピック