(57)【特許請求の範囲】
【請求項１】
コンピュータの処理により、コード化対象外ブロックと、コード化対象ブロックを含む複数のブロックを連結して構成されたコードを並列化する方法であって、
前記コードを、ＤＡＧのタスク・グラフに変換するステップと、
前記タスク・グラフを、直列実行ノードがそこから分岐するＳノードと、並列実行ノードがそこから分岐するＰノードを含む、直列−並列木に変換するステップと、
前記コード化対象外ブロックの上位に前記Ｐノードが存在しなくなるまで前記直列−並列木を別の直列−並列木に変形するステップを有する、
コード並列化方法。
【請求項２】
前記直列−並列木に変換する前に、前記タスク・グラフにおいて、前記コード化対象外ブロックをマージするステップをさらに含む、
請求項１に記載のコード並列化方法。
【請求項３】
前記コード化対象外ブロックのマージが、リスト・スケジューリングにより行われる、請求項２に記載のコード並列化方法。
【請求項４】
請求項１のコード並列化方法で生成されたコードを、マルチプロセッサ環境で実行する方法であって、
前記Ｐノードの下位の個々のノードをコード化するステップと、
該コード化されたコードを実行可能コードに個別にコンパイルするステップと、
前記実行可能コードを個々のプロセッサに割り当てて実行するステップを有する、
コード並列実行方法。
【請求項５】
請求項１のコード並列化方法で生成されたコードを、前記コード化対象外ブロックのコードを実行するためのインタープリタをもつマルチプロセッサ環境で実行する方法であって、
前記Ｐノードの下位の個々のノードをコード化するステップと、
該コード化されたコードが前記コード化対象外ブロックを含まないなら、実行可能コードに個別にコンパイルするステップと、
前記実行可能コードを個々のプロセッサに割り当てて実行するステップと、
前記コード化されたコードが前記コード化対象外ブロックを含むなら、前記コード化されたコードを前記インタープリタで実行するステップを有する、
コード並列実行方法。
【請求項６】
コンピュータの処理により、コード化対象外ブロックと、コード化対象ブロックを含む複数のブロックを連結して構成されたコードを並列化するプログラムであって、
前記コンピュータに、
前記コードを、ＤＡＧのタスク・グラフに変換するステップと、
前記タスク・グラフを、直列実行ノードがそこから分岐するＳノードと、並列実行ノードがそこから分岐するＰノードを含む、直列−並列木に変換するステップと、
前記コード化対象外ブロックの上位に前記Ｐノードが存在しなくなるまで前記直列−並列木を別の直列−並列木に変形するステップを実行させる、
プログラム。
【請求項７】
前記直列−並列木に変換する前に、前記タスク・グラフにおいて、前記コード化対象外ブロックをマージするステップをさらに含む、
請求項６に記載のプログラム。
【請求項８】
前記コード化対象外ブロックのマージが、リスト・スケジューリングにより行われる、請求項７に記載のプログラム。
【請求項９】
コンピュータの処理により、コード化対象外ブロックと、コード化対象ブロックを含む複数のブロックを連結して構成されたコードを並列化するシステムであって、
前記コードから変換されたＤＡＧのタスク・グラフを保存する記憶手段と、
前記タスク・グラフを、直列実行ノードがそこから分岐するＳノードと、並列実行ノードがそこから分岐するＰノードを含む、直列−並列木に変換する手段と、
前記コード化対象外ブロックの上位に前記Ｐノードが存在しなくなるまで前記直列−並列木を別の直列−並列木に変形する手段とを有する、
コード並列化システム。
【請求項１０】
前記タスク・グラフにおいて、前記コード化対象外ブロックをマージする手段をさらに含む、
請求項９に記載のコード並列化システム。
【請求項１１】
前記コード化対象外ブロックのマージが、リスト・スケジューリングにより行われる、請求項１０に記載のコード並列化システム。
【請求項１２】
マルチプロセッサ環境と、
前記Ｐノードの下位の個々のノードをコード化する手段と、
該コード化されたコードを実行可能コードに個別にコンパイルする手段と、
前記実行可能コードを個々のプロセッサに割り当てて実行する手段をさらに有する、
請求項９に記載のコード並列化システム。
【請求項１３】
前記コード化対象外ブロックのコードを実行するためのインタープリタをもつマルチプロセッサ環境と、
前記Ｐノードの下位の個々のノードをコード化する手段と、
該コード化されたコードが前記コード化対象外ブロックを含まないなら、実行可能コードに個別にコンパイルする手段と、
前記実行可能コードを個々のプロセッサに割り当てて実行する手段と、
前記コード化されたコードが前記コード化対象外ブロックを含むなら、前記コード化されたコードを前記インタープリタで実行する手段をさらに有する、
請求項９に記載のコード並列化システム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、シミュレーション・システムにおいて、並列化によりプログラムの実行を高速化する技法に関する。
【背景技術】
【０００２】
近年、科学技術計算、シミュレーションなどの分野で、複数のプロセッサをもつ、いわゆるマルチプロセッサ・システムが使用されている。一方、最近になって特に盛んに開発されるようになってきたシミュレーションの分野として、ロボット、自動車、飛行機などのメトカトロニクスのプラントのシミュレーション用ソフトウェアがある。電子部品とソフトウェア技術の発展の恩恵により、ロボット、自動車、飛行機などでは、神経のように張り巡らされたワイヤ結線や無線ＬＡＮなどを利用して、大部分の制御が電子的に行われる。
【０００３】
それらは、本来的にはメカトロニクスの装置であるが、大量の制御ソフトウェアをも内蔵している。そのため、製品の開発に当たっては、制御プログラムの開発とそのテストに、長い時間と、膨大な費用と、多数の人員を費やす必要が出てきた。
【０００４】
このようなテストにために従来行われている技法として、ＨＩＬＳ(Hardware In the Loop Simulation)がある。特に、自動車全体の電子制御ユニット（ＥＣＵ）をテストする環境は、フルビークルＨＩＬＳと呼ばれる。フルビークルＨＩＬＳにおいては、実験室内で、本物のＥＣＵが、エンジン、トランスミッション機構などをエミュレーションする専用のハードウェア装置に接続され、所定のシナリオに従って、テストが行われる。ＥＣＵからの出力は、監視用のコンピュータに入力され、さらにはディスプレイに表示されて、テスト担当者がディスプレイを眺めながら、異常動作がないかどうか、チェックする。
【０００５】
しかし、ＨＩＬＳは、専用のハードウェア装置を使い、それと本物のＥＣＵの間を物理的に配線しなくてはならないので、準備が大変である。また、別のＥＣＵに取り替えてのテストも、物理的に接続し直さなくてはならないので、手間がかかる。さらに、本物のＥＣＵを用いたテストであるため、テストに実時間を要する。従って、多くのシナリオをテストすると、膨大な時間がかかる。また、ＨＩＬＳのエミュレーション用のハードウェア装置は、一般に、非常に高価である。
【０００６】
そこで近年、高価なエミュレーション用ハードウェア装置を使うことなく、シミュレーション全体をソフトウェアで構成する手法が提案されている。その手法においては、エンジンやトランスミッションなどのプラント部分には連続系シミュレーション（continuous simulation）を利用し、また、コントローラ部分にはステート・チャート（state chart）あるいは実際のソフトウエアコードを利用する。コントローラ部分のシミュレーション方法に応じて、前者は ＭＩＬ (Model-in-the-Loop) シミュレーション、後者は ＳＩＬ  (Software-in-the-Loop) シミュレーションと呼ばれる。ＭＩＬやＳＩＬによればＥＣＵのハードウェアが存在しなくても、テストを実行可能である。
【０００７】
このようなＭＩＬ／ＳＩＬの構築を支援するシステムとして例えば、MathWorks社から入手可能なシミュレーション・モデリング・システムである、MATLAB(R)/Simulink(R)がある。MATLAB(R)/Simulink(R)を使用すると、画面上にグラフィカル・インターフェースによって、機能ブロックを配置し、その処理の流れを指定することによって、シミュレーション・プログラムを作成することができる。ここで、機能ブロックは、和や積などの基本演算や積分や条件分岐、さらには、ソフトウエア・コードを呼び出すブロックなどの種類があり、それぞれが入力あるいは・および出力を持つ。なお、コントローラの表現としてソフトウエア・ブロックを含むシミュレーションがＳＩＬである。
【０００８】
こうして、MATLAB(R)/Simulink(R)上で、いったん機能ブロックを構成配置してブロック線図を作成すると、次に、Real-Time Workshop(R)の機能を利用して、シミュレーションの実行をさらに高速化することができる。すなわち、ソフトウエア・コード以外のブロックを、等価な機能のＣ言語など既知のコンピュータ言語のソース・コードに変換することにより、逐次解釈的な処理から、ホストに最適化された処理に置き換える。なお、Real-Time WOrkshop(R) の場合、コード変換を実施する単位は、モデルの全体あるいは、図１に参照番号１０２、１０４などで示すようなサブブロックの単位である。ここで、サブブロックは、モデルの可読性のために導入される階層的な構造を表現するための特別な境界を表す。例えば、サブブロック１０８は、参照番号１０８ａで示すような内部的な構造をもつ。
【０００９】
ところが、自動車や航空機などの制御システムは複雑なので、数千個〜数十万個の機能ブロックを含むことが普通である。従って、シミュレーション・モデルを設計して、所望のモデルを得るためには、何度も設計・コンパイル・実行を繰り返す必要がある。
【００１０】
図１において、例えば、オペレータが、サブブロック１０２〜１１０などのうち、サブブロック１１０を編集してコンパイルして実行可能バイナリ・コードを得る。そして、その実行可能バイナリ・コードをコンピュータ・システム上で実行しで動作を確認し、所望の動作が得られないならば、再度サブブロック１１０を編集し、コンパイル＆実行するということを繰り返す。
【００１１】
機能ブロックの数が増えるにつれて、結果のソースコードが増大するが、すると、ソースコード全体をフル・コンパイルする際のコンパイル時間も長くなる。
【００１２】
一般に大規模なモデルを編集するときは、編集の対象となるサブブロックは、例えば図１のサブブロック１１０のように、一部に限定されることが多い。特に、複合的なモデルの場合には、設計者が担当する部分を除いた他のサブブロックは、変更せずに固定化してブラックボックスのように扱われることが多い。そこで、編集の対象となるサブブロックを残して、それ以外をあらかじめコード変換しておくことで、実行速度と編集作業の両立を図ることができる。また、マルチ・プロセッサ、あるいは、マルチ・コアの環境で、分割コンパイルした個別の実行コードを、異なるプロセッサまたはコアに割り当てて並列実行させることにより、実行時間が短縮される。特に後者について、関連技術として次の特許公開公報に記述されている技法がある。
【００１３】
特開平７−１１４４８６号公報は、デバッグ用の出力文を含む逐次ループを、並列化する方法に関し、逐次ループ内のＩ／Ｏ文を検出し、Ｉ／Ｏ文がループ不変式による条件節に含まれること検出して、Ｉ／Ｏ文を含む依存を解析し、実行順序を守るための同期文を挿入し、並列処理用のループに変換することを開示する。
【００１４】
特開２０１１−９６１０７号公報は、ブロック線図などで表されるプログラムにおいて、内部状態をもつ機能ブロックと、内部状態をもたない機能ブロックとの接続関係に基づき、機能ブロック毎に、使用ブロック集合／定義ブロック集合の数を求め、その数に基づき、複数のストランドを割り当て、これにより、ブロック線図を、ストランドに分けて処理を並列化することを開示する。
【００１５】
図２は、サブブロックにアラインした単純分割の例を示す。すなわち、図２では、領域２０２、２０４、２０６などに分割されている。しかしながら、MATLAB(R)/Simulink(R) のように、タイムステップに基づくシミュレーションの場合には、必ずしもサブブロックの単位でまとめてコード変換ができるとは限らない。たとえば、ブロックの実行順序をスケジュールするにはサブブロックの中（下位の階層）まで解析する必要があり、その結果、サブブロックの中ほど（途中）から計算を開始することが決定した場合には、実質的にサブブロックは前後に分断されなければならない。また、例えば、MATLAB(R)/Simulink(R)のScopeブロックのような結果を表示するブロックはコード変換することができず、したがって、そのようなコード化することができない機能ブロックを含むサブブロックは、その単位のままではコード化できない。以上のような制約を考慮して試みられた分割の例を図３に示す。すなわち、図３に示すように、分割は、コード化対象外ブロック３１４、３１６を除外し、スケジュールに合わせた実行開始コード３１０、３１２が先頭にくるように分割・再構成によりコード変換を適用することが、シミュレーションの高速化のためには望ましい。
【００１６】
しかしながら、そのような分割および再構成の手法は自明ではなく、特に、並列化のための分割手順は組合せ問題となり、最適な組合せを短時間で計算することは一般に非常に困難である。そこで、限られた時間の中で準最適な解を求めることが強く求められる。
【先行技術文献】
【特許文献】
【００１７】
【特許文献１】特開平７−１１４４８６号公報
【特許文献２】特開２０１１−９６１０７号公報
【発明の概要】
【発明が解決しようとする課題】
【００１８】
この発明の目的は、基本処理の流れを表すブロック線図について、その実行速度を最適化するように分割することである。
この発明の他の目的は、その際に、実行速度を損なわないように、コード化対象外ブロックを分割の境界に配置するための技法を提供することにある。
【課題を解決するための手段】
【００１９】
この発明は、上記課題を解決するためになされたものであり、この発明に従うシステムは先ず、ブロック線図を、ＤＡＧ（directed acyclic graph）のタスク・グラフに変換する。
【００２０】
次に、この発明に従うシステムは、上記タスク・グラフを、既知のアルゴリズムに従い一旦直列−並列グラフ（ＳＰＧ: series-parallel graph）に変換してから、構造（構文）解析を行い、一意の直列−並列木（ＳＰＴ: series-parallel parse tree）を得る。ＳＰＴは、直列実行ノードがそこから分岐するＳノードと、並列実行ノードがそこから分岐するＰノードを含む。また、末端のノードは、タスク・グラフのノードを表す。
【００２１】
次に、この発明に従うシステムは、上記ＳＰＴを、コード化対象外ブロックの上位にＰノードが存在しなくなるまで、別のＳＰＴに変形する。
【００２２】
こうして最適なＳＰＴが得られると、発明に従うシステムは、結果のＳＰＴのＰノードの下に連なるブロックを並列に実行するように、コードを生成しコンパイルして、異なるプロセッサまたはコアに割り当てて、並列実行させる。
【００２３】
なお、あるＤＡＧのタスク・グラフに対して一般的に、ノード実行順序の前後関係に矛盾しないＳＰＴは複数存在する。そこで、本発明の好適な一側面によれば、ＳＰＴに変換する前に、ＤＡＧのタスク・グラフは、点在するコード化対象外ブロックをなるべくマージさせるように変形される。これによって、結果のタスク・グラフの分割数の低減がはかられる。一般に、各分割のサイズが同程度であれば、全体におけるクリティカル・パスが小さくなって並列処理での高速化の効果が大きくなる。また、逐次処理であっても、分割数が小さければ、呼び出しのオーバヘッドが減少するために、実行の高速化に大いに貢献する。
【発明の効果】
【００２４】
この発明によれば、ブロック線図であらわされるプログラム・コードにおいて、コード化対象外ブロックの存在を考慮して、コードの分割数を減らし、並列実行コストのバランスのとれた分割を与える技法が提供される。
【図面の簡単な説明】
【００２５】
【図１】タスク・グラフのコンパイルと実行を説明するための図である。
【図２】サブブロックにアラインした単純分割を示す図である。
【図３】コード化対象外ブロックと実行スケジュールに合わせた最大分割を示す図である。
【図４】本発明を実施するためのハードウェアのブロック図である。
【図５】本発明を実施するための機能ブロック図である。
【図６】本発明の処理全体の概要フローチャートを示す図である。
【図７】タスク・グラフ変形処理のフローチャートを示す図である。
【図８】タスク・グラフ変形処理におけるリスト・スケジューリングの例を示す図である。
【図９】タスク・グラフをＳＰＴに変換する処理のフローチャートを示す図である。
【図１０】タスク・グラフをＳＰＴに変換する処理の例を示す図である。
【図１１】タスク・グラフをＳＰＴに変換する処理の例を示す図である。
【図１２】ＳＰＴ変形処理のフローチャートを示す図である。
【図１３】ＳＰＴ変形処理の例を示す図である。
【図１４】ＳＰＴ変形処理の例を示す図である。
【図１５】ＳＰＴ変形処理における主要な処理を説明するための図である。
【図１６】ＳＰＴ変形処理における主要な処理を説明するための図である。
【図１７】個別のプロセッサまたはコアに割り当てるコードを生成するための処理のフローチャートを示す図である。
【発明を実施するための形態】
【００２６】
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
【００２７】
先ず、図４を参照して、本発明を実施するために使用されるコンピュータのハードウェアについて説明する。図４において、ホスト・バス４０２には、複数のＣＰＵ１  ４０４ａ、ＣＰＵ２  ４０４ｂ、ＣＰＵ３  ４０４ｃ、・・・ＣＰＵｎ  ４０４ｎが接続されている。ホスト・バス４０２にはさらに、ＣＰＵ１  ４０４ａ、ＣＰＵ２  ４０４ｂ、ＣＰＵ３  ４０４ｃ、・・・ＣＰＵｎ  ４０４ｎの演算処理のためのメイン・メモリ４０６が接続されている。
【００２８】
一方、Ｉ／Ｏバス４０８には、キーボード４１０、マウス４１２、ディスプレイ４１４及びハードティスク・ドライブ４１６が接続されている。Ｉ／Ｏバス４０８は、Ｉ／Ｏブリッジ４１８を介して、ホスト・バス４０２に接続されている。キーボード４１０及びマウス４１２は、オペレータが、コマンドを打ち込んだり、メニューをクリックするなどして、操作するために使用される。ディスプレイ４１４は、必要に応じて、本発明に係るプログラムをＧＵＩで操作するためのメニューを表示するために使用される。
【００２９】
この目的のために使用される好適なコンピュータ・システムのハードウェアとして、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘがある。その際、ＣＰＵ１  ４０４ａ、ＣＰＵ２  ４０４ｂ、ＣＰＵ３  ４０４ｃ、・・・ＣＰＵｎ  ４０４ｎは、例えば、インテル（Ｒ）Ｘｅｏｎ（Ｒ）であり、オペレーティング・システムは、Ｗｉｎｄｏｗｓ（商標）Ｓｅｒｖｅｒ  ２００３である。オペレーティング・システムは、ハードティスク・ドライブ４１６に格納され、コンピュータ・システムの起動時に、ハードティスク・ドライブ４１６からメイン・メモリ４０６に読み込まれる。
【００３０】
本発明を実施するためには、マルチプロセッサ・システムを用いることが必要である。ここでマルチプロセッサ・システムとは、一般に、独立に演算処理し得るプロセッサ機能のコアを複数もつプロセッサを用いるシステムを意図しており、従って、マルチコア・シングルプロセッサ・システム、シングルコア・マルチプロセッサ・システム、及びマルチコア・マルチプロセッサ・システムのどれでもよいことを理解されたい。
【００３１】
なお、本発明を実施するために使用可能なコンピュータ・システムのハードウェアは、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘに限定されず、本発明のシミュレーション・プログラムを走らせることができるものであれば、任意のコンピュータ・システムを使用することができる。オペレーティング・システムも、Ｗｉｎｄｏｗｓ（Ｒ）ＸＰ、Ｗｉｎｄｏｗｓ（Ｒ）７、Ｌｉｎｕｘ（Ｒ）、Ｍａｃ  ＯＳ（Ｒ）など、任意のオペレーティング・システムを使用することができる。さらに、シミュレーション・プログラムを高速で動作させるために、ＰＯＷＥＲ（商標）６ベースで、オペレーティング・システムがＡＩＸ（商標）のＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｐなどのコンピュータ・システムを使用してもよい。
【００３２】
ハードティスク・ドライブ４１６にはさらに、MATLAB(R)/Simulink(R)、Cコンパイラまたは、C++コンパイラ、後述する、タスクグラフ生成、タスクグラフ変形直接−並列木（ＳＰＴ）変換、ＳＰＴ変形などのためのモジュール、ＣＰＵ割り当て用コード生成モジュールなどが格納されており、オペレータのキーボードやマウス操作に応答して、メイン・メモリ４０６にロードされて実行される。タスクグラフ生成、タスクグラフ変形直接−並列木（ＳＰＴ）変換、ＳＰＴ変形などのためのモジュールは、Java(R)、C、C++、C#などの既存の任意のプログラミング言語で作成することができる。
【００３３】
尚、使用可能なシミュレーション・モデリング・ツールは、MATLAB(R)/Simulink(R)に
限定されず、オープンソースのScilab/Scicosなど、タイム・ステップに基づくタスク・グラフで表現される任意のシミュレーション・モデリング・ツールを使用することが可能である。
【００３４】
あるいは、場合によっては、シミュレーション・モデリング・ツールを使わず、直接、Ｃ、Ｃ＋＋などでシミュレーション・システムのソース・コードを書くことも可能であり、その場合にも、個々の機能が、互いに依存関係にある個別の機能ブロックとして記述できるなら、本発明は適用可能である。
【００３５】
図５は、本発明の実施例に係る機能ブロック図である。各々のブロックは、基本的に、ハードティスク・ドライブ４１６に格納されているモジュールに対応する。
【００３６】
図５において、シミュレーション・モデリング・ツール５０２は、好適には、MATLAB(R)/Simulink(R)であり、それ以外に、Scilab/Scicosなど、コード化対象外ブロックを含み得る、任意のシミュレーション・モデリング・ツールを使用することができる。
【００３７】
モデル・データ５０４は、シミュレーション・モデリング・ツール５０２を用いて作成され、好適にはブロック線図で記述され、ハードディスク・ドライブ４１６に保存されている。そのブロック線図に含まれるブロックにおいて、コード化対象外ブロックは、予めマークされている。
【００３８】
メイン・ルーチン５０６は、本発明に係る処理の各種モジュールを呼び出し、実行するためのプログラムであり、好適には、ディスプレイ４１４上で、キーボード４１０やマウス４１２で操作して処理を行うためのＧＵＩなどのインターフェースを与える。
【００３９】
ＤＡＧ変換モジュール５０８は、モデル・データ５０４を読み込んで、ＤＡＧのタスク・グラフに変換する機能をもつ。好適には、変換されたタスク・グラフのデータは、メイン・メモリ４０６上に必要な領域を確保して展開される。なお、コンピュータ・メモリ上にグラフを表現するデータ構造として、行列表現あるいはリスト表現などが知られているが、この実施例で、既知の任意のデータ構造を使用することができる。
【００４０】
タスク・グラフ変形モジュール５１０は、ＤＡＧ変換モジュール５０８によって変換して得られたタスク・グラフに含まれるコード化対象外ブロックを可能な範囲でマージする機能をもつ。変形された結果のタスク・グラフは、好適には、メイン・メモリ４０６上に必要な領域を確保して展開される。この処理は後で、図７のフローチャートを参照して、より詳細に説明する。
【００４１】
ＳＰＴ変換モジュール５１２は、タスク・グラフ変形モジュール５１０によって変形して得られたタスク・グラフを、直接−並列木（ＳＰＴ）に変換する機能をもつ。ＳＰＴは、直列実行ノードがそこから分岐するＳノードと、並列実行ノードがそこから分岐するＰノードを含む。変換された結果のタスク・グラフは、好適には、メイン・メモリ４０６上に必要な領域を確保して展開される。この処理は後で、図９のフローチャートを参照して、より詳細に説明する。
【００４２】
ＳＰＴ変形モジュール５１４は、ＳＰＴ変換モジュール５１２によって得られたＳＰＴのグラフを、別の直接−並列木（ＳＰＴ）に変形する機能をもつ。変形は、コード化対象外ブロックの上位にＰノードが存在しなくなるまで行われる。変形された結果のタスク・グラフは、好適には、メイン・メモリ４０６上に必要な領域を確保して展開される。この処理は後で、図１２のフローチャートを参照して、より詳細に説明する。
【００４３】
ＣＰＵ割当てモジュール５１６は、ＳＰＴ変形モジュール５１４の変形の結果得られたＳＰＴに基づき、個別のプロセッサあるいはコアに割り当てるためのコードを抽出する。抽出されたコードは、好適には、ハードティスク・ドライブ４１６に書き出される。このコードは、機能ブロックに対応する、好適にはＣまたはＣ＋＋のソースコードである。ＣＰＵ割当てモジュール５１６の処理は後で、図１７のフローチャートを参照して、より詳細に説明する。
【００４４】
コンパイラ５１８は、ＣＰＵ割当てモジュール５１６によって書き出されたコードをコンパイルして、実行可能コードを生成する。実行環境５２０は、個別のプロセッサあるいはコアに割り当てて並列実行させる。実行環境５２０は、好適には、ＣＰＵ割当てモジュール５１６が生成した補助的な情報を参照して実行可能コードを割り当てる。
【００４５】
実行環境５２０の一部として、MATLAB(R)/Simulink(R)を利用する場合には、それが未コンパイルの（サブ）ブロックとコンパイル済みのサブブロックを区別して、前者はインタプリターとして実行し、後者はバイナリーコードとしてホスト実行する。
【００４６】
図６は、本発明の処理の全体の流れを示す概要フローチャートである。この後の詳細な説明は、この流れに沿って説明することになる。
【００４７】
ステップ６０２では、ＤＡＧ変換モジュール５０８により、モデル・データがＤＡＧのタスク・グラフに変換される。
【００４８】
ステップ６０４では、タスク・グラフ変形モジュール５１０により、コード化対象外ブロックを可能な範囲でマージするように、タスク・グラフが変形される。
【００４９】
ステップ６０６では、ＳＰＴ変換モジュール５１２により、タスク・グラフがＳＰＴに変換される。
【００５０】
ステップ６０８では、ＳＰＴ変形モジュール５１４により、ＳＰＴが、コード化対象外ブロックの上位にＰノードが存在しなくなるように、別のＳＰＴに変換される。
【００５１】
ステップ６１０では、ＳＰＴ変形モジュール５１４により生成されたＳＰＴに基づき、ＣＰＵ割当てモジュール５１６により、各ＣＰＵに割り当てるためのコードが生成される。
【００５２】
ステップ６１２では、コンパイラ５１８により、生成されたコードがコンパイルされ、ステップ６１４では、コンパイルされたコードが実行される。
【００５３】
以下、各ステップについて詳細に説明するが、その前に、ＤＡＧ およびＳＰＴ上のノードに関する用語について定義を与えておく。
xノード : コード化対象外ノード
非xノード ：コード化対象ノード
ＳＰＴ上のノードに関する用語
ノードの順序 : 木の(Tree)左優先の深さ優先探索(Depth first search)で辿られる順番で決定する。ＳＰＴ中のある二つのノードに対して、辿られる順番が他方より早いものを前、他方より遅い方を後ろとする。
根ノード : 一般的な定義に順ずる。
葉ノード : 子ノードを持たないノード。ＤＡＧ上のノードに対応する。（一般的な定義と同じ）
内部ノード : 葉ノードでないノード  （一般的な定義と同じ）
親ノード : 一般的な定義に順ずる
子ノード : 一般的な定義に順ずる
兄ノード : 親ノードが同じノードのうち、対象ノードより前にあるノード
弟ノード : 親ノードが同じノードのうち、対象ノードより後ろにあるノード
兄弟ノード : 兄ノードおよび弟ノード  
祖父ノード : 親ノードの親ノード
曽祖父ノード : 祖父ノードの親ノード
Sノード : 子ノードの直列実行を表す内部ノード
Pノード : 子ノードの並列実行を表す内部ノード
【００５４】
また、ＳＰＴの構成に関する補足について述べると、ＳＰＴ上では、Ｓノード同士またはＰノード同士が親子関係になることはないものとする。仮に同種の内部ノードが親子関係になった場合には、当該子ノードを切り離し、当該子ノードの子ノードを順序を維持したまま親ノードに移動させる（このとき移動されるノード以下のノードも引き連れて移動するものとする）処理を自動的に適用するものとする。上記処理は、木によって表現される直列・並列実行の意味合いを変化させない。
【００５５】
以上の定義と補足に基づき、図６の各ステップを順に説明していく。先ず、モデル・データをＤＡＧのタスク・グラフに変換するステップ６０２であるが、ＤＡＧ変換モジュール５０８は、モデル・データ５０４を読み込んで、ＤＡＧのタスク・グラフに変換する。このとき、図３にあるような、スケジュールの先頭になるブロックを解釈して、自己ループのないＤＡＧ構造へと変換する。好適には、変換されたタスク・グラフのデータは、メイン・メモリ４０６上に必要な領域を確保して展開される。ＤＡＧ変換モジュール５０８は、ブロック線図として記述されたモデル・データ５０４において、入力のない機能ブロックや実行のスケジュール上先頭に来る機能ブロックを全体のソースとして、またノード間の接続を有向エッジとしてＤＡＧ（無閉路有向グラフ）を構成する。全体のシンクとなるのは、出力のない機能ブロックや実行上、最後にスケジュールされる機能ブロックなどである。
【００５６】
タスク・グラフ変形モジュール５１０が、コード化対象外ブロックを可能な範囲でマージするように、タスク・グラフを変形するステップ６０４は、タスク・グラフに対して以下の性質を持つリストスケジューリングを行い、スケジュール上で隣接するコード化対象外ノード（X）をひとつにマージする処理を行う。
【００５７】
このとき、直前にスケジュールされたノードがxであれば可能な限りxをスケジュールし、直前にスケジュールされたノードがxでなければ可能な限りxでないノードをスケジュールする。
【００５８】
ここでの目的は、タスクノードの前後関係に矛盾しない範囲でなるべくxをひとつの塊にすることである。これにより、次のステップで抽出されるＳＰＴ上で x が分散配置されて最終的なコードの分割数を増やしたり、最終的に利用(exploit)できないxとの並列性の抽出により本来利用できる並列性が抽出されない事態を極力回避する。
【００５９】
図７は、図６のステップ６０４に対応する、タスク・グラフ変形モジュール５１０の処理のフローチャートを示す図である。この処理は、xノード、非xノードをもつＤＡＧを入力とし、直列スケジュールSを出力する。直列スケジュールSは、タスク・グラフにおいて、マージされた単一のノードとして扱われる。
【００６０】
さて、図７のステップ７０２において、タスク・グラフ変形モジュール５１０は、空のリストとしてS、ＤＡＧの全ノード（未スケジュールノード集合）としてCを用意する。
【００６１】
ステップ７０４でタスク・グラフ変形モジュール５１０は、親をC中に持たないC中の非xノードの集合としてRoを、親をC中に持たないC中のxノードの集合としてRxを、それぞれ用意する。
【００６２】
ステップ７０６でタスク・グラフ変形モジュール５１０は、Ro = φ ∧ Rx = φすなわち、Roが空集合且つRxが空集合かどうか判断する。
【００６３】
そうでないなら、タスク・グラフ変形モジュール５１０は、ステップ７０８で、直前にSに加えられたノードがxノードかどうか判断し、そうならステップ７１０で、Rx = φかどうか判断する。
【００６４】
ステップ７１０でRx = φでないと判断すると、タスク・グラフ変形モジュール５１０は、ステップ７１２で、Rxから１つノードを取り出し、そのノードはRxから削除し、そのノードをSの最後に加える。更にそのノードをCから削除する。そして、ステップ７０４に戻る。
【００６５】
ステップ７１０に戻って、Rx = φであると判断すると、タスク・グラフ変形モジュール５１０は、ステップ７１４に進み、Ro = φかどうか判断する。
【００６６】
ステップ７１４でRo = φでないと判断すると、タスク・グラフ変形モジュール５１０は、ステップ７１６で、Roから１つノードを取り出し、そのノードはRoから削除し、そのノードをSの最後に加える。更にそのノードをCから削除する。そして、ステップ７０４に戻る。
【００６７】
ステップ７０８に戻って、直前にSに加えられたノードがxノードでないなら、ステップ７１４に進み、タスク・グラフ変形モジュール５１０はRo = φかどうか判断し、もしそうなら、ステップ７１０に進む。ステップ７１０での処理は、上述のとおりである。ステップ７１４でRx = φでないと判断された場合の処理も上述のとおりである。
【００６８】
こうして、ステップ７０４を経由してステップ７０６に戻った時点で、Roが空集合且つRxが空集合であると判断すると、タスク・グラフ変形モジュール５１０は、ステップ７１８で、S中で隣接するxノードを１つの集合とし、その集合毎に含まれるxノードをＤＡＧ上で１つのノードにマージする処理を行い、処理を終わる。
【００６９】
図８は、図７の処理の様子を模式的に示す図である。すなわち、図８(a)に示すようなタスク・グラフが与えられると、図７のフローチャートに示すステップ７０２〜７１６の処理で、図８(b)に示すリスト・スケジューリングが行われる。そこで、ステップ７１８の処理で、隣接するxノードを１つの集合とし、その集合毎に含まれるxノードをＤＡＧ上で１つのノードにマージすることで、図８(c)に示す変更されたタスク・グラフが得られる。
【００７０】
図９は、ＳＰＴ変換モジュール５１２の処理のフローチャートを示す図である。この処理は、図６のステップ６０６に対応する。この処理は、ＤＡＧを入力とし、ＳＰＴを出力する。
【００７１】
ステップ９０２で、ＳＰＴ変換モジュール５１２は、ＤＡＧを直列−並列グラフに変換して、それをＳＰＧとおく。ＤＡＧを直列−並列グラフに変換する処理として、例えば、A. Gonzalez Escribano, V. Cardenoso and A.J.C. van Gemund, “Conversion from NSP to SP graphs”, Tech. Rep. TR-DINFO-01-97, Universidad de Valladolid, Valladolid (Spain), 1997などに記述されている技法を使用することができる。また、ステップ９０２では、ＳＰＧの構造を解析して、ＳＰＴ（series-parallel parsed tree）を得る。
ここで、ＳＰＴ上の葉ノードはＳＰＧのノードに対応する。また、非端末（非葉）ノードはＳＰＧ上には存在しないが、間接的にノード間の接続順序を表す。
【００７２】
次にステップ９０４で、ＳＰＴ変換モジュール５１２は、ＳＰＧ上のノード数が1以下かどうか判断し、そうでないなら、ステップ９０６に進む。
【００７３】
ステップ９０６でＳＰＴ変換モジュール５１２は、以下の処理を行う。すなわち、ＳＰＧ上で直列に接続しているノードのパスを見つける。ここで、直列に接続しているノードのパスとは、親を複数持つ、または親を持たないノードから、子を複数持つ、または子を持たないノードまでの、親と子を１つずつ持つノードによって構成されるパスを指す。
【００７４】
そして、ＳＰＴ変換モジュール５１２は、各々のパスLに対して、以下の処理を行う。
ＳＰＧ上のLに属するすべてのノードを一つのノードSに置き換える（このとき、Lの外部のノードとの接続関係は維持される）。
同時に、SをＳＰＴ上の一つのノードとし、L中のノードに該当するＳＰＴ上のノードをL中での順序順にＳＰＴ上のSの子ノードとして加える。ここで、ＳＰＧ上に構成されていくノードは、対応するノードがＳＰＴ上にも構築されていくため、つねに互いに対応関係が取れる。
【００７５】
次に、ＳＰＴ変換モジュール５１２は、ステップ９０８で、ＳＰＧ上で並列関係にあるノードの集合を見つける。ここで、並列関係にあるノードの集合とは、親および子ノードが一致（存在しない場合を含む）しているノードの集合を指す。
【００７６】
また、ＳＰＴ変換モジュール５１２は、各々の集合Cに対して、以下の処理を行う。
ＳＰＧ上のCに属するすべてのノードを一つのノードPに置き換える（このとき、Pの外部のノードとの接続関係は維持される）。
同時に、PをＳＰＴ上の一つのノードとし、C中のノードに該当するＳＰＴ上のノードを、ＳＰＴ上のPの子ノードとして加える。ここでも、ＳＰＧ上に構成されていくノードは、対応するノードがＳＰＴ上にも構築されていくため、つねに互いに対応関係が取れることに留意されたい。
【００７７】
ステップ９０８の後は、ＳＰＴ変換モジュール５１２は、ステップ９０４に戻り、ＳＰＴ変換モジュール５１２は、ＳＰＧ上のノード数が1以下かどうか判断し、もしそうなら、処理を終わる。
【００７８】
図１０は、図９に示すフローチャートの処理に従い、ＤＡＧをＳＰＴに変換する例を示す図である。すなわち、図１０(a)のＤＡＧが、図１０(b)のＳＰＴに変換される。その際、ＳＰＴでは、子ノードの直列実行を表す内部ノードであるSノードと、子ノードの並列実行を表す内部ノードであるPノードが生成されていることが見て取れる。
【００７９】
参考までに、図１１は、タスク・グラフ変形モジュール５１０の変形を経ていないＤＡＧをＳＰＴに変換する例を示す図である。図１１(b)に示すＳＰＴは、図１０(b)のＳＰＴに比較して、xノードが葉ノードとして散在していることが見て取れる。
【００８０】
図１２は、ＳＰＴ変形モジュール５１４の処理のフローチャートを示す図である。この処理は、図６のステップ６０８に対応する。この処理は、ＳＰＴを入力とし、ＳＰＴを出力する。
【００８１】
ステップ１２０２で、ＳＰＴ変形モジュール５１４は、ＳＰＴの根ノードがPノードである場合、新たな根ノードとしてSノードを設け、元の根であったPノードを当該Sノードの子ノードとする。また、上位にPノードを持つＳＰＴ上のすべてのxノードの集合をXとする。
【００８２】
ステップ１２０４で、ＳＰＴ変形モジュール５１４は、Xが空集合かどうか判断する。もし空集合なら、処理を終わる。
【００８３】
もしXが空集合でないなら、ステップ１２０６に進み、ＳＰＴ変形モジュール５１４は、Xから１つの要素xを取り出す（xはXから削除）。
【００８４】
ステップ１２０８で、ＳＰＴ変形モジュール５１４は、xの親がSかどうか判断する。そうでなければ、ＳＰＴ変形モジュール５１４はステップ１２１０で、xを祖父ノードとして、親ノードの直前に移動する。このとき、ＳＰＴ上のノードを移動する場合、その子ノード以下もすべて引き連れて移動することとする。
【００８５】
ステップ１２１２で、ＳＰＴ変形モジュール５１４は、xの祖先にPノードが存在するかどうか判断する。もしそうなら、処理はステップ１２０８に戻り、そうでなければ処理はステップ１２０４に戻る。
【００８６】
ステップ１２０８に戻って、xの親がSであると判断すると、処理はステップ１２１４に進み、そこで、ＳＰＴ変形モジュール５１４は、xの兄ノードの重みの和 < xの弟ノードの重みの和であるかどうか判断する。ここで、ＳＰＴ上のノードの重みとは、そのノード以下の葉ノードの重みの和である。葉ノードは元のＤＡＧ上のノードであり、ＤＡＧ上のノードはシミュレーション・モデル中の特定の処理と対応づいている。その処理の計算時間をＤＡＧ上のノードの重みとする。
【００８７】
もしxの兄ノードの重みの和 < xの弟ノードの重みの和であると判断すると、ＳＰＴ変形モジュール５１４は、ステップ１２１６で、xの兄ノードおよびxを、順序を維持したままxの曽祖父ノードの子として、xの祖父ノードの直前に移動し、ステップ１２１２に戻る。xの兄ノードの重みの和 < xの弟ノードの重みの和ではないと判断すると、ＳＰＴ変形モジュール５１４は、ステップ１２１８で、xおよびxの弟ノードを、順序を維持したままxの曽祖父ノードの子として、xの祖父ノードの直後に移動し、ステップ１２１２に戻る。
【００８８】
ステップ１２１２からは、そこでの判断に応じて、処理はステップ１２０８またはステップ１２０４に戻る。
【００８９】
図１３は、図１２に示すフローチャートの処理に従い、ＳＰＴを変形する例を示す図である。すなわち、図１３(b)では、変形後のＳＰＴでは最早、コード化対象外ブロックxの上位にPノードが存在しないことが見て取れる。
【００９０】
参考までに、図１４は、タスク・グラフ変形モジュール５１０の変形を経ていないＤＡＧから変換されたＳＰＴ（図１４(a))を、図１２に示すフローチャートの処理に従い、変形した例を示す図である。図１４(b)ではやはり、変形後のＳＰＴでは最早、コード化対象外ブロックxの上位にPノードが存在しているが、コード化対象外ブロックxが、トップのSノードの下に分散していることが見て取れる。
【００９１】
図１５及び図１６は、ＳＰＴの変形の途中の様子を示すである。先ず、図１５(a)に示すように、コード化対象外ブロックのノードxが、Pの直下にあるなら、変形処理は、図１５(b)または図１５(c)に示すように、ノードxを、祖父ノードSの子ノードとして、親ノードPの前または後ろに移動することである。すなわち、図１５(b)がノードxを親ノードPの後ろに移動することに対応し、図１５(c)がノードxを親ノードPの前に移動することに対応する。このようにしても、依存性の違反にはならない。
【００９２】
すると、図１６のような状態に移行する。これは、図１６(a)に示すように、ノードxが、Sの直下にある場合である。この場合の変形処理は、図１６(b)または図１６(c)に示すように、ノードxと、その同一の親Sの下にある先行ノードまたは後続ノードを、曽祖父ノードSの子として、祖父ノードPの前または後ろに移動することである。図１６(b)が後続ノードを祖父ノードPの後に移動することに対応し、図１６(c)が先行ノードを祖父ノードPの前に移動することに対応する。このようにしても、依存性の違反にはならない。この際、移動の方向によってPの下から移動するノードのワークロードが異なるため、小さい方を選択して移動させる。
【００９３】
図１７は、ＣＰＵ割当てモジュール５１６が、変形された結果のＳＰＴに基づき、複数のＣＰＵに個別に割り当てるコードに対応するＳＰＴを生成する処理のフローチャートを示す図である。この処理は、図６のステップ６１０に対応する。この処理は、ＳＰＴを入力とし、ＳＰＴを出力する。以下で、maxは、利用可能なプロセッサまたはコアの数である。
【００９４】
ステップ１７０２で、ＣＰＵ割当てモジュール５１６は、ＳＰＴの根ノードの子ノードのうち、Pノードの集合としてTを用意する。
【００９５】
ステップ１７０４で、ＣＰＵ割当てモジュール５１６は、Tが空集合かどうか判断し、もしそうなら処理を終了する。そうでなければ、ステップ１７０６に進み、Tから一つのPノードqを取り出す。qはTから削除する。また、Yを、qおよび、qの下位にあるすべてのPノードの集合とする。
また、emax := 0,Umax := φ,pmax := nullとする。
【００９６】
ステップ１７０８で、ＣＰＵ割当てモジュール５１６は、Yが空集合かどうか判断し、そうでなければ、ステップ１７１０で、Yから１つのPノードpを取り出す。そしてpはYから削除する。さらに、利用可能なプロセッサ数（n）分の空集合（U1, …Un）を用意し、pの各子ノードを、各集合の重みがなるべく均等になるようU1, … Unに配分する（このために bin packing algorithmなどを利用する）
また、以下の変数を用意する。
m := 配分された集合ごとに属するノードの重みの和を計算し、その中で最大の値
e := pの全子ノードの重みの和 - m
emax < e なら emax := e, Umax = {U1, …, Un} , pmax := p とする。この後、処理は、ステップ１７０８に戻る。
【００９７】
そこで、ステップ１７０８に戻って、Yが空集合であると判断されると、ＣＰＵ割当てモジュール５１６は、ステップ１７１２で、l := q の下位の葉ノードで、pmaxの下位でない葉ノードの内、pmaxよりも前の葉ノードのリストとする。
また、r := q の下位の葉ノードで、pmax の下位でない葉ノードの内、pmaxよりも後ろの葉ノードのリストとする。
こうしておいて、ＣＰＵ割当てモジュール５１６は、lに含まれる葉ノードを根ノードの子ノードとしてqの直前に、rに含まれる葉ノードを根ノードの子ノードとして qの直後にリスト内の順序を維持したまま移動する。そして、qをpmaxで置き換える。
そしてさらに、ＣＰＵ割当てモジュール５１６は、以下の処理を行う。
pmaxの子ノードを切り離す（一度子ノードがいない状態になる）。
Umaxの要素のうち、空でない各集合Uiに対し、新しいSノードをpmaxの子ノードとして作成する。
各 Uiに含まれるすべてのノードの下位の葉ノードを、順序関係を維持したまま対応するSノードの子ノードとする。
【００９８】
このステップ１７１２の処理が終わると、処理はステップ１７０４に戻る。そして、Tが空集合でないなら、ステップ１７０６に進み、Tが空集合であると判断されると、処理は終了する。この処理の結果、Umax = {U1, …, Un}の各々にＳＰＴが与えられる。
【００９９】
この処理が終わると、出力となるＳＰＴは、以下のような構造となる。
根ノードがSノード
根ノードの子ノードは葉ノード（すなわちオリジナルのＤＡＧ上のノード）またはPノード
当該Pノードの子ノードの数はプロセッサ数n以下
当該Pノードの子ノードはすべてSノードで、葉ノードのみをその子ノードに持つ
ＳＰＴ上に存在するすべてのPノードの子ノードの数はプロセッサ数以下であるため、各子ノード以下の葉ノード（元のＤＡＧ上のノード）をどのようにプロセッサに配分するかを示した構造になっている。
根ノードの子ノードのうち、連続する非xノードである葉ノード、および各Pノードが一つのコード化の単位となる。
【０１００】
こうして、図６のステップ６１２では、Umax = {U1, …, Un}の各々にＳＰＴがコードに展開されて、実行可能ファイルにコンパイルされ、ステップ６１４で個別のプロセッサまたはコアに割り当てられて実行される。この際、U1, …, Unのうちの、コード化対象外コードを含む要素は、実行可能ファイルにコンパイルにされず、MATLAB(R)/Simulink(R)のインタープリターにより実行されることになる。
【０１０１】
以上説明した実施例において、タスク・グラフをＳＰＴに変換する前に、コード化対象外コードをマージするように、タスク・グラフを変形するようにしたが、これは望ましい処理ではあるが必須ではなく、タスク・グラフを変形する処理を省略しても、コンパイル結果の実行速度向上の効果は得られることを理解されたい。
【０１０２】
以上、この発明を特定の実施例に基づき説明してきたが、この発明は、この特定の実施例に限定されず、当業者が自明に思いつく様々な変形、置換などの構成、技法適用可能であることを理解されたい。例えば、特定のプロセッサのアーキテクチャ、オペレーティング・システムなどに限定されない。
【０１０３】
また、上記実施例は、MATLAB(R)/Simulink(R)を例にとって説明したが、これに限らず、任意のモデリング・ツールに適用可能であることを、この技術分野の当業者なら理解するであろう。
【符号の説明】
【０１０４】
３０２  コード化対象外ブロック
４０６  メイン・メモリ
４１６  ハードティスク・ドライブ
５０２  シミュレーション・モデリング・ツール
５０４  モデル・データ
５０８  ＤＡＧ変換モジュール
５１０  タスク・グラフ変形モジュール
５１２  ＳＰＴ変換モジュール
５１４  ＳＰＴ変形モジュール
５１６  ＣＰＵ割当てモジュール
５１８  コンパイラ
５２０  実行環境
【図１】
0005775386.tif 000002
【図２】
0005775386.tif 000003
【図３】
0005775386.tif 000004
【図４】
0005775386.tif 000005
【図５】
0005775386.tif 000006
【図６】
0005775386.tif 000007
【図７】
0005775386.tif 000008
【図８】
0005775386.tif 000009
【図９】
0005775386.tif 000010
【図１０】
0005775386.tif 000011
【図１１】
0005775386.tif 000012
【図１２】
0005775386.tif 000013
【図１３】
0005775386.tif 000014
【図１４】
0005775386.tif 000015
【図１５】
0005775386.tif 000016
【図１６】
0005775386.tif 000017
【図１７】
0005775386.tif 000018