(57)【特許請求の範囲】
【請求項１】
コンピュータの処理により、内部状態をもつブロックと、内部状態をもたないブロックを連結して構成されたコードを並列化する方法であって、
前記ブロックをノードとし、前記ブロックの間の接続をリンクとするグラフ表現を作成して、前記コンピュータのメモリに格納するステップと、
前記グラフ表現を辿ることによって、前記ブロックを複数のストランドに分けるステップであって、該各ストランドの入力から出力までのパス中に、内部状態をもつブロックを含まないパスが存在しないようにストランドに分けるステップと、
前記ストランドのうち、最大の計算時間をもつものを選択するステップと、
前記選択された最大の計算時間をもつストランドにおいて、内部状態をもたないブロックにつき、内部状態をもつブロックに対する親子関係に基づき、移動可能なブロックを特定するステップと、
前記移動可能なブロックを隣接ストランドに移動させた場合の最大の計算時間をもつストランドが、元の最大の計算時間をもつストランドよりも計算時間が減少することに基づき、前記移動可能なブロックを隣接ストランドに実際に移動させるステップを有する、
並列化方法。
【請求項２】
前記移動可能なブロックを特定するステップが、同一ストランドで子ブロックを辿っていくと内部状態をもつブロックにぶつかる入力側ブロックと、同一ストランドで親ブロックを辿っていくと内部状態をもつブロックにぶつかる出力側ブロックから前記移動可能なブロックを特定し、前記入力側ブロックから特定されたブロックは、入力側にあるストランドに移動され、前記出力側ブロックから特定されたブロックは、出力側にあるストランドに移動される、請求項１に記載の並列化方法。
【請求項３】
前記移動可能なブロックが入力側ブロックである場合、当該ブロックに直接入力を与える全てのストランドを一つに統合し、当該ブロックを全てのストランドから削除し、統合されてできた新しいストランドに当該ブロックを所属させる処理を行う、請求項２に記載の並列化方法。
【請求項４】
前記移動可能なブロックが出力側ブロックである場合、当該ブロックが直接出力を与える全てのストランドに当該ブロックをコピーし、上記最大の計算時間をもつストランドから当該ブロックを削除する処理を行う、請求項２に記載の並列化方法。
【請求項５】
前記ストランドに分けるステップが、
前記グラフ表現上で前記ノードを順次訪問し、前記ノードが内部状態をもたないブロックであることに応答して、該内部状態をもたないブロックから内部状態をもつブロックへの入力を検出して該内部状態をもつブロックを使用ブロック集合として前記メモリに記憶し、内部状態をもつブロックから該内部状態をもたないブロックへの入力を検出して該内部状態をもつブロックを定義ブロック集合として前記メモリに記憶するステップと、
前記ブロックに関連して記憶された前記使用ブロック集合の情報及び前記定義ブロック集合の情報に基づき、ブロックのストランドを形成するステップを有する、
請求項１に記載の並列化方法。
【請求項６】
前記ストランドを形成するステップでは、下記の条件に従い前記ストランドが形成される、請求項５に記載の並列化方法。
(1) 使用ブロック数 = 0で、定義ブロック数 = 0:
この場合は、そのブロックは、隣接する、使用ブロック数 = 0、定義ブロック数 =0となるブロックと同じストランドに割り当てられる。
(2) 使用ブロック数 = 0で、定義ブロック数 = 1:
この場合は、そのブロックは、隣接する使用ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(3) 使用ブロック数 = 0で、定義ブロック数 > 1:
この場合は、そのブロックは、隣接する使用ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(4) 使用ブロック数 = 1で、定義ブロック数 = 0:
この場合は、そのブロックは、隣接する定義ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(5) 使用ブロック数 = 1で、定義ブロック数 = 1:
この場合は、そのブロックは、定義ブロックと同じストランドに割り当てられる。
(6) 使用ブロック数 = 1で、定義ブロック数 > 1:
この場合は、そのブロックは、使用ブロックと同じストランドに割り当てられる。
(7) 使用ブロック数 > 1で、定義ブロック数 = 0:
この場合は、そのブロックは、隣接する定義ブロック数=0となるブロックと同じストランドに割り当てられる。
(8) 使用ブロック数 > 1で、定義ブロック数 = 1:
この場合は、そのブロックは、定義ブロックと同じストランドに割り当てられる。
(9) 使用ブロック数 > 1で、定義ブロック数 > 1:
この場合は、そのブロックは、重複して、使用ブロック集合の各使用ブロックのストランドに割り当てられる。
【請求項７】
マルチコアまたはマルチプロセッサの環境において、請求項１に記載の方法にさらに、前記ストランドを個別にコンパイルして実行可能コードを生成するステップと、前記生成された実行可能コードを、個別に前記コアまたはプロセッサに割り当てて実行させるステップを有する、並列化されたコードの実行方法。
【請求項８】
コンピュータの処理により、内部状態をもつブロックと、内部状態をもたないブロックを連結して構成されたコードを並列化するプログラムであって、
前記コンピュータをして、
前記ブロックをノードとし、前記ブロックの間の接続をリンクとするグラフ表現を作成して、前記コンピュータのメモリに格納するステップと、
前記グラフ表現を辿ることによって、前記ブロックを複数のストランドに分けるステップであって、該各ストランドの入力から出力までのパス中に、内部状態をもつブロックを含まないパスが存在しないようにストランドに分けるステップと、
前記ストランドのうち、最大の計算時間をもつものを選択するステップと、
前記選択された最大の計算時間をもつストランドにおいて、内部状態をもたないブロックにつき、内部状態をもつブロックに対する親子関係に基づき、移動可能なブロックを特定するステップと、
前記移動可能なブロックを隣接ストランドに移動させた場合の最大の計算時間をもつストランドが、元の最大の計算時間をもつストランドよりも計算時間が減少することに基づき、前記移動可能なブロックを隣接ストランドに実際に移動させるステップを実行させる、
並列化プログラム。
【請求項９】
前記移動可能なブロックを特定するステップが、同一ストランドで子ブロックを辿っていくと内部状態をもつブロックにぶつかる入力側ブロックと、同一ストランドで親ブロックを辿っていくと内部状態をもつブロックにぶつかる出力側ブロックから前記移動可能なブロックを特定し、前記入力側ブロックから特定されたブロックは、入力側にあるストランドに移動され、前記出力側ブロックから特定されたブロックは、出力側にあるストランドに移動される、請求項８に記載の並列化プログラム。
【請求項１０】
前記移動可能なブロックが入力側ブロックである場合、当該ブロックに直接入力を与える全てのストランドを一つに統合し、当該ブロックを全てのストランドから削除し、統合されてできた新しいストランドに当該ブロックを所属させる処理を行う、請求項９に記載の並列化プログラム。
【請求項１１】
前記移動可能なブロックが出力側ブロックである場合、当該ブロックが直接出力を与える全てのストランドに当該ブロックをコピーし、上記最大の計算時間をもつストランドから当該ブロックを削除する処理を行う、請求項９に記載の並列化プログラム。
【請求項１２】
前記ストランドに分けるステップが、前記グラフ表現上で前記ノードを順次訪問し、前記ノードが内部状態をもたないブロックであることに応答して、該内部状態をもたないブロックから内部状態をもつブロックへの入力を検出して該内部状態をもつブロックを使用ブロック集合として前記メモリに記憶し、内部状態をもつブロックから該内部状態をもたないブロックへの入力を検出して該内部状態をもつブロックを定義ブロック集合として前記メモリに記憶するステップと、
前記ブロックに関連して記憶された前記使用ブロック集合の情報及び前記定義ブロック集合の情報に基づき、ブロックのストランドを形成するステップを有する、
請求項８に記載の並列化プログラム。
【請求項１３】
前記ストランドを形成するステップでは、下記の条件に従い前記ストランドが形成される、請求項１２に記載の並列化プログラム。
(1) 使用ブロック数 = 0で、定義ブロック数 = 0:
この場合は、そのブロックは、隣接する、使用ブロック数 = 0、定義ブロック数 =0となるブロックと同じストランドに割り当てられる。
(2) 使用ブロック数 = 0で、定義ブロック数 = 1:
この場合は、そのブロックは、隣接する使用ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(3) 使用ブロック数 = 0で、定義ブロック数 > 1:
この場合は、そのブロックは、隣接する使用ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(4) 使用ブロック数 = 1で、定義ブロック数 = 0:
この場合は、そのブロックは、隣接する定義ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(5) 使用ブロック数 = 1で、定義ブロック数 = 1:
この場合は、そのブロックは、定義ブロックと同じストランドに割り当てられる。
(6) 使用ブロック数 = 1で、定義ブロック数 > 1:
この場合は、そのブロックは、使用ブロックと同じストランドに割り当てられる。
(7) 使用ブロック数 > 1で、定義ブロック数 = 0:
この場合は、そのブロックは、隣接する定義ブロック数=0となるブロックと同じストランドに割り当てられる。
(8) 使用ブロック数 > 1で、定義ブロック数 = 1:
この場合は、そのブロックは、定義ブロックと同じストランドに割り当てられる。
(9) 使用ブロック数 > 1で、定義ブロック数 > 1:
この場合は、そのブロックは、重複して、使用ブロック集合の各使用ブロックのストランドに割り当てられる。
【請求項１４】
コンピュータの処理により、内部状態をもつブロックと、内部状態をもたないブロックを連結して構成されたコードを並列化するシステムであって、
メモリと、
前記ブロックをノードとし、前記ブロックの間の接続をリンクとするグラフ表現を作成して、前記メモリに格納する手段と、
前記グラフ表現を辿ることによって、前記ブロックを複数のストランドに分けるステップであって、該各ストランドの入力から出力までのパス中に、内部状態をもつブロックを含まないパスが存在しないようにストランドに分ける手段と、
前記ストランドのうち、最大の計算時間をもつものを選択する手段と、
前記選択された最大の計算時間をもつストランドにおいて、内部状態をもたないブロックにつき、内部状態をもつブロックに対する親子関係に基づき、移動可能なブロックを特定するステップと、
前記移動可能なブロックを隣接ストランドに移動させた場合の最大の計算時間をもつストランドが、元の最大の計算時間をもつストランドよりも計算時間が減少することに基づき、前記移動可能なブロックを隣接ストランドに実際に移動させる手段を有する、
並列化システム。
【請求項１５】
前記移動可能なブロックを特定する手段が、同一ストランドで子ブロックを辿っていくと内部状態をもつブロックにぶつかる入力側ブロックと、同一ストランドで親ブロックを辿っていくと内部状態をもつブロックにぶつかる出力側ブロックから前記移動可能なブロックを特定し、前記入力側ブロックから特定されたブロックは、入力側にあるストランドに移動され、前記出力側ブロックから特定されたブロックは、出力側にあるストランドに移動される、請求項１４に記載の並列化システム。
【請求項１６】
前記移動可能なブロックが入力側ブロックである場合、当該ブロックに直接入力を与える全てのストランドを一つに統合し、当該ブロックを全てのストランドから削除し、統合されてできた新しいストランドに当該ブロックを所属させる処理を行う、請求項１５に記載の並列化システム。
【請求項１７】
前記移動可能なブロックが出力側ブロックである場合、当該ブロックが直接出力を与える全てのストランドに当該ブロックをコピーし、上記最大の計算時間をもつストランドから当該ブロックを削除する処理を行う、請求項１５に記載の並列化システム。
【請求項１８】
前記ストランドに分ける手段が、
前記グラフ表現上で前記ノードを順次訪問し、前記ノードが内部状態をもたないブロックであることに応答して、該内部状態をもたないブロックから内部状態をもつブロックへの入力を検出して該内部状態をもつブロックを使用ブロック集合として前記メモリに記憶し、内部状態をもつブロックから該内部状態をもたないブロックへの入力を検出して該内部状態をもつブロックを定義ブロック集合として前記メモリに記憶する手段と、
前記ブロックに関連して記憶された前記使用ブロック集合の情報及び前記定義ブロック集合の情報に基づき、ブロックのストランドを形成する手段を有する、
請求項１４に記載の並列化システム。
【請求項１９】
前記ストランドを形成するステップでは、下記の条件に従い前記ストランドが形成される、請求項１８に記載の並列化システム。
(1) 使用ブロック数 = 0で、定義ブロック数 = 0:
この場合は、そのブロックは、隣接する、使用ブロック数 = 0、定義ブロック数 =0となるブロックと同じストランドに割り当てられる。
(2) 使用ブロック数 = 0で、定義ブロック数 = 1:
この場合は、そのブロックは、隣接する使用ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(3) 使用ブロック数 = 0で、定義ブロック数 > 1:
この場合は、そのブロックは、隣接する使用ブロック数 = 0となるブロックと同じ
ストランドに割り当てられる。
(4) 使用ブロック数 = 1で、定義ブロック数 = 0:
この場合は、そのブロックは、隣接する定義ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(5) 使用ブロック数 = 1で、定義ブロック数 = 1:
この場合は、そのブロックは、定義ブロックと同じストランドに割り当てられる。
(6) 使用ブロック数 = 1で、定義ブロック数 > 1:
この場合は、そのブロックは、使用ブロックと同じストランドに割り当てられる。
(7) 使用ブロック数 > 1で、定義ブロック数 = 0:
この場合は、そのブロックは、隣接する定義ブロック数=0となるブロックと同じストランドに割り当てられる。
(8) 使用ブロック数 > 1で、定義ブロック数 = 1:
この場合は、そのブロックは、定義ブロックと同じストランドに割り当てられる。
(9) 使用ブロック数 > 1で、定義ブロック数 > 1:
この場合は、そのブロックは、重複して、使用ブロック集合の各使用ブロックのストランドに割り当てられる。
【請求項２０】
マルチコアまたはマルチプロセッサの環境において、請求項１４に記載のシステムにさらに、前記ストランドを個別にコンパイルして実行可能コードを生成する手段と、前記生成された実行可能コードを、個別に前記コアまたはプロセッサに割り当てて実行させる手段を有する、並列化されたコードの実行システム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、シミュレーション・システムにおいて、プログラムの実行を並列化により高速化する技法に関する。
【背景技術】
【０００２】
近年、科学技術計算、シミュレーションなどの分野で、複数のプロセッサをもつ、いわゆるマルチプロセッサ・システムが使用されている。そのようなシステムでは、アプリケーション・プログラムは、複数のプロセスを生成して、個別のプロセッサに、プロセスを割り当てる。それらのプロセッサは、例えば、共有のメモリ空間を利用して互いに通信しながら、並列的に処理を進める。
【０００３】
最近になって特に盛んに開発されるようになってきたシミュレーションの分野として、ロボット、自動車、飛行機などのメトカトロニクスのプラントのシミュレーション用ソフトウェアがある。電子部品とソフトウェア技術の発展の恩恵により、ロボット、自動車、飛行機などでは、神経のように張り巡らされたワイヤ結線や無線ＬＡＮなどを利用して、大部分の制御が電子的に行われる。
【０００４】
それらは、本来的には機械的装置であるのに、大量の制御ソフトウェアをも内蔵している。そのため、製品の開発に当たっては、制御プログラムの開発とそのテストに、長い時間と、膨大な費用と、多数の人員を費やす必要が出てきた。
【０００５】
このようなテストにために従来行われている技法として、ＨＩＬＳ(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)の機能により、等価な機能のＣ言語など既知のコンピュータ言語のソース・コードに変換することができる。このＣ言語のソース・コードをコンパイルすることにより、別のコンピュータ・システムで、ＳＩＬＳとして、シミュレーションを実行することができる。
【００１０】
図１は、典型的なMATLAB(R)/Simulink(R)の機能ブロックのループを模式的に示す図である。機能ブロックは大別して、内部状態をもつブロックと、内部状態をもたないブロックに分かれる。図１では、斜線をつけて示したブロックA、Bが内部状態をもつブロックであり、斜線をつけていないブロックa、b、cが、内部状態をもたないブロックである。
【００１１】
内部状態をもたないブロックでは、図２(a)に示すように、入力データから直ちに出力データが計算されて出力される。
【００１２】
一方、内部状態をもつブロックでは、図２(b)に示すように、前回の入力データに、ある所定の演算を施した値が内部データ２０２として保持され、出力データは、内部データ２０２をもちいて計算される。よって、今回の入力データは、今回の出力データの計算には使われず、次回の出力データの計算のために、今回の出力データの計算の完了後、内部データ２０２として保持される。
【００１３】
図１で示すブロック線図の構成の処理を、説明する。ここで、ブロックAの出力をf1、ブロックaの出力をf2、ブロックBの出力をf3、ブロックbの出力をf4、ブロックcの出力をf5とする。f1はブロックaに入力され、f2はブロックBに入力され、f3はブロックbに入力され、f4はブロックcに入力され、f5はブロックAに入力される。但し、ブロックAとブロックBは、内部状態をもつブロックなので、上述のように、各々、f1及びf3を計算するために、直接入力f5、f2を使うことはない。以上のことを擬似コードで書くと、以下のとおりである。
while (ts < EOS) {
// 出力
f1 = Aout(sA)
f2 = a(f1)
f3 = Bout(sB)
f4 = b(f3)
f5 = c(f4)
// 状態の更新
sA = Ain(f5)
sB = Bin(f2)
// 時間の更新
ts++
}
【００１４】
上記擬似コードは、時間tsが、EOS(シミュレーションの終わり)に達するまで、whileループを繰り返すことを示す。このコードで、Aout()は、ブロックAが内部状態に基づき出力を計算する関数、Ain()は、ブロックAが入力に基づき内部状態変数を計算する関数、a()は、ブロックaが入力に基づき、出力を計算する関数、等である。
【００１５】
この擬似コードから見て取れるように、ブロックAは、出力を計算するのに、その内部状態を使い、ブロックaは、ブロックAの出力を使う。ここには、ブロックB、b、cの出力は使われていない。
【００１６】
一方、ブロックB、b、cも、ブロックA、aの出力を使用していない。このことは、A、aと、B、b、cをそれぞれ並列に実行できることを示唆する。図３に示すように、システムは、好適には異なるプロセッサまたはコアにそれぞれ、A、aとB、b、cの処理を割り当てて並列に実行した後、ブロックaの出力をブロックBに入力し、ブロックcの出力をブロックAに入力して次の並列実行に進む。すなわち、内部状態を持つブロックを終点とするフローを消去したときに、分断される各部分が１イテレーションに限り並列に実行可能となる。
【００１７】
ただし、単に内部状態を持つブロックを終点とするフローを消去しただけでは、十分にモデルを分割できないケース、すなわち並列化できないケースが多い。例えば、図１３のケースでは、結果的に全てのブロックが接続された状態で残り、まったく並列化できない。これは、複数のシグナルを統合する内部状態を持たないブロックが存在する場合に各部が分断されなくなるために発生する現象だが、多くのモデルにおいてこの傾向が強い。そのため、上記のような単純な方法だけでは高い並列性は期待できない。
【００１８】
特開２００３−９１４２２号公報は、多重ループ構造を有する非並列化ソースコードを複数のプロセッサが実行可能な並列化ソースコードに自動的に変換する方法に関し、ｎ（ｎは２以上の整数）重にネストされたループを含む非並列のソースコードから、ｍ（ｍは２以上の整数）個のプロセッサで並列実行可能な並列化ソースコードを自動的に生成する多重反復処理超並列化ソースコード自動生成プログラムＰ。非並列化ソースコードＳＣのｎ重ループそれぞれの初期値式を、ｍ個のプロセッサに与えた、各プロセッサを一意に識別する０から始まるｍ個の連続した整数ｉａｋ（ｋ＝０、・・・、ｍ−１）、およびループｊ（ｊ＝１、・・・、ｎ）毎に定められた増分値δｊを用いて表される初期値式Ｓｊに書き換え、書き換えた初期値式Ｓｊおよび増分値δｊを用いることにより、前記ｎ重ループ構造部分を、前記ｍ個のプロセッサで分担処理できる構造に変換する機能をＣＰＵに実現させることを開示する。
【００１９】
特開２００７−５１１８３５号公報は、ネットワークプロセッサをＤステージプロセッサパイプラインに構成し、シーケンシャルネットワークアプリケーションプログラムを複数のＤパイプラインステージに変換し、ＤパイプラインステージをＤステージプロセッサパイプライン内でパラレルに実行することを開示する。このとき例えば、シーケンシャルアプリケーションプログラムの変換は、シーケンシャルネットワークプログラムをフローネットワークモデルとしてモデリングし、複数の予備のパイプラインステージへとフローネットワークモデルから選択することによって実行される。
【００２０】
しかし、これらの従来技術は、ループをまたがって依存関係（loop carried dependence）を持つ機能ブロック間の、１イテレーション内での並列性を高める技法については、何も示唆しない。
【００２１】
そこで、本願発明者らは、特願２００９−２５１０４４号明細書において、機能ブロック間の、１イテレーション内での並列性を高める技法を提供した。尚、特願２００９−２５１０４４号明細書では、並列に実行される個々の機能ブロックの集合は、ストランドと呼ばれており、本明細書でも、その用語を同じ意味で使用する。
【先行技術文献】
【特許文献】
【００２２】
【特許文献１】特開２００３−９１４２２号公報
【特許文献２】特開２００７−５１１８３５号公報
【特許文献３】特願２００９−２５１０４４号明細書
【発明の概要】
【発明が解決しようとする課題】
【００２３】
特願２００９−２５１０４４号明細書に記述されている技法によって、並列性を高めることが可能となったが、そこに記述されているアルゴリズムは、結果のストランドのサイズに必ずしも配慮しないので、ストランドの計算時間に偏りが生じることがあった。すると、最も計算時間がかかるストランドが、全体の並列処理の時間を支配することにより、処理の高速化の妨げになった。
【００２４】
従って、本発明の目的は、形成されたストランド間で機能ブロックを移動させることにより、ストランドの計算時間の偏りを緩和するための技法を提供することにある。
【課題を解決するための手段】
【００２５】
本発明は、上記目的を解決するためになされたものであり、概略的には、以下のような処理からなる。これら一連の処理のステップは、アルゴリズムに従い、コンピュータによって自動的に実行される。
【００２６】
最初のステップは、機能ブロックを、ストランドに分けることである。そうやって得られたストランドの集まりを、ストランド集合と呼ぶことにする。この場合のストランドの形成方法は、各ストランドにおいて、入力から出力までのパスの間に、内部状態をもつブロックを含まないパスが存在しないような形成方法である必要がある。これは、各ストランドが１イテレーション内で並列に動作できるために必要な条件であり、以後ストランド条件と呼ぶことにする。好適には、特願２００９−２５１０４４号明細書で述べたようなストランドの形成方法が採用されるが、本発明は、それには限定されない。
【００２７】
次のステップは、ストランド集合から、計算時間が最大のストランドを見つけることである。ストランドの計算時間は、各ストランドに含まれるブロックの計算時間から見積もることができる。
【００２８】
次のステップは、計算時間が最大のストランドにおいて、移動可能なブロックを見つけることである。移動可能なブロックは、入力方向に移動可能なブロックと、出力方向に移動可能なブロックとがある。入力方向に移動可能なブロックは、当該のストランド以外のストランド内に親をもつブロックから選ばれる。出力方向に移動可能なブロックは、当該のストランド以外のストランド内に子をもつブロックから選ばれる。尚、ここで親子関係とは、ブロック同士が矢印で結ばれているときに、矢印の始点側を親ブロック、矢印の終点側を子ブロックと呼ぶような関係である。
【００２９】
次のステップでは、移動可能なブロックを、その性質に従って、入力方向または出力方向のストランドに移動した結果の当該ストランドの計算時間を求め、元のストランドとの計算時間を減り方が最大となる、ストランド間のブロックの移動を行う。
【００３０】
こうして、計算時間が最大のストランドを見つけるステップに戻る。このようなステップのループを継続していくと、移動可能なブロックを移動しても、当該のブロックの計算時間が減らなくなる状態に到達する。この状態になると、処理は終了となる。
【００３１】
このようにして、機能ブロックのストランドが得られると、各々のストランドは、対応するＣなどのソースコードに変換され、さらにコンパイルされて実行のため、個別のコアまたはプロセッサに割り当てられる。
【発明の効果】
【００３２】
この発明によれば、入力から出力までのパスの間に、内部状態をもつブロックを含まないパスが存在しないようにストランドを形成した場合に、その後の処理で可能な限り、ストランド間の計算時間のバランスを達成することにより、並列実行のボトルネックを減らし、処理を高速化するという効果が得られる。
【図面の簡単な説明】
【００３３】
【図１】内部状態をもつ機能ブロックと、内部状態をもたない機能ブロックからなるループのブロック線図の例を示す図である。
【図２】内部状態をもつ機能ブロックと、内部状態をもたない機能ブロックの仕組みをそれぞれ示す図である。
【図３】ブロック線図の並列化の例を示す図である。
【図４】本発明を実施するためのハードウェアのブロック図である。
【図５】本発明を実施するための機能ブロック図である。
【図６】本発明の処理全体の概要フローチャートを示す図である。
【図７】入力側ブロックと、出力側ブロックの例を示す図である。
【図８】ストランド集合を作成する処理のフローチャートを示す図である。
【図９】定義ブロック集合を見出す処理のフローチャートを示す図である。
【図１０】使用ブロック集合を見出す処理のフローチャートを示す図である。
【図１１】個々のストランドを形成する処理のフローチャートを示す図である。
【図１２】ストランド形成処理のルールを示す図である。
【図１３】ブロック線図のグラフにつき、定義ブロック集合と使用ブロック集合を見出す例を示す図である。
【図１４】見出された定義ブロック集合と使用ブロック集合に基づき、ストランドを形成する処理の結果を示す図である。
【図１５】入力側ブロックにおける移動候補ブロックを見出す処理のフローチャートを示す図である。
【図１６】出力側ブロックにおける移動候補ブロックを見出す処理のフローチャートを示す図である。
【図１７】移動候補ブロックの例を示す図である。
【図１８】移動候補ブロックの集合を見出す処理のフローチャートを示す図である。
【図１９】ストランドを分離させる処理の例を示す図である。
【図２０】ブロックを隣接ストランドに移動させる処理のフローチャートを示す図である。
【図２１】ブロックを隣接ストランドに移動させる処理の例を示す図である。
【発明を実施するための形態】
【００３４】
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
【００３５】
先ず、図４を参照して、本発明を実施するために使用されるコンピュータのハードウェアについて説明する。図４において、ホスト・バス４０２には、複数のＣＰＵ１  ４０４ａ、ＣＰＵ２  ４０４ｂ、ＣＰＵ３  ４０４ｃ、・・・ＣＰＵｎ  ４０４ｎが接続されている。ホスト・バス４０２にはさらに、ＣＰＵ１  ４０４ａ、ＣＰＵ２  ４０４ｂ、ＣＰＵ３  ４０４ｃ、・・・ＣＰＵｎ  ４０４ｎの演算処理のためのメイン・メモリ４０６が接続されている。
【００３６】
一方、Ｉ／Ｏバス４０８には、キーボード４１０、マウス４１２、ディスプレイ４１４及びハードティスク・ドライブ４１６が接続されている。Ｉ／Ｏバス４０８は、Ｉ／Ｏブリッジ４１８を介して、ホスト・バス４０２に接続されている。キーボード４１０及びマウス４１２は、オペレータが、コマンドを打ち込んだり、メニューをクリックするなどして、操作するために使用される。ディスプレイ４１４は、必要に応じて、後述する本発明に係るプログラムをＧＵＩで操作するためのメニューを表示するために使用される。
【００３７】
この目的のために使用される好適なコンピュータ・システムのハードウェアとして、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘがある。その際、ＣＰＵ１  ４０４ａ、ＣＰＵ２  ４０４ｂ、ＣＰＵ３  ４０４ｃ、・・・ＣＰＵｎ  ４０４ｎは、例えば、インテル（Ｒ）Ｘｅｏｎ（Ｒ）であり、オペレーティング・システムは、Ｗｉｎｄｏｗｓ（商標）Ｓｅｒｖｅｒ  ２００３である。オペレーティング・システムは、ハードティスク・ドライブ４１６に格納され、コンピュータ・システムの起動時に、ハードティスク・ドライブ４１６からメイン・メモリ４０６に読み込まれる。
【００３８】
本発明を実施するためには、マルチプロセッサ・システムを用いることが必要である。ここでマルチプロセッサ・システムとは、一般に、独立に演算処理し得るプロセッサ機能のコアを複数もつプロセッサを用いるシステムを意図しており、従って、マルチコア・シングルプロセッサ・システム、シングルコア・マルチプロセッサ・システム、及びマルチコア・マルチプロセッサ・システムのどれかでよいことを理解されたい。
【００３９】
なお、本発明を実施するために使用可能なコンピュータ・システムのハードウェアは、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘに限定されず、本発明のシミュレーション・プログラムを走らせることができるものであれば、任意のコンピュータ・システムを使用することができる。オペレーティング・システムも、Ｗｉｎｄｏｗｓ（Ｒ）に限定されず、Ｌｉｎｕｘ（Ｒ）、Ｍａｃ  ＯＳ（Ｒ）など、任意のオペレーティング・システムを使用することができる。さらに、シミュレーション・プログラムを高速で動作させるために、ＰＯＷＥＲ（商標）６ベースで、オペレーティング・システムがＡＩＸ（商標）のＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｐなどのコンピュータ・システムを使用してもよい。
【００４０】
ハードティスク・ドライブ４１６にはさらに、MATLAB(R)/Simulink(R)、Ｃコンパイラまたは、Ｃ＋＋コンパイラ、後述する本発明に係る解析、ストランド作成のためのモジュール、ＣＰＵ割り当て用コード生成モジュールなどが格納されており、オペレータのキーボードやマウス操作に応答して、メイン・メモリ４０６にロードされて実行される。
【００４１】
尚、使用可能なシミュレーション・モデリング・ツールは、MATLAB(R)/Simulink(R)に限定されず、オープンソースのScilab/Scicosなど任意のシミュレーション・モデリング・ツールを使用することが可能である。
【００４２】
あるいは、場合によっては、シミュレーション・モデリング・ツールを使わず、直接、Ｃ、Ｃ＋＋などでシミュレーション・システムのソース・コードを書くことも可能であり、その場合にも、個々の機能が、互いに依存関係にある個別の機能ブロックとして記述できるなら、本発明は適用可能である。
【００４３】
図５は、本発明の実施例に係る機能ブロック図である。各々のブロックは、基本的に、ハードティスク・ドライブ４１６に格納されているモジュールに対応する。
【００４４】
図５において、シミュレーション・モデリング・ツール５０２は、MATLAB(R)/Simulink(R)、Scilab/Scicosなどの既存の任意のモデリング・ツールを使用することができる。シミュレーション・モデリング・ツール５０２は、基本的には、オペレータが、ディスプレイ４１４上でＧＵＩ的に機能ブロックを配置し、数式など必要な属性を記述し、必要に応じて、機能ブロック間を関連付けてブロック線図を記述することを可能ならしめるような機能をもつ。シミュレーション・モデリング・ツール５０２はさらに、記述されたブロック線図に等価な機能を記述するＣのソースコードを出力する機能をもつ。Ｃ以外にも、Ｃ＋＋、ＦＯＲＴＲＡＮなどを使用することができる。特に、ＭＤＬファイルは、Simulink(R)独自のフォーマットであり、機能ブロック間の依存関係を記述するために、ＭＤＬファイルを生成することができる。
【００４５】
なお、シミュレーション・モデリング・ツールは、別のパーソナル・コンピュータに導入して、そこで生成されたソース・コードを、ネットワークなどを経由して、ハードティスク・ドライブ４１６にダウンロードするようにすることもできる。
【００４６】
こうして出力されたソース・コード５０４は、ハードティスク・ドライブ４１６に保存される。なお、ソース・コード５０４以外に、機能ブロック間の依存関係を記述するためのＭＤＬファイルを保存してもよい。
【００４７】
解析モジュール５０６は、ソースコード５０４を入力して構文解析し、ブロックのつながりを、グラフ表現に変換する。グラフ表現のデータは、好適には、ハードディスク・ドライブ４１６に格納される。なお、コンピュータ上のグラフ表現のデータ構造は周知であるので、ここでは説明を省略する。
【００４８】
ストランド作成モジュール５０８は、解析モジュール５０６によって作成されたグラフ表現５０８を読み取って、内部状態をもたない機能ブロックの各々に関連して、内部状態を有する定義ブロック(definer)と、内部状態を有する使用ブロック(user)を決定し、その情報に基づき、ストランドの集合を作成する。ストランド作成モジュール５０８のより詳しい処理は、後述する。
【００４９】
ストランド・バランシング・モジュール５１０は、ストランド作成モジュール５０８によって作成されたストランドの集合に関して、ストランドの計算時間の偏りを緩和させる処理を行う。ストランド・バランシング・モジュール５１０の処理については、図６のフローチャートなどを参照して、後で詳細に説明する。
【００５０】
コード生成モジュール５１２は、ストランド・バランシング・モジュール５１０が生成したストランドの情報に基づき、コンパイラ５１４がコンパイルするためのソースコードを生成する。コンパイラ５１４が想定するプログラミング言語としては、好適にはＣ、Ｃ＋＋、Ｃ＃、Ｊａｖａ（商標）などのマルチコア、またはマルチプロセッサに対応したプログラミングが可能な任意のプログラミング言語を使用することができ、コード生成モジュール５１２はそれに対応して、ストランド毎に、ソースコードを生成することになる。
【００５１】
コンパイラ５１４が生成した実行可能バイナリ・コード（図示しない）は、好適にはストランド毎に、異なるコアまたはプロセッサに割り当てられて、オペレーティング・システムの作用により、実行環境５１６で実行される。
【００５２】
次に、図６以下のフローチャートを参照して、特にストランド・バランシング・モジュール５１０の処理について説明する。図６において、ステップ６０２では、ブロック線図のグラフ表現において、ストランド作成モジュール５０８が、ストランド集合Ｓkを作成する処理を行う。すなわち、Ｓkは、k番目に作成されたストランド集合であり、kは最初は0で、図６の処理のループを廻す毎にkを1ずつ増分する。
【００５３】
ここで、ストランド集合Ｓkを作成するアルゴリズムは、各ストランドの入力から出力までのパス中に、内部状態をもつブロック（以下、ＳＢとも書く）を含まないパスが存在しないようにグラフを分割する（ストランド条件を満たす）アルゴリズムである。ストランド集合Ｓkを作成するための好適なアルゴリズムは、これには限定しないが、特願２００９−２５１０４４号明細書で述べられているアルゴリズムであり、本明細書でも、図８以下を参照して説明する。
【００５４】
ここで、後の説明のために、入力側ブロックと、出力側ブロックを定義しておく。
先ず、内部状態をもたないブロック（以下、ＳＬＢとも書く）は、必ず、所属するストランド内のＳＢの入力側か出力側に属する。
入力側に属するとは、同一ストランド内で、子供を辿っていくと、ＳＢにぶつかるＳＬＢをさす。
出力側に属するとは、同一ストランド内で、親を辿っていくと、ＳＢにぶつかるＳＬＢをさす。
尚、ブロックの親子関係とは、（親）→（子）のように、ブロック間の矢印の出所のブロックを親、矢印の行き先のブロックを子、とするものである。このような入力側ブロックと、出力側ブロックの例を、図７に示す。
但し、ループ構造中のＳＬＢは、どちらにも所属可能であるが、それは、ストランド作成モジュール５０８のアルゴリズムによって一意的に決められる。
【００５５】
ステップ６０４では、ストランド・バランシング・モジュール５１０が、Ｓkから最大ストランドｓkmaxを見つける。ここで「最大」とは、そのストランドに含まれているブロックの計算量の見積もりの合計が、ストランド集合中で最大であることを意味する。各ブロックの処理は、多くのものが常に一定の実行時間を持つので、事前に計測する、あるいは、含まれる演算の種類（四則演算や論理演算など）とその数から適当な重みを設定するなどして、合計の実行時間を見積もり可能である。
【００５６】
次にステップ６０６では、ストランド・バランシング・モジュール５１０は、最大ストランドｓkmaxから、移動するブロックの候補集合{Ｂ1,Ｂ2,...,Ｂn}を選出する。この処理は、図１５と図１６のフローチャートを参照して、後で詳細に説明する。
【００５７】
次にステップ６０８では、ストランド・バランシング・モジュール５１０は、
各候補Ｂi (i = 1,,n)を隣接ブロックに移動させた後にできる最大ストランドを、ｓk+1max(i)とする。なお、図７を参照すると理解できるように、各候補Ｂi (i = 1,,n)は、隣接ストランド中のブロックとの接続関係で、どの隣接ストランドに移動するかが決定される。
【００５８】
次にステップ６１０では、ストランド・バランシング・モジュール５１０は、
|ｓkmax| − |ｓk+1max(i)|を最大にするようなiを見つけ、そのiをjとおく。なお、|ｓ|のような記法は、ｓの計算時間を意味する。
【００５９】
次にステップ６１２では、ストランド・バランシング・モジュール５１０は、
|ｓkmax| − |ｓk+1max(j)| > 0かどうか、判断する。
|ｓkmax| − |ｓk+1max(j)| > 0であるということは、より最適なブロックの移動の余地があるということを意味するので、ストランド・バランシング・モジュール５１０は、ステップ６１４に進んで、Ｂj中の全ブロックを隣接ストランドに移動する処理を行う。ステップ６１４では更に、kを1だけ増分し、新たにできるストランド集合がＳkとされる。
【００６０】
次に処理は、ステップ６０４に戻って、再び最大ストランドが見つけられる。
【００６１】
ステップ６１２に戻って、|ｓkmax| − |ｓk+1max(j)| > 0でないと判断されると、より最適なブロックの移動の余地は最早ないことを意味するので、ストランド・バランシング・モジュール５１０は、処理を終了する。
【００６２】
次に、図６のステップ６０２における、ストランド作成モジュール５０８による、ストランド集合作成機能を、図８以下を参照して説明する。ここで、定義ブロック(definer block)と、使用ブロック(user block)の定義を与えておく。
【００６３】
すなわち、ある内部状態をもたない機能ブロックの出力が、ある内部状態をもつ機能ブロックAによって、直接・間接を問わず、他の内部状態を持つブロックを経由せずに使用されるとき、機能ブロックAは、その内部状態をもたない機能ブロックの使用ブロックと呼び、内部状態を持たない機能ブロックの使用ブロック集合の要素となる。
【００６４】
また、ある内部状態をもつ機能ブロックAの出力が、直接・間接を問わず、他の内部状態を持つブロックを経由せずに、ある内部状態をもたない機能ブロックの入力として計算に使用されるとき、機能ブロックAは、その内部状態をもたない機能ブロックの定義ブロックと呼び、定義ブロック集合の要素となる。
【００６５】
図８において、ストランド作成モジュール５０８は、ステップ８０２で、ブロック線図のグラフ表現において、定義ブロックを見つける処理を行う。この処理は、後で図９のフローチャートを参照して、より詳細に説明する。
【００６６】
次に、ストランド作成モジュール５０８は、ステップ８０４で、ブロック線図のグラフ表現において、定義ブロックを見つける処理を行う。この処理は、後で図１０のフローチャートを参照して、より詳細に説明する。
【００６７】
図９は、ノード（機能ブロック）nに関して、定義ブロックを見つける、FindDefiners(n)の処理を示すフローチャートである。図９において、ステップ９０２では、ノードnに対して、空のノード集合Dnが用意される。
【００６８】
ステップ９０４では、ノードnの未処理の親ノードのうちの１つをnparentとする。
【００６９】
ステップ９０６では、ノードnparentが内部状態をもつブロックかどうかが判断され、もしそうなら、ステップ９０８で、Dnにnparentが加えられる。
【００７０】
ステップ９０６で、ノードnparentが内部状態をもたないブロックであると判断したなら、ステップ９１０で、FindDefiners(nparent)が再帰的に呼び出され、返されるノード集合の全要素がDnに加えられる。
【００７１】
次に、ステップ９０８とステップ９１０のどちらからも、ステップ９１２に進み、そこで、ノードnの全ての親ノードに対して処理が行われたかどうか判断され、そうでなければ、ステップ９０４に戻る。
【００７２】
ステップ９１２で、ノードnの全ての親ノードに対して処理が行われたと判断されると、ステップ９１４で、Dnを返して、FindDefiners(n)の処理を終わる。
【００７３】
図８のステップ８０２では、ストランド作成モジュール５０８が、ブロック線図のグラフの全てのノードを順次訪問して、ノードnが内部状態をもたないブロックである場合に、図９のFindDefiners(n)を適用し、返されたDnを、ノードnの定義ブロック集合として得る。また、ノードnが内部状態を持つブロックである場合には、ノードn自身を自身の空のブロック集合Dnに入れ、定義ブロック集合とする。各ノードnに対して得られた定義ブロック集合Dnおよびそれらの対応関係を、好適にはメイン・メモリ４０６に保存する。
【００７４】
図１０は、ノード（機能ブロック）nに関して、使用ブロックを見つける、FindUsers(n)の処理を示すフローチャートである。図１０において、ステップ１００２では、ノードnに対して、空のノード集合Unが用意される。
【００７５】
ステップ１００４では、ノードnの未処理の子ノードをnchildとする。
【００７６】
ステップ１００６では、ノードnchildが内部状態をもつブロックかどうかが判断され、もしそうなら、ステップ１００８で、Unにnchildが加えられる。
【００７７】
ステップ１００６で、ノードnchildが内部状態をもたないブロックであると判断したなら、ステップ１０１０で、FindUsers(nchild)が再帰的に呼び出され、返されるノード集合の全要素がUnに加えられる。
【００７８】
次に、ステップ１００８とステップ１０１０のどちらからも、ステップ１０１２に進み、そこで、ノードnの全ての子ノードに対して処理が行われたかどうか判断され、そうでなければ、ステップ１００４に戻る。
【００７９】
ステップ１０１２で、ノードnの全ての子ノードに対して処理が行われたと判断されると、ステップ１０１４で、Unを返して、FindUsers(n)の処理を終わる。
【００８０】
図８のステップ８０４では、ストランド作成モジュール５０８が、ブロック線図のグラフの全てのノードを順次訪問して、ノードnが内部状態をもたないブロックである場合に、図１０のFindDeUsers(n)を適用し、返されたUnを使用ブロック集合としてノードnに関連付けて、Unの内容とそれに対するリンクの情報を、好適にはメイン・メモリ４０６に保存する。また、ノードnが内部状態を持つブロックである場合には、ノードn自身を自身の空のブロック集合Unに入れ、使用ブロック集合とする。各ノードnに対して得られた使用ブロック集合Dnおよびそれらの対応関係を、好適にはメイン・メモリ４０６に保存する。
【００８１】
次に、図１１のフローチャートを参照して、ストランド作成処理について説明する。この処理は、図８のステップ８０６に対応する。なお、図１１のフローチャートの処理を実行する時点でステップ８０２と８０４の処理で、ブロックnには既に、定義ブロック集合Dnと使用ブロック集合Unが関連付けられていることを理解されたい。
【００８２】
図１１において、ステップ１００２では、ストランド作成モジュール５０８が、ブロック線図のグラフ表現の次のノードnを訪問する。このときノードの訪問順序は特に問わず、最初のステップでは、任意のノードnが選択される。
【００８３】
次にステップ１００４に進み、そこで、DnとUnの情報を用いるルールに従い、ストランド形成処理を行う。
【００８４】
図１２に、そのルールまたは条件を示す。図示されているようにこれは、Unの要素の数である使用ブロック数と、Dnの要素の数である定義ブロック数に依存して、下記のような処理を行うものである。
(1) 使用ブロック数 = 0で、定義ブロック数 = 0:
この場合は、その機能ブロックは、隣接する、使用ブロック数 = 0、定義ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(2) 使用ブロック数 = 0で、定義ブロック数 = 1:
この場合は、その機能ブロックは、隣接する使用ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(3) 使用ブロック数 = 0で、定義ブロック数 > 1:
この場合は、その機能ブロックは、隣接する使用ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(4) 使用ブロック数 = 1で、定義ブロック数 = 0:
この場合は、その機能ブロックは、隣接する定義ブロック数 = 0となるブロックと同じストランドに割り当てられる。
(5) 使用ブロック数 = 1で、定義ブロック数 = 1:
この場合は、その機能ブロックは、定義ブロックと同じストランドに割り当てられる。ただし、
後で負荷バランスのために、割当てし直すことがある。
(6) 使用ブロック数 = 1で、定義ブロック数 > 1:
この場合は、その機能ブロックは、使用ブロックと同じストランドに割り当てられる。
(7) 使用ブロック数 > 1で、定義ブロック数 = 0:
この場合は、その機能ブロックは、隣接する定義ブロック数=0となるブロックと同じストランドに割り当てられる。
(8) 使用ブロック数 > 1で、定義ブロック数 = 1:
この場合は、その機能ブロックは、定義ブロックと同じストランドに割り当てられる。
(9) 使用ブロック数 > 1で、定義ブロック数 > 1:
この場合は、その機能ブロックは、重複して、使用ブロック集合の各使用ブロックのストランドに割り当てられる。
【００８５】
このような複数の条件は、実際は、例えば：
if ( 定義ブロック数 == 0 && 使用ブロック数 == 0  ) { 
処理;
}  else if (  定義ブロック数 == 1 && 使用ブロック数 == 0  ) { 
処理;
}
・・・
のようなステートメントで記述することができる。
【００８６】
ステップ１１０４で上記のストランド割当てを行うと、ステップ１１０６では、ストランド作成モジュール５０８は、すべてのノードを訪問したかどうかを判断し、もしそうなら処理を終了し、そうでないなら、ステップ１１０２に戻る。
【００８７】
このようにして作成された複数のストランドは、ストランド・バランシング・モジュール５１０で、計算時間に関してサイズをバランシングされた後、各々コンパイラ５１４でコンパイルされて、実行環境５１６で、好適には、個々のＣＰＵ１〜ＣＰＵｎに割り当てられて並列実行される。
【００８８】
図１３は、あるブロック線図にステップ８０２とステップ８０４を適用した結果を示す図である。図１で、影線付きでA、B、C、Dなどと書かれているのが内部状態をもつブロックであり、白抜きのブロックが内部状態をもたないブロックである。
【００８９】
ステップ８０２とステップ８０４を適用した結果、各々の内部状態をもつブロックには、定義ブロック集合／使用ブロック集合として、０個以上の内部状態をもつブロックの関連性が計算される。
【００９０】
次に、ステップ８０６、すなわち図１１のフローチャートの処理を、図１３のブロック線図のグラフに適用することで、図１４に示すようなストランド１４０２、１４０４、１４０６、１４０８、１４１０及び１４１２が形成される。特に、定義／使用ブロック集合 = A,D/A,B及び、定義／使用ブロック集合 = A,B/C,Bのように、定義ブロック集合と使用ブロック集合に各々複数のブロックが存在する場合は、複数のストランドによって共有されることに留意されたい。例えば、ブロック１４１４が、ストランド１４０４と、ストランド１４０６によって共有され、ブロック１４１６が、ストランド１４０８と、ストランド１４１０によって共有される、等である。
【００９１】
次に、図１５及び図１６のフローチャートを参照して、図６のステップ６０６で示す、移動するブロックの選出処理を説明する。なお、図１５及び図１６の処理は、最大ストランド内の各ＳＬＢをｂとし、全てのＳＬＢに対して実行される。
【００９２】
図１５において、ストランド・バランシング・モジュール５１０は、ステップ１５０２で、ブロックｂが、ｓkmax以外のストランドに親をもつかどうか判断する。そうでなければ、処理は直ちに終了する。
【００９３】
ステップ１５０２での判断が肯定的であると、ステップ１５０４に進み、そこでストランド・バランシング・モジュール５１０は、ブロックｂが、ｓkmax中の入力側のブロックを親にもつかどうか判断し、もしそうなら、処理は直ちに終了する。
【００９４】
ステップ１５０４での判断が否定的であると、ストランド・バランシング・モジュール５１０は、ステップ１５０４で、ブロックｂを入力方向の移動候補とする。
【００９５】
次に、図１６において、ストランド・バランシング・モジュール５１０は、ステップ１６０２で、ブロックｂが、ｓkmax以外のストランドに属するブロックを子にもつかどうか判断する。そうでなければ、処理は直ちに終了する。
【００９６】
ステップ１６０２での判断が肯定的であると、ステップ１６０４に進み、そこでストランド・バランシング・モジュール５１０は、ブロックｂが、ｓkmax中の出力側ブロックを子にもつかどうか判断する。もしそうなら、処理は直ちに終了する。
【００９７】
ステップ１６０４での判断が否定的であると、ステップ１６０６に進み、そこでストランド・バランシング・モジュール５１０は、ブロックｂが、ｓkmax中の入力側ブロックを子にもつかどうか判断する。もしそうなら、ステップ１６０８に進み、ストランド・バランシング・モジュール５１０は、ブロックｂに対する移動候補ブロック集合Ｂを計算し、出力方向への移動候補とする。このステップは、後で図１８のフローチャートを参照して、より詳細に説明する。ステップ１６０８の後は処理を終了する。
【００９８】
ステップ１６０６に戻って、ステップ１６０６での判断が否定的なら、ストランド・バランシング・モジュール５１０は、ブロックｂが、ステップ１６１０で、ｓkmax中のＳＢを子にもつかどうか判断し、もしそうなら、処理はステップ１６０８に進む。
【００９９】
ステップ１６１０での判断が否定的であるなら、処理はステップ１６１２に進み、そこで、ストランド・バランシング・モジュール５１０は、ｂを出力方向への移動候補として、処理を完了する。
【０１００】
ストランド・バランシング・モジュール５１０は、移動候補のブロックを決定するために、最大ストランド内の各ＳＬＢに対して、図１５のフローチャートの処理と、図１６のフローチャートの処理を実行する。
【０１０１】
図１７は、このようにして決定された、最大トスランドにおける、入力方向への移動候補と、出力方向への移動候補のブロックを示す図である。
【０１０２】
図１８は、図１６のステップ１６０８をさらに詳述するフローチャートである。図１８において、ステップ１８０２では、ストランド・バランシング・モジュール５１０は、親を辿っていったときに他のＳＢを経由せずに見つかる同一ストランド内のＳＢの組が、ｂと同一となる全てのＳＬＢを、同一ストランド内でＳＢを経由せずにｂに先行するＳＬＢの中から探し、それらのブロックの集合をＢとする。
【０１０３】
図１９(1)の場合、ａとｂが移動候補に該当し、Ｂ＝｛ａ，ｂ｝となる。これに、ストランド・バランシング・モジュール５１０が図６のステップ６１４を適用して、ａ，ｂを出力方向に移動すると、図１９(2)のように、ストランドが分離する。
【０１０４】
同じストランド内で、入力側ブロックを子に持つ出力側ブロックは、それのみを出力方向へ移動させても、結局自分にも当該ブロックが返ってきてしまうので、基本的にはストランドを小さくすることはできない。
【０１０５】
しかし、そのブロック、あるいはそのブロックに先行するいくつかの出力側ＳＬＢを同時に出力方向へ移動すれば、最大ストランドがいくつかに分裂して小さくなる可能性がある。
【０１０６】
ステップ６０８の操作は、Ｂｉ中の各ブロックに対してＳｋのコピー上で試行し（ただし、ステップ６０８中のjをiと読み変える）、出来上がったストランドの集合の中で、最も計算量を要するストランドをｓk+1max(i)とする。
【０１０７】
図２０は、図６のステップ６１４の処理をより詳細に説明するフローチャートである。図２０の処理は、Ｂｊ中のブロックｂに対して、実行されるものである。図２０において、ステップ２００２では、ストランド・バランシング・モジュール５１０は、ｂが入力方向への移動候補かどうか判断する。
【０１０８】
もしそうなら、処理は、ステップ２００４に進み、ストランド・バランシング・モジュール５１０は、ｂに直接入力を与える全てのストランドを一つに統合し、現在のｂを全てのストランドから削除し、統合されてできた新しいストランドにｂを所属させる処理を行う。
【０１０９】
もしそうでなく、ｂが入力方向への移動候補でないなら、ステップ２００６に進み、ストランド・バランシング・モジュール５１０は、ｂが直接出力を与える全てのストランドにｂをコピーし、ｓkmaxからｂを削除する処理を行う。ここで、ステップ２００４の処理は、bに直接入力を与えるストランドが二つ以上存在する場合にも、ストランド条件を崩さないための処理である。また、ステップ２００６の処理は、bの出力を受けるストランドが二つ以上存在する場合に、ストランド条件を崩さず、かつブロックの移動後に出来上がるストランドの計算時間の大きさを、可能な限り小さく保つための処理である。
【０１１０】
ステップ２００６は、図２１の例における矢印２１０２の方向の処理に対応し、ステップ２００４は、図２１の例における矢印２１０４の方向の処理に対応する。
【０１１１】
このようにして計算時間に関してバランシングされたストランドは、ＣＰＵに割り付けられて実行されることとなる。各ストランドを一つのＣＰＵに割り付けて全てを並列に（ただし、シミュレーションの各イテレーション毎に同期処理を要する）実行しても良いが、好適には、ＣＰＵ間の通信コストや利用可能なＣＰＵ数などを鑑み、いくつかのストランドからなるストランド集合を複数作成し、各ストランド集合を個別のＣＰＵに割り当てるなどする。
【０１１２】
このとき、上記で共有されたブロックを含むストランドが、別のＣＰＵに割り当てられた場合、その共有されたブロックに対応する処理は、各々のＣＰＵで実行される（つまり処理が異なる複数のＣＰＵ上で重複して実行される）ことになる。
【０１１３】
また、上記のように、複数のストランドまとめてストランド集合として一つのＣＰＵに割り当てて実行した場合、ストランド集合内の各ストランドの実行順序は任意でよく、他のストランド集合に所属するストランドから入力が必要なストランドをなるべく後に、他のストランド集合に所属するストランドに出力を与えるストランドをなるべく早く実行することで、ストランド集合（つまりＣＰＵ）をまたがってやり取りされるデータの準備ができてから、それが実際に必要となるまでの時間的間隔を拡大し、その間にシミュレーションの処理の裏で通信（例えばソフトウェアプリフェッチなど）を行い、プロセッサ間の通信遅延を隠蔽することもできる。
【０１１４】
以上、この発明を特定の実施例に基づき説明してきたが、この発明は、この特定の実施例に限定されず、当業者が自明に思いつく様々な変形、置換などの構成、技法適用可能であることを理解されたい。例えば、特定のプロセッサのアーキテクチャ、オペレーティング・システムなどに限定されない。
【０１１５】
また、上記実施例は、MATLAB(R)/Simulink(R)を例にとって説明したが、これに限らず、任意のモデリング・ツールに適用可能であることを理解されたい。
【符号の説明】
【０１１６】
４０２  ホスト・バス
４０４ａ、４０４ｂ、・・・４０４ｎ  ＣＰＵ
４０６  メイン・メモリ
４０８  バス
４１０  キーボード
４１２  マウス
４１４  ディスプレイ
４１６  ハードティスク・ドライブ
５０２  シミュレーション・モデリング・ツール
５０４  ソース・コード
５０６  解析モジュール
５０４  ソースコード
５０８  ストランド作成モジュール
５１２  コード生成モジュール
５１４  コンパイラ
５１６  実行環境
１４０２〜１４１０  ストランド
【図１】
0005479942.tif 000002
【図２】
0005479942.tif 000003
【図３】
0005479942.tif 000004
【図４】
0005479942.tif 000005
【図５】
0005479942.tif 000006
【図６】
0005479942.tif 000007
【図７】
0005479942.tif 000008
【図８】
0005479942.tif 000009
【図９】
0005479942.tif 000010
【図１０】
0005479942.tif 000011
【図１１】
0005479942.tif 000012
【図１２】
0005479942.tif 000013
【図１３】
0005479942.tif 000014
【図１４】
0005479942.tif 000015
【図１５】
0005479942.tif 000016
【図１６】
0005479942.tif 000017
【図１７】
0005479942.tif 000018
【図１８】
0005479942.tif 000019
【図１９】
0005479942.tif 000020
【図２０】
0005479942.tif 000021
【図２１】
0005479942.tif 000022