(57)【特許請求の範囲】
【請求項１】
ソースコードにおいて定義されている処理及び変数の集まりであるオブジェクトの各々について、該オブジェクトに含まれるそれぞれの前記処理から他のいずれかの前記オブジェクトに含まれる前記変数へのアクセスがなされる度合いであるアクセス負荷度を算出する算出手段（Ｓ３０５）と、
それぞれの前記オブジェクトを、マルチコアプロセッサを構成する複数のコアうちのいずれかに割り当てる手段であって、異なる前記コアに割り当てられた前記オブジェクト間の前記アクセス負荷度が低くなるように、それぞれの前記コアに割り当てる前記オブジェクトを選択する割当手段（Ｓ３１０，Ｓ３１５）と、
前記オブジェクトに含まれる前記変数を、該オブジェクトが割り当てられた前記コアに対応するＲＡＭ領域に配置する配置手段（Ｓ５１５，Ｓ５２０）と、
それぞれの前記オブジェクトについて、前記割当手段による割り当ての結果を提示する提示手段（１５０）と、
前記割当手段による割り当てがなされた前記オブジェクトのうち、該オブジェクトが割り当てられた前記コアとは異なる他の前記コアに割り当てられた前記オブジェクトである他コアオブジェクトに含まれる前記変数への前記アクセスがなされる前記処理を含むコア跨ぎオブジェクトを特定する特定手段（Ｓ４０５）と、
前記コア跨ぎオブジェクトと前記他コアオブジェクトとの間の前記アクセス負荷度と、該コア跨ぎオブジェクトに含まれる前記処理を実行するためのリソース消費量とに基づき、該コア跨ぎオブジェクトが割り当てられた前記コアと、該他コアオブジェクトが割り当てられた前記コアとの双方に該コア跨ぎオブジェクトを割り当てることで、処理速度の向上効果が得られるか否かを判定する判定手段（Ｓ４１０）と、
を備え、
前記提示手段は、さらに、前記判定手段により前記向上効果が得られると判定された前記コア跨ぎオブジェクトを提示し、
前記配置手段は、さらに、前記判定手段により前記向上効果が得られると判定された前記コア跨ぎオブジェクトに含まれる前記変数を、前記他コアオブジェクトが割り当てられた前記コアに対応する前記ＲＡＭ領域に配置すること（Ｓ５２０）、
を特徴とするプログラム開発支援装置。
【請求項２】
請求項１に記載のプログラム開発支援装置において、
前記割当手段は、二つの前記オブジェクトの組合せを前記アクセス負荷度の高いものから順番に選択し、選択した前記組合せをなす双方の前記オブジェクトが、いずれの前記コアにも割り当てられていない場合には、これらのオブジェクトを同一の前記コアに割り当て、選択した前記組合せをなす一方のオブジェクトがいずれかの前記コアに割り当てられており、他方の前記オブジェクトがいずれの前記コアにも割り当てられていない場合には、他方の前記オブジェクトを、一方の前記オブジェクトが割り当てられた前記コアに割り当てること、
を特徴とするプログラム開発支援装置。
【請求項３】
ソースコードにおいて定義されている処理及び変数の集まりであるオブジェクトの各々について、該オブジェクトに含まれるそれぞれの前記処理から他のいずれかの前記オブジェクトに含まれる前記変数へのアクセスがなされる度合いであるアクセス負荷度を算出する算出手段（Ｓ３０５）と、
それぞれの前記オブジェクトを、マルチコアプロセッサを構成する複数のコアうちのいずれかに割り当てる手段であって、異なる前記コアに割り当てられた前記オブジェクト間の前記アクセス負荷度が低くなるように、それぞれの前記コアに割り当てる前記オブジェクトを選択する割当手段（Ｓ３１０，Ｓ３１５）と、
前記オブジェクトに含まれる前記変数を、該オブジェクトが割り当てられた前記コアに対応するＲＡＭ領域に配置する配置手段（Ｓ５１５，Ｓ５２０）と、
それぞれの前記オブジェクトについて、前記割当手段による割り当ての結果を提示する提示手段（１５０）と、
前記割当手段による割り当てがなされた前記オブジェクトのうち、該オブジェクトが割り当てられた前記コアとは異なる他の前記コアに割り当てられた前記オブジェクトである他コアオブジェクトに含まれる前記変数への前記アクセスがなされる前記処理を含むコア跨ぎオブジェクトを特定する特定手段（Ｓ４０５）と、
前記コア跨ぎオブジェクトと前記他コアオブジェクトとの間の前記アクセス負荷度と、該コア跨ぎオブジェクトに含まれる前記処理を実行するためのリソース消費量とに基づき、該コア跨ぎオブジェクトが割り当てられた前記コアと、該他コアオブジェクトが割り当てられた前記コアとの双方に該コア跨ぎオブジェクトを割り当てることで、処理速度の向上効果が得られるか否かを判定する判定手段（Ｓ４１０）と、
してコンピュータを動作させ、
前記提示手段は、さらに、前記判定手段により前記向上効果が得られると判定された前記コア跨ぎオブジェクトを提示し、
前記配置手段は、さらに、前記判定手段により前記向上効果が得られると判定された前記コア跨ぎオブジェクトに含まれる前記変数を、前記他コアオブジェクトが割り当てられた前記コアに対応する前記ＲＡＭ領域に配置すること（Ｓ５２０）、
を特徴とするプログラム開発支援ツール。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチコアプロセッサ用のプログラム開発支援装置等に関する。
【背景技術】
【０００２】
従来、複数のコアを有するマルチコアプロセッサが知られており、このようなマルチコアプロセッサでは、各コアに対応してＲＡＭが設けられている。そして、各ＲＡＭは、対応するコアのみからアクセス可能な専用領域と、対応するコアと他のコアからアクセス可能な共用領域が設けられており、各コアは、他のコアに対応するＲＡＭにアクセスする場合には、自身に対応するＲＡＭにアクセスする場合よりもアクセス速度が低下する。
【０００３】
ここで、マルチコアプロセッサ用のプログラムでは、複数のコアからアクセスされる共通変数が用いられる場合があり、このような共通変数は、アクセスがなされるいずれかのコアに対応するＲＡＭの共用領域に配置することが考えられる。しかし、配置先のコアよりも他のコアからのアクセス頻度が高い場合には、処理速度が低下してしまう。
【０００４】
一方、共通変数にアクセスする各コアに対応するＲＡＭの専用領域に、該共通変数と同等の意味を持つ内部変数を個別に配置し、各コアが、自身に対応するＲＡＭに配置された内部変数にアクセスするようにすることも考えられる。これによりアクセス速度を向上させることができるが、各コアで重複的に内部変数を更新する必要が生じるため、総合的な処理負荷が増加し、かえって処理速度が低下する可能性がある。
【０００５】
このように、共通変数の配置先や、共通変数に替えて内部変数を用いるかどうかを決定することは困難であり、従来は、開発者の経験則等によりこのような決定がなされていた。
【０００６】
一方、特許文献１には、デュアルコア向けの制御仕様から自動生成されたソースコードを解析し、いずれかのコアに対応するＲＡＭに配置された静的変数に対する各コアからのアクセス時間を算出することが記載されている。そして、総アクセス時間が短くなるように、静的変数を再配置することが記載されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００８−２６２３４０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
特許文献１によれば、複数のコアからアクセスされる静的変数へのアクセス速度を確実に向上させることができる。しかしながら、マルチコアプロセッサ用のプログラムを開発する際には、変数のみならず、各処理を実行するコアを選択する必要があるが、特許文献１には、このような選択をどのように行うかについては記載されていない。
【０００９】
本願発明は上記課題に鑑みてなされたものであり、マルチコアプロセッサ用のプログラム開発において、開発者に手間を取らせること無く、変数の配置や、各処理を実行するコアの選択を適切に行うことができるプログラム開発支援装置等を提供することを目的とする。
【課題を解決するための手段】
【００１０】
上記課題に鑑みてなされた請求項１に係る発明は、ソースコードにおいて定義されている処理及び変数の集まりであるオブジェクトの各々について、該オブジェクトに含まれるそれぞれの処理から他のいずれかのオブジェクトに含まれる変数へのアクセスがなされる度合いであるアクセス負荷度を算出する算出手段を備えるプログラム開発支援装置に関するものである。
【００１１】
このプログラム開発支援装置は、このほかにも、それぞれのオブジェクトを、マルチコアプロセッサを構成する複数のコアうちのいずれかに割り当てる手段であって、異なるコアに割り当てられたオブジェクト間のアクセス負荷度が低くなるように、それぞれのコアに割り当てるオブジェクトを選択する割当手段を備える。また、オブジェクトに含まれる変数を、該オブジェクトが割り当てられたコアに対応するＲＡＭ領域に配置する配置手段と、それぞれのオブジェクトについて、割当手段による割り当ての結果を提示する提示手段と、を備える。
また、このプログラム開発支援装置は、割当手段による割り当てがなされたオブジェクトのうち、該オブジェクトが割り当てられたコアとは異なる他のコアに割り当てられたオブジェクトである他コアオブジェクトに含まれる変数へのアクセスがなされる処理を含むコア跨ぎオブジェクトを特定する特定手段と、コア跨ぎオブジェクトと他コアオブジェクトとの間のアクセス負荷度と、該コア跨ぎオブジェクトに含まれる処理を実行するためのリソース消費量とに基づき、該コア跨ぎオブジェクトが割り当てられたコアと、該他コアオブジェクトが割り当てられたコアとの双方に該コア跨ぎオブジェクトを割り当てることで、処理速度の向上効果が得られるか否かを判定する判定手段と、を備える。
そして、提示手段は、さらに、判定手段により向上効果が得られると判定されたコア跨ぎオブジェクトを提示し、配置手段は、さらに、判定手段により向上効果が得られると判定されたコア跨ぎオブジェクトに含まれる変数を、他コアオブジェクトが割り当てられたコアに対応するＲＡＭ領域に配置する。
【００１２】
このような構成によれば、各オブジェクト間のアクセス負荷度が算出され、これに基づき各オブジェクトがコアに割り当てられる。
ここで、アクセス負荷度の高い二つのオブジェクトを異なるコアに割り当て、各オブジェクトに含まれる変数を、該オブジェクトが割り当てられたコアに対応するＲＡＭ領域に配置したとする。そして、各コアが自身に割り当てられたオブジェクトに含まれる処理を実行するように、各オブジェクトを実装したとする。
【００１３】
このような場合には、各コアが自身に割り当てられたオブジェクトに含まれる処理を実行する際、他方のコアのＲＡＭ領域に配置された変数へのアクセス（コア跨ぎアクセス）が発生する頻度が高くなり、処理速度が低下してしまう。
【００１４】
これに対し、請求項１に係る発明によれば、アクセス負荷度の高いオブジェクトが同一のコアに割り当てられ、割り当て結果が提示されると共に、各オブジェクトに含まれる変数に関しては、該オブジェクトが割り当てられたコアに対応するＲＡＭ領域に配置される。
【００１５】
このため、開発者は、提示された割り当て結果に従い、各オブジェクトに含まれる処理を割り当て先のコアにより実行されるように実装する作業を行うのみで、コア跨ぎアクセスが発生する頻度を抑え、処理速度を向上させることができる。
【００１６】
すなわち、開発者は、各オブジェクトを作成した後や、他のプログラム開発に用いられたオブジェクトを準備した後に、割り当て結果に従い機械的にオブジェクトに含まれる処理を実装する作業を行うのみで良くなる。つまり、各オブジェクトに含まれる変数の配置先や、各オブジェクトに含まれる処理をどのコアに実行させるかを検討する必要が無くなるのである。
【００１７】
したがって、請求項１に記載のプログラム開発支援装置によれば、マルチコアプロセッサ用のプログラム開発において、開発者に手間を取らせること無く、変数の配置や、各処理を実行するコアの選択を適切に行うことができる。
【図面の簡単な説明】
【００１８】
【図１】プログラム開発支援装置（ＰＣ）の構成を示すブロック図である。
【図２】プログラム開発支援ツールの構成を示すブロック図である。
【図３】解析部の構成を示すブロック図である。
【図４】オブジェクト分割処理のフローチャートである。
【図５】アクセス負荷度の算出結果の一例を示す表である。
【図６】各オブジェクト間のアクセス負荷度の大きさを表した説明図である。
【図７】アクセス負荷度の算出結果の一例を示す表である。
【図８】クラスタ解析の説明図である。
【図９】クラスタ解析により得られたテンドグラムの一例である。
【図１０】オブジェクトの重複実装の説明図である。
【図１１】重複実装処理についてのフローチャートである。
【図１２】重複実装の対象オブジェクトについての、ＲＡＭ容量増加度，ＲＯＭ容量増加度，処理速度向上度の算出結果の一例を示す表である。
【図１３】オブジェクトに含まれる各変数の配置先の一例を示す表である。
【図１４】コンパイル・リンク部の構成を示すブロック図である。
【図１５】変数配置処理についてのフローチャートである。
【発明を実施するための形態】
【００１９】
以下、本発明の実施形態について図面を用いて説明する。なお、本発明の実施の形態は、下記の実施形態に何ら限定されることはなく、本発明の技術的範囲に属する限り種々の形態を採りうる。
【００２０】
［構成について］
（１）全体構成について
図１には、複数のコアを有するマルチコアプロセッサ用のプログラム開発支援装置として作動する周知のパーソナルコンピュータ（ＰＣ）１の構成を示すブロック図が記載されている。このＰＣ１は、ディスプレイ１０，ＨＤＤ（ハードディスクドライブ）２０，ＣＰＵ（演算装置）３０，ＲＯＭ４０，ＲＡＭ５０，入力装置６０等を備える。
【００２１】
ディスプレイ１０は、ＣＰＵ３０から受けた映像信号を、ユーザに対して映像として表示する。
入力装置６０は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をＣＰＵ３０に出力する。
【００２２】
ＲＡＭ５０は読み出し、書き込み可能な揮発性メモリであり、ＲＯＭ４０は読み出し専用の不揮発性メモリであり、ＨＤＤ２０は読み出し、書き込み可能な不揮発性メモリである。ＲＯＭ４０，ＨＤＤ２０には、ＣＰＵ３０が読み出して実行するプログラム等が予め記憶されている。
【００２３】
ＲＡＭ５０は、ＣＰＵ３０がＲＯＭ４０，ＨＤＤ２０に記憶されたプログラムを実行する際に、そのプログラムを一時的に保存するための記憶領域、及び作業用のデータを一時的に保存するための記憶領域として用いられる。
【００２４】
ＣＰＵ３０は、オペレーティングシステム（ＯＳ）をＨＤＤ２０から読み出して実行し、ＨＤＤ２０に記録されている各種プログラムをＯＳ上のプロセスとして実行する。また、このプロセスにおいて、ＣＰＵ３０は必要に応じて入力装置６０から信号の入力を受け付け、ディスプレイ１０に映像信号を出力し、ＲＡＭ５０，ＨＤＤ２０に対してデータの読み出し／書き込みの制御を行う。
【００２５】
（２）プログラム開発支援ツールについて
次に、ＰＣ１にインストールされている本実施形態のマルチコアプロセッサ用のプログラム開発支援ツール１００について、図２を用いて説明する。プログラム開発支援ツール１００は、ＨＤＤ２０に保存され、ＯＳ上のプロセスとして実行されるアプリケーションの１つであり、ＰＣ１は、プログラム開発支援ツール１００を動作させることで、プログラム開発支援装置として稼動する。
【００２６】
なお、このプログラム開発支援装置は、車載装置等といった組み込みシステム向けのプログラム開発に用いられることが考えられるが、これに限定されることは無く、あらゆる用途のプログラム開発に用いることができる。
【００２７】
ここで、マルチコアプロセッサは、複数のコアを有すると共に、各コアに対応してＲＡＭが設けられており、さらに、各ＲＡＭには、対応するコアからのみアクセス可能な専用領域と、対応するコアと他のコアとからアクセス可能な共用領域が設けられている。
【００２８】
そして、各コアは、該コアに対応するＲＡＭにアクセスする場合には、他のコアに対応するＲＡＭの共用領域にアクセスする場合（コア跨ぎアクセスとも記載）よりも、高速アクセスが可能となっている。
【００２９】
このため、処理速度を向上させるためには、ソースコード上で定義されている各関数を実行するコアを適切に選択する（各関数が実装されるコアを適切に選択する）と共に、各変数等の配置先を適切に選択し、コア跨ぎアクセスをなるべく減らす必要がある。
【００３０】
これに対し、プログラム開発支援ツール１００は、コア跨ぎアクセスを減らすため、ソースコード２００を構成する各オブジェクト（関数や変数等の集合体）間でどの程度のアクセスが生じるかを算出し、これに基づき各オブジェクトの実装先となるコアを選択する。そして、各オブジェクトの実装先となるコアを表示すると共に、各オブジェクトに含まれる変数に関しては、該オブジェクトの実装先のコアに対応するＲＡＭの共用領域或いは専用領域に配置する。
【００３１】
なお、オブジェクトとは、ソースコード上で定義されている変数，関数，テーブル等の集合体であり、本実施形態では、一例として、ソースコードが記述された１つのソースファイルをオブジェクトとする。しかし、これに限定されることはなく、例えば、１または複数のタスクと、主に該タスクからアクセスされる変数等をオブジェクトとしても良い。
【００３２】
続いて、プログラム開発支援ツール１００の構成について説明する。プログラム開発支援ツール１００は、解析部１１０と、コンパイル・リンク部１４０と、表示部１５０等を備える。
【００３３】
解析部１１０は、ソースコード２００を構成するオブジェクトを、マルチコアプロセッサを構成する複数のコアのうちのいずれかに割り当てる。そして、オブジェクトが割り当てられたコアを該オブジェクトの実装先とし、各オブジェクトの実装先を示す実装先指定ファイルを実装先指定ファイル格納部１２０（ＨＤＤ２０）に保存する。また、各オブジェクトの実装先のコアに対応するＲＡＭの共用領域或いは専用領域を、該オブジェクトに含まれる変数の配置先とし、該配置先を示す配置先指定ファイルを、配置先指定ファイル格納部１３０（ＨＤＤ２０）に保存する。
【００３４】
なお、ソースコード２００とは、開発者が新たに作成したものであっても良いし、シングルコアプロセッサ用のプログラムや、他のマルチコアプロセッサ用のプログラムとして用いられていたものであっても良い。
【００３５】
また、コンパイル・リンク部１４０は、実装先指定ファイルや配置先指定ファイルに基づき、ソースコード２００のコンパイルやリンクを行う。そして、ターゲットとなるマルチコアプロセッサを稼動させるためのバイナリデータを生成し、バイナリデータ格納部１６０（ＨＤＤ２０）に保存する。
【００３６】
また、表示部１５０は、ディスプレイ１０を介して、実装先指定ファイルや配置先指定ファイルの内容に基づき、各オブジェクトの実装先のコアを表示すると共に、各オブジェクトに含まれる変数の配置先を表示する。
【００３７】
（３）解析部について
次に、解析部１１０について、図３を用いて詳しく説明する。
解析部１１０では、各オブジェクト間のアクセス負荷度を算出し、算出結果に基づき、各オブジェクトの実装先となるコアを決定すると共に、各オブジェクトに含まれる変数を、実装先のコアに対応するＲＡＭの専用領域と共用領域のいずれに配置するかを決定する。
【００３８】
ここで、アクセス負荷度とは、二つのオブジェクト間でどの程度のアクセスが行われるかを示すものであり、これらのオブジェクトに含まれる関数が、他のオブジェクトに含まれる変数にアクセスする度合いを示すものである。なお、変数のみならず、他のオブジェクトに含まれる関数やテーブル等にアクセスする度合いも含めてアクセス負荷度としても良い。
【００３９】
そして、解析部１１０は、分割部１１２と、オブジェクト追加部１１６と、変数配置先決定部１１７とを備えており、以下では、これらの各部位について詳しく説明する。
（３−１）分割部について
分割部１１２は、ソースコード２００を構成する各オブジェクトを解析し、二つのオブジェクトからなる組合せの全てについてアクセス負荷度を算出する。そして、これに基づき、オブジェクトをコア数分のグループに分け、各オブジェクトをグループ毎に別のコアに割り当てる。
【００４０】
以下では、アクセス負荷度に基づき各オブジェクトをいずれかのコアに割り当てるオブジェクト分割処理について、図４に記載のフローチャートを用いて詳しく説明する。
なお、以後、プログラム開発支援ツール１００を構成する各部位が処理を実行するといった記載がなされるが、これは、該部位に従い動作するＰＣ１のＣＰＵ３０により該処理が実行されることを意味する。
【００４１】
Ｓ３０５では、分割部１１２は、いずれかの組合せを選択すると共に、選択した組合せをなすオブジェクト間のアクセス負荷度を算出する。
なお、アクセス負荷度を算出する方法として、例えば、選択中の組合せをなす各オブジェクトについて、該オブジェクトに含まれる関数から他方のオブジェクトに含まれる変数等へのアクセスがなされる箇所の数をカウントしても良い。そして、その箇所の数に所定の重みを乗算することで、これらのオブジェクト間のアクセス負荷度を算出しても良い。
【００４２】
なお、図５に記載の表は、ソースコード２００がＡ〜Ｅオブジェクトから構成されている場合の、各オブジェクト間のアクセス負荷度の算出結果の一例を示している。該表では、各欄は、「参照」に記載された対応するオブジェクトに含まれる関数が、「公開」に記載された対応するオブジェクトに含まれる変数等にアクセスする際のアクセス負荷度を示している。
【００４３】
また、図６に記載の説明図は、図５に記載の表が示すアクセス負過度が算出された場合の、Ａ〜Ｅオブジェクトにおけるアクセス負荷度の大きさを示している。該説明図では、線が太いほどアクセス負荷度が高くなり、また、線の矢印の向きは、根元側にあるオブジェクトに含まれる関数が、先端側にあるオブジェクトに含まれる変数等にアクセスすることを示している。また、双方向の矢印は、双方のオブジェクトに含まれる関数が他方のオブジェクトにアクセスすることを示している。
【００４４】
続くＳ３１０では、各組合せについて、各オブジェクトを起点とするアクセスについてのアクセス負荷度の和を算出し（図７参照）、これに基づき、周知のクラスタ解析を行う。
【００４５】
そして、Ｓ３１５では、クラスタ解析により得られたアクセス負荷度の階層構造に基づき、各オブジェクトをコア数分のグループに分け、グループとコアが１対１の関係となるよう各グループをいずれかのコアに割り当てる。また、各グループに割り当てられたコアを、該グループに属するオブジェクトの実装先とし、各オブジェクトの実装先を示す実装先情報を生成する。
【００４６】
ここで、クラスタ解析と、クラスタ解析の結果に基づくオブジェクトのグループ分けについて、より詳細に説明する。これらの処理は、以下の（ａ），（ｂ）のステップを行うことで実現される。
【００４７】
（ａ）アクセス負荷度が最大の組合せを選択し、該組合せをなすオブジェクトを結合して一つのクラスタとする。
（ｂ）未選択の組合せの中から、アクセス負荷度が最大のものを選択する。そして、選択した組合せをなす双方のオブジェクトがいずれのクラスタにも属していない場合には、これらのオブジェクトを結合して新たなクラスタを生成する。また、該組合せをなす一方のオブジェクトが先に生成されたクラスタに属している場合には、他方のオブジェクトを該クラスタに結合する。また、該組合せをなす双方のオブジェクトが、異なる二つのクラスタに結合されている場合には、これらのクラスタを結合する。
【００４８】
なお、（ｂ）のステップは、全てのオブジェクトが一つのクラスタに結合されるまで繰り返し行われる。
また、図８に記載の説明図２１０〜２３０は、図７に記載の表が示すアクセス負荷度を有するＡ〜Ｅオブジェクトについてのクラスタ解析の様子を示している。
【００４９】
これらのオブジェクトを対象としてクラスタ解析を行った場合、最初に、Ｂ，Ｄオブジェクトの組合せが選択され、これらのオブジェクトからなるクラスタが生成される（説明図２１０）。続いて、Ａ，Ｅオブジェクトの組合せが選択され、これらのオブジェクトからなるクラスタが生成される（説明図２２０）。
【００５０】
次に、Ａ，Ｃオブジェクトの組合せが選択され、Ｃオブジェクトは、Ａ，Ｅオブジェクトからなるクラスタに結合される（説明図２３０）。続いて、Ａ，Ｂオブジェクトの組合せが選択され、Ｂ，Ｄオブジェクトからなるクラスタと、Ａ，Ｃ，Ｅオブジェクトからなるクラスタが結合され、全てのオブジェクトが一つのクラスタに結合される。
【００５１】
そして、クラスタ解析の各段階でクラスタが新たに生成されたり、クラスタに新たなオブジェクトが結合されたり、複数のクラスタを統合して新たなクラスタが生成される過程は、テンドグラムとして表される。図９は、説明図２１０〜２３０が示すクラスタ解析の結果（アクセス負荷度の階層構造）を示すテンドグラム２４０を示している。このテンドグラム２４０では、各オブジェクトを結ぶ枝の水平部分の高さがアクセス負荷度を示しており、該高さが低いほどアクセス負荷度が高くなる。
【００５２】
このテンドグラムからコア数分のクラスタが生成された段階を特定し、該段階における各クラスタをグループとする。換言すれば、テンドグラム２４０上にアクセス負荷度のレベルを示す水平方向のバー２４１を設け、該レベル（バー２４１の高さ）を調整することで、コア数に応じてグループ分けを行うことができる。なお、説明図２１０〜２３０、及び、テンドグラム２４０は、一例として、コア数が２個である場合のグループ分けの様子を示している。
【００５３】
また、プログラム開発支援ツール１００では、入力装置６０を介して受け付けた入力に基づき、各オブジェクトをどのように実装するかが定められる。
具体的には、入力装置６０を介して、同じコアに実装する複数のオブジェクトを指定すること（同コア指定）や、別のコアに実装する複数のオブジェクトを指定すること（別コア指定）や、各オブジェクトの実装先を指定すること（実装先指定）が可能となっている。これらの指定内容は、実装先指定ファイル１１１としてＨＤＤ２０に保存される。
【００５４】
そして、オブジェクト分割処理では、実装先指定ファイル１１１での指定内容を優先してグループ分けがなされる。
具体的には、実装先指定ファイル１１１により指定がなされている場合には、上記（ａ）に替えて、該指定に応じたクラスタ分けを行った後に、上記（ｂ）が行われる。
【００５５】
すなわち、同コア指定がなされているオブジェクトが存在する場合、これらのオブジェクトを結合してクラスタが生成され、別コア指定がなされているオブジェクトが存在する場合、各オブジェクトからなる別のクラスタが生成される。また、実装先指定がなされているオブジェクトが存在する場合、該オブジェクトを実装先別に分け、実装先毎にクラスタを生成する。
【００５６】
そして、生成されたクラスタに対し、上記（ｂ）を実行する。無論、実装先指定がなされたクラスタに含まれる各オブジェクトは、該実装先指定に従い実装先のコアが定められる。
【００５７】
また、このような指定がなされるケースとしては、以下のような状況が考えられる。
すなわち、複数のオブジェクトにより実現される各処理が同期して稼動する場合、これらのオブジェクトを異なるコアに実装すると、これらのコア間で同期を取る必要が生じ、各コアにより実行される他の処理に遅延が生じる可能性がある。このため、仮にこれらのオブジェクト間のアクセス負荷度が小さくても、処理速度の向上のためには、これらのオブジェクトを同一のコアに実装することが望ましい。
【００５８】
このような場合には、これらのオブジェクトに対し同コア指定や実装先指定を行うことで、アクセス負荷度に関らずこれらのオブジェクトを同一コアに実装させることができ、処理速度を向上させることができる。
【００５９】
また、これ以外にも、オブジェクトの配置や品質保証が完了したプログラムのソースコードを流用する場合には、テスト作業を軽減するため、ソースコードの改変規模や、オブジェクトの実装先の変更を極力抑える必要がある。
【００６０】
このような場合には、改変を行わないオブジェクトに対して実装先指定を行い、該オブジェクトを流用元のプログラムと同一のコアに実装することが考えられる。そして、改変が行われたオブジェクトや、新たに追加されたオブジェクトについてのみ、クラスタ解析に基づき実装先のコアを決定することが考えられる。
【００６１】
（３−２）オブジェクト追加部について
次に、オブジェクト追加部１１６の動作について説明する。
分割部１１２により定められた実装先に従い各オブジェクトを実装することで、異なるコアに実装されたオブジェクト間のアクセス負荷度を低く抑えることができる。しかし、言うまでもなく、このようなオブジェクト間のアクセスを無くすことができるというわけではなく、コア跨ぎアクセスを完全に防ぐことはできない。
【００６２】
これに対し、オブジェクト追加部１１６は、分割部１１２により生成された実装先情報に従い各オブジェクトを実装した場合に、コア跨ぎアクセスが生じるオブジェクトを抽出する。
【００６３】
具体例を挙げると、図１０に記載の説明図２５０は、Ａ，Ｃ，Ｅオブジェクトが第１コアに、Ｂ，Ｄオブジェクトが第２コアに実装されることを示しているが、Ａ，Ｂオブジェクト間と、Ｃ，Ｄオブジェクト間にコア跨ぎのアクセスが生じる。
【００６４】
そこで、説明図２５５のように、Ａオブジェクトと同一のＡ´オブジェクトを新たに設け、第２コアに重複実装した場合には、Ａ，Ｂオブジェクト間のコア跨ぎアクセスが生じず、アクセス速度が向上する。しかしながら、その反面、Ａオブジェクトの処理を重複して実行する必要があり、処理負荷が増加する。
【００６５】
このため、オブジェクト追加部１１６は、コア跨ぎアクセスが生じるオブジェクトを重複実装した場合のリソース消費量の増加度合い（処理負荷の増加度合い）を算出する。そして、重複実装によるアクセス速度の向上度合いとリソース消費量の増加度合いとを比較し、重複実装した場合における処理速度の向上効果の有無を判定する。
【００６６】
次に、重複実装するオブジェクトを決定する重複実装処理について、図１１に記載のフローチャートを用いて説明する。
Ｓ４０５では、オブジェクト追加部１１６は、実装先情報と、各オブジェクトのアクセス負荷度に基づき、コアに対するコア跨ぎアクセスがなされるオブジェクト（コア跨ぎオブジェクトとも記載）を抽出する。
【００６７】
なお、ここで抽出されるコア跨ぎオブジェクトは、単一のコアに対するコア跨ぎアクセスがなされるオブジェクトであることが望ましい。その理由は、複数のコアに対するコア跨ぎオブジェクトがなされている場合には、重複実装を行った結果、新たなコア跨ぎアクセスが発生してしまうためである。
【００６８】
ただし、一方のコアに対するコア跨ぎアクセスのアクセス負荷度が、他方のコアに対するコア跨ぎアクセスのアクセス負荷度よりも十分に大きい場合には、該一方のコアに重複実装を行うことで、十分なコア跨ぎアクセスの低減効果が得られることになる。このため、複数のコアに対するコア跨ぎアクセスがなされるオブジェクトについては、各コアに対するコア跨ぎアクセスのアクセス負荷度を考慮して、抽出するか否かを決定しても良い。
【００６９】
また、コア跨ぎオブジェクトから同一コアに実装されている他のオブジェクトにアクセスされる場合には、該コア跨ぎオブジェクトを他のコアに重複実装した結果、さらにコア跨ぎアクセスが生じてしまう。このため、抽出されたコア跨ぎオブジェクトの中から、さらに、同一コアに実装されている他のオブジェクトへのアクセスがなされないものを、重複実装可能なオブジェクト（対象オブジェクトとも記載）として抽出する。
【００７０】
なお、図１０に記載の説明図２５０が示すＡ〜Ｅオブジェクトについては、Ａ〜Ｄオブジェクトがコア跨ぎオブジェクトとして抽出される。しかし、これらのうち、Ａオブジェクトのみが、同一コアに実装されている他のオブジェクトへのアクセスがなされないため、Ａオブジェクトのみが対象オブジェクトとして抽出される。
【００７１】
続くＳ４１０では、オブジェクト追加部１１６は、各対象オブジェクトを重複実装した際に処理速度の向上効果が得られるか否かを判定する。
具体的には、対象オブジェクトを解析し、対象オブジェクトの重複実装によるリソース消費量の増加分として、該対象オブジェクトに含まれる変数のＲＡＭ容量や、関数のＲＯＭ容量を算出する。そして、算出したＲＡＭ容量，ＲＯＭ容量に所定の重みを乗算した値を、ＲＡＭ容量増加度，ＲＯＭ容量増加度とする。
【００７２】
また、対象オブジェクトの実装先でない他のコアについて、それぞれ、該コアに実装される１または複数のオブジェクトと、対象オブジェクトとの間のアクセス負荷度の総和を算出すると共に、該総和の最も大きいコアを、対象オブジェクトの重複実装先とする。そして、重複実装先となるコアについてのアクセス負荷度の総和から、ＲＡＭ容量増加度及びＲＯＭ容量増加度を減算し、減算結果を、処理速度向上効果の度合いを示す処理速度向上度とする。
【００７３】
なお、図１２に記載の表は、対象オブジェクトとして、Ａ，Ｆ，Ｇ，Ｊ，Ｌ，Ｐオブジェクトが抽出された場合の、各オブジェクトのＲＡＭ容量増加度，ＲＯＭ容量増加度，処理速度向上度の算出結果の一例を示している。これらのオブジェクトのうち、Ｐ，Ｊオブジェクトは処理速度向上度が負の値となっており、重複実装を行うと処理速度が低下してしまうことを示している。
【００７４】
そして、Ｓ４１５では、オブジェクト追加部１１６は、処理速度向上度に基づき重複実装する対象オブジェクトを決定する。
具体的には、例えば、処理速度向上度が正の値である対象オブジェクトを、重複実装する対象オブジェクトとしても良い。
【００７５】
また、これ以外にも、プログラム開発支援ツール１００では、入力装置６０を介して受け付けた入力に基づき、重複実装の際に増加するリソース消費量の上限値（ＲＡＭ容量増加度及びＲＯＭ容量増加度の上限値）が定められる。この上限値は、リソース制限ファイル１１５としてＨＤＤ２０に保存される。
【００７６】
そして、リソース制限ファイル１１５からリソース消費量の上限値が特定される場合は、処理速度向上度が高い順に対象オブジェクトが選択され、リソース消費量の増加分が該上限値を超えない範囲で重複実装を行う対象オブジェクトが選択される。
【００７７】
例えば、ＲＯＭ容量増加度の上限値が６０、ＲＡＭ容量増加度の上限値が８０である場合に、図１２に記載の表の如く処理速度向上度等の算出結果が得られたとする。このとき、Ａ，Ｌ，Ｆ・・・の順にオブジェクトが選択されるが、Ａ，Ｌ，ＦオブジェクトのＲＯＭ容量増過度の総和は６５となり、リソース消費量の増加分が上限値を超える。このため、Ａ，Ｌオブジェクトが重複実装を行う対象オブジェクトとして選択される。
【００７８】
さらに、プログラム開発支援ツール１００では、入力装置６０を介して受け付けた入力に基づき、重複実装するオブジェクトと重複実装先のコアを指定することができ、この指定内容は、実装先指定ファイル１１１としてＨＤＤ２０に保存される。
【００７９】
そして、実装先指定ファイル１１１により重複実装するオブジェクトが指定されている場合には、Ｓ４１５では、該オブジェクトの処理速度向上度等に関らず、該オブジェクトを指定されたオブジェクトに重複実装することが決定される。
【００８０】
また、オブジェクト追加部１１６は、重複実装する対象オブジェクト（重複実装オブジェクトとも記載）の決定後、重複実装オブジェクトと、該オブジェクトの重複実装先とを示す重複実装情報を生成する。そして、実装先情報と重複実装情報とから構成される実装先指定ファイルを生成し、実装先指定ファイル格納部１２０に保存する。
【００８１】
また、オブジェクト追加部１１６は、重複実装するオブジェクト（重複実装オブジェクトと同一のオブジェクト）を新たに生成し、新規オブジェクトとしてソースコード２００に追加しても良い。無論、開発者が、重複実装オブジェクトをコピーする等して新規オブジェクトを作成するものとしても良い。
【００８２】
（３−３）変数配置先決定部について
次に、変数配置先決定部１１７の動作について説明する。
変数配置先決定部１１７は、実装先指定ファイルの内容と、各オブジェクトのアクセス負荷度に基づき、各オブジェクトの配置先を決定する。
【００８３】
すなわち、実装先指定ファイルに含まれる実装先情報に基づき、新規オブジェクトを除く既存のオブジェクトに含まれる変数を、実装先のコアに対応するＲＡＭに配置することを決定する。また、実装先指定ファイルに含まれる重複実装情報に基づき、重複実装オブジェクトに対応する新規オブジェクトに含まれる変数を、重複実装先のコアに対応するＲＡＭに配置することを決定する。
【００８４】
また、実装先情報，各オブジェクトのアクセス負荷度，重複実装情報に基づき、新規オブジェクトが重複実装された後の状態での各オブジェクトにおけるコア跨ぎアクセスの有無を判定する。そして、コア跨ぎアクセスがなされるオブジェクトに含まれる変数は、実装先のコアに対応するＲＡＭの共用領域に、コア跨ぎアクセスがなされないオブジェクトの変数は、該ＲＡＭの専用領域に配置することを決定する。
【００８５】
そして、変数配置先決定部１１７は、決定内容を配置先指定ファイルに保存する。なお、重複実装オブジェクト及び新規オブジェクトに含まれる変数については、実装先のコアの専用領域が配置先となる。これらの変数の配置先については、該変数が重複実装オブジェクト或いは新規オブジェクトに含まれるものであることを示した状態で、配置先指定ファイルに保存される。
【００８６】
ここで、図１３には、一例として、図１０に記載の説明図２５５に対応するＡ〜Ｅオブジェクトと、重複実装されたＡ´オブジェクトについての、変数の配置先を示す表が記載されている。該表における「配置先」に対応する欄における“専用領域（複数）”という記載は、対応するオブジェクトが重複実装オブジェクト、或いは新規オブジェクトであることを示している。また、該欄における“専用領域（単数）”という記載は、対応するオブジェクトが、重複実装オブジェクト及び新規オブジェクトのいずれでもないことを示している。
【００８７】
（４）表示部について
次に、表示部１５０について詳しく説明する。
表示部１５０は、実装先指定ファイルを参照し、ディスプレイ１０を介して、各オブジェクトの実装先と、重複実装オブジェクト及び重複実装先のコアとを表示する。
【００８８】
開発者は、表示内容に従いソースコード２００を改変し、各オブジェクトを表示された実装先に実装する作業を行う。また、オブジェクト追加部１１６により生成された新規オブジェクトについても重複実装先に実装する作業を行う。
【００８９】
（５）コンパイル・リンク部について
次に、コンパイル・リンク部１４０について、図１４を用いて詳しく説明する。
コンパイル・リンク部１４０は、コンパイル部１４１と、リンク部１４３等から構成されている。
【００９０】
コンパイル部１４１は、各オブジェクトに含まれる変数が、配置先指定ファイルにより指定された配置先に配置されるよう、ソースコード２００を改変する変数配置処理を行う（詳細は後述する）。また、これと同時期に、開発者によりソースコード２００が改変され、表示部１５０により表示された実装先のコアにより各オブジェクトに含まれる関数が実行されるよう、各オブジェクトに含まれる関数等が実装される。
【００９１】
その後、コンパイル部１４１は、改変後のソースコード２００をコンパイルし、コンパイルにより生成されたオブジェクトコードをオブジェクトコード格納部１４２（ＨＤＤ２０）に保存する。
【００９２】
また、リンク部１４３は、オブジェクトコードのリンクを行い、ターゲットのマルチコアプロセッサを稼動させるためのバイナリデータを生成し、バイナリデータ格納部１６０（ＨＤＤ２０）に保存する。なお、このとき、リンク部１４３は、実装先指定ファイルに基づき、各オブジェクトに対応するバイナリデータを各オブジェクトの実装先のコアに対応するＲＯＭ領域に配置する。
【００９３】
（５−１）変数配置処理について
次に、図１５に記載のフローチャートを用いて変数配置処理について詳しく説明する。
Ｓ５０５では、コンパイル部１４１は、ソースコード２００を構成する各オブジェクトに含まれる全ての変数について配置が完了したか否かを判定する。そして、肯定判定が得られた場合には（Ｓ５０５：Ｙｅｓ）、本処理を終了し、否定判定が得られた場合には（Ｓ５０５：Ｎｏ）、配置が完了していないいずれかの変数を選択し、Ｓ５１０に処理を移行する。
【００９４】
Ｓ５１０では、コンパイル部１４１は、配置先指定ファイルに基づき、選択中の変数が共用領域に配置されるか否かを判定する。そして、肯定判定が得られた場合には（Ｓ５１０：Ｙｅｓ）、Ｓ５１５に処理を移行し、否定判定が得られた場合には（Ｓ５１０：Ｎｏ）、Ｓ５２０に処理を移行する。
【００９５】
Ｓ５１５では、コンパイル部１４１は、配置先指定ファイルに基づき、選択中の変数が、該変数が属するオブジェクトの実装先のコアに対応するＲＡＭの共用領域に配置されるようソースコード２００を改変し、Ｓ５０５に処理を移行する。
【００９６】
Ｓ５２０では、コンパイル部１４１は、配置先指定ファイルに基づき、選択中の変数が、該変数が属するオブジェクトの実装先のコアに対応するＲＡＭの専用領域に配置されるようソースコード２００を改変し、Ｓ５２５に処理を移行する。
【００９７】
Ｓ５２５では、コンパイル部１４１は、配置先指定ファイルに基づき、選択中の変数が重複実装オブジェクト或いは新規オブジェクトに含まれるか否かを判定する。そして、肯定判定が得られた場合には（Ｓ５２５：Ｙｅｓ）、Ｓ５３０に処理を移行し、否定判定が得られた場合には（Ｓ５２５：Ｎｏ）、Ｓ５０５に処理を移行する。
【００９８】
Ｓ５３０では、コンパイル部１４１は、ソースコード２００を改変し、選択中の変数を含むオブジェクトと、同一コアに実装された他のオブジェクトについて、該変数の名称を該コアの名称に関連付けた新名称に変更し、Ｓ５０５に処理を移行する。
【００９９】
具体例を挙げると、例えば、図１３に記載の表のように変数の配置が定められた場合であれば、第１コアに実装される重複実装オブジェクトであるＡオブジェクトに含まれる変数“ａ１”を“ａ１＿１”としても良い。また、第２コアに重複実装される新規オブジェクトであるＡ´オブジェクト（Ａオブジェクトに相当）に含まれる変数“ａ１”を“ａ１＿２”としても良い。
【０１００】
また、本ステップでの変数の名称変更により、新オブジェクトと共に同一コアに実装された他のオブジェクトは、重複実装オブジェクトに替えて新オブジェクトにアクセスすることが可能となる。
【０１０１】
［効果］
本実施形態のプログラム開発支援ツール１００では、オブジェクト分割処理により、クラスタ解析の結果に基づき各オブジェクトがグループ分けされ、各グループに属するオブジェクトの実装先として同一のコアが割り当てられる。クラスタ解析の結果を用いることで、アクセス負荷度の高いオブジェクトを確実に同一のグループにまとめることができ、また、生成されるグループの数を柔軟に調整することができる。このため、確実に、アクセス負荷度の高いオブジェクト同士を集めてコア数分のグループを生成することができる。
【０１０２】
そして、変数配置処理では、各オブジェクトに含まれる変数が実装先のコアに対応するＲＡＭに配置されるよう、ソースコード２００が改変される。
このため、開発者は、表示部１５０により表示された各オブジェクトの実装先に従い、各オブジェクトに含まれる関数等を実装先のコアに機械的に実装するのみで、異なるコアに実装されたオブジェクト間のアクセス負荷度を低減させることができる。これにより、コア跨ぎアクセスを抑えることができ、処理速度を向上させることができる。
【０１０３】
また、重複実装処理により、コア跨ぎオブジェクトを重複実装した場合のリソース消費量の増加度合い（処理負荷の増加度合い）とアクセス速度の向上度合いとが比較される。そして、重複実装により処理速度の向上効果が得られるコア跨ぎオブジェクトのみが、重複実装オブジェクトとされる。
【０１０４】
そして、重複実装オブジェクトと同一の新規オブジェクトが新たに生成されると共に、変数配置処理では、新規オブジェクトに含まれる変数が重複実装先のコアに対応するＲＡＭに配置されるよう、ソースコード２００が改変される。
【０１０５】
また、変数配置処理では、新規オブジェクトに含まれる変数の名称が実装先のコアに関連付けた新名称に変更されると共に、該コアに実装された他のオブジェクトについても、該変数の名称が該新名称に変更される。これにより、重複実装オブジェクトとの間でコア跨ぎアクセスを行っていたオブジェクトは、重複実装オブジェクトに替えて新規オブジェクトにアクセスするようになる。
【０１０６】
このため、開発者は、表示部１５０により表示された重複実装オブジェクトや重複実装先に従い、新規オブジェクトに含まれる関数等を重複実装先のコアに機械的に実装するのみで、処理速度を向上させることができる。
【０１０７】
［他の実施形態］
（１）本実施形態のプログラム開発支援ツール１００では、クラスタ解析の結果に基づき各オブジェクトの実装先が決定されるが、これに限らず、実装先の異なるオブジェクト間のアクセス負荷度が低くなるように、各オブジェクトの実装先を選択しても良い。
【０１０８】
具体的には、例えば、二つのオブジェクトの組合せのうち、アクセス負荷度が所定値以上であるものや、アクセス負荷度の高さが上位にあるものについては、該組合せをなすオブジェクトの実装先を同一のコアとしても良い。そして、他のオブジェクトについては、任意に実装先のコアを定めても良い。このような場合であっても、異なるコアに実装されたオブジェクト間のアクセス負荷度が低くなるように、各オブジェクトの実装先を定めることができる。
【０１０９】
（２）また、本実施形態のプログラム開発支援ツール１００によりオブジェクトの重複実装がなされたとしても、重複実装オブジェクトと、これに対応する新規オブジェクトとに含まれる各関数の実行タイミングの同期が取られるというわけではない。このため、重複実装オブジェクトにおける変数と、新規オブジェクトにおける該変数に相当する変数の更新タイミングは、異なるものとなる。
【０１１０】
したがって、このような更新タイミングのずれにより、重複実装オブジェクト或いは新規オブジェクトにアクセスする他のオブジェクトの動作に支障をきたす場合には、重複実装を行うべきではない。
【０１１１】
このため、プログラム開発支援ツール１００は、入力装置６０を介して受け付けた入力に基づき、重複実装を禁止するオブジェクトの指定を受け付けても良い。そして、解析部１１０のオブジェクト追加部１１６は、重複実装を禁止されたオブジェクト以外の他のオブジェクトを対象として、重複実装を行うか否かを判定しても良い。
【０１１２】
こうすることにより、重複実装を行ったことにより障害が生じてしまうことを防ぐことができる。
（３）また、本実施形態のプログラム開発支援ツール１００では、コンパイル・リンク部１４０におけるコンパイル部１４１により、コンパイルが実行される前の段階でソースコード２００の改変を行うことで、配置先指定ファイルに従い変数の配置先が定められる。しかしながら、このような改変を行わず、リンク部１４３がリンクを行う際に配置先指定ファイルを参照し、各変数を、変数配置先決定部１１７により定められた配置先に配置しても良い。このような構成を有する場合であっても、同様の効果を得ることができる。
【０１１３】
［特許請求の範囲との対応］
上記実施形態の説明で用いた用語と、特許請求の範囲の記載に用いた用語との対応を示す。
【０１１４】
本実施形態のプログラム開発支援ツール１００の表示部１５０が提示手段に相当する。
また、オブジェクト分割処理のＳ３０５が算出手段に、Ｓ３１０，Ｓ３１５が割当手段に相当する。
【０１１５】
また、重複実装処理のＳ４０５が特定手段に、Ｓ４１０が判定手段に相当する。
また、変数配置処理のＳ５１５，Ｓ５２０が配置手段に相当する。
【符号の説明】
【０１１６】
１…ＰＣ、１０…ディスプレイ、２０…ＨＤＤ、３０…ＣＰＵ、４０…ＲＯＭ、５０…ＲＡＭ、６０…入力装置、１００…プログラム開発支援ツール、１１０…解析部、１１１…実装先指定ファイル、１１２…分割部、１１３…分割結果格納部、１１４…アクセス負荷度格納部、１１５…リソース制限ファイル、１１６…オブジェクト追加部、１１７…変数配置先決定部、１２０…実装先指定ファイル格納部、１３０…配置先指定ファイル格納部、１４０…コンパイル・リンク部、１４１…コンパイル部、１４２…オブジェクトコード格納部、１４３…リンク部、１５０…表示部、１６０…バイナリデータ格納部、２００…ソースコード。
【図１】
0005637182.tif 000002
【図２】
0005637182.tif 000003
【図３】
0005637182.tif 000004
【図４】
0005637182.tif 000005
【図５】
0005637182.tif 000006
【図６】
0005637182.tif 000007
【図７】
0005637182.tif 000008
【図８】
0005637182.tif 000009
【図９】
0005637182.tif 000010
【図１０】
0005637182.tif 000011
【図１１】
0005637182.tif 000012
【図１２】
0005637182.tif 000013
【図１３】
0005637182.tif 000014
【図１４】
0005637182.tif 000015
【図１５】
0005637182.tif 000016