(57)【要約】【課題】処理の呼び出しにかかっていた時間の削減を図ることができるマルチプロセッサ用プログラム等を提供する。【解決手段】コンピュータが、プロセスを実行するプロセッサおよびコアの位置情報と、メモリが搭載されたプロセッサの位置情報と、プロセスを実行するコアからメモリにアクセスする際に使用可能なインターフェイスの情報とを含む通信経路情報とを読み込む。そして、読み込んだ情報に基づいて、コンピュータが、プロセス間でメモリを介してデータの送受信を実行するＡＰＩに設定するパラメータを特定する。そして、コンピュータが、特定したパラメータで動作するＡＰＩのコードを生成し、メイン処理プログラムにおいて、プロセス間でのデータの送受信の実行箇所に、生成したＡＰＩのコードを埋め込む処理を実行する。【選択図】図１
2015125503.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータが、
プロセスを実行するプロセッサおよびコアの位置情報と、メモリが搭載されたプロセッサの位置情報と、前記プロセスを実行するコアから前記メモリにアクセスする際に使用可能なインターフェイスの情報とを含む通信経路情報に基づいて、プロセス間で前記メモリを介してデータの送受信を実行するＡＰＩ（Application  Programming  Interface）に設定するパラメータを特定し、
特定したパラメータで動作するＡＰＩのコードを生成し、
メイン処理プログラムにおいて、前記プロセス間でのデータの送受信の実行箇所に、生成したＡＰＩのコードを埋め込む
処理を実行することを特徴とするマルチプロセッサ用プログラム生成方法。
【請求項２】
前記コンピュータが、
前記プロセス間でのデータの送受信において前記プロセスがアクセスする前記メモリの情報を含む仮想通信情報と、
前記プロセスを実行するプロセッサおよびコアの位置情報を含むタスクの物理位置情報と、
前記メモリが搭載されたプロセッサの位置情報および前記メモリにアクセスする際に使用可能なインターフェイスの情報を含むメモリの物理位置情報と、
を外部から受け付け、
受け付けた前記仮想通信情報、前記タスクの物理位置情報、および前記メモリの物理位置情報に基づいて、前記通信経路情報を生成する
処理をさらに実行することを特徴とする請求項１に記載のマルチプロセッサ用プログラム生成方法。
【請求項３】
前記通信経路情報には、
前記プロセスが前記メモリにアクセスする際の最小のデータサイズの情報が含まれ、
前記コンピュータは、前記特定する処理において、
前記最小のデータサイズが、予め定められた値以上の場合に、前記プロセスを実行するコアから前記メモリにアクセスする際に使用可能なインターフェイスの情報を、データ転送専用のハードウェアを用いたインターフェイスに変更することを特徴とする請求項１または２に記載のマルチプロセッサ用プログラム生成方法。
【請求項４】
前記データ転送専用のハードウェアを用いたインターフェイスは、ＤＭＡ（Direct  Memory  Access）であることを特徴とする請求項３に記載のマルチプロセッサ用プログラム生成方法。
【請求項５】
第１のコアと第２のコアとを有する第１のプロセッサと、
第３のコアを有する第２のプロセッサと、
第１のプロセスから第２のプロセスへデータを送信するデータ送信部と、
前記第１のプロセスから前記第２のプロセスへ送信されたデータを受信するデータ受信部と
を有し、
前記第１のプロセスは、前記第１のコアで実行され、
前記第２のプロセスは、前記第１のコア、前記第２のコア、または前記第３のコアの中で、予め定められたコアで実行され、
前記データ送信部は、
前記第１のプロセスから前記第２のプロセスへのデータ送信において予め定められたインターフェイスを用いてデータを送信し、
前記データ受信部は、
前記第１のプロセスから前記第２のプロセスへ送信されたデータの受信において予め定められたインターフェイスを用いてデータを受信することを特徴とするマルチプロセッサ装置。
【請求項６】
第１のコアと第２のコアとを有する第１のプロセッサと、
第３のコアを有する第２のプロセッサと
を有するコンピュータに、
第１のプロセスを、前記第１のコアで実行し、
第２のプロセスを、前記第１のコア、前記第２のコア、または前記第３のコアの中で、予め定められたコアで実行し、
前記第１のプロセスから前記第２のプロセスへのデータを、前記第１のプロセスから前記第２のプロセスへのデータ送信において予め定められたインターフェイスを用いて送信し、
前記第１のプロセスから前記第２のプロセスへ送信されたデータを、前記第１のプロセスから前記第２のプロセスへ送信されたデータの受信において予め定められたインターフェイスを用いてデータを受信する
処理を実行させることを特徴とするマルチプロセッサ用ファームウェア。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチプロセッサ用プログラム生成方法、マルチプロセッサ装置およびマルチプロセッサ用ファームウェアに関する。
【背景技術】
【０００２】
マルチプロセッサやマルチコアの組込み機器の開発において、あるコアで実行させていたプロセスを別なコアで実行させるように変更する場合がある。かかる場合、プロセスを実行するコアと、プロセスによってアクセスされるメモリとの物理的な位置関係が変わることで、プロセスを実行するコアとプロセスによってアクセスされるメモリとの間の通信手段を変更することになる場合がある。
【０００３】
物理的な位置の変更に伴う通信手段の変更負担を軽減する方法として、通信部分を仮想化する方法がある。仮想通信では、メイン処理プログラムにおいて、通信が行われる箇所では、通信処理を実行するＡＰＩ（Application  Programming  Interface）を呼び出すように記述される。通信元および通信先の定義は初期起動時に初期化され、定義された通信元と通信先とに基づいて、実際に通信を行う通信処理ＡＰＩがライブラリから動的に呼び出されて実行される。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００９−１０４４２２号公報
【特許文献２】特開２０００−１８１８８１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかし、上記の仮想通信では、通信の実行時にＡＰＩを呼び出して通信処理を実行するため、通信処理を呼び出すための前処理や、呼び出した通信処理が終了した後の後処理が行われる。このような前処理や後処理のオーバーヘッドは、メモリへのリード／ライトのように、実行時間が短く頻繁に発生する通信処理では、全体の処理時間のうち、大きな割合を占めることになる。
【０００６】
１つの側面では、本発明は、処理の呼び出しにかかっていた時間の削減を図ることができるマルチプロセッサ用プログラム生成方法、マルチプロセッサ装置およびマルチプロセッサ用ファームウェアを提供することを目的とする。
【課題を解決するための手段】
【０００７】
一つの案では、コンピュータが、プロセスを実行するプロセッサおよびコアの位置情報と、メモリが搭載されたプロセッサの位置情報と、前記プロセスを実行するコアから前記メモリにアクセスする際に使用可能なインターフェイスの情報とを含む通信経路情報に基づいて、プロセス間で前記メモリを介してデータの送受信を実行するＡＰＩに設定するパラメータを特定する処理を実行する。そして、前記コンピュータが、特定したパラメータで動作するＡＰＩのコードを生成する処理を実行する。そして、前記コンピュータが、メイン処理プログラムにおいて、前記プロセス間でのデータの送受信の実行箇所に、生成したＡＰＩのコードを埋め込む処理を実行する。
【発明の効果】
【０００８】
１つの側面では、本発明は、処理の呼び出しにかかっていた時間の削減を図ることができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施例１におけるプログラム生成装置の一例を示す説明図である。
【図２】図２は、通信経路情報の一例を示す説明図である。
【図３】図３は、仮想通信情報の一例を示す説明図である。
【図４】図４は、タスクに関する物理位置情報の一例を示す説明図である。
【図５】図５は、メモリに関する物理位置情報の一例を示す説明図である。
【図６】図６は、マルチプロセッサ装置の一例を示す説明図である。
【図７Ａ】図７Ａは、ポインタによるデータ転送の一例を説明するための図である。
【図７Ｂ】図７Ｂは、ポインタによるデータ転送の一例を説明するための図である。
【図７Ｃ】図７Ｃは、ポインタによるデータ転送の一例を説明するための図である。
【図８】図８は、タスク間のデータ転送の詳細な一例を示す説明図である。
【図９Ａ】図９Ａは、コアアクセスによるデータ転送（Read  Local）の一例を説明するための図である。
【図９Ｂ】図９Ｂは、コアアクセスによるデータ転送（Read  Local）の一例を説明するための図である。
【図９Ｃ】図９Ｃは、コアアクセスによるデータ転送（Read  Local）の一例を説明するための図である。
【図１０Ａ】図１０Ａは、コアアクセスによるデータ転送（Write  Local）の一例を説明するための図である。
【図１０Ｂ】図１０Ｂは、コアアクセスによるデータ転送（Write  Local）の一例を説明するための図である。
【図１０Ｃ】図１０Ｃは、コアアクセスによるデータ転送（Write  Local）の一例を説明するための図である。
【図１１Ａ】図１１Ａは、シェアードメモリによるデータ転送の一例を説明するための図である。
【図１１Ｂ】図１１Ｂは、シェアードメモリによるデータ転送の一例を説明するための図である。
【図１１Ｃ】図１１Ｃは、シェアードメモリによるデータ転送の一例を説明するための図である。
【図１２Ａ】図１２Ａは、ＤＭＡによるデータ転送の一例を説明するための図である。
【図１２Ｂ】図１２Ｂは、ＤＭＡによるデータ転送の一例を説明するための図である。
【図１２Ｃ】図１２Ｃは、ＤＭＡによるデータ転送の一例を説明するための図である。
【図１３Ａ】図１３Ａは、ＳＲＩＯによるデータ転送の一例を説明するための図である。
【図１３Ｂ】図１３Ｂは、ＳＲＩＯによるデータ転送の一例を説明するための図である。
【図１３Ｃ】図１３Ｃは、ＳＲＩＯによるデータ転送の一例を説明するための図である。
【図１４】図１４は、実施例１におけるプログラム生成装置の動作の一例を示すフローチャートである。
【図１５】図１５は、実施例２におけるプログラム生成装置の一例を示す説明図である。
【図１６】図１６は、実施例２におけるプログラム生成装置の動作の一例を示すフローチャートである。
【図１７】図１７は、プログラム生成装置の機能を実現するコンピュータの一例を示す説明図である。
【発明を実施するための形態】
【００１０】
以下に、本願の開示するマルチプロセッサ用プログラム生成方法、マルチプロセッサ装置およびマルチプロセッサ用ファームウェアの実施例を詳細に説明する。なお、本実施例により、開示技術が限定されるものではない。また、以下に示す各実施例は、矛盾を起こさない範囲で適宜組み合わせてもよい。
【実施例１】
【００１１】
図１は、実施例１におけるプログラム生成装置１０の一例を示す説明図である。プログラム生成装置１０は、例えば図１に示すように、通信経路情報格納部１１と、特定部１２と、生成部１３と、埋め込み部１４とを有する。本実施例において、プログラム生成装置１０は、例えば、１つ以上のコアを有するプロセッサを複数有するマルチプロセッサ装置用のプログラムを生成する。また、本実施例において、マルチプロセッサ装置は、例えば無線基地局や無線端末として機能する。
【００１２】
通信経路情報格納部１１には、例えば図２に示すような通信経路情報１１０が格納される。図２は、通信経路情報１１０の一例を示す説明図である。通信経路情報１１０には、ＡＰＩ名称１１１、アクセス種別１１２、アクセス元情報１１３、アクセス先情報１１４、最小アクセスサイズ１１５、領域サイズ１１６、およびＩＦ（InterFace）種別１１７が含まれる。ＡＰＩ名称１１１は、タスクからメモリへのデータの転送や、メモリからタスクへのデータの転送を実行するＡＰＩを識別する名称である。タスクは、プロセスの一例である。アクセス種別１１２は、データの転送がタスクからメモリへの書き込みなのか、メモリからの読み出しなのかを示す情報である。図２に例示したアクセス種別１１２において、「Ｗ」はデータの転送がタスクからメモリへの書き込みであることを示し、「Ｒ」はデータの転送がメモリからの読み出しであることを示す。
【００１３】
アクセス元情報１１３には、メモリにアクセスするアクセス元のタスクの名称と、タスクが実行されるコアの名称と、コアを有するプロセッサの名称とが含まれる。アクセス元情報１１３に含まれたプロセッサおよびコアの名称を参照することにより、タスクが実行されているコアの位置と、コアを含むプロセッサの位置とを特定することができる。
【００１４】
アクセス先情報１１４には、タスクがアクセスするアクセス先のメモリの名称と、プロセッサの名称と、コアの名称と、メモリの種別とが含まれる。メモリの種別とは、ローカルメモリやシェアードメモリ等のメモリの種別を示す。図２に例示したアクセス先情報１１４の種別において、「ローカル」はメモリの種別がローカルメモリであることを示す。コアの名称とは、メモリがローカルメモリである場合、メモリに主としてアクセスするコアの名称である。プロセッサの名称とは、メモリが実装されているプロセッサの名称である。アクセス先情報１１４に含まれたプロセッサおよびコアの名称を参照することにより、メモリが実装されているプロセッサの位置と、メモリが主としてアクセスされるコアの位置とを特定することができる。
【００１５】
最小アクセスサイズ１１５は、転送されるデータの最小サイズを示す。領域サイズ１１６は、転送されるデータを保持するための領域のサイズを示す。ＩＦ種別１１７は、タスクからメモリへのアクセスにおいて使用されるインターフェイスの種別を示す。図２に例示したＩＦ種別１１７において、「Ｂｕｓ」は、タスクからメモリへのアクセスにおいて使用されるインターフェイスの種別がバスであることを示す。
【００１６】
ここで、図２に例示した通信経路情報１１０は、例えば、図３に例示する仮想通信情報２００と、図４に例示するタスクの物理位置情報２１０と、図５に例示するメモリの物理位置情報２１４とに基づいて作成される。仮想通信情報２００およびタスクの物理位置情報２１０は、例えばプログラマ等によって作成される。また、メモリの物理位置情報２１４は、例えばマルチプロセッサ装置の設計者等によって作成される。
【００１７】
図３は、仮想通信情報２００の一例を示す説明図である。仮想通信情報２００には、例えば図３に示すように、番号２０１に対応付けて、アクセス元タスク名称２０２、アクセス先メモリ名称２０３、最小アクセスサイズ２０４、領域サイズ２０５、アクセス種別２０６、およびＡＰＩ名称２０７が含まれる。アクセス元タスク名称２０２は、メモリにアクセスするアクセス元のタスクの名称である。アクセス先メモリ名称２０３は、タスクがアクセスするアクセス先のメモリの名称である。最小アクセスサイズ２０４は、転送されるデータの最小サイズを示す。領域サイズ２０５は、転送されるデータを保持するための領域のサイズを示す。ＡＰＩ名称２０７は、タスクからメモリへのデータの転送や、メモリからタスクへのデータの転送を実行するＡＰＩを識別する名称である。
【００１８】
図４は、タスクに関する物理位置情報２１０の一例を示す説明図である。タスクの物理位置情報２１０には、タスク名称２１１、プロセッサ名称２１２、およびコア名称２１３が含まれる。タスク名称２１１は、それぞれのタスクを識別する名称である。プロセッサ名称２１２は、タスクが実行されるコアを有するプロセッサの名称である。コア名称２１３は、タスクを実行するコアの名称である。
【００１９】
図５は、メモリに関する物理位置情報２１４の一例を示す説明図である。メモリの物理位置情報２１４には、メモリ名称２１５、プロセッサ名称２１６、コア名称２１７、種別２１８、および使用ＩＦ２１９が含まれる。メモリ名称２１５は、それぞれのメモリを識別する名称である。プロセッサ名称２１６は、メモリが実装されているプロセッサの名称である。コア名称２１７は、メモリがローカルメモリである場合に、メモリに主としてアクセスするコアの名称である。種別２１８は、ローカルメモリやシェアードメモリ等のメモリの種別を示す。使用ＩＦ２１９は、メモリにアクセスする場合に使用可能なインターフェイスを示す。
【００２０】
図１に戻って説明を続ける。特定部１２は、通信経路情報１１０を参照し、タスクからアクセスされるメモリの種別や、タスクが実行されるコアの位置等に応じて、タスク間のデータ通信に使用されるインターフェイスのＩＦ種別を修正する。例えば、特定部１２は、通信経路情報１１０内のアクセス先情報を参照し、アクセス先が同一のメモリであるタスクのペアを特定する。そして、特定部１２は、特定したタスクのペアによってアクセスされるメモリの種別がローカルか否かを判定する。
【００２１】
アクセス先のメモリの種別がローカルである場合、特定部１２は、特定したタスクのペアが同一のプロセッサ内の同一のコアで実行されていれば、通信経路情報１１０内のＩＦ種別をポインタによるデータ転送に変更する。このように、同一のプロセッサ内の同一のコアで実行されているタスクのデータ転送を、ポインタによるデータ転送に変更することにより、特定部１２は、タスク間のデータ転送を高速化することができる。
【００２２】
一方、特定したタスクのペアが同一のプロセッサ内の異なるコアで実行されている場合、特定部１２は、通信経路情報１１０内の最小アクセスサイズが所定サイズ以上か否かを判定する。所定サイズとは、例えばデータ転送専用のハードウェアを使用するインターフェイスを用いたデータ転送の方が高速なデータ転送となるデータのサイズである。データ転送専用のハードウェアを用いたインターフェイスとは、例えばＤＭＡ（Direct  Memory  Access）である。通信経路情報１１０内の最小アクセスサイズが所定サイズ以上である場合、特定部１２は、通信経路情報１１０内のＩＦ種別を、ＤＭＡによるデータ転送に変更する。このように、タスク間で転送されるデータ量が所定サイズ以上の場合に、ＩＦ種別をＤＭＡによるデータ転送に変更することにより、特定部１２は、より高速なデータ転送を設定することができる。
【００２３】
一方、通信経路情報１１０内の最小アクセスサイズが所定サイズ未満である場合、特定部１２は、通信経路情報１１０内のＩＦ種別をコアアクセスに変更する。コアアクセスとは、異なるコアで実行されているタスクが、いずれかのタスクが実行されているコアのローカルメモリを介してデータを転送するデータ転送方法である。このように、異なるコアでタスクが実行される場合であっても、いずれかのローカルメモリを介してデータ転送を行う場合に、ＩＦ種別をコアアクセスに変更することにより、特定部１２は、より高速なデータ転送を設定することができる。
【００２４】
次に、特定部１２は、通信経路情報１１０に基づいて、タスク間でメモリを介してデータの送受信を実行するＡＰＩに設定するパラメータを特定する。特定部１２は、例えば、通信経路情報１１０内のＩＦ種別を参照し、ＩＦ種別で示されるインターフェイスを用いた通信を実現するＡＰＩのソースコードを、既存のソースライブラリ内で特定する。そして、特定部１２は、特定したＡＰＩの起動に用いられるパラメータを特定する。
【００２５】
生成部１３は、特定部１２によって特定されたパラメータで動作するＡＰＩのソースコードを生成する。生成部１３は、例えば、通信経路情報１１０内のＩＦ種別を参照し、ＩＦ種別で示されるインターフェイスを用いた通信を実現するＡＰＩのソースコードを、既存のソースライブラリから取得する。そして、生成部１３は、取得したＡＰＩのソースコードの設定値を、特定部１２によって特定されたパラメータに書き換えて、ＡＰＩのソースコードを生成する。ここで生成されたＡＰＩのソースコードは、本実施例のマルチプロセッサ装置に特化した仮想通信用ＡＰＩのソースコードである。
【００２６】
埋め込み部１４は、メイン処理プログラムのソースコード内で、タスク間のデータ送受信の実行箇所に、生成したＡＰＩのソースコードを埋め込む。ここで、本実施例におけるメイン処理プログラムとは、例えば、個別の処理を行う複数のタスクを実行して所定の処理を実行するプログラムである。また、プログラム生成装置１０によって生成されるマルチプロセッサ用プログラムに基づいて動作するマルチプロセッサ装置が、例えば無線基地局として機能する場合、メイン処理プログラムによって実行される所定の処理は、例えば送信処理である。また、メイン処理プログラムによって実行されるタスクは、例えばエンコードの処理等の個別の処理を実行する。
【００２７】
埋め込み部１４は、例えば、メイン処理プログラムのソースコード内で、タスク間のデータ通信を実行するＡＰＩが呼び出される箇所を特定する。そして、埋め込み部１４は、特定した箇所に、生成部１３によって生成されたＡＰＩのソースコードを埋め込んで、マルチプロセッサ用プログラムのソースコードを生成する。
【００２８】
なお、埋め込み部１４は、生成したマルチプロセッサ用プログラムのソースコードをプログラム生成装置１０内の記憶部に記憶させてもよく、プログラム生成装置１０の外部の機器へ出力してもよい。また、埋め込み部１４は、生成したマルチプロセッサ用プログラムのソースコードと、他のＡＰＩのソースコードとを、コンパイルおよびリンクし、マルチプロセッサ用の実行コードとして、プログラム生成装置１０内の記憶部に記憶させてもよい。また、埋め込み部１４は、生成したマルチプロセッサ用の実行コードを、プログラム生成装置１０の外部の機器（例えば、マルチプロセッサ装置）へ出力してもよい。
【００２９】
ここで、プログラム生成装置１０によって生成されたマルチプロセッサ用プログラムに基づいて動作するマルチプロセッサ装置について説明する。図６は、マルチプロセッサ装置３０の一例を示す説明図である。本実施例におけるマルチプロセッサ装置３０は、複数のプロセッサであるＤＳＰ１およびＤＳＰ２と、マルチプロセッサ用ファームウェア３１および各種データを格納するＲＯＭとを有する。マルチプロセッサ用ファームウェア３１は、プログラム生成装置１０によって生成されたマルチプロセッサ用プログラムの実行コードであり、マルチプロセッサ装置３０の起動前にマルチプロセッサ装置３０内のＲＯＭに予め格納される。
【００３０】
ＤＳＰ１には、複数のコアであるＣｏｒｅ１１およびＣｏｒｅ１２と、複数のメモリであるＭＥＭ１１、ＭＥＭ１２およびＭＥＭ１３とが含まれる。また、ＤＳＰ１には、ＤＳＰ１内のコア間でメモリの転送を行うインターフェイスであるＤＭＡと、ＤＳＰ１の外部の機器と間でシリアル通信を行うインターフェイスの一例であるＳＲＩＯ（Serial  Rapid  IO）とが含まれる。ＤＳＰ１の外部の機器と間でシリアル通信を行うインターフェイスとしては、ＳＲＩＯの他に、イーサネット（登録商標）、ＲＳ２３２Ｃ、ＰＣＩ等がＤＳＰ１に含まれていてもよい。
【００３１】
ＭＥＭ１１は、Ｃｏｒｅ１１のローカルメモリであり、主としてＣｏｒｅ１１からアクセスされる。ＭＥＭ１１は、Ｃｏｒｅ１１以外のコア（例えばＣｏｒｅ１２）からアクセスされることも可能であるが、Ｃｏｒｅ１１との間のデータ転送速度の方が、Ｃｏｒｅ１１以外のコアとの間のデータ転送速度よりも高速である。
【００３２】
ＭＥＭ１２は、Ｃｏｒｅ１２のローカルメモリであり、主としてＣｏｒｅ１２からアクセスされる。ＭＥＭ１２も、Ｃｏｒｅ１２以外のコア（例えばＣｏｒｅ１１）からアクセスされることが可能であるが、Ｃｏｒｅ１２との間のデータ転送速度の方が、Ｃｏｒｅ１２以外のコアとの間のデータ転送速度よりも高速である。
【００３３】
ＭＥＭ１３は、Ｃｏｒｅ１１およびＣｏｒｅ１２のシェアードメモリであり、Ｃｏｒｅ１１およびＣｏｒｅ１２の双方からアクセスされ、Ｃｏｒｅ１１との間のデータ転送速度と、Ｃｏｒｅ１２との間のデータ転送速度とは、同程度である。
【００３４】
ＤＳＰ２には、複数のコアであるＣｏｒｅ２１およびＣｏｒｅ２２と、複数のメモリであるＭＥＭ２１、ＭＥＭ２２およびＭＥＭ２３とが含まれる。また、ＤＳＰ２には、ＤＭＡとＳＲＩＯとが含まれる。
【００３５】
ＲＯＭ内のマルチプロセッサ用ファームウェア３１には、タスク毎の実行コードが含まれている。ＤＳＰ１またはＤＳＰ２は、マルチプロセッサ用ファームウェア３１をＲＯＭから読み出し、それぞれのタスクの実行コードを、タスクを実行するコアのローカルメモリに展開する。なお、全てのタスクの実行コードが、いずれかのローカルメモリに必ずしも常時展開されている必要はなく、処理に用いられるタスクの実行コードのみがローカルメモリに展開されてもよい。
【００３６】
それぞれのタスクは、データの送信において、タスクの実行コードに埋め込まれている命令に従って、命令で指定されたインターフェイスを用いて、命令で指定されたメモリにデータを書き込む。また、それぞれのタスクは、データの受信において、タスクの実行コードに埋め込まれている命令に従って、命令で指定されたインターフェイスを用いて、命令で指定されたメモリからデータを読み出す。
【００３７】
各コアは、ローカルメモリ内の実行コードをタスクとして機能させる。そして、それぞれのタスクは、ローカルメモリから読み出した各種データを適宜ローカルメモリやシェアードメモリ上の自身に割り当てられた領域に展開し、この展開した各種データに基づいて各種処理を実行する。
【００３８】
次に、通信経路情報１１０に基づいてプログラム生成装置１０が生成したマルチプロセッサ用プログラムと、マルチプロセッサ用プログラムに基づいて動作するマルチプロセッサ装置３０との関係について、図７〜図１３を参照して説明する。図７〜図１３では、図６において例示したマルチプロセッサ装置３０の動作を示している。
【００３９】
図７Ａ〜Ｃは、ポインタによるデータ転送の一例を示す説明図である。図７Ａに例示した仮想通信情報２００では、ＴａｓｋＡからＴａｓｋＢへのデータ転送をＭＥＭ１２を介して行う仮想通信が定義されている。
【００４０】
図７Ｂの通信経路情報１１０に例示されているように、ＴａｓｋＡおよびＴａｓｋＢは、同一のＤＳＰ１内の同一のＣｏｒｅ１２で実行されている。また、図７Ｃに例示されているように、ＭＥＭ１２はＣｏｒｅ１２のローカルメモリであるため、特定部１２は、ＭＥＭ１２を介したＴａｓｋＡからＴａｓｋＢへのデータ転送におけるＩＦ種別を、例えばポインタによるデータ転送に変更する。図７Ｂでは、特定部１２によってＩＦ種別が変更された後の通信経路情報１１０が例示されている。
【００４１】
図８は、タスク間のデータ転送の詳細な一例を示す説明図である。データの転送元のＴａｓｋＡから、データの転送先のＴａｓｋＢへのデータ転送では、ＴａｓｋＡ内のデータ送信部３２が転送対象のデータをＭＥＭ１２に書き込み、ＴａｓｋＢ内のデータ受信部３３が転送対象のデータをＭＥＭ１２から読み出す。ただし、ＩＦ種別がポインタによるデータの転送に変更となったため、図７Ａ〜Ｃの例では、データ自体の転送は行われず、データが格納されたＭＥＭ１２内の場所を示すポインタの情報が、データ送信部３２からデータ受信部３３へ送られる。
【００４２】
図９Ａ〜Ｃは、コアアクセスによるデータ転送（Read  Local）の一例を示す説明図である。図９Ａに例示した仮想通信情報２００では、ＴａｓｋＡからＴａｓｋＢへのデータ転送をＭＥＭ１２を介して行う仮想通信が定義されている。
【００４３】
図９Ｂの通信経路情報１１０に例示されているように、ＴａｓｋＡおよびＴａｓｋＢは、同一のＤＳＰ１内で実行されているが、ＴａｓｋＡはＣｏｒｅ１１で実行され、ＴａｓｋＢはＣｏｒｅ１２で実行されている。また、図９Ｃに例示されているように、ＭＥＭ１２はＣｏｒｅ１２のローカルメモリであるため、特定部１２は、通信経路情報１１０内の最小アクセスサイズが所定サイズ（例えば５１２ｂｙｔｅ）以上か否かを判定する。
【００４４】
通信経路情報１１０内の最小アクセスサイズ（図９Ｂの例では２５６ｂｙｔｅ）が所定サイズ未満であるため、特定部１２は、ＭＥＭ１２を介したＴａｓｋＡからＴａｓｋＢへのデータ転送におけるＩＦ種別を、例えばコアアクセスに変更する。図９Ｂでは、特定部１２によってＩＦ種別が変更された後の通信経路情報１１０が例示されている。データの転送元のＴａｓｋＡからデータの転送先のＴａｓｋＢへのデータ転送では、ＴａｓｋＡ内のデータ送信部３２がコアアクセスにより転送対象のデータをＭＥＭ１２に書き込み、ＴａｓｋＢ内のデータ受信部３３が転送対象のデータをＭＥＭ１２から読み出す。
【００４５】
図１０Ａ〜Ｃは、コアアクセスによるデータ転送（Write  Local）の一例を示す説明図である。図１０Ａに例示した仮想通信情報２００では、ＴａｓｋＢからＴａｓｋＡへのデータ転送をＭＥＭ１２を介して行う仮想通信が定義されている。
【００４６】
図１０Ｂの通信経路情報１１０に例示されているように、ＴａｓｋＡおよびＴａｓｋＢは、同一のＤＳＰ１内で実行されているが、ＴａｓｋＡはＣｏｒｅ１１で実行され、ＴａｓｋＢはＣｏｒｅ１２で実行されている。また、図１０Ｃに例示されているように、ＭＥＭ１２はＣｏｒｅ１２のローカルメモリであるため、特定部１２は、通信経路情報１１０内の最小アクセスサイズが所定サイズ（例えば５１２ｂｙｔｅ）以上か否かを判定する。
【００４７】
通信経路情報１１０内の最小アクセスサイズ（図１０Ｂの例では２５６ｂｙｔｅ）が所定サイズ未満であるため、特定部１２は、ＭＥＭ１２を介したＴａｓｋＢからＴａｓｋＡへのデータ転送におけるＩＦ種別を、例えばコアアクセスに変更する。図１０Ｂでは、特定部１２によってＩＦ種別が変更された後の通信経路情報１１０が例示されている。データの転送元のＴａｓｋＢから、データの転送先のＴａｓｋＡへのデータ転送では、ＴａｓｋＢ内のデータ送信部３２が転送対象のデータをＭＥＭ１２に書き込み、ＴａｓｋＡ内のデータ受信部３３がコアアクセスにより転送対象のデータをＭＥＭ１２から読み出す。
【００４８】
図１１Ａ〜Ｃは、シェアードメモリによるデータ転送の一例を示す説明図である。図１１Ａに例示した仮想通信情報２００では、ＴａｓｋＡからＴａｓｋＢへのデータ転送をＭＥＭ１３を介して行う仮想通信が定義されている。
【００４９】
図１１Ｂの通信経路情報１１０に例示されているように、ＴａｓｋＡおよびＴａｓｋＢは、同一のＤＳＰ１内で実行されているが、ＴａｓｋＡはＣｏｒｅ１１で実行され、ＴａｓｋＢはＣｏｒｅ１２で実行されている。また、図１１Ｃに例示されているように、ＭＥＭ１３はＣｏｒｅ１１またはＣｏｒｅ１２のローカルメモリではないため、特定部１２は、ＭＥＭ１３を介したＴａｓｋＡからＴａｓｋＢへのデータ転送におけるＩＦ種別の変更を行わない。図１１Ｂに例示した通信経路情報１１０では、ＩＦ種別が変更前のＢｕｓのままとなっている。データの転送元のＴａｓｋＡから、データの転送先のＴａｓｋＢへのデータ転送では、ＴａｓｋＡ内のデータ送信部３２が転送対象のデータをＭＥＭ１３に書き込み、ＴａｓｋＢ内のデータ受信部３３が転送対象のデータをＭＥＭ１３から読み出す。
【００５０】
図１２Ａ〜Ｃは、ＤＭＡによるデータ転送の一例を示す説明図である。図１２Ａに例示した仮想通信情報２００では、ＴａｓｋＡからＴａｓｋＢへのデータ転送をＭＥＭ１２を介して行う仮想通信が定義されている。ただし、最小アクセスサイズの定義は５１２ｂｙｔｅとなっている。
【００５１】
図１２Ｂの通信経路情報１１０に例示されているように、ＴａｓｋＡおよびＴａｓｋＢは、同一のＤＳＰ１内で実行されているが、ＴａｓｋＡはＣｏｒｅ１１で実行され、ＴａｓｋＢはＣｏｒｅ１２で実行されている。また、図１２Ｃに例示されているように、ＭＥＭ１２はＣｏｒｅ１２のローカルメモリであるため、特定部１２は、通信経路情報１１０内の最小アクセスサイズが所定サイズ（例えば５１２ｂｙｔｅ）以上か否かを判定する。
【００５２】
通信経路情報１１０内の最小アクセスサイズ（図１２Ｂの例では５１２ｂｙｔｅ）が所定サイズ以上であるため、特定部１２は、ＭＥＭ１２を介したＴａｓｋＡからＴａｓｋＢへのデータ転送におけるＩＦ種別を、例えばＤＭＡによるデータ転送に変更する。図１２Ｂでは、特定部１２によってＩＦ種別が変更された後の通信経路情報１１０が例示されている。データの転送元のＴａｓｋＡから、データの転送先のＴａｓｋＢへのデータ転送では、ＴａｓｋＡ内のデータ送信部３２が転送対象のデータをＭＥＭ１１を介してＤＭＡへ送り、ＴａｓｋＢ内のデータ受信部３３が転送対象のデータをＭＥＭ１２から読み出す。
【００５３】
図１３Ａ〜Ｃは、ＳＲＩＯによるデータ転送の一例を示す説明図である。図１３Ａに例示した仮想通信情報２００では、ＴａｓｋＡからＴａｓｋＢへのデータ転送をＭＥＭ２１を介して行う仮想通信が定義されている。
【００５４】
図１３Ｂの通信経路情報１１０に例示されているように、ＴａｓｋＡおよびＴａｓｋＢは、異なるプロセッサ内のコアで実行されている。すなわち、ＴａｓｋＡはＤＳＰ１内のＣｏｒｅ１１で実行され、ＴａｓｋＢはＤＰＳ２内のＣｏｒｅ２１で実行されている。図１３Ｃに例示されているように、ＴａｓｋＡおよびＴａｓｋＢは異なるプロセッサ内で実行されているため、特定部１２は、ＭＥＭ１３を介したＴａｓｋＡからＴａｓｋＢへのデータ転送におけるＩＦ種別の変更を行わない。図１３Ｂに例示した通信経路情報１１０では、ＩＦ種別が変更前のＳＲＩＯのままとなっている。データの転送元のＴａｓｋＡから、データの転送先のＴａｓｋＢへのデータ転送では、ＴａｓｋＡ内のデータ送信部３２が転送対象のデータをＭＥＭ１１を介してＳＲＩＯへ送り、ＴａｓｋＢ内のデータ受信部３３が転送対象のデータをＭＥＭ２１から読み出す。なお、プロセッサ間のデータ転送において使用可能なインターフェイス（例えば、ＳＲＩＯ、イーサネット、ＰＣＩ等）が複数存在する場合には、例えばデータの転送速度が最も高いインターフェイスが採用される。
【００５５】
図１４は、プログラム生成装置１０の動作の一例を示すフローチャートである。プログラム生成装置１０は、例えば、図示しない入力装置を介してユーザからの指示を受け付けた場合等の所定のタイミングで、本フローチャートに示す動作を開始する。
【００５６】
まず、特定部１２は、通信経路情報１１０を参照して、アクセス先のメモリの中で、未選択のメモリを１つ選択する（Ｓ１００）。そして、特定部１２は、通信経路情報１１０を参照して、選択したメモリにデータを書き込むタスクと読み出すタスクのペアを特定する（Ｓ１０１）。そして、特定部１２は、通信経路情報１１０を参照して、タスクのペアによってアクセスされるメモリの種別がローカルか否かを判定する（Ｓ１０２）。
【００５７】
アクセス先のメモリの種別がローカルである場合（Ｓ１０２：Ｙｅｓ）、特定部１２は、通信経路情報１１０を参照して、タスクのペアが同一のプロセッサ内で実行されているか否かを判定する（Ｓ１０３）。タスクのペアによってアクセスされるメモリの種別がローカルではない場合（Ｓ１０２：Ｎｏ）、または、タスクのペアが異なるプロセッサ内で実行されている場合（Ｓ１０３：Ｎｏ）、特定部１２は、ステップＳ１０９に示す処理を実行する。
【００５８】
タスクのペアが同一のプロセッサ内で実行されている場合（Ｓ１０３：Ｙｅｓ）、特定部１２は、通信経路情報１１０を参照して、タスクのペアが同一のコアで実行されているか否かを判定する（Ｓ１０４）。タスクのペアが同一のコアで実行されている場合（Ｓ１０４：Ｙｅｓ）、特定部１２は、通信経路情報１１０内のＩＦ種別をポインタによるデータ転送に変更し（Ｓ１０５）、ステップＳ１０９に示す処理を実行する。
【００５９】
一方、タスクのペアが異なるコアで実行されている場合（Ｓ１０４：Ｎｏ）、特定部１２は、通信経路情報１１０内の最小アクセスサイズを参照して、最小アクセスサイズが所定サイズ以上か否かを判定する（Ｓ１０６）。最小アクセスサイズが所定サイズ未満である場合（Ｓ１０６：Ｎｏ）、特定部１２は、通信経路情報１１０内のＩＦ種別を、コアアクセスによるデータ転送に変更し（Ｓ１０７）、ステップＳ１０９に示す処理を実行する。
【００６０】
一方、最小アクセスサイズが所定サイズ以上である場合（Ｓ１０６：Ｙｅｓ）、特定部１２は、通信経路情報１１０内のＩＦ種別を、ＤＭＡによるデータ転送に変更する（Ｓ１０８）。そして、特定部１２は、通信経路情報１１０内のＩＦ種別を参照し、ＩＦ種別で示されるインターフェイスを用いた通信を実現するＡＰＩのソースコードを、例えば既存のソースライブラリから取得する（Ｓ１０９）。そして、特定部１２は、取得したＡＰＩの起動に用いられるパラメータを特定する（Ｓ１１０）。
【００６１】
次に、生成部１３は、ステップＳ１１０において特定されたパラメータで起動するように、ステップＳ１０９において取得されたソースコードを書き換えることにより、仮想通信ＡＰＩを生成する（Ｓ１１１）。そして、生成部１３は、生成した仮想通信ＡＰＩをプログラム生成装置１０内の記憶部に保持する。そして、特定部１２は、通信経路情報１１０を参照して、アクセス先のメモリを全て選択したか否かを判定する（Ｓ１１２）。未選択のメモリがある場合（Ｓ１１２：Ｎｏ）、特定部１２は、再びステップＳ１００に示した処理を実行する。
【００６２】
一方、アクセス先のメモリを全て選択した場合（Ｓ１１２：Ｙｅｓ）、埋め込み部１４は、メイン処理プログラムにおいて、タスク間でのデータの送受信の実行箇所に、生成したＡＰＩのソースコードを埋め込むＡＰＩコード埋め込み処理を実行する（Ｓ１１３）。そして、プログラム生成装置１０は、本フローチャートに示した動作を終了する。
【００６３】
ステップＳ１１３において、埋め込み部１４は、例えば、メイン処理プログラムのソースコード内で、タスク間のデータ通信を実行するＡＰＩが呼び出される箇所を特定する。そして、埋め込み部１４は、特定した箇所に、生成部１３によって生成されたＡＰＩのソースコードを埋め込んで、マルチプロセッサ用プログラムを生成する。
【００６４】
以上、実施例１について説明した。本実施例におけるプログラム生成装置１０によれば、マルチプロセッサ装置において、処理の呼び出しにかかっていた時間を削減し、全体的な処理時間の削減を図ることができる。
【実施例２】
【００６５】
図１５は、実施例２におけるプログラム生成装置の一例を示す説明図である。本実施例におけるプログラム生成装置１０’は、例えば図１５に示すように、通信経路情報格納部１１と、特定部１２と、生成部１３と、埋め込み部１４とを有する。また、プログラム生成装置１０’は、仮想通信情報格納部２０と、物理位置情報格納部２１と、受付部２２と、通信経路情報生成部２３と、ＡＰＩソースライブラリ格納部２４と、メイン処理プログラム格納部２５と、実行コード生成部２６とを有する。なお、以下に説明する点を除き、図１５において、図１と同じ符号を付した構成は、図１における構成と同一または同様の機能を有するため説明を省略する。
【００６６】
受付部２２は、ユーザのコンピュータ等の外部機器から、図３に例示した仮想通信情報２００、図４に例示したタスクの物理位置情報２１０、および図５に例示したメモリの物理位置情報２１４をそれぞれ受け付ける。そして、受付部２２は、受け付けた仮想通信情報２００を仮想通信情報格納部２０内に格納する。また、受付部２２は、受け付けたタスクの物理位置情報２１０およびメモリの物理位置情報２１４を物理位置情報格納部２１内に格納する。
【００６７】
通信経路情報生成部２３は、仮想通信情報格納部２０内の仮想通信情報２００と、物理位置情報格納部２１内のタスクの物理位置情報２１０およびメモリの物理位置情報２１４とに基づいて、図２に例示した通信経路情報１１０を生成する。そして、通信経路情報生成部２３は、生成した通信経路情報１１０を通信経路情報格納部１１に格納する。
【００６８】
ＡＰＩソースライブラリ格納部２４は、インターフェイス毎に、インターフェイスを用いた通信を実現するＡＰＩのソースライブラリを格納する。本実施例において、生成部１３は、通信経路情報１１０内のＩＦ種別を参照し、ＩＦ種別で示されるインターフェイスを用いた通信を実現するＡＰＩのソースコードを、ＡＰＩソースライブラリ格納部２４から取得する。
【００６９】
メイン処理プログラム格納部２５は、メイン処理プログラムのソースコードを格納する。埋め込み部１４は、メイン処理プログラム格納部２５からメイン処理プログラムのソースコードを取得する。実行コード生成部２６は、埋め込み部１４によって生成されたマルチプロセッサ用プログラムのソースコードを、他のＡＰＩのソースコードと共にコンパイルおよびリンクし、マルチプロセッサ用の実行コードを生成する。そして、実行コード生成部２６は、生成した実行コードを外部機器（例えばマルチプロセッサ装置３０等）へ出力する。
【００７０】
図１６は、実施例２におけるプログラム生成装置１０’の動作の一例を示すフローチャートである。プログラム生成装置１０’は、例えば、図示しない入力装置を介してユーザからの指示を受け付けた場合等の所定のタイミングで、本フローチャートに示す動作を開始する。
【００７１】
まず、受付部２２は、ユーザのコンピュータ等の外部機器から、仮想通信情報２００、タスクの物理位置情報２１０、およびメモリの物理位置情報２１４をそれぞれ受け付ける（Ｓ２００）。そして、受付部２２は、受け付けた仮想通信情報２００を仮想通信情報格納部２０内に格納し、受け付けたタスクの物理位置情報２１０およびメモリの物理位置情報２１４を物理位置情報格納部２１内に格納する（Ｓ２０１）。
【００７２】
次に、通信経路情報生成部２３は、仮想通信情報２００、タスクの物理位置情報２１０、メモリの物理位置情報２１４に基づいて、タスク名称およびメモリ名称をキーとして、図２に例示した通信経路情報１１０を生成する（Ｓ２０２）。そして、プログラム生成装置１０’は、図１４に例示したステップＳ１００〜Ｓ１１３の処理を実行する。
【００７３】
本実施例のプログラム生成装置１０’によれば、タスクを実行させるコア等の位置を変更した場合であっても、仮想通信情報、タスクの物理位置情報、およびメモリの物理位置情報を変更することで、変更に対応した実行コードを生成することができる。これにより、タスクを実行するコアやアクセス先のメモリの位置変更に伴うメイン処理プログラムの変更負担を軽減できる。そのため、マルチプロセッサ装置およびマルチプロセッサ装置に適用するファームウェアの開発において、プログラマ等の作業負担を軽減することができる。
【００７４】
なお、上記の実施例１または２において説明したプログラム生成装置における各種の処理は、予め用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。
【００７５】
図１７は、プログラム生成装置の機能を実現するコンピュータの一例を示す説明図である。図１７に示すように、コンピュータ１００は、操作部１１０ａと、スピーカ１１０ｂと、カメラ１１０ｃと、ディスプレイ１２０と、通信部１３０とを有する。さらに、このコンピュータ１００は、ＣＰＵ１５０と、ＲＯＭ１６０と、ＨＤＤ１７０と、ＲＡＭ１８０とを有する。これら１１０〜１８０の各部はバス１４０を介して接続される。
【００７６】
ＨＤＤ１７０には、例えば図１７に示すように、生成プログラム１７０ａが予め記憶される。上記実施例１では、生成プログラム１７０ａがコンピュータ１００に読み込まれることにより、コンピュータ１００は、特定部１２、生成部１３、および埋め込み部１４と同様の機能を発揮する。また、上記実施例１において、ＲＡＭ１８０またはＨＤＤ１７０には、通信経路情報格納部１１内のデータが格納される。
【００７７】
また、上記実施例２では、生成プログラム１７０ａがコンピュータ１００に読み込まれることにより、コンピュータ１００は、特定部１２、生成部１３、埋め込み部１４、受付部２２、通信経路情報生成部２３、および実行コード生成部２６と同様の機能を発揮する。また、上記実施例２において、ＲＡＭ１８０またはＨＤＤ１７０には、通信経路情報格納部１１、仮想通信情報格納部２０、物理位置情報格納部２１、ＡＰＩソースライブラリ格納部２４、およびメイン処理プログラム格納部２５内のデータが格納される。
【００７８】
生成プログラム１７０ａについては、図１４または図１６に示した各々の構成要素と同様、適宜統合または分離してもよい。また、ＨＤＤ１７０に格納される各データは、常に全てのデータがＨＤＤ１７０に格納される必要はなく、処理に用いられるデータのみがＨＤＤ１７０に格納されればよい。
【００７９】
そして、ＣＰＵ１５０が、生成プログラム１７０ａをＨＤＤ１７０から読み出してＲＡＭ１８０に展開する。これによって、図１７に示すように、生成プログラム１７０ａは、生成プロセス１８０ａとして機能する。この生成プロセス１８０ａは、ＨＤＤ１７０から読み出した各種データを適宜ＲＡＭ１８０上の自身に割り当てられた領域に展開し、この展開した各種データに基づいて各種処理を実行する。
【００８０】
なお、上記した各実施例における生成プロセス１８０ａは、図１および図１５に示した特定部１２、生成部１３、および埋め込み部１４において実行される処理、例えば図１４または図１６に示した処理を含む。ＣＰＵ１５０上で仮想的に実現される各処理部は、常に全ての処理部がＣＰＵ１５０上で動作する必要はなく、処理に用いられる処理部のみが仮想的に実現されればよい。
【００８１】
なお、上記の生成プログラム１７０ａについては、必ずしも最初からＨＤＤ１７０やＲＯＭ１６０に記憶させておく必要はない。例えば、コンピュータ１００に挿入されるフレキシブルディスク、いわゆるＦＤ、ＣＤ−ＲＯＭ、ＤＶＤディスク、光磁気ディスク、ＩＣカードなどの「可搬用の物理媒体」に各プログラムを記憶させる。そして、コンピュータ１００がこれらの可搬用の物理媒体から各プログラムを取得して実行するようにしてもよい。また、公衆回線、インターネット、ＬＡＮ、ＷＡＮなどを介してコンピュータ１００に接続される他のコンピュータまたはサーバ装置などに各プログラムを記憶させておき、コンピュータ１００がこれらから各プログラムを取得して実行するようにしてもよい。
【符号の説明】
【００８２】
１０  プログラム生成装置
１１  通信経路情報格納部
１２  特定部
１３  生成部
１４  埋め込み部
【図１】
2015125503.tif 000003
【図２】
2015125503.tif 000004
【図３】
2015125503.tif 000005
【図４】
2015125503.tif 000006
【図５】
2015125503.tif 000007
【図６】
2015125503.tif 000008
【図７Ａ】
2015125503.tif 000009
【図７Ｂ】
2015125503.tif 000010
【図７Ｃ】
2015125503.tif 000011
【図８】
2015125503.tif 000012
【図９Ａ】
2015125503.tif 000013
【図９Ｂ】
2015125503.tif 000014
【図９Ｃ】
2015125503.tif 000015
【図１０Ａ】
2015125503.tif 000016
【図１０Ｂ】
2015125503.tif 000017
【図１０Ｃ】
2015125503.tif 000018
【図１１Ａ】
2015125503.tif 000019
【図１１Ｂ】
2015125503.tif 000020
【図１１Ｃ】
2015125503.tif 000021
【図１２Ａ】
2015125503.tif 000022
【図１２Ｂ】
2015125503.tif 000023
【図１２Ｃ】
2015125503.tif 000024
【図１３Ａ】
2015125503.tif 000025
【図１３Ｂ】
2015125503.tif 000026
【図１３Ｃ】
2015125503.tif 000027
【図１４】
2015125503.tif 000028
【図１５】
2015125503.tif 000029
【図１６】
2015125503.tif 000030
【図１７】
2015125503.tif 000031