(57)【要約】【課題】プログラムに応じた組み込みシステムの最適化を図りつつ、設計者の設計負担の軽減および設計期間の短縮化を図ること。【解決手段】取得部により設定情報を取得して記憶装置に記憶し（ステップＳ１００１）、対象プログラムコードを読み込んで記憶装置に記憶する（ステップＳ１００２）。そして、分割部により対象プログラムコードを解析してタスク分割して、分割されたタスクを記憶装置に記憶する（ステップＳ１００３）。このあと、プログラムパターン割当処理（ステップＳ１００４）およびスケジューリング処理（ステップＳ１００５）を実行し、最後に、出力部により、最適な組み合わせパターンを出力する（ステップＳ１００６）。【選択図】図１０
2010113384.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータを、
対象プログラムコードを複数のタスクに分割する分割手段、
前記分割手段によって得られた各タスクを実行する演算要素の種別に基づいて、前記各タスクの実行時間に応じた実行コストを算出するタスク実行コスト算出手段、
前記タスクの実行順序をあらわす組み合わせパターンを生成する生成手段、
前記タスク実行コスト算出手段によって算出された実行コストに基づいて、前記生成手段によって生成された各組み合わせパターンの実行時間に応じた総実行コストを算出する総実行コスト算出手段、
前記総実行コスト算出手段によって算出された総実行コストに基づいて、前記組み合わせパターン群の中から特定の組み合わせパターンを決定する決定手段、
前記決定手段によって決定された決定結果を出力する出力手段、
として機能させることを特徴とする設計支援プログラム。
【請求項２】
前記コンピュータを、
前記演算要素の種別および当該演算要素に実行させる最適化処理に関する設定情報を取得する取得手段、
前記取得手段によって取得された設定情報に含まれる演算要素の種別により前記最適化処理が実行可能なタスクを前記複数のタスクの中から抽出する抽出手段として機能させ、
前記タスク実行コスト算出手段は、
前記設定情報に基づいて、前記抽出手段によって抽出されたタスクの実行時間に応じた実行コストを算出することを特徴とする請求項１に記載の設計支援プログラム。
【請求項３】
前記タスク実行コスト算出手段は、
さらに、前記演算要素間のデータ転送時間に応じた転送コストを算出し、
前記総実行コスト算出手段は、
前記タスク実行コスト算出手段によって算出された実行コストおよび転送コストに基づいて、前記各組み合わせパターンの実行時間に応じた総実行コストを算出することを特徴とする請求項１または２に記載の設計支援プログラム。
【請求項４】
対象プログラムコードを複数のタスクに分割する分割手段と、
前記分割手段によって得られた各タスクを実行する演算要素の種別に基づいて、前記各タスクの実行時間に応じた実行コストを算出するタスク実行コスト算出手段と、
前記タスクの実行順序をあらわす組み合わせパターンを生成する生成手段と、
前記タスク実行コスト算出手段によって算出された実行コストに基づいて、前記生成手段によって生成された各組み合わせパターンの実行時間に応じた総実行コストを算出する総実行コスト算出手段と、
前記総実行コスト算出手段によって算出された総実行コストに基づいて、前記組み合わせパターン群の中から特定の組み合わせパターンを決定する決定手段と、
前記決定手段によって決定された決定結果を出力する出力手段と、
を備えることを特徴とする設計支援装置。
【請求項５】
中央処理装置および記憶装置を備えるコンピュータが、
前記中央処理装置により、対象プログラムコードを複数のタスクに分割して、当該複数のタスクを前記記憶装置に記憶する分割工程と、
前記中央処理装置により前記記憶装置にアクセスして、前記分割工程によって得られた各タスクを実行する演算要素の種別に基づいて、前記各タスクの実行時間に応じた実行コストを算出して、当該実行コストを前記記憶装置に記憶するタスク実行コスト算出工程と、
前記中央処理装置により、前記タスクの実行順序をあらわす組み合わせパターンを生成して、当該組み合わせパターンを前記記憶装置に記憶する生成工程と、
前記中央処理装置により前記記憶装置にアクセスして、前記タスク実行コスト算出工程によって算出された実行コストに基づいて、前記生成工程によって生成された各組み合わせパターンの実行時間に応じた総実行コストを算出して、当該総実行コストを前記記憶装置に記憶する総実行コスト算出工程と、
前記中央処理装置により前記記憶装置にアクセスして、前記総実行コスト算出工程によって算出された総実行コストに基づいて、前記組み合わせパターン群の中から特定の組み合わせパターンを決定して、その決定結果を前記記憶装置に記憶する決定工程と、
前記中央処理装置により前記記憶装置にアクセスして、前記決定工程によって決定された決定結果を出力する出力工程と、
を実行することを特徴とする設計支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、組み込みシステムの最適化を支援する設計支援プログラム、設計支援装置、および設計支援方法に関する。
【背景技術】
【０００２】
従来から、組み込みシステムには、多機能・高性能に対して強い要求があるが、動作周波数を向上させるという手法では、消費電力が大きくなりすぎるため、複数のプロセッシングエレメント（ＰＥ）からなるシステムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ）であるマルチコアが用いられるようになった。それらの機能は、独立に動くことができるものもあれば、依存して動作するものもある。
【０００３】
またプログラムの構造や要求される性能も異なる。これらに対応するために、プロセッサの他に、メディア演算を得意とするＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｎｇａｌ  Ｐｒｏｃｅｓｓｏｒ）や、特定の命令に対して構成を変更することで高速に処理することを可能とするＲｅｃｏｎｆ（Ｒｅｃｏｎｆｉｇｕｒａｂｌｅ  Ｐｒｏｃｅｓｓｏｒ）などのアクセラレータ・専用ハードウェアなどの異なる種類のコアを複数搭載したヘテロジニアスマルチコア（Ａｓｙｍｍｅｔｒｉｃ  Ｍｕｌｔｉ−Ｃｏｒｅ  Ｐｒｏｃｅｓｓｏｒ。以下、「ＡＭＰ」）が多く使われている。
【０００４】
そのようなＡＭＰの性能を引き出すためには、ＡＭＰに搭載しているＰＥの特性を理解し、プログラム中から機能を抽出しその処理に最適なＰＥをマッピングすることおよび並列処理を行うなどのソフトウェアの最適化が必要となる。
【０００５】
ハイパフォーマンスコンピューティング（以下、「ＨＰＣ」）の分野において、同じ種類の複数のプロセッサを搭載したシステムとして、ホモジニアスマルチコア（Ｓｙｍｍｅｔｒｉｃ  Ｍｕｌｔｉ−Ｃｏｒｅ  Ｐｒｏｃｅｓｓｏｒ。以下、「ＳＭＰ」）における並列化の研究が行われてきた。ＳＭＰにおける並列化では、各プロセッサにおける処理負荷の均一性が性能向上の鍵を握っており、処理負荷の均一性を抽出しやすいループ並列性についての多くの研究が行われてきた。
【０００６】
ＳＭＰで行われてきたループ並列性を基にした並列処理では、ＰＥによって性能の異なるＡＭＰの性能を引き出すことは難しい。ＡＭＰではプログラムを解析し、その中から処理を抽出しそれに最適なＰＥをマッピングすることおよび並列処理を行うなどのソフトウェアの最適化が必要となる。シングルプロセッサ＋ハードウェアアクセラレータという構成においても、重たい処理をハードウェアアクセラレータに割り当てるということは行われてきた。
【０００７】
また既存資産を継承するために、要求された機能を分析しソフトウェア・ハードウェアに切り分け、それらの機能を持つＩＰ（Ｉｎｔｅｌｌｅｃｔｕａｌ  Ｐｒｏｐｅｒｔｙ）を集積し開発を行うという手法も行われてきた。しかしＡＭＰのようにソフトウェア処理をするＰＥが複数異なる種類搭載される場合には、解析の複雑さは急激に増大する。なおかつ、プログラムの規模が数百Ｋｓｔｅｐ〜１０００Ｋｓｔｅｐとも言われ今後拡大の一途を辿っていく上に、その規模で複雑な構造となっている組み込みソフトに対しては人手による解析はほぼ不可能である。このため、自動解析により最適化する方法が開示されている。
【０００８】
【特許文献１】特開２００７−３２８４１５号公報
【非特許文献１】中田育男著  「コンパイラの構成と最適化」  朝倉書店出版  １９９９年９月  ｐ２７０〜ｐ２８８
【発明の開示】
【発明が解決しようとする課題】
【０００９】
上述した従来技術では、プログラムを定義されているタスク分割ルールに基づいて、複数のタスクに分割し、対象のＡＭＰにおいてスケジューリングによって最適なコアを割り当てる形式を取っている。そのため、ＡＭＰの構成に変更があってもタスク分割結果は変更されない。
【００１０】
それに対して、この発明ではコアの特性に沿ったプログラムパターンをプログラム中から抽出して割り当てる形式を取っている。コア毎にパターンが異なり、新規にコアを追加する場合には、パターンも新たに追加される。この手法によって対象のＡＭＰのコアの特性を最大限に発揮することが出来る。また専用ハードウェアで処理すべき箇所の抽出も可能であり、ソフトウェアでの処理とハードウェアでの処理を自動的に分割することも可能である。
【００１１】
このようにプログラムに応じた組み込みシステムの最適化と設計者の設計負担の軽減および設計期間の短縮化とを図ることができる設計支援プログラム、設計支援装置、および設計支援方法を提供することを目的とする。
【課題を解決するための手段】
【００１２】
上述した課題を解決し、目的を達成するため、この設計支援プログラム、設計支援装置、および設計支援方法は、対象プログラムコードを複数のタスクに分割し、各タスクを実行する演算要素の種別に基づいて、前記各タスクの実行時間に応じた実行コストを算出し、前記タスクの実行順序をあらわす組み合わせパターンを生成し、実行コストに基づいて、各組み合わせパターンの実行時間に応じた総実行コストを算出し、総実行コストに基づいて、前記組み合わせパターン群の中から特定の組み合わせパターンを決定し、決定結果を出力することを要件とする。
【発明の効果】
【００１３】
この設計支援プログラム、設計支援装置、および設計支援方法によれば、プログラムに応じた組み込みシステムの最適化を図りつつ、設計者の設計負担の軽減および設計期間の短縮化を図ることができるという効果を奏する。
【発明を実施するための最良の形態】
【００１４】
以下に添付図面を参照して、この設計支援プログラム、設計支援装置、および設計支援方法の好適な実施の形態を詳細に説明する。この設計支援プログラム、設計支援装置、および設計支援方法は、組み込みシステムで実行されるプログラムをタスク分割してコストを算出し、タスクの実行順序をスケジューリングしてコストが最小となるパターンを得ることで、組み込みシステムを最適化し、性能の向上を図る技術である。
【００１５】
（設計支援装置のハードウェア構成）
図１は、本実施の形態にかかる設計支援装置のハードウェア構成を示すブロック図である。図１において、設計支援装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）１０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０３と、磁気ディスクドライブ１０４と、磁気ディスク１０５と、光ディスクドライブ１０６と、光ディスク１０７と、ディスプレイ１０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）１０９と、キーボード１１０と、マウス１１１と、スキャナ１１２と、プリンタ１１３と、を備えている。また、各構成部はバス１００によってそれぞれ接続されている。
【００１６】
ここで、ＣＰＵ１０１は、設計支援装置の全体の制御を司る中央処理装置である。ＲＯＭ１０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ１０３は、ＣＰＵ１０１のワークエリアとして使用される。磁気ディスクドライブ１０４は、ＣＰＵ１０１の制御にしたがって磁気ディスク１０５に対するデータのリード／ライトを制御する。磁気ディスク１０５は、磁気ディスクドライブ１０４の制御で書き込まれたデータを記憶する。
【００１７】
光ディスクドライブ１０６は、ＣＰＵ１０１の制御にしたがって光ディスク１０７に対するデータのリード／ライトを制御する。光ディスク１０７は、光ディスクドライブ１０６の制御で書き込まれたデータを記憶したり、光ディスク１０７に記憶されたデータをコンピュータに読み取らせたりする。
【００１８】
ディスプレイ１０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ１０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００１９】
インターフェース（以下、「Ｉ／Ｆ」と略する。）１０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク１１４に接続され、このネットワーク１１４を介して他の装置に接続される。そして、Ｉ／Ｆ１０９は、ネットワーク１１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ１０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００２０】
キーボード１１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス１１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００２１】
スキャナ１１２は、画像を光学的に読み取り、設計支援装置内に画像データを取り込む。なお、スキャナ１１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ１１３は、画像データや文書データを印刷する。プリンタ１１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【００２２】
（設計支援装置の機能的構成）
図２は、本実施の形態にかかる設計支援装置の機能的構成を示すブロック図である。設計支援装置２００は、分割部２０１と、取得部２０２と、抽出部２０３と、タスク実行コスト算出部２０４と、生成部２０５と、総実行コスト算出部２０６と、決定部２０７と、出力部２０８と、を含む構成である。この制御部となる機能（分割部２０１〜出力部２０８）は、具体的には、たとえば、図１に示したＲＯＭ１０２、ＲＡＭ１０３、磁気ディスク１０５、光ディスク１０７などの記憶装置に記憶されたプログラムをＣＰＵ１０１に実行させることにより、または、Ｉ／Ｆ１０９により、その機能を実現する。
【００２３】
分割部２０１は、組み込みシステムで実行させたい対象プログラムコードを複数のタスクに分割する機能を有する。組み込みシステムとは、複数種のコア（演算要素）を備えており、たとえば、プロセッサ、リコンフィグ回路、ＤＳＰなどの演算要素を有する。分割部２０１では、対象プログラムコードを、制御文単位のブロックに機能的に分割する。分割された個々のブロックをタスクと呼ぶ。この分割部２０１による分割は、周知の手法により実現する。
【００２４】
図３は、対象プログラムコードの一記述例を示す説明図である。ここでは、３つのｆｏｒブロックからなる対象プログラムコード３００を例に挙げている。図４は、図３に示した対象プログラムコード３００の分割例を示す説明図である。図４では、タスクＴ１〜Ｔ３に分割されることとなる。
【００２５】
取得部２０２は、組み込みシステムに組み込まれている演算要素の種別および当該演算要素に実行させる最適化処理に関する設定情報を取得する機能を有する。ユーザが、所定の入力画面に設定情報をマウス１１１やキーボード１１０を操作して入力することで、設定情報を記憶装置に保存する。
【００２６】
図５〜図７は、入力画面の一例を示す説明図である。この入力画面５００は、演算要素ごとにタブ５０１〜５０３が表示され、タブを指定することで、指定されたタブにより特定される演算要素の設定情報（最適化手法、実行制約、パラメータ）の入力領域５０４〜５０６が表示される。そして、ＯＫボタン５０７をクリックすることで、設定情報が記憶装置に記憶されることとなる。
【００２７】
図５は、プロセッサのタブ５０１が指定されたときの入力画面５００である。最適化手法には、「ループ並列処理」や「ＶＬＩＷ命令」などのチェックボックスが表示されている。そして、マウス１１１やキーボード１１０を操作してチェックを入れることで、所望の最適化手法を設定することができる。また、「ＶＬＩＷ命令」については、並列数も必要になるため、マウス１１１やキーボード１１０を操作して数値を入力することとなる。実行制約は、最適化手法を指定することで自動でチェックが入力される。パラメータについては、マウス１１１やキーボード１１０を操作して数値を入力することとなる。
【００２８】
図６は、ＤＳＰのタブ５０２が指定されたときの入力画面５００である。最適化手法には、「ＳＩＭＤ化」などのチェックボックスが表示されている。そして、マウス１１１やキーボード１１０を操作してチェックを入れることで、所望の最適化手法を設定することができる。また、「ＳＩＭＤ化」については、型ごとに並列数も必要になるため、マウス１１１やキーボード１１０を操作して数値を入力することとなる。実行制約は、最適化手法を指定することで自動でチェックが入力される。パラメータについては、マウス１１１やキーボード１１０を操作して数値を入力することとなる。
【００２９】
図７は、リコンフィグ回路のタブ５０３が指定されたときの入力画面５００である。最適化手法には、「ｆｏｒブロックのパイプライン処理」や「ｉｆブロックの同時処理」、「ｓｗｉｔｃｈブロックの同時処理」などのチェックボックスが表示されている。そして、マウス１１１やキーボード１１０を操作してチェックを入れることで、所望の最適化手法を設定することができる。実行制約は、最適化手法を指定することで自動でチェックが入力される。パラメータについては、マウス１１１やキーボード１１０を操作して数値を入力することとなる。このようにして入力された情報が設定情報として記憶装置に記憶されることとなる。
【００３０】
図８は、設定情報のデータ構造を示す説明図である。設定情報は、演算要素（ＰＥ）種、パラメータ、対象ブロック、最適化手法、実行制約を有する。ＰＥ種には、タブにより指定されたＰＥ種（プロセッサ、ＤＳＰ、リコンフィグ回路）が記憶される。パラメータには、その入力領域に入力された数値（ＰＥの使用個数、動作周波数など）が記憶される。
【００３１】
対象ブロックには、最適化手法が適用されるブロック（タスク）の種別（ｆｏｒ，ｉｆ−ｅｌｓｅ，ｓｗｉｔｃｈ−ｃａｓｅ）が記憶される。対象ブロックの種別は、最適化手法により一意に決定される。たとえば、最適化手法が「ループ並列性」である場合には、対象ブロックは「ｆｏｒ」となる。
【００３２】
最適化手法には、チェックボックスにより指定された最適化手法が記憶される。また、並列数の数値が入力されている場合にはその数値も記憶する。実行制約には、チェックボックスにより指定された最適化手法の実行制約が記憶される。実行制約は、最適化手法により一意に決定される。たとえば、ＰＥ種が「リコンフィグ回路」で最適化手法が「パイプライン」である場合には、「（ループヘッダの）正規化」、「完全ネスト」、「ループ繰越依存」といった実行制約となる。
【００３３】
抽出部２０３は、取得部２０２によって取得された設定情報に含まれる演算要素の種別により最適化処理が実行可能なタスクを複数のタスクの中から抽出する機能を有する。具体的には、たとえば、あらかじめ用意されたプログラムパターンを抽出するための解析ルーチンの中から設定情報に合致するプログラムパターンを選択する。そして、選択されたプログラムパターンに該当するタスクを複数のタスクの中から抽出する。抽出されたタスクは、記憶装置に記憶される。
【００３４】
たとえば、ＰＥ種が「リコンフィグ回路」で最適化手法が「パイプライン」である場合には、パイプライン処理に関する解析ルーチンが選択され、対象プログラムコード３００を、分割されたタスクごとに解析する。この解析ルーチンは、パイプライン処理の実行制約である「（ループヘッダの）正規化」、「完全ネスト」、「ループ繰越依存」の解析を含む。この解析ルーチンにより、分割された複数のタスクの中から、リコンフィグ回路に割り当てられるタスクを抽出する。このように、タスクが抽出された場合、そのタスクは最適化手法を実行する演算要素により実行されることとなる。
【００３５】
タスク実行コスト算出部２０４は、分割部２０１によって得られた各タスクを実行する演算要素の種別に基づいて、各タスクの実行時間に応じた実行コストを算出する機能を有する。具体的には、設定情報に基づいて、抽出部２０３によって抽出されたタスクの実行時間に応じた実行コストを算出する。ここで、実行コストとは、タスクの実行時間に比例する値であり、実行コストが高いほどそのタスクの実行時間は長くなり、実行コストが低いほどそのタスクの実行時間は短くなる。プロセッサの実行コストは下記式（１）により算出される。
【００３６】
Ｃ＝ｓ×ｃ×Ｌ／ｆ・・・（１）
ここで、Ｃは実行コストであり、ｓは対象となるタスクのステートメント数であり、ｃは演算数であり、Ｌは対象となるタスクのループ回転数であり、ｆは対象となる演算要素のクロック周波数（設定情報の動作周波数）である。ｃは定数であり、以下、ｃ＝５とする。
【００３７】
たとえば、図４に示したタスクＴ１をプロセッサが実行する場合の実行コストＣ（Ｔ１）は、ｆ＝５００［ＭＨｚ］とすると、
ｓ＝１
ｃ＝５
Ｌ＝２０×１０より、
Ｃ（Ｔ１）＝２［μｓ］となる。同様に、タスクＴ２，Ｔ３についても、
Ｃ（Ｔ２）＝０．５［μｓ］、Ｃｐ（Ｔ３）＝０．５［μｓ］となる。
【００３８】
また、ＤＳＰ／プロセッサの実行コストは、下記式（２）により算出される。
【００３９】
Ｃ＝ｓ×ｃ×Ｌ／（ｆ×ｐ）・・・（２）
ここで、ＣはＤＳＰ／プロセッサのＳＩＭＤ／ＶＬＩＷによる並列処理による実行コストであり、ｓは対象となるタスクのステートメント数であり、ｐは、ＳＩＭＤ／ＶＬＩＷによる並列処理の並列数である。
【００４０】
たとえば、図４に示したタスクＴ１をＤＳＰ／プロセッサがＳＩＭＤ演算処理／ＶＬＩＷ処理を実行する場合の実行コストＣ（Ｔ１）は、ｆ＝５００［ＭＨｚ］とすると、
ｓ＝１
ｃ＝５
Ｌ＝２０×１０
ｐ＝８より、
Ｃ（Ｔ１）＝０．２５となる。同様に、タスクＴ２，Ｔ３についても、
Ｃ（Ｔ２）＝０．０６２５［μｓ］、Ｃ（Ｔ３）＝０．０６２５［μｓ］となる。
【００４１】
また、対象となるタスクがＳＩＭＤ／ＶＬＩＷの両並列処理を実行する場合、双方の並列数で除算する。
【００４２】
たとえば、図４に示したタスクＴ１をＤＳＰがＳＩＭＤ演算処理を実行し、プロセッサがＶＬＩＷ処理を実行する場合の実行コストＣは、ＳＩＭＤの並列数ｐ＝８、ＶＬＩＷの並列数ｐ＝４とすると、Ｃ（Ｔ１）＝０．０６２５［μｓ］となる。
【００４３】
なお、ＶＬＩＷ処理では命令レベルでの並列処理を行うため、詳細な見積もりを行うにはｎａｔｉｖｅ  ｃｏｍｐｉｌｅｒを用いての見積もりが必要となる。しかし、大まかな精度で十分な場合には、この見積もり手法を適用する。
【００４４】
また、リコンフィグ回路の実行コストは、下記式（３）により算出される。
【００４５】
Ｃ＝Ｌ／ｆ＋ｒ・・・（３）
ここで、Ｃはリコンフィグ回路の実行コストであり、ｒは、動的再構成コストである。なお、ｒが１〜数クロックである場合には、Ｌ／ｆに対して無視できる。以下、ｒ＝０とする。
【００４６】
たとえば、図４に示したタスクＴ１をリコンフィグ回路が実行する場合の実行コストＣ（Ｔ１）は、ｆ＝５００［ＭＨｚ］とすると、
Ｌ＝２０×１０より、
Ｃ（Ｔ１）＝０．４［μｓ］となる。同様に、タスクＴ２，Ｔ３についても、
Ｃ（Ｔ２）＝０．１［μｓ］、Ｃ（Ｔ３）＝０．１［μｓ］となる。
【００４７】
また、タスク実行コスト算出部２０４は、演算要素間のデータ転送時間に応じた転送コストも算出する。ＤＳＰやリコンフィグ回路で実行する場合、または、複数のプロセッサにより並列実行する場合、データ転送がおこなわれるため、転送コストが必要となる。転送コストは、下記式（４）により算出される。
【００４８】
Ｃｔ＝ｄ／ｂｔ・・・（４）
ここで、ｄはデータ転送量であり、ｂｔはバススループットである。データ転送量ｄはそのタスクのループ回転数Ｌ×並列数ｐである。ＳＩＭＤ／ＶＬＩＷでない場合は、ｐ＝１とする。バススループットｂｔは、たとえば、６４ｂｉｔ、１６６ＭＨｚの場合は、６４×１６６＝１０６２４となる。
【００４９】
このように、プログラムパターンに該当するタスクとして抽出されたタスクは、その実行主体である演算要素およびその実行コスト（転送コストを用いる場合は転送コストも含む）とともに、割当情報として、記憶装置に記憶される。図９は、割当情報のデータ構造を示す説明図である。
【００５０】
図２において、生成部２０５は、タスクの実行順序をあらわす組み合わせパターンを生成する機能を有する。具体的には、たとえば、割当情報を参照することで、演算要素とその演算要素に割り当てられたタスクが特定されるため、これらのタスクが該当する演算要素により時系列（直列）または並列に実行される順序となる組み合わせパターンを構築する。組み合わせパターンは、可能な限りすべてのパターンを網羅するように生成する。組み合わせパターンの生成例については後述する。
【００５１】
総実行コスト算出部２０６は、タスク実行コスト算出部２０４によって算出された実行コストに基づいて、生成部２０５によって生成された各組み合わせパターンの実行時間に応じた総実行コストを算出する機能を有する。具体的には、たとえば、組み合わせパターンを構成するタスクの実行コストを集計する。より具体的には、直列に実行されるタスクはその実行コストを集計する。並列に分岐している場合は、分岐先の実行コストの合計が最大となる方を採用して、総実行コストを集計する。また、データ転送が発生している箇所については転送コストも加算する。総実行コストの具体的な算出例については後述する。
【００５２】
決定部２０７は、総実行コスト算出部２０６によって算出された総実行コストに基づいて、組み合わせパターン群の中から特定の組み合わせパターンを決定する機能を有する。具体的には、たとえば、総実行コストが最小となる組み合わせパターンを最適な組み合わせパターンに決定する。これにより、組み込みシステムの実行時間が最短となるため、組み込みシステムの最適化を図ることができる。
【００５３】
また、総実行コストが所定のしきい値以下となる組み合わせパターンを最適な組み合わせパターンに決定することとしてもよい。これにより、ユーザの許容限度の組み合わせパターンが得られるため、組み合わせパターンの選択枝が増えることとなる。また、いずれの場合でも、総実行コストが同一の値である場合、演算要素の使用個数が少ない方を最適な組み合わせパターンとしてもよい。これにより、消費電力の低減化を図ることができる。なお、最適な組み合わせパターンは、記憶装置に記憶される。
【００５４】
出力部２０８は、決定部２０７によって決定された決定結果を出力する機能を有する。具体的には、たとえば、最適な組み合わせパターンをディスプレイ１０８に渡すことにより、ディスプレイ１０８の表示画面に最適な組み合わせパターンを表示させる。また、Ｉ／Ｆ１０９に渡すことにより、他のコンピュータに送信する。
【００５５】
（設計支援処理手順）
図１０は、本実施の形態にかかる設計支援処理手順を示すフローチャートである。まず、取得部２０２により設定情報を取得して記憶装置に記憶し（ステップＳ１００１）、対象プログラムコード３００を読み込んで記憶装置に記憶する（ステップＳ１００２）。対象プログラムコード３００の読み込みは、設定情報の取得（ステップＳ１００１）に先立って実行してもよい。
【００５６】
そして、分割部２０１により対象プログラムコード３００を解析してタスク分割して、分割されたタスクを記憶装置に記憶する（ステップＳ１００３）。このあと、プログラムパターン割当処理（ステップＳ１００４）およびスケジューリング処理（ステップＳ１００５）を実行し、最後に、出力部２０８により、最適な組み合わせパターンを出力する（ステップＳ１００６）。
【００５７】
図１１は、プログラムパターン割当処理（ステップＳ１００４）の詳細な処理手順を示すフローチャートである。まず、未処理のＰＥ種があるか否かを判断し（ステップＳ１１０１）、未処理のＰＥ種がある場合（ステップＳ１１０１：Ｙｅｓ）、未処理のＰＥ種を１つ選択する（ステップＳ１１０２）。つぎに、選択ＰＥ種に応じた設定情報を読み込み（ステップＳ１１０３）、解析ルーチンを呼び出す（ステップＳ１１０４）。
【００５８】
解析ルーチンは、該当する最適化手法により呼び出されるプログラムパターンの抽出アルゴリズムである。解析ルーチンは複数呼び出される場合もある。最後に、解析実行処理（ステップＳ１１０５）をおこなう。解析実行処理では、呼び出された解析ルーチンを実行する。解析ルーチンが複数呼び出された場合は、順次実行することとなる。そして、ステップＳ１１０１に戻る。ステップＳ１１０１において、未処理のＰＥ種がない場合（ステップＳ１１０１：Ｎｏ）、ステップＳ１００５に移行する。
【００５９】
図１２は、解析実行処理（ステップＳ１１０５）の詳細な処理手順を示すフローチャートである。まず、未処理の解析ルーチンがあるか否かを判断し（ステップＳ１２０１）、未処理の解析ルーチンがある場合（ステップＳ１２０１：Ｙｅｓ）、未処理の解析ルーチンを１つ選択し（ステップＳ１２０２）、選択解析ルーチンを実行する（ステップＳ１２０３）。そして、ステップＳ１２０１に戻る。ステップＳ１２０１において、未処理の解析ルーチンがない場合（ステップＳ１２０１：Ｎｏ）、ステップＳ１１０１に戻る。
【００６０】
つぎに、解析ルーチンの具体例について説明する。図１３〜図２０は、各種解析ルーチンの実行処理手順を示すフローチャートである。以下、個別に説明する。
【００６１】
図１３は、ｆｏｒブロックのループ並列処理に関するプログラムパターン抽出処理手順を示すフローチャートである。この解析ルーチンは、ｆｏｒブロックのタスクをプロセッサに割り当てるための解析ルーチンである。
【００６２】
まず、分割された全ブロック（タスク）の探索が終了したか否かを判断する（ステップＳ１３０１）。探索が終了していない場合（ステップＳ１３０１：Ｎｏ）、探索された対象ブロックを選択し（ステップＳ１３０２）、ｆｏｒブロックであるか否かを判断する（ステップＳ１３０３）。ｆｏｒブロックでない場合（ステップＳ１３０３：Ｎｏ）、ステップＳ１３０１に戻る。一方、ｆｏｒブロックである場合（ステップＳ１３０３：Ｙｅｓ）、正規化可能であるか否かを判断する（ステップＳ１３０４）。
【００６３】
ここで、正規化とは、ループヘッダを“ｆｏｒ（ｉ＝０；ｉ  ｏｐ（比較演算）定数；ｉ＋＋）”の形に変換する処理である。ステップＳ１３０４では、ループの実行前にその形に変換可能か否かを判断する。上記の形に変換できないと実行時にループの回転数が分からないためにＮＧとする。
【００６４】
正規化可能でない場合（ステップＳ１３０４：Ｎｏ）、ステップＳ１３０１に戻る。一方、正規化可能である場合（ステップＳ１３０４：Ｙｅｓ）、ループ繰越依存があるか否かを判断する（ステップＳ１３０５）。ここで、あるイタレーション（ｉ＝ｉ０）での結果を他のイタレーション（ｉ＝ｉ１）で利用する場合など、異なるイタレーション間で同じデータの定義・参照を行う場合、ループ繰越依存があるという。
【００６５】
イタレーションごとに異なるコア（演算要素）に処理を割り当てた場合、実行順序が保証されないため、逐次実行した場合と異なる結果になる可能性があるからである。したがって、ループ繰越依存がない場合（ステップＳ１３０５：Ｎｏ）、ステップＳ１３０１に戻る。一方、ループ繰越依存がある場合（ステップＳ１３０５：Ｙｅｓ）、タスク実行コスト算出部２０４により、コスト見積もりをおこなう（ステップＳ１３０６）。すなわち、対象ブロックの実行コストや転送コストを算出する。
【００６６】
そして、割り当てに見合うコストか否かを判断する（ステップＳ１３０７）。具体的には、「ループの実行コスト＋転送コスト＋呼び出しオーバーヘッド」が「逐次実行した場合のコスト」よりも大きくなってしまった場合、処理を割り当てることはかえって性能劣化の原因となる。このため、「ループの実行コスト＋転送コスト＋呼び出しオーバーヘッド」＜「逐次実行した場合のコスト」となる場合、割り当てに見合うコストとする。たとえば、対象ブロックのループ回転数が非常に小さいと実行コストも小さくなるため、割り当てに見合わなくなる。
【００６７】
そして、割り当てに見合わない場合（ステップＳ１３０７：Ｎｏ）、ステップＳ１３０１に戻る。一方、割り当てに見合う場合（ステップＳ１３０７：Ｙｅｓ）、対象ブロックをプロセッサに割当可能なタスクに決定する（ステップＳ１３０８）。たとえば、対象ブロックに割当フラグを設定する。そして、ステップＳ１３０１に戻る。ステップＳ１３０１において、探索が終了した場合（ステップＳ１３０１：Ｙｅｓ）、この解析ルーチンを終了する。
【００６８】
図１４は、ｆｏｒブロックのパイプライン処理に関するプログラムパターン抽出処理手順を示すフローチャートである。この解析ルーチンは、ｆｏｒブロックのタスクをプロセッサ／リコンフィグ回路（図１４中、「ｒｅｃｏｎｆ」と表記する。）に割り当てるための解析ルーチンである。
【００６９】
まず、分割された全ブロック（タスク）の探索が終了したか否かを判断する（ステップＳ１４０１）。探索が終了していない場合（ステップＳ１４０１：Ｎｏ）、探索された対象ブロックを選択し（ステップＳ１４０２）、ｆｏｒブロックであるか否かを判断する（ステップＳ１４０３）。ｆｏｒブロックでない場合（ステップＳ１４０３：Ｎｏ）、ステップＳ１４０１に戻る。一方、ｆｏｒブロックである場合（ステップＳ１４０３：Ｙｅｓ）、正規化可能であるか否かを判断する（ステップＳ１４０４）。
【００７０】
ここで、正規化とは、ループヘッダを“ｆｏｒ（ｉ＝０；ｉ  ｏｐ（比較演算）定数；ｉ＋＋）”の形に変換する処理である。ステップＳ１４０４では、ループの実行前にその形に変換可能か否かを判断する。上記の形に変換できないと実行時にループの回転数が分からないためにＮＧとする。
【００７１】
正規化可能でない場合（ステップＳ１４０４：Ｎｏ）、ステップＳ１４０１に戻る。一方、正規化可能である場合（ステップＳ１４０４：Ｙｅｓ）、入れ子構造であるか否かを判断する（ステップＳ１４０５）。この判断は、完全ネスト解析である。入れ子構造でない場合（ステップＳ１４０５：Ｎｏ）、ステップＳ１４０１に戻る。一方、入れ子構造である場合（ステップＳ１４０５：Ｙｅｓ）、ループ繰越依存があるか否かを判断する（ステップＳ１４０６）。ここで、あるイタレーション（ｉ＝ｉ０）での結果を他のイタレーション（ｉ＝ｉ１）で利用する場合など、異なるイタレーション間で同じデータの定義・参照を行う場合、ループ繰越依存があるという。
【００７２】
イタレーションごとに異なるコア（演算要素）に処理を割り当てた場合、実行順序が保証されないため、逐次実行した場合と異なる結果になる可能性があるからである。したがって、ループ繰越依存がない場合（ステップＳ１４０６：Ｎｏ）、ステップＳ１４０１に戻る。一方、ループ繰越依存がある場合（ステップＳ１４０６：Ｙｅｓ）、タスク実行コスト算出部２０４により、コスト見積もりをおこなう（ステップＳ１４０７）。すなわち、対象ブロックの実行コストや転送コストを算出する。
【００７３】
そして、割り当てに見合うコストか否かを判断する（ステップＳ１４０８）。具体的には、「ループの実行コスト＋転送コスト＋呼び出しオーバーヘッド」が「逐次実行した場合のコスト」よりも大きくなってしまった場合、処理を割り当てることはかえって性能劣化の原因となる。このため、「ループの実行コスト＋転送コスト＋呼び出しオーバーヘッド」＜「逐次実行した場合のコスト」となる場合、割り当てに見合うコストとする。たとえば、対象ブロックのループ回転数が非常に小さいと実行コストも小さくなるため、割り当てに見合わなくなる。
【００７４】
そして、割り当てに見合わない場合（ステップＳ１４０８：Ｎｏ）、ステップＳ１４０１に戻る。一方、割り当てに見合う場合（ステップＳ１４０８：Ｙｅｓ）、対象ブロックをプロセッサに割当可能なタスクに決定する（ステップＳ１４０９）。たとえば、対象ブロックに割当フラグを設定する。そして、ステップＳ１４０１に戻る。ステップＳ１４０１において、探索が終了した場合（ステップＳ１４０１：Ｙｅｓ）、この解析ルーチンを終了する。
【００７５】
図１５は、ｓｗｉｔｃｈ−ｃａｓｅブロックの同時処理に関するプログラムパターンの抽出処理手順を示すフローチャートである。この解析ルーチンは、ｓｗｉｔｃｈ−ｃａｓｅブロックのタスクをプロセッサ／ＤＳＰに割り当てるための解析ルーチンである。
【００７６】
まず、分割された全ブロック（タスク）の探索が終了したか否かを判断する（ステップＳ１５０１）。探索が終了していない場合（ステップＳ１５０１：Ｎｏ）、探索された対象ブロックを選択し（ステップＳ１５０２）、ｓｗｉｔｃｈ−ｃａｓｅブロックであるか否かを判断する（ステップＳ１５０３）。ｓｗｉｔｃｈ−ｃａｓｅブロックでない場合（ステップＳ１５０３：Ｎｏ）、ステップＳ１５０１に戻る。
【００７７】
一方、ｓｗｉｔｃｈ−ｃａｓｅブロックである場合（ステップＳ１５０３：Ｙｅｓ）、そのｓｗｉｔｃｈ−ｃａｓｅブロック内において、未選択のｃａｓｅブロックがあるか否かを判断する（ステップＳ１５０４）。未選択のｃａｓｅブロックがない場合（ステップＳ１５０４：Ｎｏ）、ステップＳ１５０１に戻る。一方、未選択のｃａｓｅブロックがある場合（ステップＳ１５０４：Ｙｅｓ）、未選択のｃａｓｅブロックを選択し（ステップＳ１５０５）、ｂｒｅａｋ文があるか否かを判断する（ステップＳ１５０６）。
【００７８】
ｂｒｅａｋ文がない場合（ステップＳ１５０６：Ｎｏ）、ステップＳ１５０１に戻る。一方、ｂｒｅａｋ文がある場合（ステップＳ１５０６：Ｙｅｓ）、ステップＳ１５０４に戻る。ステップＳ１５０１において、探索が終了した場合（ステップＳ１５０１：Ｙｅｓ）、すべてのｃａｓｅブロックにおいてｂｒｅａｋ文があるか否かを判断する（ステップＳ１５０７）。ある場合、各ｃａｓｅブロックを、コア（対象演算要素。ここでは、プロセッサまたはＤＳＰ）に割り当て可能なタスクに決定する（ステップＳ１５０８）。たとえば、各ｃａｓｅブロックに割当フラグを設定する。そして、この解析ルーチンを終了する。一方、ステップＳ１５０７において、ない場合（ステップＳ１５０７：Ｙｅｓ）、この解析ルーチンを終了する。
【００７９】
図１６は、ｓｗｉｔｃｈ−ｃａｓｅブロックの同時処理に関するプログラムパターンの抽出処理手順を示すフローチャートである。この解析ルーチンは、ｓｗｉｔｃｈ−ｃａｓｅブロックのタスクをリコンフィグ回路に割り当てるための解析ルーチンである。
【００８０】
まず、分割された全ブロック（タスク）の探索が終了したか否かを判断する（ステップＳ１６０１）。探索が終了していない場合（ステップＳ１６０１：Ｎｏ）、探索された対象ブロックを選択し（ステップＳ１６０２）、ｓｗｉｔｃｈ−ｃａｓｅブロックであるか否かを判断する（ステップＳ１６０３）。ｓｗｉｔｃｈ−ｃａｓｅブロックでない場合（ステップＳ１６０３：Ｎｏ）、ステップＳ１６０１に戻る。
【００８１】
一方、ｓｗｉｔｃｈ−ｃａｓｅブロックである場合（ステップＳ１６０３：Ｙｅｓ）、そのｓｗｉｔｃｈ−ｃａｓｅブロック内において、未選択のｃａｓｅブロックがあるか否かを判断する（ステップＳ１６０４）。未選択のｃａｓｅブロックがない場合（ステップＳ１６０４：Ｎｏ）、ステップＳ１６０１に戻る。一方、未選択のｃａｓｅブロックがある場合（ステップＳ１６０４：Ｙｅｓ）、
【００８２】
未選択のｃａｓｅブロックを選択し（ステップＳ１６０５）、回路構成情報が生成できるかを判断する（ステップＳ１６０６）。生成できない場合（ステップＳ１６０６：Ｎｏ）、ステップＳ１６０４に戻る。一方、生成できる場合には（ステップＳ１６０６：Ｙｅｓ）、選択ｃａｓｅブロックの回路構成情報を生成して（ステップＳ１６０７）、ステップＳ１６０４に戻る。一方、ステップＳ１６０４において、未選択のｃａｓｅブロックがない場合（ステップＳ１６０４：Ｎｏ）、ステップＳ１６０１に戻る。
【００８３】
ここで、回路構成情報が生成できるかの判断においては、解析される項目として例を挙げると、ｃａｓｅブロックにｂｒｅａｋ文が含まれているか、浮動小数点を使用しているか否か、ポインタ変数・構造体を使用しているか否か、除算・剰余における除数が定数であるか否かなどがある。少なくともいずれか一つが合致していれば、回路構成情報を生成可能としてもよく、すべてが合致している場合に、回路構成情報を生成可能としてもよい。
【００８４】
回路構成情報は、典型的な演算器ベースの粗粒度構成要素は４ビット〜３２ビットの算術演算、論理演算を行うＡＬＵ（Ａｒｉｔｈｍｅｔｉｃ  ａｎｄ  Ｌｏｇｉｃ  Ｕｎｉｔ）、ビットシフトとマスク用回路およびレジスタファイルから構成され、これらの間のデータの流れを切り替えるデータセレクタによって接続することで、生成される。回路構成情報の生成自体は周知（参考資料："リコンフィギャラブルシステム"末吉敏則・天野英晴［編著］,ｐ１４４  ５．２．１  粗粒度構成要素の利用）である。
【００８５】
図１７は、対象ブロックとなったｓｗｉｔｃｈ−ｃａｓｅブロックとその回路構成情報を示す説明図である。このｓｗｉｔｃｈ−ｃａｓｅブロック１７００のｂｒｅａｋ文があるｃａｓｅブロックごとに部分的な回路構成情報１７１１〜１７１３が生成され、最終的に統合されて、回路構成情報１７１０を得る。リコンフィグ回路には、この回路構成情報１７１０であらわされる回路がマッピングされることとなる。
【００８６】
図１６において、ステップ１６０１で探索が終了した場合（ステップＳ１６０１：Ｙｅｓ）、すべてのｃａｓｅブロックにおいて回路構成情報が生成できたか否かを判断する（ステップＳ１６０８）。できた場合（ステップＳ１６０８：Ｙｅｓ）、各ｃａｓｅブロックを割り当て可能なタスクに決定する（ステップＳ１６０９）。たとえば、すべてのｃａｓｅブロックに割当フラグを設定する。そして、この解析ルーチンを終了する。一方、できなかった場合（ステップＳ１６０８：Ｎｏ）、この解析ルーチンを終了する。
【００８７】
図１８は、ｉｆブロック／ｅｌｓｅブロックの同時処理に関するプログラムパターンの抽出処理手順を示すフローチャートである。この解析ルーチンは、ｉｆブロック／ｅｌｓｅブロックのタスクをプロセッサ／ＤＳＰに割り当てるための解析ルーチンである。
【００８８】
まず、分割された全ブロック（タスク）の探索が終了したか否かを判断する（ステップＳ１８０１）。探索が終了していない場合（ステップＳ１８０１：Ｎｏ）、探索された対象ブロックを選択し（ステップＳ１８０２）、ｉｆブロック／ｅｌｓｅブロックであるか否かを判断する（ステップＳ１８０３）。ｉｆブロック／ｅｌｓｅブロックでない場合（ステップＳ１８０３：Ｎｏ）、ステップＳ１８０１に戻る。
【００８９】
一方、ｉｆブロック／ｅｌｓｅブロックである場合（ステップＳ１８０３：Ｙｅｓ）、そのｉｆブロック／ｅｌｓｅブロック内において、未選択のｉｆブロック／ｅｌｓｅブロックがあるか否かを判断する（ステップＳ１８０４）。未選択のｉｆブロック／ｅｌｓｅブロックがない場合（ステップＳ１８０４：Ｎｏ）、ステップＳ１８０１に戻る。
【００９０】
一方、未選択のｉｆブロック／ｅｌｓｅブロックがある場合（ステップＳ１８０４：Ｙｅｓ）、未選択のｉｆブロック／ｅｌｓｅブロックを選択し（ステップＳ１８０５）、対象ブロックを、対象演算要素（ここでは、プロセッサまたはＤＳＰ）に割り当て可能なタスクに決定する（ステップＳ１８０６）。たとえば、対象ブロックに割当フラグを設定する。そして、ステップＳ１８０４に戻る。また、ステップＳ１８０１において、探索が終了した場合（ステップＳ１８０１：Ｙｅｓ）、この解析ルーチンを終了する。
【００９１】
図１９は、ｉｆブロック／ｅｌｓｅブロックの同時処理に関するプログラムパターンの抽出処理手順を示すフローチャートである。この解析ルーチンは、ｉｆブロック／ｅｌｓｅブロックのタスクをリコンフィグ回路に割り当てるための解析ルーチンである。
【００９２】
まず、分割された全ブロック（タスク）の探索が終了したか否かを判断する（ステップＳ１９０１）。探索が終了していない場合（ステップＳ１９０１：Ｎｏ）、探索された対象ブロックを選択し（ステップＳ１９０２）、ｉｆブロック／ｅｌｓｅブロックであるか否かを判断する（ステップＳ１９０３）。ｉｆブロック／ｅｌｓｅブロックでない場合（ステップＳ１９０３：Ｎｏ）、ステップＳ１９０１に戻る。
【００９３】
一方、ｉｆブロック／ｅｌｓｅブロックである場合（ステップＳ１９０３：Ｙｅｓ）、そのｉｆブロック／ｅｌｓｅブロック内において、未選択のｉｆブロック／ｅｌｓｅブロックがあるか否かを判断する（ステップＳ１９０４）。未選択のｉｆブロック／ｅｌｓｅブロックがない場合（ステップＳ１９０４：Ｎｏ）、ステップＳ１９０１に戻る。一方、未選択のｉｆブロック／ｅｌｓｅブロックがある場合（ステップＳ１９０４：Ｙｅｓ）、未選択のｉｆブロック／ｅｌｓｅブロックを選択する（ステップＳ１９０５）。
【００９４】
そして、回路構成情報が生成可能かを判断する（ステップＳ１９０６）。生成できない場合（ステップＳ１９０６：Ｎｏ）、ステップＳ１９０４に戻る。一方、生成できる場合には（ステップＳ１９０６：Ｙｅｓ）、選択ｉｆブロック／ｅｌｓｅブロックの回路構成情報を生成して（ステップＳ１９０７）、ステップＳ１９０４に戻る。一方、ステップＳ１９０４において、未選択のｉｆブロック／ｅｌｓｅブロックがない場合（ステップＳ１９０４：Ｎｏ）、ステップＳ１９０１に戻る。
【００９５】
ここで、回路構成情報が生成できるかの判断においては、解析される項目として例を挙げると、浮動小数点を使用しているか否か、ポインタ変数・構造体を使用しているか否か、除算・剰余における除数が定数であるか否かなどがある。少なくともいずれか一つが合致していれば、回路構成情報を生成可能としてもよく、すべてが合致している場合に、回路構成情報を生成可能としてもよい。
【００９６】
また、ステップＳ１９０１において、探索が終了した場合（ステップＳ１９０１：Ｙｅｓ）、すべてのｉｆブロック／ｅｌｓｅブロックにおいて回路構成情報が生成できたか否かを判断する（ステップＳ１９０８）。できた場合（ステップＳ１９０８：Ｙｅｓ）、各ｉｆブロック／ｅｌｓｅブロックを割り当て可能なタスクに決定する（ステップＳ１９０９）。たとえば、すべてのｃａｓｅブロックに割当フラグを設定する。そして、この解析ルーチンを終了する。一方、できなかった場合（ステップＳ１９０８：Ｎｏ）、この解析ルーチンを終了する。
【００９７】
図２０は、ＳＩＭＤ演算処理に関するプログラムパターン抽出処理手順を示すフローチャートである。この解析ルーチンは、ｆｏｒブロックのタスクをＤＳＰに割り当てるための解析ルーチンである。
【００９８】
まず、分割された全ブロック（タスク）の探索が終了したか否かを判断する（ステップＳ２００１）。探索が終了していない場合（ステップＳ２００１：Ｎｏ）、探索された対象ブロックを選択し（ステップＳ２００２）、ｆｏｒブロックであるか否かを判断する（ステップＳ２００３）。ｆｏｒブロックでない場合（ステップＳ２００３：Ｎｏ）、ステップＳ２００１に戻る。一方、ｆｏｒブロックである場合（ステップＳ２００３：Ｙｅｓ）、ＳＩＭＤ演算適用箇所があるか否かを判断する（ステップＳ２００４）。
【００９９】
具体的には、配列要素のような同じデータ型にアクセスを繰り返し行うループ処理は、同じ型のデータ演算を一度に実行するものであるため、ＳＩＭＤ演算適用箇所となる。一方、データ依存がある場合は、そのようにできないため、対象箇所をｎａｔｉｖｅ  ｃｏｍｐｉｌｅｒが解析し適用箇所となるか否かを判断することとなる。
【０１００】
ＳＩＭＤ演算適用箇所がない場合（ステップＳ２００４：Ｎｏ）、ステップＳ２００１に戻る。一方、ＳＩＭＤ演算適用箇所がある場合（ステップＳ２００４：Ｙｅｓ）、ｎａｔｉｖｅ  ｃｏｍｐｉｌｅｒによる最適化を実行する（ステップＳ２００５）。
【０１０１】
各コアには、ｎａｔｉｖｅ  ｃｏｍｐｉｌｅｒと呼ばれる実行バイナリを作るためのコンパイラが用意されており、ｎａｔｉｖｅ  ｃｏｍｐｉｌｅｒにおいて様々な最適化を実行することができる。たとえば、
ｆｏｒ（ｉ＝０；ｉ＜４；  ｉ＋＋）
ａ［ｉ］＝ｂ［ｉ］＋ｃ［ｊ］；
を、
ａ［ｉ］＝ＳＩＭＤ＿ａｄｄ（ｂ［ｉ］，ｃ［ｉ］）；
のように、複数のデータ演算を一度に実行できるように変換する。
【０１０２】
そして、最適化後、タスク実行コスト算出部２０４により、コスト見積もりをおこなう（ステップＳ２００６）。すなわち、最適化後の対象ブロックの実行コストや転送コストを算出する。
【０１０３】
そして、割り当てに見合うコストか否かを判断する（ステップＳ２００７）。具体的には、「ループの実行コスト＋転送コスト＋呼び出しオーバーヘッド」が「逐次実行した場合のコスト」よりも大きくなってしまった場合、処理を割り当てることはかえって性能劣化の原因となる。このため、「ループの実行コスト＋転送コスト＋呼び出しオーバーヘッド」＜「逐次実行した場合のコスト」となる場合、割り当てに見合うコストとする。たとえば、対象ブロックのループ回転数が非常に小さいと実行コストも小さくなるため、割り当てに見合わなくなる。
【０１０４】
そして、割り当てに見合わない場合（ステップＳ２００７：Ｎｏ）、ステップＳ２００１に戻る。一方、割り当てに見合う場合（ステップＳ２００７：Ｙｅｓ）、最適化後の対象ブロックをＤＳＰに割当可能でかつＳＩＭＤ演算可能なタスクに決定する（ステップＳ２００８）。たとえば、対象ブロックに割当フラグを設定する。そして、ステップＳ２００１に戻る。ステップＳ２００１において、探索が終了した場合（ステップＳ２００１：Ｙｅｓ）、この解析ルーチンを終了する。
【０１０５】
図２１は、ＶＬＩＷ命令実行処理に関するプログラムパターン抽出処理手順を示すフローチャートである。この解析ルーチンは、ｆｏｒブロックのタスクをプロセッサに割り当てるための解析ルーチンである。
【０１０６】
まず、分割された全ブロック（タスク）の探索が終了したか否かを判断する（ステップＳ２１０１）。探索が終了していない場合（ステップＳ２１０１：Ｎｏ）、探索された未選択の対象ブロックを選択し（ステップＳ２１０２）、ｆｏｒブロックであるか否かを判断する（ステップＳ２１０３）。ｆｏｒブロックでない場合（ステップＳ２１０３：Ｎｏ）、ステップＳ２１０１に戻る。一方、ｆｏｒブロックである場合（ステップＳ２１０３：Ｙｅｓ）、ｎａｔｉｖｅ  ｃｏｍｐｉｌｅｒによる最適化を実行する（ステップＳ２１０４）。この最適化によりｆｏｒブロックが、複数の演算を一度に実行できるブロックに変換される。
【０１０７】
そして、最適化後、タスク実行コスト算出部２０４により、コスト見積もりをおこなう（ステップＳ２１０５）。すなわち、最適化後の対象ブロックの実行コストや転送コストを算出する。
【０１０８】
そして、割り当てに見合うコストか否かを判断する（ステップＳ２１０６）。具体的には、「ループの実行コスト＋転送コスト＋呼び出しオーバーヘッド」が「逐次実行した場合のコスト」よりも大きくなってしまった場合、処理を割り当てることはかえって性能劣化の原因となる。このため、「ループの実行コスト＋転送コスト＋呼び出しオーバーヘッド」＜「逐次実行した場合のコスト」となる場合、割り当てに見合うコストとする。たとえば、対象ブロックのループ回転数が非常に小さいと実行コストも小さくなるため、割り当てに見合わなくなる。
【０１０９】
そして、割り当てに見合わない場合（ステップＳ２１０６：Ｎｏ）、ステップＳ２１０１に戻る。一方、割り当てに見合う場合（ステップＳ２１０６：Ｙｅｓ）、最適化後の対象ブロックをプロセッサに割当可能でかつＶＬＩＷ命令実行可能なタスクに決定する（ステップＳ２１０７）。たとえば、対象ブロックに割当フラグを設定する。そして、ステップＳ２１０１に戻る。ステップＳ２１０１において、探索が終了した場合（ステップＳ２１０１：Ｙｅｓ）、この解析ルーチンを終了する。このように、様々な解析ルーチンを用意しておくことで、どのような設定情報が取得されても、最適化をおこなうことができる。
【０１１０】
図２２は、図１０に示したスケジューリング処理の詳細な処理手順を示すフローチャートである。まず、生成部２０５により、組み合わせパターンを生成する（ステップＳ２２０１）。つぎに、未選択の組み合わせパターンがあるか否かを判断する（ステップＳ２２０２）。
【０１１１】
未選択の組み合わせパターンがある場合（ステップＳ２２０２：Ｙｅｓ）、未選択の組み合わせパターンを１つ選択し（ステップＳ２２０３）、総実行コスト算出部２０６により、選択組み合わせパターンの総実行コストを算出する（ステップＳ２２０４）。そして、ステップＳ２２０２に戻る。一方、未選択の組み合わせパターンがない場合（ステップＳ２２０２：Ｎｏ）、決定部２０７により、最適な組み合わせパターンを決定する（ステップＳ２２０５）。そして、ステップＳ１００６に移行する。
【実施例１】
【０１１２】
つぎに、実施例１について説明する。実施例１では、図３に示した対象プログラムコード３００を組み込みシステムにマッピングする。実施例１は、プロセッサを２個、リコンフィグ回路を１個使用し、プロセッサはｆｏｒブロックのループ並列性を最適化手法とし、リコンフィグ回路は、パイプライン処理を最適化手法として選択した場合の適用例である。
【０１１３】
図２３は、実施例１における設定情報を示す説明図である。設定情報はこのようにテーブル化されて記憶装置に記憶される。図２４は、実施例１におけるプログラムパターン抽出結果を示す割当テーブルを示す説明図である。割当テーブルは、図９に示した割当情報の一部を構成する。この割当テーブルでは、タスクを実行可能な演算要素について割当フラグが立てられる。図２４の場合は、タスクＴ１〜Ｔ３がいずれもプロセッサおよびリコンフィグ回路で実行されることを示している。すなわち、タスクＴ１〜Ｔ３は、図１３に示した解析ルーチンによりプロセッサに割当可能なタスクに決定されたブロックである。同様に、タスクＴ１〜Ｔ３は、図１４に示した解析ルーチンによりプロセッサに割当可能なタスクに決定されたブロックでもある。
【０１１４】
図２５は、実施例１における最適化するための組み合わせパターンを示す説明図である。図２５中、「Ｔａｓｋ♯」とは、タスクＴ♯を示す。実施例１では、（１）〜（１２）の１２個の組み合わせパターンとして生成部２０５により生成される。また、図２５中、黒抜きのタスクはプロセッサに割り当てられたタスクを示しており、網掛けのタスクは、リコンフィグ回路に割り当てられたタスクを示している。
【０１１５】
また、各タスクＴ１〜Ｔ３は纏めて実行することができる。それらのタスクをタスクＴ４〜Ｔ７とする。タスクＴ４は、タスクＴ２とタスクＴ３を１つのプロセッサで実行するタスクである。タスクＴ５は、タスクＴ１とタスクＴ３を１つのプロセッサで実行するタスクである。タスクＴ６は、タスクＴ１とタスクＴ２を１つのプロセッサで実行するタスクである。タスクＴ７は、タスクＴ１〜Ｔ３を１つのプロセッサで実行するタスクである。図２６〜図２９は、タスクを纏めた例を示す説明図である。
【０１１６】
図３０は、実施例１における実行コストおよび転送コストの算出結果テーブルを示す説明図である。算出結果テーブルは、図２４に示した割当テーブルとともに、図９に示した割当情報の一部を構成する。タスクＴ１〜Ｔ３の実行コストは、上述したように、図１３〜図２１の解析ルーチンで算出される。なお、タスクＴ４〜Ｔ７は、あらたに纏められたタスクであるが、これらの実行コストはタスクＴ１〜Ｔ３の実行コストの組み合わせとなる。
【０１１７】
図３１は、図２５に示した組み合わせパターン（１）のスケジューリング結果を示す説明図である。図３１では、実行主体がリコンフィグ回路のみであるため、リコンフィグ回路がタスクＴ１〜Ｔ３の順に実行する。この場合、リコンフィグ回路へのマッピングが生じるため、タスクごとに転送コストが加算される。転送コストは、送信および受信があるため２倍となる。したがって、タスクＴ１の総実行コストは、７０（＝４０＋１５＋１５）となる。同様に、タスクＴ２の総実行コストは、２０（＝１０＋５＋５）、タスクＴ３の総実行コストは、２０（＝１０＋５＋５）となる。よって、組み合わせパターン（１）の総実行コストは、１１０（＝７０＋２０＋２０）となる。
【０１１８】
図３２は、図２５に示した組み合わせパターン（２）のスケジューリング結果を示す説明図である。図３２では、タスクＴ１，Ｔ２をリコンフィグ回路が実行し、タスクＴ３をプロセッサが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ１の総実行コスト：７０とタスクＴ２の総実行コスト：２０との和：９０である。一方、タスクＴ３は、２つのプロセッサのうちメインのプロセッサに実行させればよいため、転送コストが発生しない。したがって、タスクＴ３の総実行コストは５０である。リコンフィグ回路とプロセッサの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（２）の総実行コストは、９０（＝７０＋２０）となる。
【０１１９】
図３３は、図２５に示した組み合わせパターン（３）のスケジューリング結果を示す説明図である。図３３では、タスクＴ１，Ｔ３をリコンフィグ回路が実行し、タスクＴ２をプロセッサが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ１の総実行コスト：７０とタスクＴ３の総実行コスト：２０との和：９０である。一方、タスクＴ２は、２つのプロセッサのうちメインのプロセッサに実行させればよいため、転送コストが発生しない。したがって、タスクＴ２の総実行コストは５０である。リコンフィグ回路とプロセッサの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（３）の総実行コストは、９０（＝７０＋２０）となる。
【０１２０】
図３４は、図２５に示した組み合わせパターン（４）のスケジューリング結果を示す説明図である。図３４では、タスクＴ１をリコンフィグ回路が実行し、タスクＴ２，Ｔ３をプロセッサが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ１の総実行コスト：７０である。一方、タスクＴ２，Ｔ３は、２つのプロセッサがそれぞれ実行することとなるが、メインのプロセッサに対しては、データ転送が発生しない。したがって、タスクＴ３を実行するプロセッサをメインとすると、タスクＴ２の総実行コストは、６０（＝５０＋５＋５）、タスクＴ３の総実行コストは５０である。リコンフィグ回路とプロセッサの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（４）の総実行コストは、７０（＝４０＋１５＋１５）となる。
【０１２１】
図３５は、図２５に示した組み合わせパターン（５）のスケジューリング結果を示す説明図である。図３５では、タスクＴ１をプロセッサが実行し、タスクＴ２，Ｔ３をリコンフィグ回路が実行する。このように、異なる演算要素を用いる場合は、並列実行できる。プロセッサでは、タスクＴ１の総実行コストは、２００である。一方、リコンフィグ回路では、タスクＴ２の総実行コストが２０（＝１０＋５＋５）で、タスクＴ３の総実行コストは２０（＝１０＋５＋５）である。リコンフィグ回路の総実行コストは、タスクＴ２の総実行コスト：２０とタスクＴ３の総実行コスト：２０との和：４０である。リコンフィグ回路とプロセッサの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（５）の総実行コストは、２００となる。
【０１２２】
図３６は、図２５に示した組み合わせパターン（６）のスケジューリング結果を示す説明図である。図３６では、タスクＴ２をリコンフィグ回路が実行し、タスクＴ１，Ｔ３をプロセッサが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ２の総実行コスト：２０である。一方、タスクＴ１，Ｔ３は、２つのプロセッサがそれぞれ実行することとなるが、メインのプロセッサに対しては、データ転送が発生しない。したがって、タスクＴ１を実行するプロセッサをメインとすると、タスクＴ１の総実行コストは２００、タスクＴ３の総実行コストは６０（＝５０＋５＋５）である。転送コストが高い方のプロセッサをメインとすることにより、総実行コストを抑制することができる。リコンフィグ回路とプロセッサの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（６）の総実行コストは、２００となる。
【０１２３】
図３７は、図２５に示した組み合わせパターン（７）のスケジューリング結果を示す説明図である。図３７では、タスクＴ３をリコンフィグ回路が実行し、タスクＴ１，Ｔ２をプロセッサが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ３の総実行コスト：２０である。一方、タスクＴ１，Ｔ２は、２つのプロセッサがそれぞれ実行することとなるが、メインのプロセッサに対しては、データ転送が発生しない。したがって、タスクＴ１を実行するプロセッサをメインとすると、タスクＴ１の総実行コストは２００、タスクＴ２の総実行コストは６０（＝５０＋５＋５）である。転送コストが高い方のプロセッサをメインとすることにより、総実行コストを抑制することができる。リコンフィグ回路とプロセッサの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（７）の総実行コストは、２００となる。
【０１２４】
図３８は、図２５に示した組み合わせパターン（８）のスケジューリング結果を示す説明図である。図３８では、いずれのタスクＴ１〜Ｔ３もプロセッサが実行する。ここでは、プロセッサの個数は２個であるため、タスクＴ１をメインとなる一方のプロセッサ、タスクＴ２，Ｔ３を他方のプロセッサが実行する。転送コストが高い方のプロセッサをメインとすることにより、総実行コストを抑制することができる。タスクＴ２，Ｔ３を実行するプロセッサはメインのプロセッサではないため、それぞれ転送コストが発生する。したがって、タスクＴ１の総実行コストは２００、タスクＴ２の総実行コストは６０、タスクＴ３の総実行コストは６０となる。タスクＴ１を実行するプロセッサとタスクＴ２，Ｔ３を実行するプロセッサとの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（８）の総実行コストは、２００となる。
【０１２５】
図３９は、図２５に示した組み合わせパターン（９）のスケジューリング結果を示す説明図である。図３９では、タスクＴ１をリコンフィグ回路が実行し、タスクＴ４（Ｔ２＋Ｔ３）をプロセッサが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ１の総実行コスト：７０である。一方、タスクＴ４は、メインのプロセッサのみでの実行となるため、転送コストは発生しない。したがって、タスクＴ４の総実行コストは１００（＝５０＋５０）である。リコンフィグ回路とプロセッサの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（９）の総実行コストは、１００となる。
【０１２６】
図４０は、図２５に示した組み合わせパターン（１０）のスケジューリング結果を示す説明図である。図４０では、タスクＴ２をリコンフィグ回路が実行し、タスクＴ５（Ｔ１＋Ｔ３）をプロセッサが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ２の総実行コスト：２０である。一方、タスクＴ５は、メインのプロセッサのみでの実行となるため、転送コストは発生しない。したがって、タスクＴ５の総実行コストは２５０（２００＋５０）である。リコンフィグ回路とプロセッサの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１０）の総実行コストは、２５０となる。
【０１２７】
図４１は、図２５に示した組み合わせパターン（１１）のスケジューリング結果を示す説明図である。図４１では、タスクＴ３をリコンフィグ回路が実行し、タスクＴ６（Ｔ１＋Ｔ２）をプロセッサが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ３の総実行コスト：２０である。一方、タスクＴ６は、メインのプロセッサのみでの実行となるため、転送コストは発生しない。したがって、タスクＴ６の総実行コストは２５０（２００＋５０）である。リコンフィグ回路とプロセッサの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１１）の総実行コストは、２５０となる。
【０１２８】
図４２は、図２５に示した組み合わせパターン（１２）のスケジューリング結果を示す説明図である。図４２では、タスクＴ７（Ｔ１＋Ｔ２＋Ｔ３）をプロセッサが実行する。タスクＴ７は、メインのプロセッサのみでの実行となるため、転送コストは発生しない。したがって、タスクＴ７の総実行コストは３００（２００＋５０＋５０）である。よって、組み合わせパターン（１２）の総実行コストは、３００となる。
【０１２９】
決定部２０７では、これらの組み合わせパターン（１）〜（１２）の総実行コストの中からその総実行コストが最小となる組み合わせパターンを最適な組み合わせパターンに決定する。したがって、図３４に示した組み合わせパターン（４）の総実行コストが最小であるため、組み合わせパターン（４）が最適な組み合わせパターンに決定される。すなわち、タスクＴ１をリコンフィグ回路に割り当てて、タスクＴ２，Ｔ３を２個のプロセッサにそれぞれ割り当てるのが、最適な組み合わせとなる。
【実施例２】
【０１３０】
つぎに、実施例２について説明する。実施例２では、図３に示した対象プログラムコード３００を組み込みシステムにマッピングする。実施例２は、全体を制御するプロセッサを１個、ＤＳＰを２個、リコンフィグ回路を１個使用し、ＤＳＰはｆｏｒブロックのＳＩＭＤ演算処理（４並列）を最適化手法とし、リコンフィグ回路は、パイプライン処理を最適化手法として選択した場合の適用例である。
【０１３１】
図４３は、実施例２における設定情報を示す説明図である。設定情報はこのようにテーブル化されて記憶装置に記憶される。図４４は、実施例２におけるプログラムパターン抽出結果を示す割当テーブルである。この割当テーブルは、図９に示した割当情報の一部を構成する。この割当テーブルでは、タスクを実行可能な演算要素について割当フラグが立てられる。図４４の場合は、タスクＴ１〜Ｔ３がいずれもＤＳＰおよびリコンフィグ回路で実行されることを示している。すなわち、タスクＴ１〜Ｔ３は、図２０に示した解析ルーチンによりＤＳＰに割当可能なタスクに決定されたブロックである。同様に、タスクＴ１〜Ｔ３は、図１４に示した解析ルーチンによりプロセッサに割当可能なタスクに決定されたブロックでもある。
【０１３２】
図４５は、実施例２における最適化するための組み合わせパターンを示す説明図である。図４５中、「Ｔａｓｋ♯」とは、タスクＴ♯を示す。実施例２では、（１０１）〜（１１２）の１２個の組み合わせパターンとして生成部２０５により生成される。また、図４５中、ハッチングが施されているタスクはＤＳＰに割り当てられたタスクを示しており、網掛けのタスクは、リコンフィグ回路に割り当てられたタスクを示している。
【０１３３】
また、各タスクＴ１〜Ｔ３は纏めて実行することができる。それらのタスクをタスクＴ４〜Ｔ７とする。タスクＴ４は、タスクＴ２とタスクＴ３を１つのＤＳＰで実行するタスクである。タスクＴ５は、タスクＴ１とタスクＴ３を１つのＤＳＰで実行するタスクである。タスクＴ６は、タスクＴ１とタスクＴ２を１つのＤＳＰで実行するタスクである。タスクＴ７は、タスクＴ１〜Ｔ３を１つのＤＳＰで実行するタスクである。タスクの纏め方については、図２６〜図２９に示したとおりである。
【０１３４】
図４６は、実施例２における実行コストおよび転送コストの算出結果テーブルを示す説明図である。算出結果テーブルは、図４４に示した割当テーブルとともに、図９に示した割当情報の一部を構成する。タスクＴ１〜Ｔ３の実行コストは、上述したように、図１３〜図２１の解析ルーチンで算出される。なお、タスクＴ４〜Ｔ７は、あらたに纏められたタスクであるが、これらの実行コストはタスクＴ１〜Ｔ３の実行コストの組み合わせとなる。
【０１３５】
図４７は、図４５に示した組み合わせパターン（１０１）のスケジューリング結果を示す説明図である。図４７では、実行主体がリコンフィグ回路のみであるため、リコンフィグ回路がタスクＴ１〜Ｔ３の順に実行する。この場合、リコンフィグ回路へのマッピングが生じるため、タスクごとに転送コストが加算される。転送コストは、送信および受信があるため２倍となる。したがって、タスクＴ１の総実行コストは、７０（＝４０＋１５＋１５）となる。同様に、タスクＴ２の総実行コストは、２０（＝１０＋５＋５）、タスクＴ３の総実行コストは、２０（＝１０＋５＋５）となる。よって、組み合わせパターン（１０１）の総実行コストは、１１０（＝７０＋２０＋２０）となる。
【０１３６】
図４８は、図４５に示した組み合わせパターン（１０２）のスケジューリング結果を示す説明図である。図４８では、タスクＴ１，Ｔ２をリコンフィグ回路が実行し、タスクＴ３をＤＳＰが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ１の総実行コスト：７０とタスクＴ２の総実行コスト：２０との和：９０である。一方、タスクＴ３は、２つのＤＳＰのうちメインのＤＳＰに実行させればよいため、転送コストが発生しない。したがって、タスクＴ３の総実行コストは１３である。リコンフィグ回路とＤＳＰの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１０２）の総実行コストは、９０（＝７０＋２０）となる。
【０１３７】
図４９は、図４５に示した組み合わせパターン（１０３）のスケジューリング結果を示す説明図である。図４９では、タスクＴ１，Ｔ３をリコンフィグ回路が実行し、タスクＴ２をＤＳＰが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ１の総実行コスト：７０とタスクＴ３の総実行コスト：２０との和：９０である。一方、タスクＴ２は、２つのＤＳＰのうちメインのＤＳＰに実行させればよいため、転送コストが発生しない。したがって、タスクＴ２の総実行コストは１３である。リコンフィグ回路とＤＳＰの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１０３）の総実行コストは、９０（＝７０＋２０）となる。
【０１３８】
図５０は、図４５に示した組み合わせパターン（１０４）のスケジューリング結果を示す説明図である。図５０では、タスクＴ１をリコンフィグ回路が実行し、タスクＴ２，Ｔ３をＤＳＰが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ１の総実行コスト：７０である。一方、タスクＴ２，Ｔ３は、２つのＤＳＰがそれぞれ実行することとなるが、メインのＤＳＰに対しては、データ転送が発生しない。したがって、タスクＴ３を実行するＤＳＰをメインとすると、タスクＴ２の総実行コストは、２３（＝１３＋５＋５）、タスクＴ３の総実行コストは１３である。リコンフィグ回路とＤＳＰの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１０４）の総実行コストは、７０（＝４０＋１５＋１５）となる。
【０１３９】
図５１は、図４５に示した組み合わせパターン（１０５）のスケジューリング結果を示す説明図である。図５１では、タスクＴ１をＤＳＰが実行し、タスクＴ２，Ｔ３をリコンフィグ回路が実行する。このように、異なる演算要素を用いる場合は、並列実行できる。ＤＳＰでは、タスクＴ１の総実行コストは、５０である。一方、リコンフィグ回路では、タスクＴ２の総実行コストが２０（＝１０＋５＋５）で、タスクＴ３の総実行コストは２０（＝１０＋５＋５）である。リコンフィグ回路の総実行コストは、タスクＴ２の総実行コスト：２０とタスクＴ３の総実行コスト：２０との和：４０である。リコンフィグ回路とプロセッサの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１０５）の総実行コストは、５０となる。
【０１４０】
図５２は、図４５に示した組み合わせパターン（１０６）のスケジューリング結果を示す説明図である。図５２では、タスクＴ２をリコンフィグ回路が実行し、タスクＴ１，Ｔ３をＤＳＰが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ２の総実行コスト：２０である。一方、タスクＴ１，Ｔ３は、２つのＤＳＰがそれぞれ実行することとなるが、メインのＤＳＰに対しては、データ転送が発生しない。したがって、タスクＴ１を実行するＤＳＰをメインとすると、タスクＴ１の総実行コストは５０、タスクＴ３の総実行コストは２３（＝１３＋５＋５）である。転送コストが高い方のＤＳＰをメインとすることにより、総実行コストを抑制することができる。リコンフィグ回路とＤＳＰの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１０６）の総実行コストは、５０となる。
【０１４１】
図５３は、図４５に示した組み合わせパターン（１０７）のスケジューリング結果を示す説明図である。図５３では、タスクＴ３をリコンフィグ回路が実行し、タスクＴ１，Ｔ２をＤＳＰが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ３の総実行コスト：２０である。一方、タスクＴ１，Ｔ２は、２つのＤＳＰがそれぞれ実行することとなるが、メインのＤＳＰに対しては、データ転送が発生しない。したがって、タスクＴ１を実行するＤＳＰをメインとすると、タスクＴ１の総実行コストは５０、タスクＴ２の総実行コストは２３（＝１３＋５＋５）である。転送コストが高い方のＤＳＰをメインとすることにより、総実行コストを抑制することができる。リコンフィグ回路とＤＳＰの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１０７）の総実行コストは、５０となる。
【０１４２】
図５４は、図４５に示した組み合わせパターン（１０８）のスケジューリング結果を示す説明図である。図５４では、いずれのタスクＴ１〜Ｔ３もＤＳＰが実行する。ここでは、ＤＳＰの個数は２個であるため、タスクＴ１をメインとなる一方のＤＳＰ、タスクＴ２，Ｔ３を他方のＤＳＰが実行する。転送コストが高い方のＤＳＰをメインとすることにより、総実行コストを抑制することができる。タスクＴ２，Ｔ３を実行するＤＳＰはメインのＤＳＰではないため、それぞれ転送コストが発生する。したがって、タスクＴ１の総実行コストは５０、タスクＴ２の総実行コストは２３、タスクＴ３の総実行コストは２３となる。タスクＴ１を実行するＤＳＰとタスクＴ２，Ｔ３を実行するＤＳＰとの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１０８）の総実行コストは、５０となる。
【０１４３】
図５５は、図４５に示した組み合わせパターン（１０９）のスケジューリング結果を示す説明図である。図５５では、タスクＴ１をリコンフィグ回路が実行し、タスクＴ４（Ｔ２＋Ｔ３）をＤＳＰが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ１の総実行コスト：７０である。一方、タスクＴ４は、メインのＤＳＰのみでの実行となるため、転送コストは発生しない。したがって、タスクＴ４の総実行コストは２６（＝１３＋１３）である。リコンフィグ回路とＤＳＰの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１０９）の総実行コストは、７０となる。
【０１４４】
図５６は、図４５に示した組み合わせパターン（１１０）のスケジューリング結果を示す説明図である。図５６では、タスクＴ２をリコンフィグ回路が実行し、タスクＴ５（Ｔ１＋Ｔ３）をＤＳＰが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ２の総実行コスト：２０である。一方、タスクＴ５は、メインのＤＳＰのみでの実行となるため、転送コストは発生しない。したがって、タスクＴ５の総実行コストは６３（＝５０＋１３）である。リコンフィグ回路とＤＳＰの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１１０）の総実行コストは、６３となる。
【０１４５】
図５７は、図４５に示した組み合わせパターン（１１１）のスケジューリング結果を示す説明図である。図５７では、タスクＴ３をリコンフィグ回路が実行し、タスクＴ６（Ｔ１＋Ｔ２）をＤＳＰが実行する。このように、異なる演算要素を用いる場合は、並列実行できる。リコンフィグ回路の総実行コストは、タスクＴ３の総実行コスト：２０である。一方、タスクＴ６は、メインのＤＳＰのみでの実行となるため、転送コストは発生しない。したがって、タスクＴ６の総実行コストは６３（＝５０＋１３）である。リコンフィグ回路とＤＳＰの並列実行であるため、総実行コストの多い方を選択する。よって、組み合わせパターン（１１１）の総実行コストは、６３となる。
【０１４６】
図５８は、図４５に示した組み合わせパターン（１１２）のスケジューリング結果を示す説明図である。図５８では、タスクＴ７（Ｔ１＋Ｔ２＋Ｔ３）をＤＳＰが実行する。タスクＴ７は、メインのＤＳＰのみでの実行となるため、転送コストは発生しない。したがって、タスクＴ７の総実行コストは７６（＝５０＋１３＋１３）である。よって、組み合わせパターン（１１２）の総実行コストは、７６となる。
【０１４７】
決定部２０７では、これらの組み合わせパターン（１０１）〜（１１２）の総実行コストの中からその総実行コストが最小となる組み合わせパターンを最適な組み合わせパターンに決定する。したがって、図５１〜図５４に示した組み合わせパターン（１０５）〜（１０８）の総実行コストが最小であるため、組み合わせパターン（１０５）〜（１０８）が最適な組み合わせパターンに決定される。ここでは、複数の組み合わせパターンが決定されたため、その中でも、演算要素の使用個数が少ない図５１または図５４の組み合わせパターン（１０５），（１０８）が最適な組み合わせパターンに決定される。
【０１４８】
すなわち、組み合わせパターン（１０５）のように、タスクＴ１をＤＳＰに割り当てて、タスクＴ２，Ｔ３をリコンフィグ回路に割り当てると、最適な組み合わせとなる。同様に、組み合わせパターン（１０８）のように、タスクＴ１をメインである一方のＤＳＰに割り当てて、タスクＴ２，Ｔ３を他方のＤＳＰに割り当てると、最適な組み合わせとなる。
【０１４９】
以上説明したように、本実施の形態では、従来の自動化技術では性能を有効に引き出すことが難しいＡＭＰでの最適化において、対象プログラムコード３００を複数の機能に分割し、それぞれの処理に適した演算要素（コア）に処理（タスク）を割り当てる。したがって、必要最低限の演算要素構成で十分な性能を抽出することができる。また、人手によって、長年の経験と勘から処理の割り当ての決定が行われていたため、必ずしも最適であるとは言えなかったのに対し、本実施の形態では定量的に処理（タスク）の割り当てを決定することができる。また、動的にタスクの再構成を行うことで、静的には解析できない部分についても最適な割り当てを可能とする。また、最適な組み合わせパターンが得られなかった場合は、再度入力画面５００を呼び出して、設定情報を設定しなおすことで、チューニングし、再度スケジューリングすることができる。
【０１５０】
このように、システム設計におけるソフトウェアの最適化および演算要素の構成の決定などを支援することから、リソース・期間の削減に役立ち、開発効率の大幅な改善を実現することができる。以上のことから、本実施の形態によれば、プログラムに応じた組み込みシステムの最適化を図りつつ、設計者の設計負担の軽減および設計期間の短縮化を図ることができるという効果を奏する。
【０１５１】
なお、本実施の形態で説明した設計支援方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。このプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネット等のネットワークを介して配布するとしてもよい。
【０１５２】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１５３】
（付記１）コンピュータを、
対象プログラムコードを複数のタスクに分割する分割手段、
前記分割手段によって得られた各タスクを実行する演算要素の種別に基づいて、前記各タスクの実行時間に応じた実行コストを算出するタスク実行コスト算出手段、
前記タスクの実行順序をあらわす組み合わせパターンを生成する生成手段、
前記タスク実行コスト算出手段によって算出された実行コストに基づいて、前記生成手段によって生成された各組み合わせパターンの実行時間に応じた総実行コストを算出する総実行コスト算出手段、
前記総実行コスト算出手段によって算出された総実行コストに基づいて、前記組み合わせパターン群の中から特定の組み合わせパターンを決定する決定手段、
前記決定手段によって決定された決定結果を出力する出力手段、
として機能させることを特徴とする設計支援プログラム。
【０１５４】
（付記２）前記コンピュータを、
前記演算要素の種別および当該演算要素に実行させる最適化処理に関する設定情報を取得する取得手段、
前記取得手段によって取得された設定情報に含まれる演算要素の種別により前記最適化処理が実行可能なタスクを前記複数のタスクの中から抽出する抽出手段として機能させ、
前記タスク実行コスト算出手段は、
前記設定情報に基づいて、前記抽出手段によって抽出されたタスクの実行時間に応じた実行コストを算出することを特徴とする付記１に記載の設計支援プログラム。
【０１５５】
（付記３）前記タスク実行コスト算出手段は、
さらに、前記演算要素間のデータ転送時間に応じた転送コストを算出し、
前記総実行コスト算出手段は、
前記タスク実行コスト算出手段によって算出された実行コストおよび転送コストに基づいて、前記各組み合わせパターンの実行時間に応じた総実行コストを算出することを特徴とする付記１または２に記載の設計支援プログラム。
【０１５６】
（付記４）前記決定手段は、
前記総実行コストが最小となる組み合わせパターンを前記特定の組み合わせパターンに決定することを特徴とする付記１〜３のいずれか一つに記載の設計支援プログラム。
【０１５７】
（付記５）前記決定手段は、
前記総実行コストが最小でかつ前記演算要素の使用個数が最小となる組み合わせパターンを前記特定の組み合わせパターンに決定することを特徴とする付記１〜３のいずれか一つに記載の設計支援プログラム。
【０１５８】
（付記６）前記決定手段は、
前記総実行コストが所定のしきい値以下となる組み合わせパターンを前記特定の組み合わせパターンに決定することを特徴とする付記１〜３のいずれか一つに記載の設計支援プログラム。
【０１５９】
（付記７）前記決定手段は、
前記総実行コストが所定のしきい値以下でかつ前記演算要素の使用数が最小となる組み合わせパターンを前記特定の組み合わせパターンに決定することを特徴とする付記１〜３のいずれか一つに記載の設計支援プログラム。
【０１６０】
（付記８）対象プログラムコードを複数のタスクに分割する分割手段と、
前記分割手段によって得られた各タスクを実行する演算要素の種別に基づいて、前記各タスクの実行時間に応じた実行コストを算出するタスク実行コスト算出手段と、
前記タスクの実行順序をあらわす組み合わせパターンを生成する生成手段と、
前記タスク実行コスト算出手段によって算出された実行コストに基づいて、前記生成手段によって生成された各組み合わせパターンの実行時間に応じた総実行コストを算出する総実行コスト算出手段と、
前記総実行コスト算出手段によって算出された総実行コストに基づいて、前記組み合わせパターン群の中から特定の組み合わせパターンを決定する決定手段と、
前記決定手段によって決定された決定結果を出力する出力手段と、
を備えることを特徴とする設計支援装置。
【０１６１】
（付記９）中央処理装置および記憶装置を備えるコンピュータが、
前記中央処理装置により、対象プログラムコードを複数のタスクに分割して、当該複数のタスクを前記記憶装置に記憶する分割工程と、
前記中央処理装置により前記記憶装置にアクセスして、前記分割工程によって得られた各タスクを実行する演算要素の種別に基づいて、前記各タスクの実行時間に応じた実行コストを算出して、当該実行コストを前記記憶装置に記憶するタスク実行コスト算出工程と、
前記中央処理装置により、前記タスクの実行順序をあらわす組み合わせパターンを生成して、当該組み合わせパターンを前記記憶装置に記憶する生成工程と、
前記中央処理装置により前記記憶装置にアクセスして、前記タスク実行コスト算出工程によって算出された実行コストに基づいて、前記生成工程によって生成された各組み合わせパターンの実行時間に応じた総実行コストを算出して、当該総実行コストを前記記憶装置に記憶する総実行コスト算出工程と、
前記中央処理装置により前記記憶装置にアクセスして、前記総実行コスト算出工程によって算出された総実行コストに基づいて、前記組み合わせパターン群の中から特定の組み合わせパターンを決定して、その決定結果を前記記憶装置に記憶する決定工程と、
前記中央処理装置により前記記憶装置にアクセスして、前記決定工程によって決定された決定結果を出力する出力工程と、
を実行することを特徴とする設計支援方法。
【図面の簡単な説明】
【０１６２】
【図１】本実施の形態にかかる設計支援装置のハードウェア構成を示すブロック図である。
【図２】本実施の形態にかかる設計支援装置の機能的構成を示すブロック図である。
【図３】対象プログラムコードの一記述例を示す説明図である。
【図４】図３に示した対象プログラムコードの分割例を示す説明図である。
【図５】入力画面の一例を示す説明図（その１）である。
【図６】入力画面の一例を示す説明図（その２）である。
【図７】入力画面の一例を示す説明図（その３）である。
【図８】設定情報のデータ構造を示す説明図である。
【図９】割当情報のデータ構造を示す説明図である。
【図１０】本実施の形態にかかる設計支援処理手順を示すフローチャートである。
【図１１】プログラムパターン割当処理（ステップＳ１００４）の詳細な処理手順を示すフローチャートである。
【図１２】解析実行処理（ステップＳ１１０５）の詳細な処理手順を示すフローチャートである。
【図１３】ｆｏｒブロックのループ並列処理に関するプログラムパターン抽出処理手順を示すフローチャートである。
【図１４】ｆｏｒブロックのパイプライン処理に関するプログラムパターン抽出処理手順を示すフローチャートである。
【図１５】ｓｗｉｔｃｈ−ｃａｓｅブロックの同時処理に関するプログラムパターンの抽出処理手順を示すフローチャートである。
【図１６】ｓｗｉｔｃｈ−ｃａｓｅブロックの同時処理に関するプログラムパターンの抽出処理手順を示すフローチャートである。
【図１７】対象ブロックとなったｓｗｉｔｃｈ−ｃａｓｅブロックとその回路構成情報を示す説明図である。
【図１８】ｉｆ−ｅｌｓｅブロックの同時処理に関するプログラムパターンの抽出処理手順を示すフローチャートである。
【図１９】ｉｆブロック／ｅｌｓｅブロックの同時処理に関するプログラムパターンの抽出処理手順を示すフローチャートである。
【図２０】ＳＩＭＤ演算処理に関するプログラムパターン抽出処理手順を示すフローチャートである。
【図２１】ＶＬＩＷ命令実行処理に関するプログラムパターン抽出処理手順を示すフローチャートである。
【図２２】図１０に示したスケジューリング処理の詳細な処理手順を示すフローチャートである。
【図２３】実施例１における設定情報を示す説明図である。
【図２４】実施例１におけるプログラムパターン抽出結果を示す割当テーブルを示す説明図である。
【図２５】実施例１における最適化するための組み合わせパターンを示す説明図である。
【図２６】タスクを纏めた例を示す説明図（その１）である。
【図２７】タスクを纏めた例を示す説明図（その２）である。
【図２８】タスクを纏めた例を示す説明図（その３）である。
【図２９】タスクを纏めた例を示す説明図（その４）である。
【図３０】実施例１における実行コストおよび転送コストの算出結果テーブルを示す説明図である。
【図３１】図２５に示した組み合わせパターン（１）のスケジューリング結果を示す説明図である。
【図３２】図２５に示した組み合わせパターン（２）のスケジューリング結果を示す説明図である。
【図３３】図２５に示した組み合わせパターン（３）のスケジューリング結果を示す説明図である。
【図３４】図２５に示した組み合わせパターン（４）のスケジューリング結果を示す説明図である。
【図３５】図２５に示した組み合わせパターン（５）のスケジューリング結果を示す説明図である。
【図３６】図２５に示した組み合わせパターン（６）のスケジューリング結果を示す説明図である。
【図３７】図２５に示した組み合わせパターン（７）のスケジューリング結果を示す説明図である。
【図３８】図２５に示した組み合わせパターン（８）のスケジューリング結果を示す説明図である。
【図３９】図２５に示した組み合わせパターン（９）のスケジューリング結果を示す説明図である。
【図４０】図２５に示した組み合わせパターン（１０）のスケジューリング結果を示す説明図である。
【図４１】図２５に示した組み合わせパターン（１１）のスケジューリング結果を示す説明図である。
【図４２】図２５に示した組み合わせパターン（１２）のスケジューリング結果を示す説明図である。
【図４３】実施例２における設定情報を示す説明図である。
【図４４】実施例２におけるプログラムパターン抽出結果を示す割当テーブルである。
【図４５】実施例２における最適化するための組み合わせパターンを示す説明図である。
【図４６】実施例２における実行コストおよび転送コストの算出結果テーブルを示す説明図である。
【図４７】図４５に示した組み合わせパターン（１０１）のスケジューリング結果を示す説明図である。
【図４８】図４５に示した組み合わせパターン（１０２）のスケジューリング結果を示す説明図である。
【図４９】図４５に示した組み合わせパターン（１０３）のスケジューリング結果を示す説明図である。
【図５０】図４５に示した組み合わせパターン（１０４）のスケジューリング結果を示す説明図である。
【図５１】図４５に示した組み合わせパターン（１０５）のスケジューリング結果を示す説明図である。
【図５２】図４５に示した組み合わせパターン（１０６）のスケジューリング結果を示す説明図である。
【図５３】図４５に示した組み合わせパターン（１０７）のスケジューリング結果を示す説明図である。
【図５４】図４５に示した組み合わせパターン（１０８）のスケジューリング結果を示す説明図である。
【図５５】図４５に示した組み合わせパターン（１０９）のスケジューリング結果を示す説明図である。
【図５６】図４５に示した組み合わせパターン（１１０）のスケジューリング結果を示す説明図である。
【図５７】図４５に示した組み合わせパターン（１１１）のスケジューリング結果を示す説明図である。
【図５８】図４５に示した組み合わせパターン（１１２）のスケジューリング結果を示す説明図である。
【符号の説明】
【０１６３】
２００  設計支援装置
２０１  分割部
２０２  取得部
２０３  抽出部
２０４  タスク実行コスト算出部
２０５  生成部
２０６  総実行コスト算出部
２０７  決定部
２０８  出力部
３００  対象プログラムコード
【図１】
2010113384.tif 000003
【図２】
2010113384.tif 000004
【図３】
2010113384.tif 000005
【図４】
2010113384.tif 000006
【図５】
2010113384.tif 000007
【図６】
2010113384.tif 000008
【図７】
2010113384.tif 000009
【図８】
2010113384.tif 000010
【図９】
2010113384.tif 000011
【図１０】
2010113384.tif 000012
【図１１】
2010113384.tif 000013
【図１２】
2010113384.tif 000014
【図１３】
2010113384.tif 000015
【図１４】
2010113384.tif 000016
【図１５】
2010113384.tif 000017
【図１６】
2010113384.tif 000018
【図１７】
2010113384.tif 000019
【図１８】
2010113384.tif 000020
【図１９】
2010113384.tif 000021
【図２０】
2010113384.tif 000022
【図２１】
2010113384.tif 000023
【図２２】
2010113384.tif 000024
【図２３】
2010113384.tif 000025
【図２４】
2010113384.tif 000026
【図２５】
2010113384.tif 000027
【図２６】
2010113384.tif 000028
【図２７】
2010113384.tif 000029
【図２８】
2010113384.tif 000030
【図２９】
2010113384.tif 000031
【図３０】
2010113384.tif 000032
【図３１】
2010113384.tif 000033
【図３２】
2010113384.tif 000034
【図３３】
2010113384.tif 000035
【図３４】
2010113384.tif 000036
【図３５】
2010113384.tif 000037
【図３６】
2010113384.tif 000038
【図３７】
2010113384.tif 000039
【図３８】
2010113384.tif 000040
【図３９】
2010113384.tif 000041
【図４０】
2010113384.tif 000042
【図４１】
2010113384.tif 000043
【図４２】
2010113384.tif 000044
【図４３】
2010113384.tif 000045
【図４４】
2010113384.tif 000046
【図４５】
2010113384.tif 000047
【図４６】
2010113384.tif 000048
【図４７】
2010113384.tif 000049
【図４８】
2010113384.tif 000050
【図４９】
2010113384.tif 000051
【図５０】
2010113384.tif 000052
【図５１】
2010113384.tif 000053
【図５２】
2010113384.tif 000054
【図５３】
2010113384.tif 000055
【図５４】
2010113384.tif 000056
【図５５】
2010113384.tif 000057
【図５６】
2010113384.tif 000058
【図５７】
2010113384.tif 000059
【図５８】
2010113384.tif 000060