(57)【要約】      （修正有）【課題】分割されたセグメント内部の並列性を抽出して、更なる処理の高速化を達成する。【解決手段】内部状態をもつブロックへの入力を計算するブロック及び出力を持たないブロックからグラフを依存関係の逆方向に辿り、各内部状態をもつブロックへの入力および出力を持たないブロックの計算に必要なブロックの集合からなるセグメントを抽出する。そのとき、当該セグメント内の並列性に基づいて一時的に除去するノードの集合を特定する。一部のノードを除去したことで子ノードのなくなったノードから上流に辿ることで、他と独立に実行できるセグメントを抽出し、これらのセグメントを上流のセグメント、無視されたノードの集合を下流のセグメントとして２つに分ける。次に上流のセグメント同士、下流のセグメント同士を、セグメント間でのブロックの重複を減らすようにマージし、セグメント数を並列実行の数まで減らす。【選択図】図５
2014035548.tif 000002
【特許請求の範囲】
【請求項１】
複数のプロセッサをもつコンピュータの処理により、ブロックがノードであり、依存関係がリンクであるグラフ状のモデルで表現される、複数の常微分方程式で記述される、連立方程式を解く方法であって、単一の常微分方程式を表現するグラフを、グラフの分割アルゴリズムを用いて複数のプロセッサをもつコンピュータの処理により解く方法において、
前記モデルにおける内部状態をもつブロックおよび出力を持たないブロックから出発して、前記依存関係を逆に辿ることにより、前記内部状態をもつブロックおよび出力を持たないブロック毎に、互いに重複を含んでいてもよい、他と独立に実行可能な前記ブロックの集合を初期セグメントとして抽出するステップと、
前記生成された初期セグメントsにおいて、s内部の並列性に基づいて該初期セグメントsの中の一部のブロックの集合を選択するステップと、
前記初期セグメントsにおいて、前記選択されたブロックの集合を処理対象から外すことで、子ブロックをもたなくなったブロックから出発して、前記依存関係を逆に辿ることにより、前記子ブロックをもたなくなったブロック毎に、互いに重複を含んでいてもよい、他と独立に実行可能な前記ブロックの集合であるセグメントを抽出するステップと、
前記抽出されたセグメント及び、前記初期セグメントの中でその内部のブロックが処理対象から外されなかったものを上流セグメントとし、前記選択され処理対象から外されたブロックの集合を下流セグメントとし、上流セグメント同士、下流セグメント同士を、重複を減らすようにマージし、前記上流セグメントおよび下流セグメントが所定並列実行数以下になるようにするマージ・ステップと、
前記マージされた結果のセグメントの各々をコンパイルして実行可能コードに変換するステップと、
前記セグメント毎の実行可能コードを、前記複数のプロセッサに個別に割り当てて並列に実行させるステップを有する、
方法。
【請求項２】
前記初期セグメントを生成するステップが、内部状態をもつブロックへの入力など、１タイムステップ内ではないものとしてよい依存関係を介した親ブロックは含まないようにして、親ブロックを辿りつつ、ブロックをセグメントに追加するステップを有する、請求項１に記載の方法。
【請求項３】
前記初期セグメントsの中の一部のブロックの集合を選択するステップが、
ノードのgainが所定の値より大きいことで前記ブロックの集合を選択するステップを有する、
請求項１に記載の方法。
【請求項４】
前記マージするステップが、bin packing問題を繰り返し解くステップを含む  請求項１に記載の方法。
【請求項５】
前記内部状態をもつブロックが、積分計算のブロック、またはユーザー定義のブロックである、請求項１に記載の方法。
【請求項６】
前記複数のプロセッサをもつコンピュータが、マルチコアのプロセッサを含む、請求項１に記載の方法。
【請求項７】
複数のプロセッサをもつコンピュータの処理により、ブロックがノードであり、依存関係がリンクであるグラフ状のモデルで表現される、複数の常微分方程式で記述される、連立方程式を解くプログラムであって、単一の常微分方程式を表現するグラフを、グラフの分割アルゴリズムを用いて複数のプロセッサをもつコンピュータの処理により解くプログラムにおいて、
前記コンピュータに、
前記モデルにおける内部状態をもつブロックおよび出力を持たないブロックから出発して、前記依存関係を逆に辿ることにより、前記内部状態をもつブロックおよび出力を持たないブロック毎に、互いに重複を含んでいてもよい、他と独立に実行可能な前記ブロックの集合を初期セグメントとして抽出するステップと、
前記生成された初期セグメントsにおいて、s内部の並列性に基づいて該初期セグメントsの中の一部のブロックの集合を選択するステップと、
前記初期セグメントsにおいて、前記選択されたブロックの集合を処理対象から外すことで、子ブロックをもたなくなったブロックから出発して、前記依存関係を逆に辿ることにより、前記子ブロックをもたなくなったブロック毎に、互いに重複を含んでいてもよい、他と独立に実行可能な前記ブロックの集合であるセグメントを抽出するステップと、
前記抽出されたセグメント及び、前記初期セグメントの中でその内部のブロックが処理対象から外されなかったものを上流セグメントとし、前記選択され処理対象から外されたブロックの集合を下流セグメントとし、上流セグメント同士、下流セグメント同士を、重複を減らすようにマージし、前記上流セグメントおよび下流セグメントが所定並列実行数以下になるようにするマージ・ステップと、
前記マージされた結果のセグメントの各々をコンパイルして実行可能コードに変換するステップと、
前記セグメント毎の実行可能コードを、前記複数のプロセッサに個別に割り当てて並列に実行させるステップを実行させる、
プログラム。
【請求項８】
前記初期セグメントを生成するステップが、内部状態をもつブロックへの入力など、１タイムステップ内ではないものとしてよい依存関係を介した親ブロックは含まないようにして、親ブロックを辿りつつ、ブロックをセグメントに追加するステップを有する、請求項７に記載のプログラム。
【請求項９】
前記初期セグメントsの中の一部のブロックの集合を選択するステップが、
ノードのgainが所定の値より大きいことで、前記ブロックの集合を選択するステップを有する、
請求項７に記載のプログラム。
【請求項１０】
前記マージするステップが、bin packing問題を繰り返し解くステップを含む、、請求項７に記載のプログラム。
【請求項１１】
前記内部状態をもつブロックが、積分計算のブロック、またはユーザー定義のブロックである、請求項７に記載のプログラム。
【請求項１２】
前記複数のプロセッサをもつコンピュータが、マルチコアのプロセッサを含む、請求項７に記載のプログラム。
【請求項１３】
複数のプロセッサをもつコンピュータの処理により、ブロックがノードであり、依存関係がリンクであるグラフ状のモデルで表現される、複数の常微分方程式で記述される、連立方程式を解くシステムであって、単一の常微分方程式を表現するグラフを、グラフの分割アルゴリズムを用いて複数のプロセッサをもつコンピュータの処理により解くシステムにおいて、
記憶手段と、
前記記憶手段に保存された、前記モデルのファイルと、
前記モデルにおける内部状態をもつブロックおよび出力を持たないブロックから出発して、前記依存関係を逆に辿ることにより、前記内部状態をもつブロックおよび出力を持たないブロック毎に、互いに重複を含んでいてもよい、他と独立に実行可能な前記ブロックの集合を初期セグメントとして抽出する手段と、
前記生成された初期セグメントsにおいて、s内部の並列性に基づいて該初期セグメントsの中の一部のブロックの集合を選択する手段と、
前記初期セグメントsにおいて、前記選択されたブロックの集合を処理対象から外すことで、子ブロックをもたなくなったブロックから出発して、前記依存関係を逆に辿ることにより、前記子ブロックをもたなくなったブロック毎に、互いに重複を含んでいてもよい、他と独立に実行可能な前記ブロックの集合であるセグメントを抽出する手段と、
前記抽出されたセグメント及び、前記初期セグメントの中でその内部のブロックが処理対象から外されなかったものを上流セグメントとし、前記選択され処理対象から外されたブロックの集合を下流セグメントとし、上流セグメント同士、下流セグメント同士を、重複を減らすようにマージし、前記上流セグメントおよび下流セグメントが所定並列実行数以下になるようにするマージ手段と、
前記マージされた結果のセグメントの各々をコンパイルして実行可能コードに変換する手段と、
前記セグメント毎の実行可能コードを、前記複数のプロセッサに個別に割り当てて並列に実行させる手段を有する、
システム。
【請求項１４】
前記初期セグメントを生成する手段が、内部状態をもつブロックへの入力など、１タイムステップ内ではないものとしてよい依存関係を介した親ブロックは含まないようにして、親ブロックを辿りつつ、ブロックをセグメントに追加するステップを行なう、請求項１３に記載のシステム。
【請求項１５】
前記初期セグメントsの中の一部のブロックの集合を選択する手段が、
ノードのgainが所定の値より大きいことで、前記ブロックの集合を選択する手段を有する、
請求項１３に記載のシステム。
【請求項１６】
前記マージするステップが、bin packing問題を繰り返し解くステップを含む、請求項７に記載のシステム。
【請求項１７】
前記内部状態をもつブロックが、積分計算のブロック、またはユーザー定義のブロックである、請求項１３に記載のシステム。
【請求項１８】
前記複数のプロセッサをもつコンピュータが、マルチコアのプロセッサを含む、請求項１３に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、シミュレーション・システムにおいて、プログラムの実行を並列化により高速化する技法に関する。
【背景技術】
【０００２】
近年、科学技術計算、シミュレーションなどの分野で、複数のプロセッサをもつ、いわゆるマルチプロセッサ・システムが使用されている。そのようなシステムでは、アプリケーション・プログラムは、複数のプロセスを生成して、個別のプロセッサに、プロセスを割り当てて並列に実行させる。
【０００３】
最近になって特に盛んに開発されるようになってきたシミュレーションの分野として、ロボット、自動車、飛行機などのメトカトロニクスのプラントのシミュレーション用ソフトウェアがある。電子部品とソフトウェア技術に発展の恩恵により、ロボット、自動車、飛行機などでは、神経のように張り巡らされたワイヤ結線や無線ＬＡＮなどを利用して、大部分の制御が電子的に行われる。
【０００４】
それらは、本来的には機械的装置であるのに、大量の制御ソフトウェアをも内蔵している。そのため、製品の開発に当たっては、制御プログラムの開発とそのテストに、長い時間と、膨大な費用と、多数の人員を費やす必要が出てきた。
【０００５】
このようなテストにために従来行われている技法として、ＨＩＬＳ(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は、その内部状態をもたない機能ブロックの使用ブロックと呼び、内部状態をもつ機能ブロックＡの出力が、内部状態をもたない機能ブロックの入力として計算に使用されるとき、機能ブロックＡは、その内部状態をもたない機能ブロックの定義ブロックと呼び、各機能ブロックをノードとして訪問することにより、内部状態をもつ機能ブロックと、内部状態をもたない機能ブロックとの接続関係に基づき、機能ブロック毎に、使用ブロック集合／定義ブロック集合の数を求め、その数に基づき、ストランドを割り当て、これにより、ブロック線図を、ストランドに分けて処理を並列化することを開示する。
【００１４】
一方、ブロック線図によって記述されるモデルは、これを数値的に解く技法の観点では、エクスプリシットな連立常微分方程式の状態空間形式での表現（ordinary differential equations / state space form = ODE/SSF）と見立てることもできる。その観点では、笠原 博徳、藤井 稔久、本多 弘樹、成田 誠之助、"スタティック・マルチプロセッサ・スケジューリング・アルゴリズムを用いた常微分方程式求解の並列処理"情報処理学会論文誌 28(10), 1060-1070, 1987-10-15は、エクスプリシットな常微分方程式求解のための並列処理手法に関し、タスク生成、タスクのプロセッサ上への最適スケジューリング、スケジューリング結果を用いたマシンコードの生成などからなり、様々な粒度に対応可能な常微分方程式求解の並列処理技法を開示する。
【００１５】
これらの従来技術では、ブロック線図で記述された処理を十分に並列化することができなかった。そこで、本出願人の発明者らは先に、特願２０１２−２６１４５号明細書において、モデルを記述するブロック線図を構成する機能ブロックのうちの、内部状態をもつブロックおよび出力を持たないブロックに着目し、内部状態をもつブロックおよび出力を持たないブロックからグラフを依存関係の逆方向に辿り、各内部状態をもつブロックおよび出力を持たないブロックへの入力の算出に必要なブロックの集合からなるセグメントを抽出し、この際、セグメント間で、ブロックの重複を許し、次に、各セグメントを、重複を減らすようにマージし、セグメント数を並列実行の数まで減らす発明を提案した。
【００１６】
特願２０１２−２６１４５号明細書に記述されている技法は、複数の方程式が連立するODE/SSF  x' = f(x,t) (ｘは状態変数のベクトルを表し、x'はその各要素の微係数を要素とするベクトルであり、fはxの要素数と同じ数の式を表す)における各右辺の計算に該当するブロックの集合をセグメントと呼び、セグメント間の並列性を抽出することにより処理の高速化を達成できたが、最大の計算時間を要するセグメントが最終的な計算時間を決定することになり、適用するモデルによっては効果が限定的になることがあった。
【先行技術文献】
【特許文献】
【００１７】
【特許文献１】特開平４−２１１８５８号公報
【特許文献２】特開平８−４４５７７号公報
【特許文献３】特開２０１１−９６１０７号公報
【特許文献４】特願２０１２−２６１４５号明細書
【非特許文献】
【００１８】
【非特許文献１】笠原 博徳、藤井 稔久、本多 弘樹、成田 誠之助、"スタティック・マルチプロセッサ・スケジューリング・アルゴリズムを用いた常微分方程式求解の並列処理"  情報処理学会論文誌 28(10), 1060-1070, 1987-10-15
【発明の概要】
【発明が解決しようとする課題】
【００１９】
従って、この発明の目的は、分割されたセグメント内部の並列性をさらに抽出して、上記従来技術のボトルネックを解消して、更なる処理の高速化を達成することにある。
【課題を解決するための手段】
【００２０】
本発明に従うシステムは先ず、モデルが本質的に表現している常微分方程式の状態空間形式ODE/SSFの性質を利用して、１ステップ内で通信の発生しない並列実行単位を抽出する。
【００２１】
このために、本発明に従うシステムは、モデルを記述するブロック線図を構成するブロックのうちの、内部状態をもつブロックおよび出力を持たないブロックに着目し、内部状態をもつブロックへの入力を計算するブロック及び出力を持たないブロックからグラフを依存関係の逆方向に辿り、各内部状態をもつブロックへの入力および出力を持たないブロックの計算に必要なブロックの集合からなるセグメントを抽出する。この際、セグメント間で、ブロックの重複を許すものとする。
【００２２】
そこで抽出されたセグメントを更に細かい、他と独立に実行可能な、重複を許すセグメントに分割したいのだが、セグメントはどのように分割しても、当該セグメント内の別の部分との依存関係が残り、互いに独立な部分に分割することはできない。そこで、本発明に従うシステムは、当該セグメント内の一部のブロック（ノード）を一時的に除去したセグメントを互いに独立な部分に分割する。そのために、当該セグメント内の並列性に基づいて一時的に除去するノードの集合を特定する。
【００２３】
そして、本発明に従うシステムは、一部のノードを除去したことで子ノードのなくなったノードから上流に辿ることで、他と独立に実行できるセグメントを抽出し、これらのセグメントを上流のセグメント、一時的に除去されたノードの集合を下流のセグメントとして２つに分ける。
【００２４】
次に、本発明に従うシステムは、上流のセグメント同士、下流のセグメント同士を、セグメント間でのブロックの重複を減らすようにマージし、セグメント数を並列実行の数まで減らす。このとき、同じブロックを多くもつセグメント同士をマージすることで、セグメント間の重複が減る。尚ここで、並列実行の数とは典型的には、利用可能なコアまたはプロセッサの数である。
【００２５】
次に、本発明に従うシステムは、結果として得られたセグメントの各々をコンパイルし、得られた実行可能コードを各コアまたはプロセッサに割り当てて並列実行させる。
【発明の効果】
【００２６】
以上のように、この発明によれば、ブロック線図などのグラフ形式で記述されたプログラムを、バランスよく１ステップ内で通信が必要ない形でセグメント化し、さらにセグメントを再分割して並列性を抽出することで、複数のプロセッサに割り当てて並列実行させることにより、実行速度を向上することができるという効果が得られる。
【図面の簡単な説明】
【００２７】
【図１】本発明を実施するためのハードウェアのブロック図である。
【図２】本発明を実施するための機能構成のブロック図である。
【図３】本発明の入力となるブロック線図を説明するための図である。
【図４】本発明の処理がセグメントを抽出するために利用する概念を説明するための図である。
【図５】本発明処理の概要を説明するための図である。
【図６】セグメント抽出処理のフローチャートを示す図である。
【図７】セグメント抽出処理で呼び出されるサブルーチンの処理のフローチャートを示す図である。
【図８】セグメント再分割処理のフローチャートを示す図である。
【図９】上流・下流のセグメントをそれぞれ重複を減らすようにマージして、それぞれ並列実行の数まで減らして、ＣＰＵに割り当てる処理のフローチャートを示す図である。
【図１０】セグメントのマージ処理で呼ばれるmergeのフローチャートを示す図である。
【図１１】setbinpack1及びsetbinpack2で呼ばれるsetbinpackのフローチャートを示す図である。
【図１２】mergeで呼ばれるsetbinpack1のフローチャートを示す図である。
【図１３】mergeで呼ばれるsetbinpack2のフローチャートを示す図である。
【図１４】コンピュータにより、逐次処理により、常微分方程式を解く処理を説明する図である。
【図１５】コンピュータにより、並列化して、常微分方程式を解く処理を説明する図である。
【発明を実施するための形態】
【００２８】
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
【００２９】
先ず、図１を参照して、本発明を実施するために使用されるコンピュータのハードウェアについて説明する。図１において、ホスト・バス１０２には、複数のＣＰＵ１  １０４ａ、ＣＰＵ２  １０４ｂ、ＣＰＵ３  １０４ｃ、・・・ＣＰＵｎ  １０４ｎが接続されている。ホスト・バス１０２にはさらに、ＣＰＵ１  １０４ａ、ＣＰＵ２  １０４ｂ、ＣＰＵ３  １０４ｃ、・・・ＣＰＵｎ  １０４ｎの演算処理のためのメイン・メモリ１０６が接続されている。
【００３０】
一方、Ｉ／Ｏバス１０８には、キーボード１１０、マウス１１２、ディスプレイ１１４及びハードティスク・ドライブ１１６が接続されている。Ｉ／Ｏバス１０８は、Ｉ／Ｏブリッジ１１８を介して、ホスト・バス１０２に接続されている。キーボード１１０及びマウス１１２は、オペレータが、コマンドを打ち込んだり、メニューをクリックするなどして、操作するために使用される。ディスプレイ１１４は、必要に応じて、後述する本発明に係るプログラムをＧＵＩで操作するためのメニューを表示するために使用される。
【００３１】
この目的のために使用される好適なコンピュータ・システムのハードウェアとして、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘがある。その際、ＣＰＵ１  １０４ａ、ＣＰＵ２  １０４ｂ、ＣＰＵ３  １０４ｃ、・・・ＣＰＵｎ  １０４ｎは、例えば、インテル（Ｒ）Ｘｅｏｎ（Ｒ）であり、オペレーティング・システムは、Ｗｉｎｄｏｗｓ（商標）Ｓｅｒｖｅｒ  ２００３である。オペレーティング・システムは、ハードティスク・ドライブ１１６に格納され、コンピュータ・システムの起動時に、ハードティスク・ドライブ１１６からメイン・メモリ１０６に読み込まれる。
【００３２】
本発明を実施するためには、マルチプロセッサ・システムを用いることが必要である。ここでマルチプロセッサ・システムとは、一般に、独立に演算処理し得るプロセッサ機能を複数もつシステムを意図しており、従って、マルチコア・シングルプロセッサ・システム、シングルコア・マルチプロセッサ・システム、及びマルチコア・マルチプロセッサ・システムのどれかでよいことを理解されたい。
【００３３】
マルチコア・プロセッサとしては、好適には、インテル(R)Core(商標)2 Quadなどの、インテル(R)Core(商標)シリーズのプロセッサなどを使用することができる。
【００３４】
なお、本発明を実施するために使用可能なコンピュータ・システムのハードウェアは、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘに限定されず、本発明のシミュレーション・プログラムを走らせることができるものであれば、パーソナル・コンピュータを含む任意のコンピュータ・システムを使用することができる。オペレーティング・システムも、Ｗｉｎｄｏｗｓ（Ｒ）に限定されず、Ｌｉｎｕｘ（Ｒ）、Ｍａｃ  ＯＳ（Ｒ）など、任意のオペレーティング・システムを使用することができる。さらに、シミュレーション・プログラムを高速で動作させるために、ＰＯＷＥＲ（商標）６ベースで、オペレーティング・システムがＡＩＸ（商標）のＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｐなどのコンピュータ・システムを使用することもできる。
【００３５】
ハードティスク・ドライブ１１６にはさらに、図２に関連して後述するシミュレーション・モデリング・ツール２０２であるMATLAB(R)/Simulink(R)、メイン・ルーチン２０６、セグメント抽出ルーチン２０８、セグメント再分割ルーチン２１２、マージ処理ルーチン２１６、コード変換ルーチン２２０、Ｃコンパイラまたは、Ｃ＋＋コンパイラ２２４、などが格納されており、オペレータのキーボード１１０やマウス１１２などの操作に応答して、メイン・メモリ１０６にロードされて実行される。これらのツールやルーチンに関しては、図２に関連して後述する。メイン・ルーチン２０６、セグメント抽出ルーチン２０８、セグメント再分割ルーチン２１２、マージ処理ルーチン２１６等は、Java(R)、C、C++、C#などの既存のコンピュータ・プログラミングのコードとして書かれ、所定のコンパイラでコンパイルすることにより作成することができる。
【００３６】
尚、使用可能なシミュレーション・モデリング・ツール２０２は、MATLAB(R)/Simulink(R)に限定されず、オープンソースのScilab/Scicosなど任意のシミュレーション・モデリング・ツールを使用することが可能である。
【００３７】
あるいは、場合によっては、シミュレーション・モデリング・ツールを使わず、直接、Ｃ、Ｃ＋＋などでシミュレーション・システムのソース・コードを書くことも可能であり、その場合にも、個々の機能が、互いに依存関係にある個別の機能ブロックとして記述できるなら、本発明は適用可能である。
【００３８】
図２は、本発明の実施例に係る処理要素のブロック図である。図２において、オペレータがシミュレーション・モデリング・ツール２０２を操作することによって作成されたブロック線図のコード２０４は、ハードティスク・ドライブ１１６に保存される。ブロック線図のコード２０４は例えば、図３に示すように、機能をもつブロックをノードとし、ブロック間の依存関係をリンクとするグラフ形式で記述される。依存関係は、好適には、ＸＭＬなどの形式で記述される。
【００３９】
メイン・ルーチン２０６は、オペレータのキーボード１１０やマウス１１２などの操作を受け付けて、セグメント抽出ルーチン２０８、セグメント再分割ルーチン２１２、マージ処理ルーチン２１６、コード変換ルーチン２２０、コンパイラ２２４などを適宜呼び出し、全体の処理を統合する機能をもつ。
【００４０】
セグメント抽出ルーチン２０８は、ブロック線図のコード２０４において、内部状態をもつブロックおよび出力を持たないブロックに着目して、ブロック線図の機能ブロック群を、ブロックの重複を許容しつつ複数のセグメントに分割し、ファイル２１０としてハードティスク・ドライブ１１６に書き出す機能をもつ。セグメント抽出ルーチン２０８の処理については、図６及び図７のフローチャートを参照して、後で詳細に説明する。
【００４１】
セグメント再分割ルーチン２１２は、ファイル２１０からセグメントを読み取り、当該セグメント内の並列性に基づいて一時的に除去するノードの集合を特定する機能を有する。セグメント再分割ルーチン２１２はさらに、一部のノードを除去したことで子ノードのなくなったノードから上流に辿ることで、他と独立に実行できるセグメントを抽出し、これらのセグメントを上流のセグメント、無視されたノードの集合を下流のセグメントとして２つに分けて、分割されたセグメントをファイル２１４としてハードティスク・ドライブ１１６に書き出す。なお、セグメント再分割ルーチン２１２によって再分割されたセグメントと区別するために、セグメント抽出ルーチン２０８によって抽出されたセグメントを適宜、初期セグメントと呼び、セグメント再分割ルーチン２１２によって再分割されたセグメントを前記種別に応じて上流セグメントまたは下流セグメントと呼ぶ。セグメント再分割ルーチン２１２の処理については、図８のフローチャートを参照して、後で詳細に説明する。
【００４２】
マージ処理ルーチン２１６は、ブロックの重複を減らしつつ、上流セグメントおよび下流セグメントをそれぞれマージしたセグメントを生成してファイル２１８としてハードティスク・ドライブ１１６に書き出す機能をもつ。マージ処理ルーチン２１６の処理については、図９乃至図１３のフローチャートを参照して、後で詳細に説明する。
【００４３】
コード変換ルーチン２２０は、ブロック線図で記述されたコードを例えばＣ言語のソースコードに変換する機能をもつ。セグメント毎に変換されたソースコード２２２は、好適にはハードティスク・ドライブ１１６にに書き出される。コード変換ルーチン２２０として、これには限定されないが、好適には、MathWorks社から入手可能なRealtime Workshopを使用することができる。
【００４４】
コンパイラ２２４は、セグメント毎にソースコード２１８をコンパイルして、実行可能コード２２２を生成して、好適にはハードティスク・ドライブ１１６に書き出す。コンパイラ２２４としては、ＣＰＵ１、ＣＰＵ２・・・ＣＰＵｎに適合するコードを生成する任意のコンパイラを使用することができる。
【００４５】
実行環境２２６は、セグメント毎の実行可能コード２２２を、ＣＰＵ１、ＣＰＵ２、・・・、ＣＰＵｎに個別に割り当てて並列実行させる機能をもつ。
【００４６】
図３は本発明の入力となるブロック線図の一例を示す。本発明が対象とするブロック線図は、シミュレーションの1タイムステップ分の処理を表しており、これが所定回繰り返されることによりシミュレーションの対象となるシステムの時系列における振る舞いを得ることができる。
【００４７】
より具体的には、以下の二つの処理が１タイムステップ分の処理となる（ソルバによってはこれを複数回繰り返したものが１タイムステップ分の処理となるが、基本的な処理手順は変わらず、本発明の適用を妨げるものではない）。
【００４８】
１）以下のルールに従ってすべてのブロックの出力を計算する。
a）内部状態を持つブロックは当該ブロックへの入力を必要とせず、自身が持つ内部状態からその出力を計算できるため、任意のタイミングで出力を計算してよい。図３におけるブロック３０２、ブロック３０４が内部状態を持つブロックであるとすると、これらのブロックから出力計算を開始することができる。
b）内部状態を持たないブロックは、自身への入力を元に出力を計算するため、上流のブロックの出力として自身への入力が計算された後に当該ブロックの出力を計算する。図３におけるブロック３０２、ブロック３０４以外のブロックは、入力が計算された後、初めて出力を計算することができる。ただし、入力を持たないブロックの場合には、そのブロックから出力計算を開始することができる。
【００４９】
２）前記処理により、内部状態を持つブロックへの入力値（図３においてはブロック３０６およびブロック３０２の出力）が計算されているので、これを使って内部状態を次のタイムステップにおけるものに更新する。
【００５０】
ここで、内部状態を持つブロックへの入力は、１タイムステップ分のブロックの出力を計算する段階においては存在しないものとみなしてよく、これをnon-direct feedthrough(ＮＤＦ)入力と呼ぶ。図３においてはブロック３０２および３０４の入力を指し、これはそれぞれブロック３０６の出力、ブロック３０２の出力である。
因みに、Simulink(R)において、ＮＤＦを持つ可能性があるブロックの例として、これには限定されないが、次のものがある。
Integrator:  積分計算のブロック
DiscreteFilter：無限インパルス応答(IIR)フィルタと有限インパルス応答(FIR)フィルタを実現するブロック
TransferFunction：伝達関数を表すブロック（ＮＤＦはdx/dtに該当）
S-function： ユーザが機能を自由に定義できるブロック
RateTransition  ：  サンプルタイムが変化することを表すブロック
【００５１】
このように表現されたブロック線図は、好適には図４の右に示すような常微分方程式の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)は、後の説明の便宜のため、NDF入力を取り除いたブロック線図のグラフ構造を示しており、通常NDF入力を取り除くとグラフ構造はDirected Acyclic Graph (DAG)となる。このグラフ構造が本発明の処理の入力となる。
【００６０】
ここで、セグメント抽出ルーチン２０８の処理により、子ノードを持たないブロック（すなわち、図５(a）においては５０２、５０４、５０６に相当し、以後シンクブロックと呼ぶ）からグラフを依存関係の逆方向に、すなわちリンクの矢印の逆方向に辿り、各シンクブロックの計算に必要なブロックの集合からなる（他のセグメントとの重複を許す）セグメントを抽出する。この処理の詳細は、図６及び図７のフローチャートを参照してより詳細に説明する。
【００６１】
このようなセグメント化の結果、図５(b)に示すように、ブロック５０２に対応するセグメント５０８、ブロック５０４に対応するセグメント５１０、ブロック５０６に対応するセグメント５１２などが得られる。図５(b)からは、例えばセグメント５０８とセグメント５１０の間でいくつかのブロックが重複していることが見て取れる。このような重複の存在により、各セグメントは他のセグメントとは独立して、すなわち並列に計算が可能となる。ただし、ブロック数が4000程度の実践的なブロック線図では、この段階におけるセグメント数は400〜1000程度と非常に多くなる傾向があり、通常のハードウェアではこのままではプロセッサに個別にセグメントを割り当てて並列実行させることはできない。また仮にここで洗い出されたセグメントの数に比べてかなり少ないプロセッサで各々のセグメントを適宜（つまり任意のセグメントをプロセッサ数分並列に実行し、一つのセグメントを処理し終わったプロセッサが次のセグメントを処理するという形で）並列に実行したとしても、重複が多すぎて、全てのブロックを直列に処理するよりも処理時間が増大してしまう場合もある。そのため、特願２０１２−２６１４５号明細書に記述されている技法では、セグメント間の重複を減らすように（究極的には各セグメントに含まれるブロックの計算に要する時間の最大値が小さくなるように）セグメントの数が利用可能なコアまたはプロセッサの数以下になるまでセグメントをマージして、マージ後のセグメントを個々のプロセッサに割り付けて並列に実行する。しかし、この方法では初期セグメントの内部の並列性は活用されず、最も処理時間を要する初期セグメントが全体のボトルネックとなり、効果が限定的となることがあった。
【００６２】
そこで、セグメント抽出ルーチン２０８の処理により抽出した初期セグメントを、セグメント再分割ルーチン２１２によって、初期セグメント内部の並列性に基づき、互いに独立に実行可能なより細かいブロックの集合（セグメント）に分割することで上記のボトルネックを解消する。ただし、初期セグメントはどのように分割しても初期セグメント内の別の部分との依存関係が残り、完全に互いに独立な部分に分割することはできない。そこで、初期セグメント内の一部のブロックを一時的に除去し、残ったブロックの集合から独立部分を取り出すことを考える。図５（c）に示すように、初期セグメント５０８からブロックの集合５１４を、初期セグメント５１０からブロックの集合５１６を一時的に除去すると、いくつかのブロックが新たにシンクブロックとなる。これらのブロックから依存関係を逆方向に辿ることで、新たにできた各々のシンクブロックの計算に必要なブロックの集合からなるセグメントを抽出する。これらセグメントは互いに一部重複を許すことで互いに独立に、すなわち並列に実行することができる。図５（d）におけるセグメント５１８および５２０は初期セグメント５０８からブロックの集合５１４を一時的に除去することでできたシンクブロックから辿られたセグメントを示している。
【００６３】
ここで新たに抽出されたセグメント及び、再分割されなかった（すなわちその内部からブロックが除去されなかった）初期セグメントを上流セグメント、個々の初期セグメントにおいて一時的に除去されたブロックの集合を下流セグメントと呼ぶことにする。上流セグメント同士、下流セグメント同士はそれぞれ互いに独立、すなわち並列に実行可能なため、各々セグメント間の重複を減らすように（究極的には各セグメントに含まれるブロックの計算に要する時間の最大値が小さくなるように）セグメントの数が利用可能なコアまたはプロセッサの数以下になるまでマージして、マージ後のセグメントを個々のプロセッサに割り付ける。図５（e）はこの様子を示している。この処理の詳細は、図８のフローチャートを参照してより詳細に説明する。
【００６４】
図５(e)の段階で各々のプロセッサに割り当てられたセグメントが、コード変換ルーチン２１６によってソースコードに変換され、コンパイラ２２０によって実行可能コードに変換され、実行環境２２４によって、個別のコアまたはプロセッサに割り当てられて実行される。
【００６５】
次に、図６以下のフローチャートを参照してセグメント抽出ルーチン２０８の処理を説明する前に、以下で使用する記号の定義を与えておく。
グラフG := (V,E)  ここで、Vはノード（ブロック）の集合で、Eはエッジ（リンク）の集合である。
P(v) := {u ∈ V:(u,v) ∈ E}    （ノード v の親ノードの集合）
C(v) := {u ∈ V:(v,u) ∈ E}    （ノード v の子ノードの集合）
|W| := 集合Wの要素の数
path(u,w) := {u,v1,v2,...,vn-1,vn,w ∈ V:
(u,v1),(v1,v2),...,(vn-1,vn),(vn,w) ∈ E}
【数１】
2014035548.tif 000003
T(v) := A(v) ∪ {v}
R(v,s) := (D(v) ∪ {v}) ∩ s where s ⊆ V
||v|| := ノードv ∈ Vの計算時間
【数２】
2014035548.tif 000004
rは、0 < r < 1を満たす実数である。
図６及び図７は、セグメント抽出ルーチン２０８の処理のフローチャートを示す図である。
【００６６】
図６のステップ６０２において、セグメント抽出ルーチン２０８は、Sini := segments(V)を呼び出してSiniに初期セグメントの集合を得、Siniに含まれる各初期セグメントをファイル２１０としてハードディスク・ドライブ１１６に書き出して処理を終わる。ここでVは全ノードの集合である。
【００６７】
図７は、図６で呼び出されるサブルーチンsegments(W)の処理のフローチャートを示す図である。
【００６８】
サブルーチンsegments(W)は、ステップ７０２で、S:= Φとして空のセグメント集合を準備し、Wから子ノードを持たないノードを集め、これらノードの集合をL'とする。すなわち L' は以下のように定義される。
L' := {v ∈ W: |C(v)| = 0}
【００６９】
ステップ７０４では、サブルーチンsegments(W)は、L'が空集合かどうか判断し、もしそうでないなら、ステップ７０６で、一つのノードv ∈ L'を選択し、ステップ７０８で、選択されたノードvとその祖先ノードの集合であるT(v)を抽出し、これをSの要素として加える。ここでSはノードの集合の集合であり、Sの要素はノードの集合（セグメント）であることに注意されたい。その後ステップ７１０で、L' := L' - {v}としてL'からvを除去してステップ７０４で再びL'が空集合かどうか判断する。このような繰り返しで、ついにL'が空集合になると、segments(W)は処理結果としてSを出力して処理を終了し、呼び出し元に戻る。
【００７０】
図８は、セグメント再分割ルーチン２１２において、初期セグメントを再分割して、より細かな上流セグメントと下流セグメントに分ける処理のフローチャートを示す図である。
【００７１】
図８において、ステップ８０２では、セグメント再分割ルーチン２１２は、ファイル２１０から、初期セグメントの集合を、Siniに読み込み、その最大の計算時間をaとする。すなわち、aは以下のように定義される。
【数３】
2014035548.tif 000005
また、初期セグメント内の並列性に基づいて初期セグメントを再分割するための各種変数の初期値を下記のとおりセットする。
V' := V (全ノードの集合)
r := 事前に定義される実数 0 < r < 1
X := Φ (空の基点ノード集合)
【００７２】
次にステップ８０４で、セグメント再分割ルーチン２１２は、V’ = Φかどうか判断し、そうでなければステップ８０６でV’からノードvを選択する。
【００７３】
次にステップ８０８で、セグメント再分割ルーチン２１２は、ノードvのgain g(v)を以下のように計算する。
【数４】
2014035548.tif 000006
このgainの値は、ノードvから依存関係の逆方向に辿って得られるセグメントの計算時間と、vの親ノードから依存関係の逆方向に辿って得られるセグメントの最大計算時間の差であり、この値が大きいほどノードvによって一つのセグメントになってしまうことにより失われる並列性が大きい、逆に言えばvを取り除いて得られる並列性が大きいことを意味する。
【００７４】
次にステップ８１０で、セグメント再分割ルーチン２１２は、g(v)>a・rであるかどうか判断し、もしそうならステップ８１２で、X:=X ∪ {v}としてノードvを基点ノード集合Xに加え、ステップ８１４でV’: = V’- {v}としてV’からノードvを削除してステップ８０４に戻る。もしステップ８１０で、g(v) > a・rでないと判断したなら、直ちにステップ８１４でV’: = V’- {v}としてV’からノードvを削除してステップ８０４に戻り、そこでV’= Φであると判断したなら、ステップ８１６に進み初期セグメント集合のコピーS'iniをS'ini := Siniとして用意し、各セグメントから一時的に除去するノードの集合を格納するための空の集合Sdownおよび再分割されたセグメントを格納する集合Supをそれぞれ用意する。
Sdown := Φ
Sup := Φ
【００７５】
次にセグメント再分割ルーチン２１２は、ステップ８１８でS'ini = Φかどうか判断し、そうでないなら、ステップ８２０でS'iniから初期セグメントsを選択し、ステップ８２２で、このsの中で、前記選別された基点ノードx （∈ X）およびその子孫ノードからなるノードの集合を一時的に除去するノードの集合として抽出し、これをSdownに記録する。この処理は以下のように記述することができる。
【数５】
2014035548.tif 000007
その後、ステップ８２４において、sからR'を除去したノードの集合W'を用意し、ステップ８２６において前記segments(W')を呼び出すことで、W'から上流セグメントを抽出し、Sup := Sup ∪ segments(W')として得られたセグメントを全てSupに加える。ちなみに、sがX中のノードを含まない（すなわちX ∩ s = Φである）場合には、sがそのままSupの要素として追加されることになる。
【００７６】
この後、ステップ８２８でS'ini = S'ini - {s} として S'iniから初期セグメントsを削除し、ステップ８１８に戻る。
この繰り返しにより全ての初期セグメントに対して上記処理が完了するとS'ini は空集合となる。ステップ８１８でS'ini = Φと判断すると、セグメント再分割ルーチン２１２は、上流セグメントの集合Supおよび下流セグメントの集合Sdownをファイル２１４としてハードディスク・ドライブ１１６に書き出して処理を終わる。
【００７７】
次に、図９乃至図１３のフローチャートを参照して、マージ処理ルーチン２１６の処理を説明する。図９は、マージ処理ルーチン２１６のメイン処理のフローチャートを示す図であり、図１０は、メイン処理で呼び出されるmerge処理のフローチャートを示す図であり、図１２は、merge処理で呼び出されるsetbinpack1処理のフローチャートを示す図であり、図１３は、merge処理で呼び出されるsetbinpack2処理のフローチャートを示す図であり、図１１は、setbinpack1とsetbinpack2で呼び出されるsetbinpack処理のフローチャートを示す図である。
【００７８】
図９のステップ９０２において、マージ処理ルーチン２１６は、ファイル２１４から、上流セグメントの集合をSupに、下流セグメントの集合をSdownに読み込み、図１０のmergeルーチンを呼び出して、下記のように、S'up、S'down、Sfinalをセットする。
S'up = merge(p,Sup,V)
S'down = merge(p,Sdown,V)
Sfinal = Φ
ここで、pは並列数であり、Vは全ノードの集合である。後述のように、mergeルーチンは第二引数に与えられたセグメント集合に含まれるセグメントをp個以下のセグメントにマージし、その結果を返す。
【００７９】
ステップ９０４において、マージ処理ルーチン２１６は、S'up = Φかどうか判断し、そうならステップ９０６でsup := Φとセットし、そうでないなら、ステップ９０８で、最大セグメントsupを取り出す。すなわち、取り出されたsupは次の条件を満たす。
sup ∈ S'up, ||sup|| ≧ ||-t||, ∀t ∈ S'up
【００８０】
ステップ９０６またはステップ９０８の後、マージ処理ルーチン２１６はステップ９１０でS'down = Φかどうか判断し、もしそうならステップ９１４でsdown := Φとセットし、そうでないなら、ステップ９１２で、下記の式の処理により、supとの通信コストと自身の処理時間の和が最大となるセグメントsdownを、S'downから選択する。
【数６】
2014035548.tif 000008
但しここで、||(u,v)||は、(u,v)の通信コストであり、
【数７】
2014035548.tif 000009
である。
【００８１】
ステップ９１２またはステップ９１４の後は、マージ処理ルーチン２１６は、ステップ９１６で、supがΦ且つ、sdownがΦであるかどうか判断し、もしそうなら、各要素が個別のCPUに割り当てられる最終的なセグメントであるセグメントの集合Sfinalをファイル２１８としてハードディスク・ドライブ１１６に書き出して処理を終了する。
【００８２】
ステップ９１６で、supと、sdownの少なくともどちらか一方がΦでないと判断すると、マージ処理ルーチン２１６は、ステップ９１８で、
sf := sup ∪ sdownとしてsupとsdownの和集合sfを新たに作り、Sfinal := Sfinal ∪ {sf}として、Sfinalにsfを加える。
【００８３】
次にマージ処理ルーチン２１６は、ステップ９２０で、S'down := S'down - {sdown}として、S'downからセグメントsdownを削除し、ステップ１２２２で、S'up := S'up - {sup}として、S'upからセグメントsupを削除してステップ９０４に戻る。
【００８４】
次に、図９の９０２において使用されているmergeの処理について説明する。このmerge処理は、複数のセグメントをマージすることでセグメントの数を所定の数にまで減じる処理である。このとき、マージ後の各セグメントに必要な計算時間がなるべくバランスする（つまり最大計算時間が最小化する）ように、マージするセグメントの組み合わせを決定し、その組み合わせに従って与えられたセグメントをマージする。ここではセグメントの組み合わせを決定するために、Bin Packing問題を繰り返し解く。Bin Packing問題とは、与えられたアイテムを全て詰め込むのに必要となる箱の最小数を算出する問題である。各アイテムはサイズを持ち、各箱には容量が与えられていて、箱に詰め込まれるアイテムのサイズの合計は箱の容量以下でなければならない。ここでは与えられる各セグメントをアイテム、セグメントの計算時間をアイテムのサイズ、各セグメント（に含まれるブロック）を実行するプロセッサ（またはプロセッサコア）を箱と見立て、箱に適当な容量を設定したときに必要となる箱の数、すなわちプロセッサの数をBin Packing問題の解法（ここではFirst Fit Decreasing と呼ばれる既知の解法）を用いて繰り返し算出し、必要な箱の数が並列数以下となる最小の箱の容量を探索する。得られた箱の容量においてBin Packing問題を解いて、一つの箱に入った全てのセグメントを一つにマージする。ただし、通常のBin Packing問題においては、一つの箱に詰め込まれたアイテムのサイズの合計が箱の容量以下であることが要求されるが、各セグメントは重複したブロックを含んでいるため、ここではセグメントの計算時間の合計ではなく、一つの箱に含まれるセグメントの和集合（このとき、セグメントはブロックの集合であるので、この和集合はブロックの集合すなわち再度セグメントとなる）の計算時間が箱の容量以下であることを制約条件とする。このような制約条件を持つ特殊なBin Packing問題をここではSet Bin Packing問題と呼ぶことにする。
【００８５】
図１０のフローチャートを参照して、merge処理の具体的詳細について説明する。以下では、ブロックの計算時間は整数で与えられるものとし、アイテムサイズおよび箱の容量も整数で与えられるものとする。ただし、これにより一般性を失うことはない。mergeは、p(並列数)、S(セグメントの集合)、V(全ノードの集合)という３つの引数をとる。
【００８６】
mergeは、ステップ１００２で、下記のようにして箱の容量の上限（vup）、下限（vlow）およびそれに対応する必要な箱の数nup,nlowをそれぞれ以下のように設定する。
【数８】
2014035548.tif 000010
このsetbinpack1の処理の詳細は、図１１及び図１２のフローチャートを参照して後で説明するが、setbinpack1は箱の容量が第一引数に与えられる値であったときに、第二引数で与えられたセグメントを全て詰め込むのに必要ななるべく少ない箱の数を返すものである。
【００８７】
次にmergeは、ステップ１００４で、下記の式により、全てのセグメントを詰め込むのに必要となる箱の数がpとなる箱の容量(vnext)を予測する。
a := (nup - nlow)/(vup - vlow)
b := nlow - a・vlow
vnext := (p - b)/a
【００８８】
次にmergeは、ステップ１０２０で、nlow > p且つ(vup - vlow) > 1かどうか判断し、もしそうならステップ１００６に進み、そうでないなら、ステップ１０２２でnlow ≦ pか判断する。
【００８９】
ステップ１０２２での判断が肯定的ならステップ１０２４でvup := vlowとしてからステップ１０２６に進み、そうでないなら直接、ステップ１０２６に進む。
【００９０】
ステップ１０２６に来た段階で、全てのセグメントをp個以下の箱で納められるような最小の箱の容量(vup)が得られているので、vupを箱の容量としてset bin packing問題を解いてマージするセグメントの組を決定し、実際にマージを行う。この処理はS' := setbinpack2(vup,S)として図１３に示す処理を呼び出すことで実行される。
【００９１】
この結果、マージされたセグメント集合S'が得られる。
【００９２】
ステップ１０２０に戻って、そこでの判断が肯定的であると、mergeは、ステップ１００６で、set bin packing手法を用い、箱の容量がvnextであるときに、全てのセグメント(∈ S)を収めるのに必要な、なるべく小さな箱の数(n)を下記の式で示す処理により、計算する。
n := setbinpack1(vnext,S)
【００９３】
次にmergeは、ステップ１００８で、n ≦ pかどうか判断し、もしそうなら、ステップ１０１０で、vup := vnext, nup := nとして箱の容量の上限及びそれに対応する箱の数を更新し、そうでないなら、ステップ１０１２で、vlow := vnext, nlow = nで箱の容量の下限及びそれに対応する箱の数を更新する。
【００９４】
次にmergeは、ステップ１０１４で、nup = pかどうか判断し、もしそうなら、ステップ１０１６で、vnext := (vlow + vup)/2として、セグメントをp個の箱に詰め込むために必要ななるべく小さな箱の容量(vnext)を二分探索で予測し、そうでないなら、ステップ１０１８で、下記の式により、セグメントをp個の箱に収めるのに必要ななるべく小さな箱の容量（vnext）を予測する。
a := (nup - nlow)/(vup - vlow)
b := nlow - a・vlow
vnext := (p - b)/a
【００９５】
次にmergeは、ステップ１０２０での判断に戻る。
【００９６】
次に、図１１のフローチャートを参照して、setbinpackの処理を説明する。この処理は Bin Packing 問題の一般的な解法であるFirst Fit Decreasing手法をアイテムが集合であるケースに拡張したアルゴリズムである。setbinpackは、v(箱の容量)と、S(セグメントの集合)を引数とする。
【００９７】
図１１において、ステップ１１０２で、setbinpackは、S' := S, B := Φ(箱の集合)としてSのコピーおよび空の箱の集合を用意する。ここで、一つの箱は一つのセグメントに対応することに注意されたい。
【００９８】
setbinpackは、ステップ１１０４で、S' = Φかどうか判断し、そうでないなら、ステップ１１０６で、S'から計算時間最大となるセグメントsを取り出す。すなわち、sは以下の条件を満たす。
s ∈ S', ||s|| ≧ ||t||, ∀t∈ S'
そしてステップ１１０８から１１１０、１１１４、１１１６の一連の処理で、最初にsが入る箱の番号i を 1から順に探す。そのためステップ１１０８ではまずi:= 1として  iに1をセットする。
【００９９】
setbinpackは、ステップ１１１０で、i ≦ |B|かどうか判断し、そうでないなら、、sが入りきる箱が見つからなかったと判断し、ステップ１１１２で、bi := s, B := B ∪ {bi}として、s自身を新たに箱としてBに追加する。ステップ１１２０に進み、そこで、S' := S' - {s}としてS'からセグメントsを削除し、ステップ１１０４での判断に戻る。
【０１００】
ステップ１１１０に戻って、i ≦ |B|であると判断したなら、setbinpackは、sが入る最初の箱の探索を続ける。ステップ１１１４で、||bi ∪ s|| ≦ v （bi ∈ B）かどうか、すなわち、s を i 番目の箱 biに入れたとき、箱の容量vをオーバーしないかを判断し、そうでない（オーバーする）ならステップ１１１６でiを1増やして、ステップ１１１０に戻る。
【０１０１】
ステップ１１１４で、setbinpackが||bi ∪ s|| ≦ v,（bi ∈ B）である、すなわちsをi番目の箱bi に容量をオーバーさせずに入れることができると判断すると、ステップ１１１８で、bi := bi ∪ sとしてs（の全ての要素）をbiに入れる。そしてステップ１１２０でS' := S' - {s}としてS'からセグメントsを削除し、ステップ１１０４での判断に戻る。
【０１０２】
見て取れるように、ステップ１１０６からステップ１１２０を経由してステップ１１０４に戻るうちに、ステップ１１２０でSから順次セグメントsが削除されるので、どこかの段階でステップ１１０４においてS' = Φとなって、処理が終了し、Sの要素を容量vの箱に詰めるのに必要な箱の数n、Sのセグメントを容量vの箱につめた結果得られたマージされたセグメントの集合Bが返される。
【０１０３】
図１２は、setbinpack1(v,S)を示す図である。ステップ１２０２で示すように、setbinpack1(v,S)は、setbinpack(v,S)を呼び出して、nを返す。
【０１０４】
図１３は、setbinpack2(v,S)を示す図である。ステップ１３０２で示すように、setbinpack2(v,S)は、setbinpack(v,S)を呼び出して、Bを返す。
【０１０５】
図９に戻って、このフローチャートで示す処理によって出力されたSfinalは、図２におけるマージされたセグメント２１８として書かれ、マージされたセグメント２１８はコード変換モジュール２２０によって、Ｃなどのプログラミング言語のソースコード２２２に変換され、コンパイラ２２４によって実行可能コード２２６に変換され、実行環境２２８で、複数のＣＰＵに割り当てられて並列実行される。
【０１０６】
次に図１４に、コンピュータによる、一般的な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)を例にとって説明したが、これに限らず、任意のモデリング・ツールに適用可能であることを理解されたい。
【符号の説明】
【０１１２】
１０２  ホスト・バス
１０４ａ、１０４ｂ、・・・１０４ｎ  ＣＰＵ
１０６  メイン・メモリ
１１６  ハードティスク・ドライブ
２０２  シミュレーション・モデリング・ツール
２０４  ブロック線図のコード
２０８  セグメント抽出ルーチン
２１２  セグメント再分割ルーチン
２１６  マージ処理ルーチン
２２０  コード変換ルーチン
２２４  コンパイラ
２２８  実行環境
【図１】
2014035548.tif 000011
【図２】
2014035548.tif 000012
【図３】
2014035548.tif 000013
【図４】
2014035548.tif 000014
【図５】
2014035548.tif 000015
【図６】
2014035548.tif 000016
【図７】
2014035548.tif 000017
【図８】
2014035548.tif 000018
【図９】
2014035548.tif 000019
【図１０】
2014035548.tif 000020
【図１１】
2014035548.tif 000021
【図１２】
2014035548.tif 000022
【図１３】
2014035548.tif 000023
【図１４】
2014035548.tif 000024
【図１５】
2014035548.tif 000025