(57)【特許請求の範囲】
【請求項１】
複数のブロックで構成されるプログラムを実行する際に可能な処理の並列化数を並列化可能数として判定する判定部と、
前記プログラムを実行する際の前記プログラムの実行スケジュールを並列化実行スケジュールとして生成するスケジュール生成部と、
前記並列化実行スケジュールで前記プログラムを実行する際の前記プログラムの実行に要する時間である並列化実行時間を算出する算出部と、
前記並列化可能数と、前記並列化実行スケジュールと、前記並列化実行時間と、前記複数のブロックのうちの２以上のブロックで共通に用いられている変数の個数である共通変数個数と、前記プログラムを実行する際のメモリ使用量とが示される並列化情報を生成し、生成した前記並列化情報を出力する情報生成部とを有する情報処理装置。
【請求項２】
前記情報処理装置は、更に、
前記プログラムを構成する複数のブロックのブロック間の依存関係に基づき、前記複数のブロックのタスクグラフを生成するタスクグラフ生成部を有し、
前記判定部は、
前記タスクグラフを解析して前記並列化可能数を判定する請求項１に記載の情報処理装置。
【請求項３】
前記判定部は、
前記タスクグラフの枝切りを行い、枝切り後のタスクグラフにおけるブロック間の接続数のうちの最大の接続数に従って前記並列化可能数を判定する請求項２に記載の情報処理装置。
【請求項４】
前記情報生成部は、
前記枝切り後のタスクグラフが示される並列化情報を生成する請求項３に記載の情報処理装置。
【請求項５】
前記情報生成部は、
前記並列化実行時間の要求値が示される並列化情報を生成する請求項１に記載の情報処理装置。
【請求項６】
前記情報生成部は、
前記並列化実行時間が前記要求値を満たしているか否かが示される並列化情報を生成する請求項５に記載の情報処理装置。
【請求項７】
前記情報生成部は、
前記共通変数個数が前記共通変数個数の要求値を満たしているか否か、及び前記メモリ使用量が前記メモリ使用量の要求値を満たしているか否かが示される並列化情報を生成する請求項１に記載の情報処理装置。
【請求項８】
前記スケジュール生成部は、
前記プログラムを実行するＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）コアの数であるＣＰＵコア数ごとに、前記並列化実行スケジュールを生成し、
前記算出部は、
前記ＣＰＵコア数ごとに、対応する並列化実行スケジュールで前記プログラムを実行する際の並列化実行時間を算出し、
前記情報生成部は、
前記ＣＰＵコア数ごとに、並列化実行スケジュールと並列化実行時間とが示される並列化情報を生成する請求項１に記載の情報処理装置。
【請求項９】
前記情報生成部は、
前記並列化実行時間の複数の要求値が示され、前記並列化実行時間が各要求値を満たしているか否かが示される並列化情報を生成する請求項１に記載の情報処理装置。
【請求項１０】
前記情報生成部は、
前記共通変数個数の複数の要求値が示され、前記プログラムを実行する際のメモリ使用量の複数の要求値が示され、前記共通変数個数が各要求値を満たしているか否か、及び前記メモリ使用量が各要求値を満たしているか否かが示される並列化情報を生成する請求項１に記載の情報処理装置。
【請求項１１】
前記算出部は、
処理を並列化せずに前記プログラムを実行する際の前記プログラムの実行に要する時間である非並列化実行時間を算出し、
前記情報生成部は、
前記並列化実行時間と前記非並列化実行時間との差異状況が示される並列化情報を生成する請求項１に記載の情報処理装置。
【請求項１２】
コンピュータが、複数のブロックで構成されるプログラムを実行する際に可能な処理の並列化数を並列化可能数として判定し、
前記コンピュータが、前記プログラムを実行する際の前記プログラムの実行スケジュールを並列化実行スケジュールとして生成し、
前記コンピュータが、前記並列化実行スケジュールで前記プログラムを実行する際の前記プログラムの実行に要する時間である並列化実行時間を算出し、
前記コンピュータが、前記並列化可能数と、前記並列化実行スケジュールと、前記並列化実行時間と、前記複数のブロックのうちの２以上のブロックで共通に用いられている変数の個数である共通変数個数と、前記プログラムを実行する際のメモリ使用量とが示される並列化情報を生成し、生成した前記並列化情報を出力する情報処理方法。
【請求項１３】
複数のブロックで構成されるプログラムを実行する際に可能な処理の並列化数を並列化可能数として判定する判定処理と、
前記プログラムを実行する際の前記プログラムの実行スケジュールを並列化実行スケジュールとして生成するスケジュール生成処理と、
前記並列化実行スケジュールで前記プログラムを実行する際の前記プログラムの実行に要する時間である並列化実行時間を算出する算出処理と、
前記並列化可能数と、前記並列化実行スケジュールと、前記並列化実行時間と、前記複数のブロックのうちの２以上のブロックで共通に用いられている変数の個数である共通変数個数と、前記プログラムを実行する際のメモリ使用量とが示される並列化情報を生成し、生成した前記並列化情報を出力する情報生成処理とをコンピュータに実行させる情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの並列処理に関する。
【背景技術】
【０００２】
演算性能又は容量のスケーラビリティを実現するため、プログラムを複数のプロセッサユニットに割当て、プログラムを並列に処理することが有効である。このような並列化技術の一つとして、特許文献１に記載の技術がある。特許文献１に記載の技術では、プログラムから並列性をもつタスクが抽出される。そして、各タスクの処理時間の見積もりが行われる。この結果、プロセッサユニットの特性に合わせたタスクの割当てが可能となる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特許第４０８２７０６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１によれば、プログラムを自動的に並列化することができる。しかし、並列化による演算性能の改善は対象のプログラムにおけるタスクの独立性及び制御構造に依存するため、プログラマーが並列性を考慮しながらコーディングを行う必要があるという課題がある。
例えば、プログラマーが並列性を考慮せずにタスクの独立性が低いプログラムを作成した場合は、並列化を行っても、各プロセッサユニットが独立して動作できる箇所が限定される。このため、プロセッサユニット間で同期をとるための通信が頻繁に発生し、演算性能が改善されない。
特に、ＰＬＣ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｃｏｎｔｒｏｌｌｅｒ）のようなシステムでは、複数のプロセッサユニットがそれぞれメモリをもつため、同期のための通信によるオーバーヘッドが大きくなる。このため、ＰＬＣのようなシステムでは、並列化による演算性能の改善度合いが、プログラムにおけるタスクの独立性及び制御構造に大きく依存する。【０００５】
本発明は、効率的なプログラムの並列化を実現するための構成を得ることを主な目的とする。
【課題を解決するための手段】
【０００６】
本発明に係る情報処理装置は、
プログラムを実行する際に可能な処理の並列化数を並列化可能数として判定する判定部と、
前記プログラムを実行する際の前記プログラムの実行スケジュールを並列化実行スケジュールとして生成するスケジュール生成部と、
前記並列化実行スケジュールで前記プログラムを実行する際の前記プログラムの実行に要する時間である並列化実行時間を算出する算出部と、
前記並列化可能数と前記並列化実行スケジュールと前記並列化実行時間とが示される並列化情報を生成し、生成した前記並列化情報を出力する情報生成部とを有する。
【発明の効果】
【０００７】
本発明では、並列化可能数と並列化実行スケジュールと並列化実行時間とが示される並列化情報が出力される。このため、プログラマーは、並列化情報を参照することで、現在作成中のプログラムで可能な並列化数、並列化による演算性能の改善状況及びプログラム中の演算性能の改善に影響を与える箇所を把握することができ、効率的な並列化を実現することができる。
【図面の簡単な説明】
【０００８】
【図１】実施の形態１に係るシステムの構成例を示す図。
【図２】実施の形態１に係る情報処理装置のハードウェア構成例を示す図。
【図３】実施の形態１に係る情報処理装置の機能構成例を示す図。
【図４】実施の形態１に係る情報処理装置の動作例を示すフローチャート。
【図５】実施の形態１に係るプログラムの例を示す図。
【図６】実施の形態１に係る並列化情報の例を示す図。
【図７】実施の形態２に係る情報処理装置の動作例を示すフローチャート。
【図８】実施の形態３に係る情報処理装置の動作例を示すフローチャート。
【図９】実施の形態３に係る並列化情報の例を示す図。
【図１０】実施の形態１に係る共通デバイスの抽出手順を示すフローチャート。
【図１１】実施の形態１に係るブロックごとの命令とデバイス名の出現例を示す図。
【図１２】実施の形態１に係る依存関係の抽出手順を示す図。
【発明を実施するための形態】
【０００９】
以下、本発明の実施の形態について、図を用いて説明する。以下の実施の形態の説明及び図面において、同一の符号を付したものは、同一の部分又は相当する部分を示す。
【００１０】
実施の形態１．
＊＊＊構成の説明＊＊＊
図１は、本実施の形態に係るシステムの構成例を示す。
本実施の形態に係るシステムは、情報処理装置１００、制御機器２００、設備（１）３０１、設備（２）３０２、設備（３）３０３、設備（４）３０４、設備（５）３０５、ネットワーク４０１及びネットワーク４０２で構成される。
【００１１】
情報処理装置１００は、設備（１）３０１から設備（５）３０５を制御するためのプログラムを生成する。情報処理装置１００は、生成したプログラムをネットワーク４０２を介して制御機器２００に送信する。
なお、情報処理装置１００により行われる動作は、情報処理方法及び情報処理プログラムに相当する。
【００１２】
制御機器２００は、情報処理装置１００で生成されたプログラムを実行し、ネットワーク４０１を介して設備（１）３０１から設備（５）３０５に制御コマンドを送信し、設備（１）３０１から設備（５）３０５を制御する。
制御機器２００は、例えばＰＬＣである。また、制御機器２００は、一般的なＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）であってもよい。
【００１３】
設備（１）３０１から設備（５）３０５は、工場ライン３００に配置されている製造設備である。
図１では、５つの設備が示されているが、工場ライン３００に配置される設備の数は５つに限らない。
【００１４】
ネットワーク４０１及びネットワーク４０２は、例えばＣＣ−Ｌｉｎｋなどのフィールドネットワークである。また、ネットワーク４０１及びネットワーク４０２は、Ｅｔｈｅｒｎｅｔ（登録商標）などの一般的なネットワークでもよいし、専用のネットワークでもよい。また、ネットワーク４０１とネットワーク４０２は、それぞれ別の種類のネットワークでもよい。
【００１５】
図２は、情報処理装置１００のハードウェア構成例を示す。
情報処理装置１００はコンピュータであり、情報処理装置１００のソフトウェア構成をプログラムで実現することができる。情報処理装置１００のハードウェア構成としては、バスに、プロセッサ１１、メモリ１２、ストレージ１３、通信装置１４、入力装置１５及び表示装置１６が接続されている。
プロセッサ１１は、例えばＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。
メモリ１２は、例えばＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。
ストレージ１３は、例えばハードディスク装置、ＳＳＤ、メモリカード読み書き装置である。
通信装置１４は、例えばＥｔｈｅｒｎｅｔ（登録商標）通信ボード、ＣＣ−Ｌｉｎｋなどのフィールドネットワーク用の通信ボードである。
入力装置１５は、例えばマウス、キーボードである。
表示装置１６は、例えばディスプレイである。
また、入力装置１５と表示装置１６をあわせたタッチパネルを用いてもよい。
ストレージ１３には、後述する入力処理部１０１、行プログラム取得部１０４、ブロック生成部１０６、タスクグラフ生成部１０８、タスクグラフ枝切り部１０９、スケジュール生成部１１２及び表示処理部１１４の機能を実現するプログラムが記憶されている。
これらプログラムは、ストレージ１３からメモリ１２にロードされる。そして、プロセッサ１１がこれらプログラムを実行して、後述する入力処理部１０１、行プログラム取得部１０４、ブロック生成部１０６、タスクグラフ生成部１０８、タスクグラフ枝切り部１０９、スケジュール生成部１１２及び表示処理部１１４の動作を行う。
図２では、プロセッサ１１が入力処理部１０１、行プログラム取得部１０４、ブロック生成部１０６、タスクグラフ生成部１０８、タスクグラフ枝切り部１０９、スケジュール生成部１１２及び表示処理部１１４の機能を実現するプログラムを実行している状態を模式的に表している。
【００１６】
図３は、情報処理装置１００の機能構成例を示す。なお、図３の矢印の実線は呼び出し関係を表し、破線の矢印はデータベースとのデータの流れを表している。
【００１７】
入力処理部１０１は、表示装置１６上の特定のエリアを監視し、入力装置１５を介してアクション（マウスのクリック等）を検知した際に、ストレージ１３内のプログラムをプログラムデータベース１０２に格納する。
本実施の形態では、入力処理部１０１は、図５に例示するプログラムをストレージ１３からプログラムデータベース１０２に格納する。
図５のプログラムでは、第一引数及び第二引数がステップ数情報である。また、図５のプログラムでは、第三引数が命令であり、第四引数以降がデバイスである。ステップ数とはプログラムの規模を測るための指標となる数値である。命令とは制御機器２００のプロセッサが行う動作を定義する文字列である。また、デバイスとは命令の対象となる変数である。
【００１８】
行プログラム取得部１０４は、プログラムデータベース１０２からプログラムを１行ずつ取得する。１行のプログラムを以下では、行プログラムという。また、行プログラム取得部１０４は、取得した行プログラムから命令とデバイスを取得する。また、行プログラム取得部１０４は、命令データベース１０３から、取得した命令の種類と実行時間と先頭フラグと終端フラグを取得する。
【００１９】
命令データベース１０３には、行プログラムごとに、命令の種類、実行時間、先頭フラグ及び終端フラグが定義されている。
命令の種類には、行プログラムの命令が参照命令及び書出し命令のいずれであるかが示される。
実行時間には、行プログラムの実行に要する時間が示される。
先頭フラグには、行プログラムが後述するブロックの先頭に位置するか否かが示される。つまり、先頭フラグが「１」である行プログラムはブロックの先頭に位置することになる。
終端フラグには、行プログラムがブロックの終端に位置するか否かが示される。つまり、終端フラグが「１」である行プログラムはブロックの終端に位置することになる。
【００２０】
そして、行プログラム取得部１０４は、行プログラム、デバイス、命令の種類、実行時間、先頭フラグ及び終端フラグを重み付きプログラムデータベース１０５に格納する。
【００２１】
ブロック生成部１０６は、重み付きプログラムデータベース１０５から、行プログラム、デバイス、命令の種類、処理時間、先頭フラグ及び終端フラグを取得する。
そして、ブロック生成部１０６は、先頭フラグ及び終端フラグに基づいて、複数の行プログラムをグループ化して１つのブロックを構成する。
つまり、ブロック生成部１０６は、先頭フラグが「１」の行プログラムから終端フラグが「１」の行プログラムまでをグループ化して、１つのブロックを生成する。
ブロック生成部１０６によるブロックの生成の結果、プログラムは複数のブロックに分割されることになる。
また、ブロック生成部１０６は、ブロック間の依存関係を判定する。ブロック間の依存関係の詳細については後述する。
また、ブロック生成部１０６は、ブロックごとに、ブロックに含まれる行プログラム、ブロックに含まれる行プログラムのデバイス、命令の種類、実行時間が示されるブロック情報と、ブロック間の依存関係を示す依存関係情報を生成する。
そして、ブロック生成部１０６は、ブロック情報と依存関係情報を依存関係データベース１０７に格納する。
【００２２】
タスクグラフ生成部１０８は、依存関係データベース１０７からブロック情報と依存関係情報を取得し、ブロック情報と依存関係情報を参照して、タスクグラフを生成する。
【００２３】
タスクグラフ枝切り部１０９は、タスクグラフ生成部１０８により生成されたタスクグラフの枝切りを行う。すなわち、タスクグラフ枝切り部１０９は、ブロック間の依存関係を整理し、タスクグラフ間の余分な経路を削除したタスクグラフを生成する。
また、タスクグラフ枝切り部１０９は、枝切り後のタスクグラフを解析して、プログラムを実行する際に可能な処理の並列化数を並列化可能数として判定する。より具体的には、タスクグラフ枝切り部１０９は、枝切り後のタスクグラフにおけるブロック間の接続数のうちの最大の接続数に従って並列化可能数を判定する。
タスクグラフ枝切り部１０９は、枝切り後のタスクグラフと、並列化可能数が示される並列化可能数情報をタスクグラフデータベース１１０に格納する。
なお、タスクグラフ枝切り部１０９は、判定部に相当する。また、タスクグラフ枝切り部１０９により行われる処理は、判定処理に相当する。
【００２４】
スケジュール生成部１１２は、タスクグラフデータベース１１０から枝切り後のタスクグラフを取得する。そして、スケジュール生成部１１２は、枝切り後のタスクグラフから、プログラムを実行する際のプログラムの実行スケジュールを生成する。スケジュール生成部１１２が生成するスケジュールを並列化実行スケジュールという。並列化実行スケジュールを単にスケジュールという場合もある。
本実施の形態では、スケジュール生成部１１２は、並列化実行スケジュールが示されるガントチャートを生成する。
スケジュール生成部１１２は、生成したガントチャートをスケジュールデータベース１１３に格納する。
なお、スケジュール生成部１１２により行われる処理は、スケジュール生成処理に相当する。
【００２５】
表示処理部１１４は、スケジュールデータベース１１３からガントチャートを取得する。
そして、表示処理部１１４は、並列化実行スケジュールでプログラムを実行する際のプログラムの実行に要する時間である並列化実行時間を算出する。
また、表示処理部１１４は、並列化情報を生成する。例えば、表示処理部１１４は、図６に示す並列化情報を生成する。図６の並列化情報は、基本情報、タスクグラフ、並列化実行スケジュール（ガントチャート）で構成される。図６の並列化情報の詳細は後述する。
表示処理部１１４は、生成した並列化情報を表示装置１６に出力する。
なお、表示処理部１１４は、算出部及び情報生成部に相当する。また、表示処理部１１４により行われる処理は、算出処理及び情報生成処理に相当する。
【００２６】
＊＊＊動作の説明＊＊＊
次に、図４のフローチャートを参照して、本実施の形態に係る情報処理装置１００の動作例を説明する。
【００２７】
入力処理部１０１が、表示装置１６上の確認ボタンが表示されるエリアを監視し、入力装置１５を介して確認ボタンが押されたか否か（マウスのクリック等があったか否か）を判定する（ステップＳ１０１）。入力処理部１０１は、毎秒、毎分、毎時、毎日などの定周期で確認ボタンが押されたか否かを判定する。
【００２８】
確認ボタンが押された場合（ステップＳ１０１でＹＥＳ）は、入力処理部１０１は、ストレージ１３内のプログラムをプログラムデータベース１０２に格納する（ステップＳ１０２）。
【００２９】
次に、行プログラム取得部１０４が、プログラムデータベース１０２から行プログラムを取得する（ステップＳ１０３）。
つまり、行プログラム取得部１０４は、プログラムデータベース１０２から１行ずつプログラムを取得する。
【００３０】
また、行プログラム取得部１０４は、行プログラムごとに、デバイス、命令の種類、実行時間等を取得する（ステップＳ１０４）。
つまり、行プログラム取得部１０４は、ステップＳ１０３で取得した行プログラムからデバイスを取得する。また、行プログラム取得部１０４は、命令データベース１０３から、ステップＳ１０３で取得した行プログラムに対応する、命令の種類と実行時間と先頭フラグと終端フラグを取得する。
前述したように、命令データベース１０３には、行プログラムごとに、命令の種類、実行時間、先頭フラグ及び終端フラグが定義されている。このため、行プログラム取得部１０４は、ステップＳ１０３で取得した行プログラムに対応する、命令の種類と実行時間と先頭フラグと終端フラグを命令データベース１０３から取得することができる。
そして、行プログラム取得部１０４は、行プログラム、デバイス、命令の種類、実行時間、先頭フラグ及び終端フラグを重み付きプログラムデータベース１０５に格納する。
行プログラム取得部１０４は、プログラムの全ての行についてステップＳ１０３及びステップＳ１０４を繰り返す。
【００３１】
次に、ブロック生成部１０６が、重み付きプログラムデータベース１０５から、行プログラム、デバイス、命令の種類、処理時間、先頭フラグ及び終端フラグを取得する。
そして、ブロック生成部１０６は、ブロックを生成する（ステップＳ１０５）。
より具体的には、ブロック生成部１０６は、先頭フラグが「１」の行プログラムから終端フラグが「１」の行プログラムまでをグループ化して、１つのブロックを生成する。
ブロック生成部１０６は、プログラムの全体が複数のブロックに分割されるまで、ステップＳ１０５を繰り返す。
【００３２】
次に、ブロック生成部１０６が、ブロック間の依存関係を判定する（ステップＳ１０６）。
本実施の形態では、依存関係の抽出は、命令語の内容と命令語に対応するデバイス名のラベリングによって行われる。順守しなければならない実行順序を守ることをこの手順で担保するには、複数のブロックで使用されるデバイス（以降は共通デバイスと表記）の実行順序を守ることである。命令毎にデバイスに与える影響は異なり、本実施の形態では、ブロック生成部１０６は、以下のようにデバイスへの影響を判定する。
・接点命令、比較演算命令など    ：入力
・出力命令、ビット処理命令など  ：出力
ここで、入力とは命令で使用されたデバイスの情報を読み込む処理であり、出力とは命令で使用されたデバイスの情報を書き変える処理である
本実施の形態では、ブロック生成部１０６が、プログラムに記載されているデバイスを入力に用いられるデバイスと出力に用いられるデバイスに分けラベリングをすることで、依存関係の抽出を行う。
【００３３】
図１０に共通デバイスの依存関係を抽出するフローチャートの一例を示す。
【００３４】
ステップＳ１５１において、ブロック生成部１０６は、ブロックの先頭から行プログラムを読み込む。
ステップＳ１５２において、ブロック生成部１０６は、ステップＳ１５１で読み込んだ行プログラムのデバイスが入力に用いられるデバイスであるか否かを判定する。つまり、ブロック生成部１０６は、ステップＳ１５１で読み込んだ行プログラムに、「接点命令＋デバイス名」の記述または「比較演算命令＋デバイス名」の記述が含まれているか否かを判定する。
ステップＳ１５１で読み込んだ行プログラムに、「接点命令＋デバイス名の記述」または「比較演算命令＋デバイス名」の記述が含まれている場合（ステップＳ１５２でＹＥＳ）は、ブロック生成部１０６は、ステップＳ１５１で読み込んだ行プログラムのデバイスが入力に用いられるデバイスであることを規定の記憶領域に記録する。
一方、ステップＳ１５１で読み込んだ行プログラムに、「接点命令＋デバイス名」の記述及び「比較演算命令＋デバイス名」の記述のいずれも含まれていない場合（ステップＳ１５２でＮＯ）は、ステップＳ１５４において、ブロック生成部１０６は、ステップＳ１５１で読み込んだ行プログラムのデバイスが出力に用いられるデバイスであるか否かを判定する。つまり、ブロック生成部１０６は、ステップＳ１５１で読み込んだ行プログラムに、「出力命令＋デバイス名」の記述または「ビット処理命令＋デバイス名」の記述が含まれているか否かを判定する。
ステップＳ１５１で読み込んだ行プログラムに、「出力命令＋デバイス名」の記述または「ビット処理命令＋デバイス名」の記述が含まれている場合（ステップＳ１５４でＹＥＳ）は、ブロック生成部１０６は、ステップＳ１５１で読み込んだ行プログラムのデバイスが出力に用いられるデバイスであることを規定の記憶領域に記録する。
一方、ステップＳ１５１で読み込んだ行プログラムに、「出力命令＋デバイス名」の記述及び「ビット処理命令＋デバイス名」の記述のいずれも含まれていない場合（ステップＳ１５４でＮＯ）は、ステップＳ１５６において、ブロック生成部１０６は、未だ読み込んでない行プログラムがあるか否かを判定する。
未だ読み込んでいない行プログラムがある場合（ステップＳ１５６でＹＥＳ）は、処理がステップＳ１５１に戻る。一方、全ての行プログラムを読み込んでいる場合（ステップＳ１５６でＮＯ）は、ブロック生成部１０６は処理を終了する。
【００３５】
図１１に、ブロックごとの命令とデバイス名の出現例を示す。
図１１のブロック名：Ｎ１の一行目に注目すると、命令にＬＤ、デバイス名にＭ０が使用されている。ＬＤは接点命令であるため、デバイスＭ０はブロックＮ１で入力として使用されたことが記録される。同様の処理を全ての行に対して行うことで、図１１の下段に示す抽出結果が得られる。
【００３６】
図１２にブロック間の依存関係の抽出方法及び依存関係の一例を示す。
共通デバイスにおいて、以下のような場合に、ブロック生成部１０６はブロック間に依存関係があると判定する。
・前：入力、後：出力
・前：出力、後：入力
・前：出力、後：出力
なお、「前」は共通デバイスが用いられているブロック間において実行順番が先のブロックを意味する。また、「後」は共通デバイスが用いられているブロック間において実行順番が後のブロックを意味する。
ある特定の共通デバイスにおいて、比較する２つのブロックが共に入力の場合、参照する共通デバイスの値は同じ値であるため、実行順序を変更しても実行結果に影響を及ぼさない（図１２のＭ１におけるＮ１とＮ３）。それに対して、上記の三パターンは参照する共通デバイスの値が変化するため、実行順序を変更すると意図しない実行結果となる。例えば、図１２の共通デバイスＭ０に注目すると、ブロックＮ１で入力、ブロックＮ３で出力として使用されている。このため、ブロックＮ１とブロックＮ３に依存関係がある。同様の処理を全ての共通デバイスに対して行うことで、図１２のブロック間の依存関係が得られる
ブロック間の依存関係をもとに、依存関係のあるブロック同士をつなぐと、データフローグラフ（ＤＦＧ）が得られる。
【００３７】
次に、ブロック生成部１０６は、ブロック情報と依存関係情報を依存関係データベース１０７に格納する。
前述したように、ブロック情報では、ブロックごとに、ブロックに含まれる行プログラム、ブロックに含まれる行プログラムのデバイス、命令の種類、実行時間が示される。依存関係情報には、ブロック間の依存関係が示される。
【００３８】
次に、タスクグラフ生成部１０８が、ブロック間の処理フローを示すタスクグラフを生成する（ステップＳ１０７）。
タスクグラフ生成部１０８は、依存関係データベース１０７からブロック情報と並列化可能数情報と依存関係情報を取得し、ブロック情報と並列化可能数情報と依存関係情報を参照して、タスクグラフを生成する。
【００３９】
次に、タスクグラフ枝切り部１０９が、ステップＳ１０７で生成されたタスクグラフの枝切りを行う（ステップＳ１０８）。
つまり、タスクグラフ枝切り部１０９は、タスクグラフにおけるブロック間の依存関係を整理することで、タスクグラフでの余分な経路を削除する。
【００４０】
次に、タスクグラフ枝切り部１０９は、並列化可能数を判定する（ステップＳ１０９）。
タスクグラフ枝切り部１０９は、枝切り後のタスクグラフにおけるブロック間の接続数のうちの最大の接続数を並列化可能数に指定する。接続数は、１つの先行するブロックに接続する後続のブロックの数である。
例えば、枝切り後のタスクグラフにおいて、先行するブロックＡと後続するブロックＢが接続され、先行するブロックＡと後続するブロックＣが接続され、先行するブロックＡと後続するブロックＤが接続されている場合は、接続数は３である。そして、接続数３が枝切り後のタスクグラフ内で最大の接続数であれば、タスクグラフ枝切り部１０９は、並列化可能数を３と判定する。
このようにして、タスクグラフ枝切り部１０９は、プログラムに含まれる複数のブロックでの並列化可能数を判定する。
タスクグラフ枝切り部１０９は、枝切り後のタスクグラフと、並列化可能数が示される並列化可能数情報をタスクグラフデータベース１１０に格納する。
【００４１】
次に、スケジュール生成部１１２が並列化実行スケジュールを生成する（ステップＳ１１０）。
より具体的には、スケジュール生成部１１２は、枝切り後のタスクグラフを参照し、スケジューリングアルゴリズムを用いて、プログラマーにより指定されたＣＰＵコア数でプログラムを実行させる場合の並列化実行スケジュール（ガントチャート）を生成する。スケジュール生成部１１２は、例えば、クリティカルパスを抽出し、クリティカルパスが赤色で表示されるように並列化実行スケジュール（ガントチャート）を生成する。
スケジュール生成部１１２は、生成した並列化実行スケジュール（ガントチャート）をスケジュールデータベース１１３に格納する。
【００４２】
次に、表示処理部１１４が並列化実行時間を算出する（ステップＳ１１１）。
より具体的には、表示処理部１１４は、スケジュールデータベース１１３からスケジュール（ガントチャート）を取得し、また、依存関係データベース１０７からブロック情報を取得する。そして、表示処理部１１４は、ブロック情報を参照して、ブロックごとに行プログラムの実行時間を積算して、ブロックごとの実行時間を算出する。そして、表示処理部１１４は、スケジュール（ガントチャート）に従ってブロックごとの実行時間を積算して、プログラマーにより指定されたＣＰＵコア数でプログラムを実行した場合の実行時間（並列化実行時間）を得る。
【００４３】
次に、表示処理部１１４が並列化情報を生成する（ステップＳ１１２）。
例えば、表示処理部１１４は図６に示す並列化情報を生成する。
【００４４】
最後に、表示処理部１１４は並列化情報を表示装置１６に出力する（ステップＳ１１３）。この結果、プログラマーは、並列化情報を参照することができる。
【００４５】
ここで、図６に示す並列化情報を説明する。
図６の並列化情報は、基本情報、タスクグラフ、並列化実行スケジュール（ガントチャート）で構成される。
【００４６】
基本情報には、プログラムの総ステップ数、並列化実行時間、並列化可能数及び制約条件が示される。
プログラムの総ステップ数は、図５に示すステップ数情報に示されるステップ数の合計値である。表示処理部１１４は、依存関係データベース１０７からブロック情報を取得し、ブロック情報に含まれる行プログラムのステップ数情報を参照することで、総ステップ数を得ることができる。
また、並列化実行時間はステップＳ１１１で得られた値である。
並列化可能数はステップＳ１０７で得られた値である。表示処理部１１４は、タスクグラフデータベース１１０から並列化可能数情報を取得し、並列化可能数情報を参照することで並列化可能数を得ることができる。
更に、図１０の手順により抽出された共通デバイスの個数を並列化情報に含ませてもよい。
また、表示処理部１１４はＣＰＵコアごとにＲＯＭ使用数を算出し、算出したＣＰＵコアごとのＲＯＭ使用数を並列化情報に含ませてもよい。表示処理部１１４は、例えば、ブロック情報に含まれる行プログラムのステップ数情報を参照することで、ブロックごとのステップ数を得る。そして、表示処理部１１４は、並列化実行スケジュール（ガントチャート）に示されるＣＰＵコアごとに、対応するブロックのステップ数を積算することで、ＣＰＵコアごとのＲＯＭ使用数を得る。
【００４７】
制約条件には、プログラムに対する要求値が定義される。図６の例では、並列化実行時間についての要求値として、「スキャンタイムは１．６［μｓ］以下」が定義されている。また、ステップ数（メモリ使用量）についての要求値として、「ＲＯＭ使用量は１０００［ＳＴＥＰ］以下」が定義されている。また、共通デバイスについての要求値として、「共通デバイスは１０［個］以下」が定義されている。
表示処理部１１４は、制約条件データベース１１１から制約条件を取得する。
【００４８】
タスクグラフは、ステップＳ１０９で生成された枝切り後のタスクグラフである。
表示処理部１１４は、タスクグラフデータベース１１０から枝切り後のタスクグラフを取得する。
図６において、「Ａ」から「Ｆ」の各々は、ブロックを表す。また、ブロックの表示の上に示される「０．２」、「０．４」等は、ブロック単位の実行時間である。
また、図６に示すように、タスクグラフに重畳して共通デバイスが示されてもよい。図６の例では、ブロックＡとブロックＢでは、デバイス「Ｍ０」とデバイス「Ｍ１」が共通に用いられていることが示される。
【００４９】
並列化実行スケジュール（ガントチャート）は、ステップＳ１１０で生成されたものである。表示処理部１１４は、スケジュールデータベース１１３から並列化実行スケジュール（ガントチャート）を取得する。
【００５０】
＊＊＊実施の形態の効果の説明＊＊＊
このように、本実施の形態では、並列化実行時間、並列化可能数、並列化実行スケジュール等で構成される並列化情報が表示される。このため、プログラマーは、並列化情報を参照することで、現在作成中のプログラムにおける並列化実行時間及び並列化可能数を把握することができ、現在検討中の並列化が十分であるか否かを検討することができる。また、プログラマーは、並列化実行スケジュールによって、並列化による演算性能の改善状況及びプログラム中の演算性能の改善に影響を与える箇所を把握することができる。このように、本実施の形態によれば、プログラマーに並列化の改善のための指針を提供することができ、効率的な並列化を実現することができる。
【００５１】
なお、上記では、プログラムの全体に対して図５のフローを適用する例を説明した。これに代えてプログラムの差分に対してのみ図５のフローを適用するようにしてもよい。例えば、プログラマーがプログラムを修正するような場合に、行プログラム取得部１０４が修正前のプログラムと修正後のプログラムとの差分を抽出する。そして、抽出された差分に対してのみ図５のステップＳ１０３以降の処理が行われるようにしてもよい。
【００５２】
実施の形態２．
本実施の形態では、主に実施の形態１との差異を説明する。
なお、以下で説明していない事項は、実施の形態１と同様である。
【００５３】
＊＊＊構成の説明＊＊＊
本実施の形態に係るシステム構成は図１に示す通りである。
本実施の形態に係る情報処理装置１００のハードウェア構成例は図２に示す通りである。
本実施の形態に係る情報処理装置１００の機能構成例は図３に示す通りである。
【００５４】
＊＊＊動作の説明＊＊＊
図７は、本実施の形態に係る情報処理装置１００の動作例を示す。
図７を参照して、本実施の形態に係る情報処理装置１００の動作例を説明する。
【００５５】
本実施の形態では、入力処理部１０１は、入力装置１５によりプログラマーがプログラムをセーブしたか否かを判定する（ステップＳ２０１）。
プログラムがセーブされた場合（ステップＳ２０１でＹＥＳ）、図４に示すステップＳ１０２からステップＳ１１０に示す処理が行われる（ステップＳ２０２）。
ステップＳ１０２からステップＳ１１０の処理は、実施の形態１に示した通りなので説明を省略する。
【００５６】
ステップＳ１１０が行われて並列化実行時間が算出された後に、表示処理部１１４が制約条件が成立しているか否かを判定する（ステップＳ２０３）。
例えば、図６の基本情報に示される制約条件が用いられる場合は、表示処理部１１４は、並列化実行時間が、制約条件に示されるスキャンタイムの要求値（「スキャンタイムは１．６［μｓ］以下」）を満たすか否かを判定する。また、表示処理部１１４は、プログラムの総ステップ数が、制約条件に示されるＲＯＭ使用数の要求値（「ＲＯＭ使用量は１０００［ＳＴＥＰ］以下」）を満たすか否かを判定する。更に、表示処理部１１４は共通デバイスの個数が、制約条件に示される共通デバイスの要求値（「共通デバイスは１０［個］以下」）を満たすか否かを判定する。
【００５７】
全ての制約条件が成立する場合（ステップＳ２０３でＹＥＳ）は、表示処理部１１４は通常の並列化情報を生成する（ステップＳ２０４）。
【００５８】
一方で、１つでも制約条件が成立しない場合（ステップＳ２０３でＮＯ）は、表示処理部１１４は制約条件が不成立の項目を強調表示する並列化情報を生成する（ステップＳ２０５）。
例えば、図６の「スキャンタイムは１．６［μｓ］以下」が不成立の場合は、当該制約条件に対応する項目である「並列化実行時間」を赤字で表示する並列化情報を生成する。
また、図６の「スキャンタイムは１．６［μｓ］以下」が不成立の場合は、表示処理部１１４は、例えば、不成立の原因となるブロックを並列化実行スケジュール（ガントチャート）上で青字で表示する並列化情報を生成してもよい。
また、例えば、図６の「ＲＯＭ使用量は１０００［ＳＴＥＰ］以下」が不成立の場合は、表示処理部１１４は、当該制約条件に対応する項目である「プログラムの総ステップ数」を赤字で表示する並列化情報を生成する。
更に、例えば、図６の「共通デバイスは１０［個］以下」が不成立の場合は、表示処理部１１４は、当該制約条件に対応する項目である「共通デバイスの個数」を赤字で表示する並列化情報を生成する。
【００５９】
その後、表示処理部１１４は、ステップＳ２０４又はステップＳ２０５で生成された並列化情報を表示装置１６０に出力する（ステップＳ２０６）。
また、制約条件が不成立の場合は、表示処理部１１４は、不成立の原因となるブロックのプログラムコードを青色で表示するようにしてもよい。
【００６０】
＊＊＊実施の形態の効果の説明＊＊＊
本実施の形態によれば、制約条件が不成立の項目を強調表示する並列化情報が表示されるため、改善すべき項目をプログラマーに認識させることができ、プログラムのデバッグに要する時間を短縮することができる。
【００６１】
なお、上記では、プログラムのセーブの検知（図７のステップＳ２０１）を処理のトリガーとする例を述べたが、実施の形態１と同様に確認ボタンの押下の検知（図４のステップＳ１０１）を処理のトリガーとしてもよい。
また、プログラマーがプログラムを１行作成するごとに図７のステップＳ２０２以降の処理を開始させるようにしてもよい。
更に、一定時間（例えば、１分）ごとに、図７のステップＳ２０２以降の処理を開始させるようにしてもよい。また、プログラマーが特定のプログラム部品（接点命令など）をプログラムに挿入したことをトリガーにして図７のステップＳ２０２以降の処理を開始させるようにしてもよい。
【００６２】
実施の形態３．
本実施の形態では、主に実施の形態１及び実施の形態２との差異を説明する。
なお、以下で説明していない事項は、実施の形態１又は実施の形態２と同様である。
【００６３】
＊＊＊構成の説明＊＊＊
本実施の形態に係るシステム構成は図１に示す通りである。
本実施の形態に係る情報処理装置１００のハードウェア構成例は図２に示す通りである。
本実施の形態に係る情報処理装置１００の機能構成例は図３に示す通りである。
【００６４】
＊＊＊動作の説明＊＊＊
図８は、本実施の形態に係る情報処理装置１００の動作例を示す。
図８を参照して、本実施の形態に係る情報処理装置１００の動作例を説明する。
【００６５】
入力処理部１０１は、表示装置１６上の確認ボタンが表示されるエリアを監視し、入力装置１５を介して確認ボタンが押されたか否か（マウスのクリック等があったか否か）を判定する（ステップＳ３０１）。
確認ボタンが押された場合（ステップＳ３０１でＹＥＳ）は、図４に示すステップＳ１０２からステップＳ１０９に示す処理が行われる（ステップＳ３０２）。
ステップＳ１０２からステップＳ１０９の処理は、実施の形態１に示した通りなので説明を省略する。
【００６６】
次に、スケジュール生成部１１２が、ステップＳ１０９で得られた枝切り後のタスクグラフに基づき、ＣＰＵコア数ごとに並列化実行スケジュール（ガントチャート）を生成する（ステップＳ３０３）。
例えば、プログラマーがデュアルコア、トリプルコア及びクアッドコアの採用を検討している場合は、スケジュール生成部１１２はプログラムをデュアルコアで実行させる場合の並列化実行スケジュール（ガントチャート）、プログラムをトリプルコアで実行させる場合の並列化実行スケジュール（ガントチャート）、及びクアッドコアで実行させる場合の並列化実行スケジュール（ガントチャート）を生成する。
【００６７】
次に、表示処理部１１４が、ステップＳ３０６で生成されたスケジュールごとに並列化実行時間を算出する（ステップＳ３０４）。
【００６８】
次に、表示処理部１１４が、組合せごとの並列化情報を生成する（ステップＳ３０５）。
組合せとは、制約条件とＣＰＵコア数との組み合わせである。
本実施の形態では、プログラマーは、制約条件のバリエーションを複数パターン設定する。例えば、プログラマーは、パターン１として、スキャンタイム、ＲＯＭ使用量及び共通デバイスの各々の要求値が緩やかなパターンを設定する。また、プログラマーは、パターン２として、スキャンタイムの要求が厳格であるが、ＲＯＭ使用量及び共通デバイスの各々の要求値は緩やかなパターンを設定する。また、プログラマーは、パターン３として、スキャンタイム、ＲＯＭ使用量及び共通デバイスの各々の要求値が厳格なパターンを設定する。
表示処理部１１４は、例えば、図９に示すように、デュアルコアとパターン１、パターン２及びパターン３の各々との組合せ、トリプルコアとパターン１、パターン２及びパターン３の各々との組合せ、クアッドコアとパターン１、パターン２及びパターン３の各々との組合せで、並列化情報を生成する。
図９に示す並列化情報では、コア数とパターンとの組合せごとにタブが設けられている。プログラマーは、所望する組合せのタブに対してマウスクリックを行うことで、所望する組合せにおける並列化実行スケジュール（ガントチャート）、制約条件の成否状況等を参照することができる。図９の例では、デュアルコアとパターン１の組合せの並列化情報が表示されている。
なお、コア数が共通していれば、並列化実行スケジュール（ガントチャート）は同じである。つまり、デュアルコアとパターン１との組合せに対応する並列化情報、デュアルコアとパターン２との組合せに対応する並列化情報、及びデュアルコアとパターン３との組合せに対応する並列化情報の各々で示される並列化実行スケジュール（ガントチャート）は同じである。
一方で、基本情報の記述はパターンごとに異なる可能性がある。表示処理部１１４は、パターンごとに制約条件が成立するか否かを判定する。そして、表示処理部１１４は、パターンごとに制約条件が成立したか否かが基本情報に示される並列化情報を生成する。
例えば、デュアルコアとパターン２の組合せでは、スキャンタイムの要求値が満たされず、ＲＯＭ使用量及び共通デバイスの各々の要求値は満たされているとする。この場合は、当該制約条件に対応する項目である「並列化実行時間」が例えば赤色で表示される。また、例えば、デュアルコアとパターン３の組合せでは、スキャンタイム、ＲＯＭ使用量及び共通デバイスの各々の要求値が満たされないとする。この場合は、スキャンタイム、ＲＯＭ使用量及び共通デバイスの各々に対応する項目が例えば赤色で表示される。
また、図９に示す並列化情報では、改善率が示される。表示処理部１１４は、並列化せずにプログラムを実行する際（シングルコアでプログラムを実行する際）のプログラムの実行に要する時間（非並列化実行時間）を算出する。そして、表示処理部１１４は、並列化実行スケジュールでプログラムを実行する際のプログラムの実行に要する時間（並列化実行時間）と非並列化実行時間との差異状況として改善率を算出する。つまり、表示処理部１１４は、「｛（非並列化実行時間／並列化実行時間）−１｝＊１００」を計算して改善率を得る。表示処理部１１４は、デュアルコア、トリプルコア及びクアッドコアの各々に対して改善率を算出し、各々の並列化情報に改善率を表示する。
【００６９】
最後に、表示処理部１１４は並列化情報を表示装置１６に出力する（ステップＳ３０９）。
【００７０】
＊＊＊実施の形態の効果の説明＊＊＊
本実施の形態では、ＣＰＵコア数と制約条件のパターンの組合せごとに並列化情報を表示する。このため、本実施の形態によれば、プログラマーは制約条件を満たす並列化数を早期に把握することができる。
【００７１】
以上、本発明の実施の形態について説明したが、これらの実施の形態のうち、２つ以上を組み合わせて実施しても構わない。
あるいは、これらの実施の形態のうち、１つを部分的に実施しても構わない。
あるいは、これらの実施の形態のうち、２つ以上を部分的に組み合わせて実施しても構わない。
なお、本発明は、これらの実施の形態に限定されるものではなく、必要に応じて種々の変更が可能である。
【００７２】
＊＊＊ハードウェア構成の説明＊＊＊
最後に、情報処理装置１００のハードウェア構成の補足説明を行う。
【００７３】
図３のストレージ１３には、入力処理部１０１、行プログラム取得部１０４、ブロック生成部１０６、タスクグラフ生成部１０８、タスクグラフ枝切り部１０９、スケジュール生成部１１２及び表示処理部１１４の機能を実現するプログラムの他、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）も記憶されている。
そして、ＯＳの少なくとも一部がプロセッサ１１により実行される。
プロセッサ１１はＯＳの少なくとも一部を実行しながら、入力処理部１０１、行プログラム取得部１０４、ブロック生成部１０６、タスクグラフ生成部１０８、タスクグラフ枝切り部１０９、スケジュール生成部１１２及び表示処理部１１４の機能を実現するプログラムを実行する。
プロセッサ１１がＯＳを実行することで、タスク管理、メモリ管理、ファイル管理、通信制御等が行われる。
また、入力処理部１０１、行プログラム取得部１０４、ブロック生成部１０６、タスクグラフ生成部１０８、タスクグラフ枝切り部１０９、スケジュール生成部１１２及び表示処理部１１４の処理の結果を示す情報、データ、信号値及び変数値の少なくともいずれかが、メモリ１２、ストレージ１３、プロセッサ１１内のレジスタ及びキャッシュメモリの少なくともいずれかに記憶される。
また、入力処理部１０１、行プログラム取得部１０４、ブロック生成部１０６、タスクグラフ生成部１０８、タスクグラフ枝切り部１０９、スケジュール生成部１１２及び表示処理部１１４の機能を実現するプログラムは、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ（登録商標）ディスク、ＤＶＤ等の可搬記録媒体に格納されていてもよい。そして、入力処理部１０１、行プログラム取得部１０４、ブロック生成部１０６、タスクグラフ生成部１０８、タスクグラフ枝切り部１０９、スケジュール生成部１１２及び表示処理部１１４の機能を実現するプログラムが格納された可搬記録媒体を商業的に流通させてもよい。
【００７４】
また、入力処理部１０１、行プログラム取得部１０４、ブロック生成部１０６、タスクグラフ生成部１０８、タスクグラフ枝切り部１０９、スケジュール生成部１１２及び表示処理部１１４の「部」を、「回路」又は「工程」又は「手順」又は「処理」に読み替えてもよい。
また、情報処理装置１００は、処理回路により実現されてもよい。処理回路は、例えば、ロジックＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）、ＧＡ（Ｇａｔｅ  Ａｒｒａｙ）、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）、ＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）である。
この場合は、入力処理部１０１、行プログラム取得部１０４、ブロック生成部１０６、タスクグラフ生成部１０８、タスクグラフ枝切り部１０９、スケジュール生成部１１２及び表示処理部１１４は、それぞれ処理回路の一部として実現される。
なお、本明細書では、プロセッサと処理回路との上位概念を、「プロセッシングサーキットリー」という。
つまり、プロセッサと処理回路とは、それぞれ「プロセッシングサーキットリー」の具体例である。
【符号の説明】
【００７５】
１１  プロセッサ、１２  メモリ、１３  ストレージ、１４  通信装置、１５  入力装置、１６  表示装置、１００  情報処理装置、１０１  入力処理部、１０２  プログラムデータベース、１０３  命令データベース、１０４  行プログラム取得部、１０５  重み付きプログラムデータベース、１０６  ブロック生成部、１０７  依存関係データベース、１０８  タスクグラフ生成部、１０９  タスクグラフ枝切り部、１１０  タスクグラフデータベース、１１１  制約条件データベース、１１２  スケジュール生成部、１１３  スケジュールデータベース、１１４  表示処理部、２００  制御機器、３００  工場ライン、３０１  設備（１）、３０２  設備（２）、３０３  設備（３）、３０４  設備（４）、３０５  設備（５）、４０１  ネットワーク、４０２  ネットワーク。
【図１】
0006890738.tif 000002
【図２】
0006890738.tif 000003
【図３】
0006890738.tif 000004
【図４】
0006890738.tif 000005
【図５】
0006890738.tif 000006
【図６】
0006890738.tif 000007
【図７】
0006890738.tif 000008
【図８】
0006890738.tif 000009
【図９】
0006890738.tif 000010
【図１０】
0006890738.tif 000011
【図１１】
0006890738.tif 000012
【図１２】
0006890738.tif 000013