(57)【特許請求の範囲】
【請求項１】
複数のプロセッサをもつコンピュータの処理により、ノードがブロックであり、依存関係がリンクであるグラフ状のモデルにおける複数の連立方程式で記述される、常微分方程式を解く方法であって、
前記モデルにおける内部状態をもつブロックへの入力を計算するブロックおよび出力を持たないブロックから出発して、前記依存関係を逆に辿ることにより、前記内部状態をもつブロックへの入力を計算するブロックおよび出力を持たないブロック毎に該ブロックへの入力の計算に必要なブロックの集合からなるセグメントを、互いに重複を含むことを許しつつ、生成するステップと、
前記セグメントを、重複を減らすようにマージするステップと、
前記マージされた結果のセグメントの各々をコンパイルして実行可能コードに変換するステップと、
前記セグメント毎の実行可能コードを、前記複数のプロセッサに個別に割り当てて並列に実行させるステップを有する、
方法。
【請求項２】
前記セグメントを生成するステップが、内部状態をもつブロックへの入力など、１タイムステップ内ではないものとしてよい依存関係を介した親ブロックは含まないようにして、親ブロックを辿りつつ、ブロックをセグメントに追加するステップを有する、
請求項１に記載の方法。
【請求項３】
前記セグメントを、重複を減らすようにマージするステップが、
(a)  前記セグメントの集合において、最も計算時間の小さいセグメントsを抽出するステップと、
(b)  前記セグメントsとの和集合に含まれるブロックの計算時間が最小となるセグメントtを抽出するステップと、
(c)  前記セグメントの集合において、最も計算時間の大きいセグメントuを抽出するステップと、
(d)  前記セグメントの集合の個数が前記プロセッサの数よりも大きいかまたは、前記セグメントuの計算時間が前記セグメントsと前記セグメントtの和集合の計算時間よりも大きいかどうかの判断を行うステップと、
(e) 前記判断が肯定的であることに従い、前記セグメントの集合から前記セグメントsと前記セグメントtを除去して、前記セグメントsと前記セグメントtの和集合を追加し前記ステップ(a)から処理を繰り返すステップと、
(f) 前記判断が否定的であることに従い、前記セグメントの集合を出力して前記マージするステップを含む、
請求項１に記載の方法。
【請求項４】
前記内部状態をもつブロックが、積分計算のブロック、またはユーザー定義のブロックである、請求項１に記載の方法。
【請求項５】
前記複数のプロセッサをもつコンピュータが、マルチコアのプロセッサを含む、請求項１に記載の方法。
【請求項６】
複数のプロセッサをもつコンピュータの処理により、ノードがブロックであり、依存関係がリンクであるグラフ状のモデルにおける複数の連立方程式で記述される、常微分方程式を解くプログラムであって、
前記コンピュータに、
前記モデルにおける内部状態をもつブロックへの入力を計算するブロックおよび出力を持たないブロックから出発して、前記依存関係を逆に辿ることにより、前記内部状態をもつブロックへの入力を計算するブロックおよび出力を持たないブロック毎に該ブロックへの入力の計算に必要なブロックの集合からなるセグメントを、互いに重複を含むことを許しつつ、生成するステップと、
前記セグメントを、重複を減らすようにマージするステップと、
前記マージされた結果のセグメントの各々をコンパイルして実行可能コードに変換するステップと、
前記セグメント毎の実行可能コードを、前記複数のプロセッサに個別に割り当てて並列に実行させるステップを実行させる、
プログラム。
【請求項７】
前記セグメントを生成するステップが、内部状態をもつブロックへの入力など、１タイムステップ内ではないものとしてよい依存関係を介した親ブロックは含まないようにして、親ブロックを辿りつつ、ブロックをセグメントに追加するステップを有する、
請求項６に記載のプログラム。
【請求項８】
前記セグメントを、重複を減らすようにマージするステップが、
(a)  前記セグメントの集合において、最も計算時間の小さいセグメントsを抽出するステップと、
(b)  前記セグメントsとの和集合に含まれるブロックの計算時間が最小となるセグメントtを抽出するステップと、
(c)  前記セグメントの集合において、最も計算時間の大きいセグメントuを抽出するステップと、
(d)  前記セグメントの集合の個数が前記プロセッサの数よりも大きいかまたは、前記セ
グメントuの計算時間が前記セグメントsと前記セグメントtの和集合の計算時間よりも大
きいかどうかの判断を行うステップと、
(e) 前記判断が肯定的であることに従い、前記セグメントの集合から前記セグメントsと前記セグメントtを除去して、前記セグメントsと前記セグメントtの和集合を追加し前記ステップ(a)から処理を繰り返すステップと、
(f) 前記判断が否定的であることに従い、前記セグメントの集合を出力して前記マージするステップを含む、
請求項６に記載のプログラム。
【請求項９】
前記内部状態をもつブロックが、積分計算のブロック、またはユーザー定義のブロックである、請求項６に記載のプログラム。
【請求項１０】
前記複数のプロセッサをもつコンピュータが、マルチコアのプロセッサを含む、請求項６に記載のプログラム。
【請求項１１】
複数のプロセッサをもつコンピュータの処理により、ノードがブロックであり、依存関係がリンクであるグラフ状のモデルにおける複数の連立方程式で記述される、常微分方程式を解くシステムであって、
前記モデルにおける内部状態をもつブロックへの入力を計算するブロックおよび出力を持たないブロックから出発して、前記依存関係を逆に辿ることにより、前記内部状態をもつブロックへの入力を計算するブロックおよび出力を持たないブロック毎に該ブロックへの入力の計算に必要なブロックの集合からなるセグメントを、互いに重複を含むことを許しつつ、生成する手段と、
前記セグメントを、重複を減らすようにマージする手段と、
前記マージされた結果のセグメントの各々をコンパイルして実行可能コードに変換する手段と、
前記セグメント毎の実行可能コードを、前記複数のプロセッサに個別に割り当てて並列に実行させる手段を有する、
システム。
【請求項１２】
前記セグメントを生成する手段が、内部状態をもつブロックへの入力など、１タイムステップ内ではないものとしてよい依存関係を介した親ブロックは含まないようにして、親ブロックを辿りつつ、ブロックをセグメントに追加する処理を実行する、
請求項１１に記載のシステム。
【請求項１３】
前記セグメントを、重複を減らすようにマージする手段が、
(a)  前記セグメントの集合において、最も計算時間の小さいセグメントsを抽出する処理と、
(b)  前記セグメントsとの和集合に含まれるブロックの計算時間が最小となるセグメントtを抽出する処理と、
(c)  前記セグメントの集合において、最も計算時間の大きいセグメントuを抽出する処理と、
(d)  前記セグメントの集合の個数が前記プロセッサの数よりも大きいかまたは、前記セ
グメントuの計算時間が前記セグメントsと前記セグメントtの和集合の計算時間よりも大
きいかどうかの判断を行う処理と、
(e) 前記判断が肯定的であることに従い、前記セグメントの集合から前記セグメントsと前記セグメントtを除去して、前記セグメントsと前記セグメントtの和集合を追加し前記処理(a)から処理を繰り返す処理と、
(f) 前記判断が否定的であることに従い、前記セグメントの集合を出力して前記マージする処理を実行する、
請求項１１に記載のシステム。
【請求項１４】
前記内部状態をもつブロックが、積分計算のブロック、またはユーザー定義のブロックである、請求項１１に記載のシステム。
【請求項１５】
前記複数のプロセッサをもつコンピュータが、マルチコアのプロセッサを含む、請求項１１に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、シミュレーション・システムにおいて、プログラムの実行を並列化により高速化する技法に関する。
【背景技術】
【０００２】
近年、科学技術計算、シミュレーションなどの分野で、複数のプロセッサをもつ、いわゆるマルチプロセッサ・システムが使用されている。そのようなシステムでは、アプリケーション・プログラムは、複数のプロセスを生成して、個別のプロセッサに、プロセスを割り当てて並列に実行させる。
【０００３】
最近になって特に盛んに開発されるようになってきたシミュレーションの分野として、ロボット、自動車、飛行機などのメトカトロニクスのプラントのシミュレーション用ソフトウェアがある。電子部品とソフトウェア技術に発展の恩恵により、ロボット、自動車、飛行機などでは、神経のように張り巡らされたワイヤ結線や無線ＬＡＮなどを利用して、大部分の制御が電子的に行われる。
【０００４】
それらは、本来的には機械的装置であるのに、大量の制御ソフトウェアをも内蔵している。そのため、製品の開発に当たっては、制御プログラムの開発とそのテストに、長い時間と、膨大な費用と、多数の人員を費やす必要が出てきた。
【０００５】
このようなテストにために従来行われている技法として、ＨＩＬＳ(Hardware In the Loop Simulation)がある。特に、自動車全体の電子制御ユニット（ＥＣＵ）をテストする環境は、フルビークルＨＩＬＳと呼ばれる。フルビークルＨＩＬＳにおいては、実験室内で、本物のＥＣＵが、エンジン、トランスミッション機構などをエミュレーションする専用のハードウェア装置に接続され、所定のシナリオに従って、テストが行われる。ＥＣＵからの出力は、監視用のコンピュータに入力され、さらにはディスプレイに表示されて、テスト担当者がディスプレイを眺めながら、異常動作がないかどうか、チェックする。
【０００６】
しかし、ＨＩＬＳは、専用のハードウェア装置を使い、それと本物のＥＣＵの間を物理的に配線しなくてはならないので、準備が大変である。また、別のＥＣＵに取り替えてのテストも、物理的に接続し直さなくてはならないので、手間がかかる。さらに、本物のＥＣＵを用いたテストであるため、テストに実時間を要する。従って、多くのシナリオをテストすると、膨大な時間がかかる。また、ＨＩＬＳのエミュレーション用のハードウェア装置は、一般に、非常に高価である。
【０００７】
そこで近年、高価なエミュレーション用ハードウェア装置を使うことなく、ソフトウェアで構成する手法が提案されている。この手法は、ＳＩＬＳ(Software In the Loop Simulation)と呼ばれ、ＥＣＵに搭載されるマイクロコンピュータ、入出力回路、制御のシナリオ、エンジンやトランスミッションなどのプラントを全て、ソフトウェア・シミュレータで構成する技法である。これによれば、ＥＣＵのハードウェアが存在しなくても、テストを実行可能である。
【０００８】
このようなＳＩＬＳの構築を支援するシステムとして例えば、MathWorks社から入手可能なシミュレーション・モデリング・システムである、MATLAB(R)/Simulink(R)がある。MATLAB(R)/Simulink(R)を使用すると、画面上にグラフィカル・インターフェースによって、機能ブロックを配置し、矢印で結ぶことで処理の流れを指定することによって、シミュレーション・プログラムを作成することができる。これらのブロック線図は、シミュレーションの１タイムステップ分の処理を表しており、これが所定回繰り返されることにより、シミュレーション対象となるシステムの時系列における振る舞いを得ることができる。
【０００９】
こうして、MATLAB(R)/Simulink(R)上で、機能ブロックなどのブロック線図が作成されると、例えばReal-Time Workshop(R)の機能により、等価な機能のＣ言語など既知のコンピュータ言語のソース・コードに変換することができる。このＣ言語のソース・コードをコンパイルすることにより、別のコンピュータ・システムで、ＳＩＬＳとして、シミュレーションを実行することができる。
【００１０】
マルチプロセッサあるいはマルチコアをもつコンピュータ・システムが普及してくるにつれて、ブロック線図で記述されたプログラムをセグメントと呼ばれるグループに分け、その各々を異なるプロセッサまたはコアに割り当てて並列実行させ、以って高速実行を図る技術が提供されるようになってきた。
【００１１】
特開２０１１−９６１０７号公報は、ブロック線図において、内部状態をもたない機能ブロックの出力が、内部状態をもつ機能ブロックＡによって使用されるとき、機能ブロックAは、その内部状態をもたない機能ブロックの使用ブロックと呼び、内部状態をもつ機能ブロックＡの出力が、内部状態をもたない機能ブロックの入力として計算に使用されるとき、機能ブロックＡは、その内部状態をもたない機能ブロックの定義ブロックと呼び、各機能ブロックをノードとして訪問することにより、内部状態をもつ機能ブロックと、内部状態をもたない機能ブロックとの接続関係に基づき、機能ブロック毎に、使用ブロック集合／定義ブロック集合の数を求め、その数に基づき、ストランドを割り当て、これにより、ブロック線図を、ストランドに分けて処理を並列化することを開示する。
【００１２】
一方、ブロック線図によって記述されるモデルは、これを数値的に解く技法の観点では、エクスプリシットな連立常微分方程式の状態空間形式での表現と見立てることもできる。その観点では、笠原 博徳、藤井 稔久、本多 弘樹、成田 誠之助、"スタティック・マルチプロセッサ・スケジューリング・アルゴリズムを用いた常微分方程式求解の並列処理"  情報処理学会論文誌 28(10), 1060-1070, 1987-10-15は、エクスプリシットな常微分方程式求解のための並列処理手法に関し、タスク生成、タスクのプロセッサ上への最適スケジューリング、スケジューリング結果を用いたマシンコードの生成などからなり、様々な粒度に対応可能な常微分方程式求解の並列処理技法を開示する。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２０１１−９６１０７号公報
【非特許文献】
【００１４】
【非特許文献１】笠原 博徳、藤井 稔久、本多 弘樹、成田 誠之助、"スタティック・マルチプロセッサ・スケジューリング・アルゴリズムを用いた常微分方程式求解の並列処理"  情報処理学会論文誌 28(10), 1060-1070, 1987-10-15
【発明の概要】
【発明が解決しようとする課題】
【００１５】
上記従来技術の技法は、ブロック線図で記述されるモデルのコードを、マルチプロセッサあるいはマルチコア上で並列化するようにセグメント化を達成するが、結果として得られるコードのセグメントのバランスが十分でない、あるいは１タイムステップの処理の間にプロセッサ間で多数の通信が必要となるなどの要因から、結果として並列化による高速化の度合いが十分でないという問題があった。
【００１６】
従って、この発明の目的は、モデルのコードを、１タイムステップ内で通信を必要としない形でバランスよくセグメント化することで、マルチプロセッサあるいはマルチコア上で並列化した際に実行を高速化させることができる技法を提供することにある。
【課題を解決するための手段】
【００１７】
本発明は、上記課題を解決するためになされたものであって、モデルが本質的に表現している常微分方程式の状態空間形式(state space form = SSF)の性質を利用して、１ステップ内で通信の発生しない並列実行単位を抽出することによって上記目的を達成する。
【００１８】
このために、本発明のシステムは、モデルを記述するブロック線図を構成するブロックのうちの、内部状態をもつブロックおよび出力を持たないブロックに着目し、内部状態をもつブロックへの入力を計算するブロック及び出力を持たないブロックからグラフを依存関係の逆方向に辿り、各内部状態をもつブロックへの入力および出力を持たないブロックの計算に必要なブロックの集合からなるセグメントを抽出する。この際、セグメント間で、ブロックの重複を許すものとする。
【００１９】
次に、本発明のシステムは、各セグメントを、セグメント間でのブロックの重複を減らすようにマージし、セグメント数を並列実行の数まで減らす。このとき、同じブロックを多くもつセグメント同士をマージすることで、セグメント間の重複が減る。尚ここで、並列実行の数とは典型的には、利用可能なコアまたはプロセッサの数である。
【００２０】
次に、本発明のシステムは、結果として得られたセグメントの各々をコンパイルし、得られた実行可能コードを各コアまたはプロセッサに割り当てて並列実行させる。
【発明の効果】
【００２１】
以上のように、この発明によれば、ブロック線図などのグラフ形式で記述されたプログラムを、バランスよく１ステップ内で通信が必要ない形でセグメント化して複数のプロセッサに割り当てて並列実行させることにより、実行速度を向上することができるという効果が得られる。
【図面の簡単な説明】
【００２２】
【図１】本発明を実施するためのハードウェアのブロック図である。
【図２】本発明を実施するための機能構成のブロック図である。
【図３】本発明の入力となるブロック線図を説明するための図である。
【図４】本発明の処理がセグメントを抽出するために利用する概念を説明するための図である。
【図５】本発明処理の概要を説明するための図である。
【図６】セグメント抽出処理のフローチャートを示す図である。
【図７】セグメント抽出処理で呼び出されるサブルーチンの処理のフローチャートを示す図である。
【図８】セグメントのマージ処理のフローチャートを示す図である。
【図９】コンピュータにより、逐次処理により、常微分方程式を解く処理を説明する図である。
【図１０】コンピュータにより、並列化して、常微分方程式を解く処理を説明する図である。
【発明を実施するための形態】
【００２３】
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
【００２４】
先ず、図１を参照して、本発明を実施するために使用されるコンピュータのハードウェアについて説明する。図１において、ホスト・バス１０２には、複数のＣＰＵ１  １０４ａ、ＣＰＵ２  １０４ｂ、ＣＰＵ３  １０４ｃ、・・・ＣＰＵｎ  １０４ｎが接続されている。ホスト・バス１０２にはさらに、ＣＰＵ１  １０４ａ、ＣＰＵ２  １０４ｂ、ＣＰＵ３  １０４ｃ、・・・ＣＰＵｎ  １０４ｎの演算処理のためのメイン・メモリ１０６が接続されている。
【００２５】
一方、Ｉ／Ｏバス１０８には、キーボード１１０、マウス１１２、ディスプレイ１１４及びハードティスク・ドライブ１１６が接続されている。Ｉ／Ｏバス１０８は、Ｉ／Ｏブリッジ１１８を介して、ホスト・バス１０２に接続されている。キーボード１１０及びマウス１１２は、オペレータが、コマンドを打ち込んだり、メニューをクリックするなどして、操作するために使用される。ディスプレイ１１４は、必要に応じて、後述する本発明に係るプログラムをＧＵＩで操作するためのメニューを表示するために使用される。
【００２６】
この目的のために使用される好適なコンピュータ・システムのハードウェアとして、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘがある。その際、ＣＰＵ１  １０４ａ、ＣＰＵ２  １０４ｂ、ＣＰＵ３  １０４ｃ、・・・ＣＰＵｎ  １０４ｎは、例えば、インテル（Ｒ）Ｘｅｏｎ（Ｒ）であり、オペレーティング・システムは、Ｗｉｎｄｏｗｓ（商標）Ｓｅｒｖｅｒ  ２００３である。オペレーティング・システムは、ハードティスク・ドライブ１１６に格納され、コンピュータ・システムの起動時に、ハードティスク・ドライブ１１６からメイン・メモリ１０６に読み込まれる。
【００２７】
本発明を実施するためには、マルチプロセッサ・システムを用いることが必要である。ここでマルチプロセッサ・システムとは、一般に、独立に演算処理し得るプロセッサ機能のコアを複数もつプロセッサを用いるシステムを意図しており、従って、マルチコア・シングルプロセッサ・システム、シングルコア・マルチプロセッサ・システム、及びマルチコア・マルチプロセッサ・システムのどれかでよいことを理解されたい。
【００２８】
マルチコア・プロセッサとしては、好適には、インテル(R)Core(商標)2 Quadなどの、インテル(R)Core(商標)シリーズのプロセッサなどを使用することができる。
【００２９】
なお、本発明を実施するために使用可能なコンピュータ・システムのハードウェアは、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘに限定されず、本発明のシミュレーション・プログラムを走らせることができるものであれば、パーソナル・コンピュータを含む任意のコンピュータ・システムを使用することができる。オペレーティング・システムも、Ｗｉｎｄｏｗｓ（Ｒ）に限定されず、Ｌｉｎｕｘ（Ｒ）、Ｍａｃ  ＯＳ（Ｒ）など、任意のオペレーティング・システムを使用することができる。さらに、シミュレーション・プログラムを高速で動作させるために、ＰＯＷＥＲ（商標）６ベースで、オペレーティング・システムがＡＩＸ（商標）のＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｐなどのコンピュータ・システムを使用することもできる。
【００３０】
ハードティスク・ドライブ１１６にはさらに、シミュレーション・モデリング・ツール２０２であるMATLAB(R)/Simulink(R)、メイン・ルーチン２０６、セグメント抽出ルーチン２０８、マージ処理ルーチン２１２、コード変換ルーチン２１６、Ｃコンパイラまたは、Ｃ＋＋コンパイラ２２０、などが格納されており、オペレータのキーボード１１０やマウス１１２などの操作に応答して、メイン・メモリ１０６にロードされて実行される。これらのツールやルーチンに関しては、図２に関連して後述する。メイン・ルーチン２０６、セグメント抽出ルーチン２０８、マージ処理ルーチン２１２等は、Java(R)、C、C++、C#などの既存のコンピュータ・プログラミングのコードとして書かれ、所定のコンパイラでコンパイルすることにより作成することができる。
【００３１】
尚、使用可能なシミュレーション・モデリング・ツール２０２は、MATLAB(R)/Simulink(R)に限定されず、オープンソースのScilab/Scicosなど任意のシミュレーション・モデリング・ツールを使用することが可能である。
【００３２】
あるいは、場合によっては、シミュレーション・モデリング・ツールを使わず、直接、Ｃ、Ｃ＋＋などでシミュレーション・システムのソース・コードを書くことも可能であり、その場合にも、個々の機能が、互いに依存関係にある個別の機能ブロックとして記述できるなら、本発明は適用可能である。
【００３３】
図２は、本発明の実施例に係る処理要素のブロック図である。図２において、オペレータがシミュレーション・モデリング・ツール２０２を操作することによって作成されたブロック線図のコード２０４は、ハードティスク・ドライブ１１６に保存される。ブロック線図のコード２０４は例えば、図３(a)に示すように、機能をもつブロックをノードとし、依存関係のリンクとするグラフ形式で記述される。依存関係は、好適には、ＸＭＬなどの形式で記述される。
【００３４】
メイン・ルーチン２０６は、オペレータのキーボード１１０やマウス１１２などの操作を受け付けて、セグメント抽出ルーチン２０８、マージ処理ルーチン２１２、コード変換ルーチン２１６、コンパイラ２２０などを適宜呼び出し、全体の処理を統合する機能をもつ。
【００３５】
セグメント抽出ルーチン２０８は、ブロック線図のコード２０４において、内部状態をもつブロックおよび出力を持たないブロックに着目して、ブロック線図の機能ブロック群を、ブロックの重複を許容しつつ複数のセグメントに分割し、ファイル２１０としてハードティスク・ドライブ１１６に書き出す機能をもつ。セグメント抽出ルーチン２０８の処理については、図６及び図７のフローチャートを参照して、後で詳細に説明する。
【００３６】
マージ処理ルーチン２１２は、ブロックの重複を減らしつつ、セグメントをマージしたセグメントを生成してファイル２１４としてハードティスク・ドライブ１１６に書き出す機能をもつ。マージ処理ルーチン２１２の処理については、図８のフローチャートを参照して、後で詳細に説明する。
【００３７】
コード変換ルーチン２１６は、ブロック線図で記述されたコードを例えばＣ言語のソースコードに変換する機能をもつ。セグメント毎に変換されたソースコード２１８は、好適にはハードティスク・ドライブ１１６にに書き出される。コード変換ルーチン２１６として好適には、MathWorks社から入手可能なRealtime Workshopを使用することができる。
【００３８】
コンパイラ２２０は、セグメント毎にソースコード２１８をコンパイルして、実行可能コード２２２を生成して、好適にはハードティスク・ドライブ１１６に書き出す。コンパイラ２２０としては、ＣＰＵ１、ＣＰＵ２・・・ＣＰＵｎに適合するコードを生成する任意のコンパイラを使用することができる。
【００３９】
実行環境２２４は、セグメント毎の実行可能コード２２２を、ＣＰＵ１、ＣＰＵ２、・・・、ＣＰＵｎに個別に割り当てて並列実行させる機能をもつ。
【００４０】
図３は本発明の入力となるブロック線図の一例を示す。本発明が対象とするブロック線図は、シミュレーションの 1 タイムステップ分の処理を表しており、これが所定回繰り返されることによりシミュレーションの対象となるシステムの時系列における振る舞いを得ることができる。
【００４１】
より具体的には、以下の二つの処理が１タイムステップ分の処理となる（ソルバによってはこれを複数回繰り返したものが１タイムステップ分の処理となるが、基本的な処理手順は変わらず、本発明の適用を妨げるものではない）。
【００４２】
１）以下のルールに従ってすべてのブロックの出力を計算する。
a）内部状態を持つブロックは当該ブロックへの入力を必要とせず、自身が持つ内部状態からその出力を計算できるため、任意のタイミングで出力を計算してよい。図３におけるブロック３０２、ブロック３０４が内部状態を持つブロックであるとすると、これらのブロックから出力計算を開始することができる。
b）内部状態を持たないブロックは、自身への入力を元に出力を計算するため、入力が計算された後に当該ブロックの出力を計算する。図３におけるブロック３０２、ブロック３０４以外のブロックは、入力が計算された後、初めて出力を計算することができる。ただし、入力を持たないブロックの場合には、そのブロックから出力計算を開始することができる。
【００４３】
２）前記処理により、内部状態を持つブロックへの入力値（図３においてはブロック３０６およびブロック３０２の出力）が計算されているので、これを使って内部状態を次のタイムステップにおけるものに更新する。
【００４４】
ここで、内部状態を持つブロックへの入力は、１タイムステップ分のブロックの出力を計算する段階においては存在しないものとみなしてよく、これを non-direct feedthrough (ＮＤＦ) 入力と呼ぶ。図３においてはブロック３０２および３０４の入力を指し、これはそれぞれブロック３０６の出力、ブロック３０２の出力である。
【００４５】
このように表現されたブロック線図は、好適には図４の右に示すような常微分方程式の State Space Form（ODE/SSF）を表現している。
【００４６】
左辺に状態変数を更新するために必要な変数 x'（一般には状態変数の時間微分だが、Simulink(R)などにおいては微係数以外にも左辺に相当する変数があり、ここではより一般化して状態変数を更新するために必要な変数と呼ぶことにする）、右辺に状態変数xを入力とする関数を持つ連立方程式となる。
【００４７】
このような常微分方程式を数値的に解く一般的な手順は、あるタイムステップにおいて与えられた状態変数から右辺をすべて評価して左辺の値を得、左辺の値を元に次のタイムステップの状態変数を計算するという、前述のブロック線図における計算処理そのものである。
【００４８】
図４はこのODE/SSFと、ブロック線図（の一部）の対応を示している。
内部状態をもつブロックをブロック４０２、ブロック４０４及びブロック４０６とする。
【００４９】
ここでブロック４０２に着目し、そこでの内部状態（すなわち State Space Form における状態変数）をxiとする。すると、その内部状態（状態変数）を更新するのに必要な変数 xi' はブロック４０２への入力に相当し、その値を計算するために必要なブロックの集合（三角形４０８に囲まれたブロック）が右辺 fiに相当する。
【００５０】
ここであるタイムステップにおけるxi'の値の計算には、他の状態変数の更新に必要な値 xj', xk' 、すなわちNDF入力は必要なく、xj',xk'を計算するブロックはこの集合に含まれないことに注意されたい。
【００５１】
ところで、図４の右の式においては、右辺の式はすべて互いに独立に、すなわち並列に計算することが可能である。本発明の手法はこの性質をブロック線図の計算の並列化に応用するものであり、基本的にはブロック線図から抽出されたODE/SSFの各右辺に相当する部分を並列に実行することで高速化を達成する。
【００５２】
図５はブロック線図から上記概念に基づいて並列に実行する単位（セグメント）を抽出する手順を説明するための図である。
【００５３】
図５(a)は、後の説明の便宜のため、内部状態をもつブロックが先頭に来るように並べ替え、また、各ブロックに、A〜Pの記号を振ったものである。この記号を用いると、図５(a)では、ブロックA、ブロックHが内部状態をもつブロックである。
【００５４】
ここで、セグメント抽出ルーチン２０８の処理により、ＮＤＦ入力を計算するブロックおよび出力のないブロック（すなわち、図５(a）においては G, J, P）からグラフを依存関係の逆方向に、すなわちリンクの矢印の逆方向に辿り、各内部状態をもつブロックおよび各出力を持たないブロックへの入力の算出に必要なブロックの集合からなる（他のセグメントとの重複を許す）セグメントを抽出する。この処理の詳細は、図６及び図７のフローチャートを参照してより詳細に説明する。
【００５５】
このようなセグメント化の結果、図５(b)に示すように、x1'に対応するセグメント５０２、x2'に対応するセグメント５０４、出力を持たないブロック P に対応するセグメント５０６などが得られる。図５(b)からは、例えばブロックC,E,Fが、セグメント５０２とセグメント５０４の間で重複していることが見て取れる。このような重複の存在により、各セグメントは他のセグメントとは独立して、すなわち並列に計算が可能となる。ただし、重複が多すぎれば並列に計算ができても処理時間は短縮しない上、ブロック数が4000程度の実践的なブロック線図では、この段階におけるセグメント数は400〜1000程度と非常に多くなる傾向があり、通常のハードウェアではこのままではプロセッサに個別にセグメントを割り当てて並列実行させることはできない。
【００５６】
そこで図５(c)に示すように、マージ処理ルーチン２１２が、セグメント間の重複を減らすように（究極的には各セグメントに含まれるブロックの計算に要する時間の最大値が小さくなるように）セグメントの数が利用可能なコアまたはプロセッサの数以下になるまでセグメントをマージする。この結果、マージされたセグメント５０８、５１０・・・が得られる。見てとれるように、この段階でも多少、セグメント間で重複するブロックは存在しえるが、この重複によって１ステップ内での通信が不要となる。また、マージ処理によって初期のセグメントにあった大量の重複はなくなり、効率的な並列実行が可能となる。
【００５７】
図５(c)の段階の個々のセグメントが、コード変換ルーチン２１６によってソースコードに変換され、コンパイラ２２０によって実行可能コードに変換され、実行環境２２４によって、個別のコアまたはプロセッサに割り当てられて実行される。
【００５８】
図６及び図７は、セグメント抽出ルーチン２０８の処理のフローチャートを示す図である。
【００５９】
図６のステップ６０２において、セグメント抽出ルーチン２０８は、B := ＮＤＦ入力へ出力を渡すブロック、すなわち内部状態をもつブロックに対する親ブロック（依存関係の矢印の上流にあるブロック）、または出力をもたないブロックの集合とする。また、ステップ６０２では、SにΦ、すなわち空集合がセットされる。
【００６０】
因みに、Simulink(R)において、ＮＤＦを持つ可能性があるブロックの例として、これには限定されないが、次のものがある。
Integrator :  積分計算のブロック
DiscreteFilter ：無限インパルス応答(IIR)フィルタと有限インパルス応答(FIR)フィルタを実現するブロック
TransferFunction ：伝達関数を表すブロック（ＮＤＦはdx/dtに該当）
S-function ： ユーザが機能を自由に定義できるブロック
RateTransition  ：  サンプルタイムが変化することを表すブロック
【００６１】
ステップ６０４において、セグメント抽出ルーチン２０８は、Bが空集合かどうか判断し、もしそうならステップ６０６で、S中の各要素を初期のセグメントとして出力、すなわちファイル２１０としてハードディスク・ドライブ１１６に書き出して処理を終わる。
【００６２】
ステップ６０４においてBが空集合でないと判断すると、ステップ６０６において、セグメント抽出ルーチン２０８は、Bの要素であるbを取り出す。
【００６３】
ステップ６１０において、セグメント抽出ルーチン２０８は、sに空集合をセットし、ancestors(b,s)を呼び出し、セグメントsを抽出する。ancestors(b,s)については、図５のフローチャートを参照して、後で説明する。
【００６４】
ステップ６１２において、セグメント抽出ルーチン２０８は、ancestors(b,s)によって抽出されたセグメントを、S := S ∪ {s}により記録する。
【００６５】
ステップ６１４において、セグメント抽出ルーチン２０８は、B := B - {b}により、Bからbを削除して、ステップ６０４での判断に戻る。
【００６６】
このように、最初にBが空でないとすると、ステップ６０４、６０８、６１０、６１２及び６１４のループを回るうちにBの要素が次第に減ってきて、ついに空になったとき、ステップ６０４からステップ６０６を経て処理が終わる。
【００６７】
図７は、図６で呼び出されるサブルーチンancestors(b,s)の処理のフローチャートを示す図である。
【００６８】
サブルーチンancestors(b,s)は、ステップ７０２で、s := s ∪ {b}により、sにbを加える。
【００６９】
ステップ７０４では、サブルーチンancestors(b,s)は、P := bの親ブロックの集合とする。但し、このとき、ＮＤＦ入力を介した親は含まない。
【００７０】
ステップ７０６では、サブルーチンancestors(b,s)は、Pが空集合かどうか判断し、もしそうでないなら、ステップ７０８で、１つの親p ∈ Pを取り出す。
【００７１】
ステップ７１０では、サブルーチンancestors(b,s)は、ancestors(p,s)を再帰呼び出しする。そして、ステップ７１２でP := P - {p}によりPからpを除去してancestors(b,s)は、ステップ７０６で再び、Pが空集合かどうか判断する。このような繰り返しで、ついにPが空集合になると、処理は図６のステップ６１０に戻る。
【００７２】
図８は、マージ処理ルーチン２１２の処理のフローチャートを示す図である。図８のステップ８０２で、マージ処理ルーチン２１２は、S := セグメントの集合、p := プロセッサ数とする。セグメントの集合は、図２に示すように、セグメント抽出ルーチン２０８が書き出したファイル２１０から取得される。また、プロセッサ数は、利用可能なハードウェアに従い、予め定数としてセットしていてもよい。
【００７３】
ステップ８０４で、マージ処理ルーチン２１２は、S中の最も計算時間の小さいセグメントsを抽出する。すなわち、sは次の条件を満たす。||s|| <= ||s'||, s∈S, ∀s'∈S
ここで、||s||のような記法は、sが含むブロックの出力計算に必要な計算時間を示す。この計算時間は、あらかじめ各ブロックに要する計算時間を測定するか、仕様に基づき記録しておき、これを表引きして、セグメントが含むブロック毎に足すことによって得られる。
【００７４】
ステップ８０６で、マージ処理ルーチン２１２は、sとの和集合に含まれるブロックの計算時間が最小となるセグメントtを抽出する。すなわち、t は次の条件を満たす。||t ∪ s|| <= ||t' ∪ s||, t∈S-{s}, ∀t'∈S-{s}
なお、t ∪ sで示すような、Sの要素の間の和集合というとき、Sの要素自体がブロックの集合なので、ブロックを要素とみなして、集合演算を行うものと理解されたい。
【００７５】
ステップ８０８で、マージ処理ルーチン２１２は、S中の最も計算時間の大きいセグメントuを抽出する。すなわち、u は次の条件を満たす。||u|| >= ||u'||, u∈S, ∀u'∈S
【００７６】
ステップ８１０で、マージ処理ルーチン２１２は、|S| > pまたは||u|| >= ||t ∪ s||かどうかを判断する。ここで、|S|とは、Sの要素の数である。
【００７７】
|S| > pまたは||u|| >= ||t ∪ s||であるなら、マージ処理ルーチン２１２は、ステップ８１２でS := S - {s}でSからsを削除し、ステップ８１４でS := S - {t}でSからtを削除し、ステップ８１６でS := S ∪ {t∪s}によりSに、tとsの和集合からなる要素を追加して、ステップ８０４に戻る。
【００７８】
このような処理を続けると、ある段階でステップ８１０の判断が否定的、すなわち、|S| <= p且つ||u|| < ||t ∪ s||という条件が満たされる。これは、現在のセグメントの数がプロセッサの数以下であり、これ以上セグメントをマージせずともすべてのセグメントが並列に実行でき、且つ、計算時間が最小となるセグメント s をこれ以上別のセグメントとマージすると、計算時間の最大値が現状よりも大きくなり、並列実行のパフォーマンスの低下につながることを意味するため、ここでマージ処理を終了する。
【００７９】
この段階で、マージ処理ルーチン２１２は、ステップ８１８で、S中の各要素を、最終的なセグメント、すなわち、図２で示したマージされたセグメント２１４として出力して、処理を終わる。
【００８０】
次に図９に、コンピュータによる、一般的なODE/SSFの数値的な求解処理を模式的に示す。すなわち、ODE/SSFが下記のとおりだとする。
x1' = f1(x(t),t)
x2' = f2(x(t),t)
...
xn' = fn(x(t),t)
【００８１】
すると、特に並列化がなされていない場合、図９のブロック９０２で、f1,f2,...,fnの計算が逐次処理される。
【００８２】
また、ブロック９０２の後処理として、好適にはルンゲ・クッタ法などによって、x'(ti)という微分項をx(ti+1)にする積分を含む状態更新処理９０４が必要となる。
【００８３】
図１０は、図９に示すf1,f2,...,fnの逐次計算をセグメントに分解し、この場合、４つのコアまたはプロセッサで並列化するように割り当てた場合の処理を模式的に示す。すなわち、図１０では、f1,f2,...,fnの逐次計算に対応するブロック線図のグラフが、本発明の処理に従い、４つのセグメントとして分割してブロック１００２、ブロック１００４、ブロック１００６、ブロック１００８で並列に実行される。ただ、図１０の処理においても、x'(ti)という微分項をx(ti+1)にする積分を含む状態更新処理１０１０は同様に必要となる。状態更新処理１０１０の実行は、fの計算の完了した後なので最早ブロック１００２、ブロック１００４、ブロック１００６、ブロック１００８を並列計算したどのＣＰＵもビジーでなく、よって任意のＣＰＵで計算することができる。
【００８４】
以上、この発明を特定の実施例に基づき説明してきたが、この発明は、この特定の実施例に限定されず、当業者が自明に思いつく様々な変形、置換などの構成、技法適用可能であることを理解されたい。例えば、特定のプロセッサのアーキテクチャ、オペレーティング・システムなどに限定されない。
【００８５】
また、上記実施例は、MATLAB(R)/Simulink(R)を例にとって説明したが、これに限らず、任意のモデリング・ツールに適用可能であることを理解されたい。
【符号の説明】
【００８６】
１０２  ホスト・バス
１０４ａ、１０４ｂ、・・・１０４ｎ  ＣＰＵ
１０６  メイン・メモリ
１１６  ハードティスク・ドライブ
２０２  シミュレーション・モデリング・ツール
２０４  ブロック線図のコード
２０８  セグメント抽出ルーチン
２１２  マージ処理ルーチン
２１６  コード変換ルーチン
２２０  コンパイラ
２２４  実行環境
【図１】
0006021342.tif 000002
【図２】
0006021342.tif 000003
【図３】
0006021342.tif 000004
【図４】
0006021342.tif 000005
【図５】
0006021342.tif 000006
【図６】
0006021342.tif 000007
【図７】
0006021342.tif 000008
【図８】
0006021342.tif 000009
【図９】
0006021342.tif 000010
【図１０】
0006021342.tif 000011