(57)【要約】【課題】シングルコアプロセッサ用のプログラムからマルチコアプロセッサ用のプログラムを作成するに際してメモリアクセス順序の適否を効率的に検討することのできる支援情報を提供し得るマルチコアプログラム作成支援装置を提供することである。【解決手段】シングルコアプロセッサ用の元プログラムに従って逐次実行される複数の処理を複数のプロセッサコアにて分割して並列実行させるプログラムの作成支援情報を生成して表示するマルチコアプログラム作成支援装置であって、前記元プログラムの記述内容から逐次実行される複数の処理を抽出し、前記抽出された複数の処理の実行順序を判定し、前記元プログラムの記述内容から前記抽出された複数の処理それぞれによるメモリアクセスの態様を抽出し、前記複数の処理の実行順序とそのメモリアクセスの態様とを表す支援情報を前記表示ユニットに表示させるような構成となる。【選択図】図７
2010237968.tif 000002
【特許請求の範囲】
【請求項１】
シングルコアプロセッサ用の元プログラムに従って逐次実行される複数の処理をマルチコアプロセッサの複数のプロセッサコアにて分割して並列実行させるプログラムの作成支援のための情報を生成する処理ユニットと、該処理ユニットにて生成される情報を表示する表示ユニットとを有するマルチコアプログラム作成支援装置であって、
前記処理ユニットは、
前記元プログラムの記述内容から逐次実行される複数の処理を抽出する処理抽出手段と、
前記抽出された複数の処理の実行順序を判定する実行順序判定手段と、
前記元プログラムの記述内容から前記抽出された複数の処理それぞれによるメモリアクセスの態様を抽出するメモリアクセス解析手段と、
前記順序判定手段にて得られた判定結果及び前記抽出された各処理によるメモリアクセスの態様に基づいて、前記複数の処理の実行順序とそのメモリアクセスの態様とを表す支援情報を前記表示ユニットに表示させる支援情報表示制御手段とを有するマルチコアプログラム作成支援装置。
【請求項２】
前記元プログラムはソースコードにて記述されている請求項１記載のマルチコアプログラム作成支援装置。
【請求項３】
前記処理抽出手段は、前記元プログラムに従って他の処理を呼び出す処理と他の処理にて呼び出される処理とが区別されるように前記複数の処理を抽出する請求項１または２記載のマルチコアプログラム作成支援装置。
【請求項４】
前記実行順序判定手段は、各処理の呼び出し及び呼び出されの関係に従って実行順序を判定する請求項３記載のマルチコアプログラム作成支援装置。
【請求項５】
前記実行順序において連続する先の処理と後の処理との間が境として指定されたときに、前記先の処理以前の処理がアクセスするメモリと前記後の処理以後の処理がアクセスするメモリとが全部または一部について合致するか否かを判定するメモリアクセス判定手段を有し、
支援情報表示制御手段は、前記先の処理以前の処理がアクセスするメモリと前記後の処理以後の処理がアクセスするメモリとが全部または一部について合致するとの判定がなされたときに、前記支援情報に合致するメモリを明示する情報を含めて当該支援情報を前記表示ユニットに表示させる請求項１乃至４のいずれかに記載のマルチコアプログラム作成支援装置。
【請求項６】
前記支援情報は、前記実行順序に従って配列された前記複数の処理と該複数の処理によりアクセスされる全メモリとに基づいたマトリクスにおける処理と該処理がアクセスするメモリとに対応した位置にアクセスを表すアクセスマークを配したマトリクス表情報である請求項１乃至５のいずれかに記載のマルチコアプログラム作成支援装置。
【請求項７】
前記アクセスマークは、リードアクセスを表すリードアクセスマークと、ライトアクセスを表すライトアクセスマークとを含む請求項６記載のマルチコアプログラム作成支援装置。
【請求項８】
前記表示ユニットに表示されたマトリクス表情報において、前記実行順序に従って配列された複数の処理のうちの連続する先の処理と後の処理との間が境として指定されたときに、マトリクス内の各メモリに対応した各処理に対応する複数の位置に前記境を挟んでアクセスマークが配されているか否かを判定するメモリアクセス判定手段を有し、
前記支援情報表示制御手段は、マトリクス内のメモリに対応した各処理に対応する複数の位置に前記境を挟んでアクセスマークが配されているとの判定がなされたときに、当該メモリを明示する情報を含めて当該支援情報を前記表示ユニットに表示させる請求項６または７記載のマルチコアプログラム作成支援装置。
【請求項９】
シングルコアプロセッサ用の元プログラムに従って逐次実行される複数の処理をマルチコアプロセッサの複数のプロセッサコアにて分割して並列実行させるプログラムの作成支援のための情報を生成し、該生成される情報を表示ユニットに表示させるマルチコアプログラム作成支援装置を構成するコンピュータに、
前記元プログラムの記述内容から逐次実行される複数の処理を抽出する処理抽出ステップと、
前記抽出された複数の処理の実行順序を判定する実行順序判定ステップと、
前記元プログラムの記述内容から前記抽出された複数の処理それぞれによるメモリアクセスの態様を抽出するメモリアクセス解析ステップと、
前記順序判定ステップにて得られた判定結果及び前記抽出された各処理によるメモリアクセスの態様に基づいて、前記複数の処理の実行順序とそのメモリアクセスの態様とを表す支援情報を前記表示ユニットに表示させる支援情報表示制御ステップとを実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、シングルコアプロセッサ用プログラムをもとにして、マルチコアプロセッサの複数のプロセッサコアにて並列実行され得るプログラムを作成する際の支援情報を提供するマルチコアプログラム作成支援装置及びその支援情報を提供するための処理をコンピュータに実行させるためのプログラムに関する。
【背景技術】
【０００２】
例えば、組み込みソフト等の開発技術は、パーソナルコンピュータと同様、シングルコアプロセッサの性能を高めることによって発達してきた。しかし、シングルコアプロセッサの性能をこれ以上高めることは、消費電力と発熱量及びノイズなどの問題により困難になってきている。そこで、種々の処理を実行するプロセッサをシングルコアからマルチコア化することで上述した問題を取り除くことができることから、マルチコアプロセッサを利用する装置が提案されている。
【０００３】
このマルチコアプロセッサでは、複数のプロセッサコアが各処理を並列的に実行することができることから、シングルコアプロセッサにて実行された処理と同じ処理をマルチコアプロセッサにて実行させ、シングルコアプロセッサ用のプログラムをそのまま適用しても性能が上がらないので意味がない。そこで、そのマルチコアプロセッサ用のプログラムの開発を支援する開発支援ツールが提案されている（例えば、特許文献１参照）。このような開発支援ツールを利用することにより、複数のプロセッサコアにて実行されるプログラムを比較的容易に開発（作成）することができるようになる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００８−１５９４０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、マルチコアプロセッサ用のプログラムを最初から開発するのではなく、既に存在するシングルコアプロセッサ用のプログラムをもとにしてマルチコアプロセッサ用のプログラムを作成することが考えられる。このようにすれば、マルチコアプロセッサ用のプログラムを最初から作成するよりも更に効率的にそのプログラムを作成することができるようになる。
【０００６】
シングルコアプロセッサ用のプログラムをもとにしてマルチコアプロセッサ用のプログラムを作成するためには、シングルコアプロセッサ用のプログラムを複数のプロセッサコア用に分割する必要がある。しかし、このようにシングルプロセッサ用のプログラムを分割すると、逐次実行されていた複数の処理が複数のプロセッサコアにて並列的に実行され得るようになるので、特に、逐次実行される複数の処理によるメモリのアクセス順序が、その複数の処理が並列的に実行されることによって変わってしまい、各処理においてメモリ値が不適切なものとなってしまうおそれがある。従って、そのプログラムを分割することにより得られた各プログラムを並列的に実行することによりなされる複数の処理でのメモリアクセスに問題は無いかの検討作業が必要となるが、この検討作業を効率的に行うことが難しい。
【０００７】
本発明は、このような事情に鑑みてなされたもので、シングルコアプロセッサ用のプログラムからマルチコアプロセッサ用のプログラムを作成するに際してメモリアクセス順序の適否を効率的に検討することのできる支援情報を提供し得るマルチコアプログラム作成支援装置及びプログラムを提供するものである。
【課題を解決するための手段】
【０００８】
本発明に係るマルチコアプログラム作成支援装置は、シングルコアプロセッサ用の元プログラムに従って逐次実行される複数の処理をマルチコアプロセッサの複数のプロセッサコアにて分割して並列実行させるプログラムの作成支援のための情報を生成する処理ユニットと、該処理ユニットにて生成される情報を表示する表示ユニットとを有するマルチコアプログラム作成支援装置であって、前記処理ユニットは、前記元プログラムの記述内容から逐次実行される複数の処理を抽出する処理抽出手段と、前記抽出された複数の処理の実行順序を判定する実行順序判定手段と、前記元プログラムの記述内容から前記抽出された複数の処理それぞれによるメモリアクセスの態様を抽出するメモリアクセス解析手段と、前記順序判定手段にて得られた判定結果及び前記抽出された各処理によるメモリアクセスの態様に基づいて、前記複数の処理の実行順序とそのメモリアクセスの態様とを表す支援情報を前記表示ユニットに表示させる支援情報表示制御手段とを有する構成となる。
【０００９】
このような構成により、シングルコアプロセッサ用の元プログラムに従って逐次実行される複数の処理の実行順序と各処理でのメモリアクセスの態様とを表す支援情報が表示ユニットに表示されるようになるので、利用者は、その支援情報から前記複数の処理の実行順序と各処理でのメモリアクセスの態様を把握することができるようになる。
【００１０】
本発明に係るマルチコアプログラム作成支援装置において、前記元プログラムはソースコードにて記述されている構成とすることができる。
【００１１】
このような構成により、元プログラムのソースコードによる記述内容を解析することにより、表示ユニットに表示される支援情報を生成することができるようになる。
【００１２】
また、本発明に係るマルチコアプログラム作成支援装置において、前記処理抽出手段は、前記元プログラムに従って他の処理を呼び出す処理と他の処理にて呼び出される処理とが区別されるように前記複数の処理を抽出するように構成することができる。
【００１３】
このような構成により、元プログラムに従って逐次実行される複数の処理が、他の処理を呼び出す処理と他の処理にて呼び出される処理とが区別されるように抽出されるので、各処理の呼び出し及び呼び出されの関係に従って、複数の処理の実行順序を判定することができるようになる
【００１４】
そして、本発明に係るマルチコアプログラム作成支援装置において、前記実行順序判定手段は、各処理の呼び出し及び呼び出されの関係に従って実行順序を判定するように構成することができる。
【００１５】
このような構成により、他の処理から呼び出される処理は、当該他の処理より実行順序が後になり、他の処理を呼び出す処理は、当該他の処理より実行順序が前となるようにその実行順序を容易に判定することができるようになる。
【００１６】
更に、本発明に係るマルチコアプログラム作成支援装置は、前記実行順序において連続する先の処理と後の処理との間が境として指定されたときに、前記先の処理以前の処理がアクセスするメモリと前記後の処理以後の処理がアクセスするメモリとが全部または一部について合致するか否かを判定するメモリアクセス判定手段を有し、支援情報表示制御手段が、前記先の処理以前の処理がアクセスするメモリと前記後の処理以後の処理がアクセスするメモリとが全部または一部について合致するとの判定がなされたときに、前記支援情報に合致するメモリを明示する情報を含めて当該支援情報を前記表示ユニットに表示させるように構成することができる。
【００１７】
このような構成により、前記実行順序において連続する先の処理と後の処理との間が境として指定されたときに、前記先の処理以前の処理がアクセスするメモリと、前記後の処理以後の処理がアクセスするメモリとの全部または一部が合致するか否かの判定がなされる。そして、合致するとの判定がなされた場合にその合致するメモリを明示する情報が表示ユニットに表示される支援情報に含まれるようになるので、前記先の処理以前の処理と前記後の処理以後の処理とを異なるプロセッサコアにて実行した場合に、その異なるプロセッサコアで実行すべき複数の処理が同じメモリをアクセスするか否かを把握することができる。その異なるプロセッサコアで実行すべき複数の処理が同じメモリをアクセスする場合、その同じメモリに対して前記先の処理以前の処理でのアクセスを、前記後の処理以後の処理でのアクセスより先に実行すべきことも概ね把握することができる。
【００１８】
また、本発明に係るマルチコアプログラム作成支援装置において、前記支援情報は、前記実行順序に従って配列された前記複数の処理と該複数の処理によりアクセスされる全メモリとに基づいたマトリクスにおける処理と該処理がアクセスするメモリとに対応した位置にアクセスを表すアクセスマークを配したマトリクス表情報である構成とすることができる。
【００１９】
このような構成により、実行順序に従って配列された複数の処理と該複数の処理によりアクセスされる全メモリとに基づいたマトリクスにおける処理と該処理がアクセスするメモリとに対応した位置にアクセスを表すアクセスマークを配したマトリクス表情報が、支援情報として表示ユニットに表示されるようになるので、利用者は、そのマトリクス表情報のアクセスマークの位置により、どの処理によってどのメモリがアクセスされるかを容易に把握することができるようになる。
【００２０】
前記アクセスマークは、リードアクセスを表すリードアクセスマークと、ライトアクセスを表すライトアクセスマークとを含むことができる。
【００２１】
これにより、表示ユニットに表示されるマトリクス表情報から、どの処理によってどのメモリがリードアクセスあるいはライトアクセスされるかを容易に把握することができるようになる。
【００２２】
更に、本発明に係るマルチコアプログラム作成支援装置は、前記表示ユニットに表示されたマトリクス表情報において、前記実行順序に従って配列された複数の処理のうちの連続する先の処理と後の処理との間が境として指定されたときに、マトリクス内の各メモリに対応した各処理に対応する複数の位置に前記境を挟んでアクセスマークが配されているか否かを判定するメモリアクセス判定手段を有し、前記支援情報表示制御手段が、マトリクス内のメモリに対応した各処理に対応する複数の位置に前記境を挟んでアクセスマークが配されているとの判定がなされたときに、当該メモリを明示する情報を含めて当該支援情報を前記表示ユニットに表示させるように構成することができる。
【００２３】
このような構成により、表示ユニットに表示されたマトリクス表情報において実行順序に従って配列された複数の処理のうちの連続する先の処理と後の処理との間が境として指定されたときに、マトリクス内の各メモリに対応した各処理に対応する複数の位置に前記境を挟んでアクセスマークが配されているか否かの判定がなされる。そして、マトリクス内のメモリに対応した各処理に対応する複数の位置に前記境を挟んでアクセスマークが配されているとの判定がなされた場合に、そのメモリを明示する情報が表示ユニットに表示される支援情報に含まれるようになるので、前記先の処理以前の処理と前記後の処理以後の処理とを異なるプロセッサコアにて実行した場合に、その異なるプロセッサコアで実行すべき複数の処理が同じメモリをアクセスするか否かを把握することができる。その異なるプロセッサコアで実行すべき複数の処理が同じメモリをアクセスする場合、その同じメモリに対して前記先の処理以前の処理でのアクセスを、前記後の処理以後の処理でのアクセスより先に実行すべきことも概ね把握することができる。
【００２４】
本発明に係るプログラムは、シングルコアプロセッサ用の元プログラムに従って逐次実行される複数の処理をマルチコアプロセッサの複数のプロセッサコアにて分割して並列実行させるプログラムの作成支援のための情報を生成し、該生成される情報を表示ユニットに表示させるマルチコアプログラム作成支援装置を構成するコンピュータに、前記元プログラムの記述内容から逐次実行される複数の処理を抽出する処理抽出ステップと、前記抽出された複数の処理の実行順序を判定する実行順序判定ステップと、前記元プログラムの記述内容から前記抽出された複数の処理それぞれによるメモリアクセスの態様を抽出するメモリアクセス解析ステップと、前記順序判定ステップにて得られた判定結果及び前記抽出された各処理によるメモリアクセスの態様に基づいて、前記複数の処理の実行順序とそのメモリアクセスの態様とを表す支援情報を前記表示ユニットに表示させる支援情報表示制御ステップとを実行させる構成となる。
【発明の効果】
【００２５】
本発明に係るマルチコアプログラム作成支援装置及びプログラムによれば、シングルコアプロセッサ用の元プログラムに従って逐次実行される複数の処理の実行順序と各処理でのメモリアクセスの態様とを表す支援情報が表示ユニットに表示され、利用者は、その支援情報から前記複数の処理の実行順序と各処理でのメモリアクセスの態様を把握することができるようになるので、シングルコアプロセッサ用のプログラムからマルチコアプロセッサ用のプログラムを作成するに際してメモリアクセス順序の適否を効率的に検討することができるようになる。
【図面の簡単な説明】
【００２６】
【図１】本発明の実施の形態に係るマルチコアプログラム作成支援装置を構成するコンピュータシステムを示すブロック図である。
【図２】ソースコードにて記述されたシングルプロセッサ用の元プログラムの記述内容例を示す図である。
【図３】シングルプロセッサ用の元プログラムの記述内容から逐次実行される複数の関数（処理）を抽出し、その抽出された関数の実行順序を判定する処理手順を示すフローチャートである。
【図４】図２に示す元プログラムから他の関数を呼び出す関数及び他の関数からの呼び出される関数（ＣＡＬＬ関数）を区別するように抽出された関数を表した関数テーブルを示す図である。
【図５】図２に示す元プログラムから抽出された関数を実行順序に従って配列したマトリクス表情報を示す図である。
【図６Ａ】抽出された関数によるメモリアクセスの態様を図２に示す元プログラムの記述内容から抽出するための処理手順を示すフローチャート（その１）である。
【図６Ｂ】抽出された関数によるメモリアクセスの態様を図２に示す元プログラムの記述内容から抽出するための処理手順を示すフローチャート（その２）である。
【図７】図６Ａ及び図６Ｂに示すフローチャートに従った処理により得られたメモリアクセスの態様を表わすメモリのアクセスマーク（ライトアクセスマーク、リードアクセスマーク）が追加されたマトリクス表情報を示す図である。
【図８】実行順序において連続する先の関数と後の関数との間が境として指定されたときに、前記関数の処理以前の処理がアクセスするメモリと前記後の関数以後の処理がアクセスするメモリとが全部または一部について合致するか否かを判定し、その判定結果に基づいた情報を図５に示すマトリクス表情報に追加するための処理手順を示すフローチャートである。
【図９】図８に示す処理に従って表示されるマトリクス表情報の表示例（その１）を示す図である。
【図１０】図８に示す処理に従って表示されるマトリクス表情報の表示例（その２）を示す図である。
【図１１】支援情報としてのマトリクス表情報の表示例（その１）を示す図である。
【図１２】支援情報としてのマトリクス表情報の表示例（その２）を示す図である。
【図１３】支援情報としてのマトリクス表情報の表示例（その３）を示す図である。
【図１４】支援情報としてのマトリクス表情報の表示例（その４）を示す図である。
【発明を実施するための形態】
【００２７】
以下、本発明の実施の形態について図面を用いて説明する。
【００２８】
本発明に係るマルチコアプログラム作成支援装置を構成するコンピュータシステムは、図１に示すように構成される。
【００２９】
図１において、このコンピュータシステム（マルチコアプログラム作成支援装置）は、例えば、パーソナルコンピュータシステムであって、プログラムに従って種々の処理を実行する処理ユニット（ＣＰＵ）１０１を有している。処理ユニット１０１には、バス１０７を介してメモリ１０２、ハードディスク装置等の外部記憶装置１０３、マウス、キーボード等の操作部１０５及びモニタ１０６（表示ユニット）が接続されている。処理ユニット１０１は、利用者による操作部１０５での操作に基づいた操作信号に応じて外部記憶装置１０３からマルチコアプログラム作成支援のプログラムをメモリ１０３に読み出し、そのプログラムに従って処理を実行する。その処理の実行により生成される支援情報がモニタ１０６に表示される。
【００３０】
以下、図２に示すようにソースコードで記述されたシングルコアプロセッサ用のプログラム（以下、元プログラムという）からマルチコアプロセッサ用のプログラムを生成する場合の支援について説明する。なお、図２に示すプログラムは、内部メモリとしてmem1、mem2、mem3を定義し、関数「main」に係る処理、この関数「main」に呼び出される（ＣＡＬＬ）関数「sub1」に係る処理、この関数「sub1」に呼び出される関数「sub2」の処理、前記関数「main」に呼び出される関数「sub3」の処理及びこの関数「sub3」に呼び出される関数「sub4」の処理を実行するようにソースコードにて記述されている。
【００３１】
処理ユニット１０１は、図３に示す手順に従って処理を実行し、元プログラム（図２参照）の記述内容から逐次実行される複数の関数（処理）を抽出し、その抽出された複数の関数の実行順序を判定する。
【００３２】
図３において、処理ユニット１０１は、関数内フラグをオフにする等の初期化処理を実行した（Ｓ１）後に、例えば、メモリ１０２に格納されたシングルコアプロセッサ用の元プログラムファイル（図２参照）を開く（Ｓ２）。そして、処理ユニット１０１は、ソースコードで記述された元プログラムの各行を先頭から順次参照し（Ｓ３）、その行の文字列が関数の先頭であるか否か（Ｓ４）、その行の文字列が関数の最後であるか否か（Ｓ８）、及びその行が関数内フラグのオンとなる関数からコールされる（呼び出される）コール関数（ＣＡＬＬ）を表しているか否か（Ｓ１０）を順次判定する。例えば、そのいずれでもない場合、処理ユニット１０１は、元プログラムの全ての行についての処理が終了したか否かを判定し（Ｓ７）、全ての行についての処理が終了していなければ（Ｓ７でＮＯ）、元プログラムの次の行について同様の判定処理（Ｓ４、Ｓ８、Ｓ１０）を実行する。
【００３３】
例えば、図２に示す元プログラムにおいて、最初の３行は、内部メモリを定義する文字列（int mem1; 、 int mem2; 、 int mem3;）であるので、処理ユニット１０１は、その３行に対して特に処理を行うことなく（Ｓ４でＮＯ、Ｓ８でＮＯ、Ｓ１０でＮＯ）、次の行「main ()」に対する処理に進む。処理ユニット１０１は、「main()」の行及び「｛」の行に対して順次判定処理（Ｓ４、Ｓ８、Ｓ１０）を行う際に、「｛」が関数「main」の先頭を表す文字列であると判定し（Ｓ４でＹＥＳ）、その関数「main」を親関数として図４に示すように関数テーブルに登録する（Ｓ５）。そして、処理ユニット１０１は、その関数「main」に対応付けられる関数内フラグをオンにする（Ｓ６）。処理ユニット１０１は、元プログラムの全ての行についての処理がまだ終了していないことを確認した（Ｓ７でＹＥＳ）後に、次の行に対する処理に進んで（Ｓ３）、同様の判定処理（Ｓ４、Ｓ８、Ｓ１０）を実行する。
【００３４】
図２に示す元プログラムに対する前述した処理の過程で、処理ユニット１０１は、「sub1();」の行を参照すると（Ｓ３）、その行が関数内フラグのオンとなる関数「main」から呼び出されるコール関数を表していると判定する（Ｓ１０でＹＥＳ）。すると、処理ユニット１０は、その関数「sub1」を関数「main」から最初に呼び出される子関数（ＣＡＬＬ関数）として図４に示すように関数テーブルに登録する（Ｓ１１）。「sub1();」の次の行の「sub3();」についても同様に処理され、関数「sub3」が関数「main」から２番目に呼び出される子関数（ＣＡＬＬ関数）として図４に示すように関数テーブルに登録される。関数テーブルにおいて（図４参照）、１つの関数、例えば、関数「main」から呼び出される子関数は、その呼び出し順番（実行順序）に従って順序付けがなされている。
【００３５】
処理ユニット１０１は、更にその処理の過程で、前記文字列「｛」を参照した後に、初めて文字列「｝」を参照すると（Ｓ３）、その行を関数「main」の最後であると判定する（Ｓ８でＹＥＳ）。すると、処理ユニット１０は、その関数「main」に対応付けられた関数内フラグをオフにして（Ｓ９）、次の行に対する処理に進む（Ｓ７でＮＯ、Ｓ３）。
【００３６】
上記のようにして関数「main」に対応付けられた関数内フラグをオフにした後に、処理ユニット１０１は、「sub1();」の行及びそれに続く「｛」の行に対して順次判定処理（Ｓ４、Ｓ８、Ｓ１０）を行う際に、「｛」が関数「sub1」の先頭を表す文字列であると判定し（Ｓ４でＹＥＳ）、その関数「sub1」を親関数として図４に示すように関数テーブルに登録する（Ｓ５）。関数「sub1」を登録した後、処理ユニット１０は、その関数「sub1」に対応付けられる関数内フラグをオンにする（Ｓ６）。
【００３７】
関数「sub1」を登録した後の処理の過程で、処理ユニット１０１は、「sub2();」の行を参照すると（Ｓ３）、その行が関数内フラグのオンとなる関数「sub1」から呼び出されるコール関数を表していると判定する（Ｓ１０でＹＥＳ）。すると、処理ユニット１０は、その関数「sub2」を関数「sub1」から最初に呼び出される子関数（ＣＡＬＬ関数）として図４に示すように関数テーブルに登録する（Ｓ１１）。その後、処理ユニット１０１は、関数「sub1」についての文字列「｝」の行を参照すると（Ｓ３）、その行を関数「sub1」の最後であると判定する（Ｓ８でＹＥＳ）。すると、処理ユニット１０は、その関数「sub1」に対応付けられた関数内フラグをオフにして（Ｓ９）、次の行に対する処理に進む（Ｓ７でＹＥＳ、Ｓ３）。
【００３８】
上記のようにして関数「sub1」に対応付けられた関数内フラグをオフにした後に、処理ユニット１０１は、「sub2();」の行及びそれに続く「｛」の行に対して順次判定処理（Ｓ４、Ｓ８、Ｓ１０）を行う際に、「｛」が関数「sub2」の先頭を表す文字列であると判定し（Ｓ４でＹＥＳ）、その関数「sub2」を親関数として図４に示すように関数テーブルに登録する（Ｓ５）。関数「sub2」を登録した後、処理ユニット１０は、その関数「sub2」に対応付けられる関数内フラグをオンにする（Ｓ６）。図２に示す元プログラムでは、文字列「sub2();」に続く「｛」以降には関数を表す文字列がなく、文字列「｝」に至るので、関数「sub2」が呼び出す子関数は登録されずに、その関数「sub2」に対応付けられた関数内フラグがオフにされる（Ｓ８でＹＥＳ、Ｓ９）。
【００３９】
関数「sub2」に対応付けられた関数内フラグをオフした後に、処理ユニット１０１は、「sub3();」の行及びそれに続く「｛」の行に対して順次判定処理を行う際に、「｛」が関数「sub3」の先頭を表す文字列であると判定し（Ｓ４でＹＥＳ）、その関数「sub3」を親関数として図４に示すように関数テーブルに登録する（Ｓ５）。このように関数「sub3」を登録した後、処理ユニット１０は、その関数「sub3」に対応付けられる関数内フラグをオンにする（Ｓ６）。
【００４０】
関数「sub3」を登録した後の処理の過程で、処理ユニット１０１は、「sub4();」の行を参照すると（Ｓ３）、その行が関数内フラグのオンとなる関数「sub3」から呼び出されるコール関数を表していると判定する（Ｓ１０でＹＥＳ）。すると、処理ユニット１０は、その関数「sub4」を関数「sub3」から最初に呼び出される子関数（ＣＡＬＬ関数）として図４に示すように関数テーブルに登録する（Ｓ１１）。その後、処理ユニット１０１は、関数「sub3」についての文字列「｝」の行を参照すると（Ｓ３）、その行を関数「sub3」の最後であると判定する（Ｓ８でＹＥＳ）。すると、処理ユニット１０は、その関数「sub3」に対応付けられた関数内フラグをオフにして（Ｓ９）、次の行に対する処理に進む（Ｓ７でＹＥＳ、Ｓ３）。
【００４１】
その後、処理ユニット１０１は、元プログラム（図２参照）の文字列「sub4()」の行以降の行を順次参照しつつ（Ｓ３）、前述したのと同様の判定処理（Ｓ４、Ｓ８、Ｓ１０）を実行する過程で、関数「sub4」を親関数として図４に示すように関数テーブルに登録する（Ｓ５）。その後、処理ユニット１０１は、元プログラムの各行について同様の処理を繰り返し実行し、全ての行についての処理が終了したと判定すると（Ｓ７でＹＥＳ）、元プログラムファイルを閉じる（Ｓ１2）。
【００４２】
このようにして、元プログラムの記述内容から逐次実行される複数の関数（処理）が、他の関数を呼び出す関数と他の関数にて呼び出される関数との区別がなされた状態で抽出され、その結果として、図４に示すような関数テーブルが作成される。
【００４３】
次に、処理ユニット１０１は、その抽出された複数の関数の実行順序を判定するための処理を実行する。具体的には、図３において、処理ユニット１０１は、関数テーブルの先頭から親関数として登録されている関数を１つ参照し（Ｓ１３）、その関数が他の関数から呼び出（ＣＡＬＬ）されているか否か、即ち、子関数としても登録されているか否かを判定する（Ｓ１４）。その参照した関数が他の関数から呼び出されていないと判定すると（Ｓ１４でＮＯ）、処理ユニット１０１は、その参照した関数をそのまま、例えば、処理サイクル（所定のカウンタの値）に対応した順序に対応づける。一方、その参照した関数が他の関数から呼び出されていると判定すると、処理ユニット１０１は、その参照した関数を、呼び出し元の他の関数の子関数であるとして、その呼び出し元の関数の後に順序付ける（Ｓ１５）。処理ユニット１０１は、このような順序付けの処理を関数テーブルに登録されている全ての関数について実行する（Ｓ１６参照）。
【００４４】
例えば、図４に示すような関数テーブルを処理の対象とした場合、登録さている関数「main」、「sub1」、「sub2」、「sub3」、「sub4」に対して次のような順序付けがなされる。
【００４５】
関数「main」は、他の関数から呼び出されていないので、前記処理サイクルに対応した順序に対応づけられる。関数「sub1」は、関数「main」から１番目に呼び出されているので、関数「main」の後に順序づけられる。関数「sub2」は、関数「sub1」から１番目に呼び出されているので、関数「sub1」の後に順序づけられる。関数「sub3」は、関数「main」から関数「sub1」の後（２番目）に呼び出されているので、関数「main」の後で、かつ、関数「sub1」の後に順序づけられる。更に、関数「sub1」が関数「sub2」を呼び出しているので、この関数「sub1」の後に順序づけられる関数「sub3」は、更に関数「sub2」の後に順序づけられる。関数「sub4」は、関数「sub3」から呼び出されているので、関数「sub3」の後に順序づけられる。
【００４６】
上記の順序づけの結果、前記関数「main」、「sub1」、「sub2」、「sub3」、「sub4」の実行順序が、
「main」→「sub1」→「sub2」→「sub3」→「sub4」
のように判定される。処理ユニット１０１は、その判定結果に基づいて、図５に示すような関数軸とメモリ軸とにより構成されるマトリクス表（情報）の関数軸に前記実行順序に従って複数の関数を配列する。このように複数の関数がその実行順序に従って配列されたマトリクス表情報は、メモリ１０２に格納される。そして、処理ユニット１０１は、このマトリクス表情報をモニタ１０６に表示させる。これにより利用者は、シングルプロセッサ用の元プログラム（図２参照）には、上記順序で実行される複数の関数「main」、「sub1」、「sub2」、「sub3」、「sub4」が含まれることを知ることができる。
【００４７】
次に、利用者が操作部１０５にてメモリアクセス態様の解析に係る処理の開始操作を行うと、処理ユニット１０１は、図６Ａ及び図６Ｂに示す処理を実行し、元プログラム（図２参照）の記述内容から、前述したように関数テーブルに登録された各関数（処理）によるメモリアクセスの態様を抽出する。
【００４８】
図６Ａにおいて、処理ユニット１０１は、関数内フラグをオフにする等の初期化処理を実行した（Ｓ２０）後に、メモリ１０２に格納された元プログラムファイル（図２参照）を開く（Ｓ２１）。そして、処理ユニット１０１は、ソースコードで記述された元プログラムの各行を先頭から順次参照し（Ｓ２２）、その行の文字列が関数の先頭であるか否か（Ｓ２３）、その行の文字列が関数の最後であるか否か（Ｓ２６）、その行が関数内フラグのオフとなる状態で外部変数宣言を表しているか否か（Ｓ２８）、更に、図６Ｂの処理に移り、その行が関数内フラグのオンとなる関数での外部変数書き込み（メモリのライトアクセス）を表しているか否か（Ｓ３０）、及びその行が関数内フラグのオンとなる関数での外部変数読み込み（メモリのリードアクセス）を表しているか否か（Ｓ３２）を順次判定する。例えば、そのいずれでもない場合、処理ユニット１０１は、元プログラムの全ての行についての処理が終了したか否かを判定し（図６ＡのＳ２５）、全ての行についての処理が終了していなければ（Ｓ２５でＮＯ）、元プログラムの次の行について同様の判定処理（Ｓ２３、Ｓ２６、Ｓ２８、Ｓ３０、Ｓ３２）を実行する。
【００４９】
図２に示す元プログラムにおいて、最初の３行は、内部メモリを定義する文字列（int mem1; 、 int mem2; 、 int mem3;）であるので、処理ユニット１０１は、その各行が関数内フラグのオフとなる状態で外部変数（int mem1; 、 int mem2; 、 int mem3）を宣言しているものと判定し（Ｓ２３でＮＯ、Ｓ２６でＮＯ、Ｓ２８でＹＥＳ）、それら外部変数（mem1、mem2、mem3）を登録する。これにより、元プログラムの各関数にてアクセスされる全てのメモリが登録される。登録された全てメモリmem1、mem2、mem3は、例えば、図５に示すように、マトリクス表のメモリ軸に配列されるようになる。
【００５０】
処理ユニット１０１は、次いで、「main()」の行及び「｛」の行に対して前記判定処理を行う際に、「｛」が関数「main」の先頭を表す文字列であると判定し（Ｓ２３でＹＥＳ）、関数「main」に対応付けられる関数内フラグをオンにする（Ｓ２４）。そして、処理ユニット１０１は、まだ全ての行についての処理が終了していないことを確認して（Ｓ２５でＮＯ）、元プログラムの次の行を参照し（Ｓ２２）、その行について同様の判定処理を実行する。
【００５１】
図２に示す元プログラムの各行についての処理を進めていく過程で、処理ユニット１０１は、「mem1=1;」の行を参照すると（Ｓ２２）、その行が関数内フラグのオンとなる関数「main」での外部変数書き込み、具体的には、mem1への値１の書き込み（ライトアクセス）を表していると判定する（Ｓ２３でＮＯ、Ｓ２６でＮＯ、Ｓ２８でＮＯ、Ｓ３０でＹＥＳ）。すると、処理ユニット１０１は、関数内フラグがオンとなる関数「main」において外部変数mem1に対するライトアクセスがなされるという情報をメモリ１０２内に設定する（Ｓ３１）。更に処理を進めていく過程で、処理ユニット１０１は、「｝」の行を参照すると（Ｓ２２）、その行を関数「main」の最後であると判定し（Ｓ２３でＮＯ、Ｓ２６でＹＥＳ）、関数「main」に対応付けられる関数内フラグをオフにする（Ｓ２７）。そして、処理ユニット１０１は、次の行に対する処理に進む（Ｓ２５でＮＯ、Ｓ２２）。
【００５２】
以下、同様にして、処理ユニット１０１は、元プログラムの各行を参照しつつ処理を進める過程で、関数「sub1」において外部変数mem2に対するライトアクセスがなされるという情報（「mem2=1;」の行参照）、関数「sub2」において外部変数mem2に対するライトアクセスがなされるという情報（「mem2=data;」の行参照）及び外部変数mem3に対するライトアクセスがなされるという情報（「mem3=2;」の行参照）をメモリ１０２に設定する。更に、処理ユニット１０１は、文字列「sub3()」の行及びそれに続く文字列「｛」から始まって「｝」の行までの処理の過程で、関数「sub3」に対応付けられる関数内フラグをオンにした（Ｓ２３でＹＥＳ、Ｓ２４）後、「data=mem2;」の行を参照すると（Ｓ２２）、その行が関数内フラグのオンとなる関数「sub3」での外部変数読み込み、具体的には、mem2からのdataの読み込み（リードアクセス）を表していると判定する（Ｓ２３でＮＯ、Ｓ２６でＮＯ、Ｓ２８でＮＯ、Ｓ３０でＮＯ、Ｓ３２でＹＥＳ）。すると、処理ユニット１０１は、関数内フラグがオンとなる関数「sub3」において外部変数mem2に対するリードアクセスがなされるという情報をメモリ１０２内に設定する（Ｓ３３）。
【００５３】
更に、同様にして、処理ユニット１０１は、元プログラムの各行を参照しつつ処理を進める過程で、関数「sub4」において外部変数mem3に対するリードアクセスがなされるという情報（「data=mem3;」の行参照）及び外部変数mem3に対するライトアクセスがなされるという情報（「mem3=2;」の行参照）をメモリ１０２内に設定する。そして、全ての行に対する処理が終了したと判定すると（Ｓ２５でＹＥＳ）、処理ユニット１０１は、元プログラムファイルを閉じて（Ｓ３４）、全ての処理を終了する。
【００５４】
図２に示す元プログラムに対する上述したような処理（図６Ａ及び図６Ｂ参照）により、処理ユニット１０１は、次のような各関数によるメモリアクセスの態様を抽出することになる。
関数「main」は、メモリmem1に対してライトアクセス（Ｗ）を行う。
関数「sub1」は、メモリmem2に対してライトアクセス（Ｗ）を行う。
関数「sub2」は、メモリmem2及びmem3に対してライトアクセス（Ｗ）を行う。
関数「sub3」は、メモリmem2に対してリードアクセス（Ｒ）を行う。
関数「sub4」は、メモリmem3に対してリードアクセス（Ｒ）及びライトアクセス（Ｗ）を行う。
【００５５】
元プログラム（図２参照）の記述内容から前記各関数によるメモリアクセスの態様が抽出された後に、例えば、操作部１０５の所定操作がなされると、処理ユニット１０１は、各関数によるメモリアクセスの態様に基づいて、図７に示すようなマトリクス表情報を作成し、そのマトリクス表情報を支援情報としてモニタ１０６に表示させる。このマトリクス表情報は、関数軸にその実行順序に従って複数の関数（main、sub1、sub2、sub3、sub4）が配列され、メモリ軸に前記複数の関数がアクセスする全てのメモリ（mem1、mem2、mem3）が配列されたマトリクス表において、各関数の行とその関数がアクセスするメモリの列とが交差する位置にアクセスマーク（リードアクセスマーク（Ｒ）またはライトアクセスマーク（Ｗ））が配されたものとなっている。このようなマトリクス表情報がモニタ１０６に支援情報として表示されると、利用者は、元プログラムによって実行される複数の関数（main、sub1、sub2、sub3、sub4）の実行順序と各関数でのメモリアクセスの態様（各関数がどのメモリをリードアクセスまたはライトアクセスするか）を把握することができるようになる。従って、その利用者は、シングルコアプロセッサ用のプログラムからマルチコアプロセッサ用のプログラムを作成するに際して、各プロセッサコアにて分割されて実行され得る複数の関数によるメモリアクセス順序の適否を効率的に検討することができるようになる。
【００５６】
更に、モニタ１０６に表示された図７に示すようなマトリクス表情報において、実行順序に従って配列された前記複数の関数（main、sub1、sub2、sub3、sub4）を複数（例えば２つ）のプロセッサコアにて分割して実行することを想定して、その分割位置を操作部１０５の操作によって指定することができる。例えば、図９に示すように、前記複数の関数（main、sub1、sub2、sub3、sub4）のうち、前半３つの関数（main、sub1、sub2）と後半２つ関数（sub3、sub4）とを別のプロセッサコアにて実行することを想定して、実行順序において連続する先の関数である関数（sub2）と後の関数である関数（sub3）との間を境（以下、この境を分割ポイントという）ＢＤ３として指定することができる。このようにマトリクス表情報において分割ポイントが指定されると、処理ユニット１０１は、その分割によって特に注意すべきメモリアクセスを強調表示するための処理を図８に示す手順に従って実行する。以下、図９に示すようにマトリクス表情報（図７に示すものと同じ）において関数（sub2）と関数（sub3）との間に分割ポイントＢＤ３が指定された場合の処理を例に説明する。
【００５７】
図８において、処理ユニット１０１は、モニタ１０６に表示されるマトリクス表情報（図９参照）における各メモリの列について、指定された分割ポイントＢＤ３を検出し（Ｓ４２でＹＥＳ）、その分割ポイントＢＤ３の上方側及びその下方側の双方にアクセスマーク（ライトアクセスマーク（Ｗ）またはリードアクセスマーク（Ｒ））がある場合に（Ｓ４３でＹＥＳ、Ｓ４４でＹＥＳ）、そのマトリクス表情報における当該メモリを強調させるためにそのメモリ名を赤色表示にする（Ｓ４５）。そして、分割ポイントＢＤ３を挟んで対向するアクセスマークを強調させるために赤色表示にする（Ｓ４６、Ｓ４７）。処理ユニット１０１は、このような処理を全メモリの列について（Ｓ４８、Ｓ４９参照）実行する。
【００５８】
その結果、モニタ１０６に表示されるマトリクス表情報において、分割ポイントＢＤ３を挟んでその上方側及びその下方側の双方にアクセスマークのある列のメモリ名「mem2」及びメモリ名「mem3」が赤色表示（図９では太字斜体文字）される。また、メモリmem2の列において分割ポイントＢＤ３を挟んで対向するアクセスマークが赤色表示される（図９では二重丸表示）とともに、メモリmem3の列において分割ポイントＢＤ３を挟んで対向するアクセスマークが赤色表示される（図９では二重丸表示）。
【００５９】
モニタ１０６に表示される前記マトリクス表情報を見る利用者は、メモリ名「mem2」、「mem3」が赤色表示されているので、分割ポイントＢＤ３より上側の関数（sub2）以前の関数（main、sub1、sub2）と分割ポイントＢＤ３より下側の関数（sub3）以後の関数（sub3、sub4）とを異なるプロセッサコアにて実行した場合に、その異なるプロセッサコアで実行すべき関数（main、sub1、sub2）と関数（sub3、sub4）とが、同じメモリmem2、mem3をアクセスすることをその赤色表示から即座に知ることができる。従って、利用者は、メモリmem2、mem3のアクセス順序に注意しつつ、関数（main、sub1、sub2）を実行するプロセッサコア用のプログラムと、関数（sub3、sub4）を実行する別のプロセッサコア用のプログラムとを作成することができるようになる。
【００６０】
また、モニタ１０６に表示されるマトリクス表情報において、分割ポイントＢＤ３を挟んで対向するアクセスマークが赤色表示されるので、具体的には、関数（sub2）のメモリmem2に対するアクセスのアクセスマーク（Ｗ）と関数（sub3）のメモリmem2に対するアクセスのアクセスマーク（Ｗ）が赤色表示され、関数（sub2）のメモリmem3に対するアクセスのアクセスマーク（Ｗ）と関数（sub4）のメモリmem3に対するアクセスのアクセスマーク（Ｒ）（Ｗ）が赤色表示されるので、異なるプロセッサコアによる実行順序のより近い各関数（sub2）と（sub3）の同じメモリmem2に対するアクセス、及び各関数(sub2)と（sub4）の同じメモリmem3に対すアクセスについて特に注意喚起させることができるようになる。
【００６１】
更に、図８に示す処理において、処理ユニット１０１は、分割ポイントＢＤ３を挟んで対向するアクセスマークを赤色表示させる際に（Ｓ４６、Ｓ４７）、例えば、図１０に示すように、分割ポイントＢＤ３の上側のアクセスマークに対応づけるように先の順序番号（例えば、「１」）を表示させ、分割ポイントＢＤ３の下側のアクセスマークに対応づけるように後の順序番号（例えば、「２」）を表示させることができる。この場合、その順序番号により、利用者は、異なるプロセッサコアによる実行順序のより近い各関数の同じメモリに対するアクセス順序を把握することができるようになる。
【００６２】
シングルプロセッサ用の元プログラムが逐次実行すべき５つの処理（関数）（処理１、処理２、処理３、処理４、処理５）を含み、その５つの処理が３つのメモリ（メモリ１、メモリ２、メモリ３）を前述したのと同じアクセス態様にてアクセスする場合、その分割ポイントＢＤの位置に応じて、モニタ１０６に表示されるマトリクス表情報の表示態様が、図１１乃至図１４に示すように変わる。
【００６３】
マトリクス表情報において処理１と処理２との間に分割ポイントＢＤ１が指定される場合、図１１に示すように、分割ポイントＢＤ１より上方側の処理１と、その下方側の処理２、処理３、処理４、処理５とを異なるプロセッサコアにて実行しても、各プロセッサコアは同じメモリをアクセスしないので、特にメモリ名の強調表示（例えば、赤色表示）やアクセスマークの強調表示（例えば、赤色表示）はなされない。
【００６４】
マトリクス表情報において処理２と処理３との間に分割ポイントＢＤ２が指定される場合、図１２に示すように、分割ポイントＢＤ２を挟んでその上方側及びその下方側の双方にアクセスマークのある列のメモリ「メモリ２」が赤色表示（図１２では太字斜体文字）される。また、メモリ２の列において分割ポイントＢＤ２を挟んで対向するアクセスマークが赤色表示される（図９では二重丸表示）。更に、その分割ポイントＢＤ２を挟んで対向するアクセスマークのうち上側のアクセスマークに対応するように先の順序番号「１」が表示されるとともにその下側のアクセスマークに対応するように後の順序番号「２」が表示される。このようなマトリクス表情報により、分割ポイントＢＤ２より上側の処理１、２と分割ポイントＢＤ３より下側の処理３、４、５とを異なるプロセッサコアにて実行する場合に、メモリ２のアクセス順序について注意喚起がなされる。
【００６５】
マトリクス表情報において処理３と処理４との間に分割ポイントＢＤ３が指定される場合（図９、図１０に示す場合と同様）、図１３に示すように、分割ポイントＢＤ３を挟んでその上方側及びその下方側の双方にアクセスマークのある列のメモリ名「メモリ２」及びメモリ名「メモリ３」が赤色表示（図１３では太字斜体文字）される。また、メモリ２の列において分割ポイントＢＤ３を挟んで対向するアクセスマークが赤色表示される（図１３では二重丸表示）とともにメモリ３の列において分割ポイントＢＤ３を挟んで対向するアクセスマークが赤色表示される（図１３では太字斜体文字）。更に、その分割ポイントＢＤ３を挟んで対向するアクセスマークのうち上側のアクセスマークに対応するように先の順序番号「１」が表示されるとともにその下側のアクセスマークに対応するように後の順序番号「２」が表示される。このようなマトリクス表情報により、分割ポイントＢＤ３より上側の処理１、２、３と分割ポイントＢＤ３より下側の処理４、５とを異なるプロセッサコアにて実行する場合に、メモリ２及びメモリ３のアクセス順序について注意喚起がなされる。
【００６６】
マトリクス表情報において処理４と処理５との間に分割ポイントＢＤ４が指定される場合、図１４に示すように、分割ポイントＢＤ４を挟んでその上方側及びその下方側の双方にアクセスマークのある列のメモリ名「メモリ３」が赤色表示（図１３では太字斜体文字）される。また、メモリ３の列において分割ポイントＢＤ４を挟んで対向するアクセスマークが赤色表示される（図１４では二重丸表示）。更に、その分割ポイントＢＤ４を挟んで対向するアクセスマークのうち上側のアクセスマークに対応するように先の順序番号「１」が表示されるとともにその下側のアクセスマークに対応するように後の順序番号「２」が表示される。このようなマトリクス表情報により、分割ポイントＢＤ４より上側の処理１、２、３、４と分割ポイントＢＤ４より下側の処理５とを異なるプロセッサコアにて実行する場合に、メモリ３のアクセス順序について注意喚起がなされる。
【００６７】
前述したマトリクス表情報において単一の分割ポイントＢＤが指定された場合、即ち、２つのプロセッサコアにて分割処理する場合について説明したが、マトリクス表情報において複数の分割ポイントＢＤを指定することができる。この場合、指定されたそれぞれの分割ポイントＢＤに対して同様の処理が実行され、各分割ポイントＢＤに起因した強調表示が重ねてマトリクス表情報になされる。
【産業上の利用可能性】
【００６８】
以上、説明したように、本発明に係るマルチコアプログラム作成支援装置は、シングルコアプロセッサ用のプログラムからマルチコアプロセッサ用のプログラムを作成するに際してメモリアクセス順序の適否を効率的に検討することのできる支援情報を提供し得るという効果を有し、シングルコアプロセッサ用プログラムをもとにして、マルチコアプロセッサの複数のプロセッサコアにて並列実行され得るプログラムを作成する際の支援情報を提供するマルチコアプロラム作成支援装置として有用である。
【符号の説明】
【００６９】
１０１  処理ユニット（ＣＰＵ）
１０２  メモリ
１０３  外部記憶装置（ＨＤＤ）
１０５  操作部
１０６  モニタ（表示ユニット）
１０７  バス
【図１】
2010237968.tif 000003
【図２】
2010237968.tif 000004
【図３】
2010237968.tif 000005
【図４】
2010237968.tif 000006
【図５】
2010237968.tif 000007
【図６Ａ】
2010237968.tif 000008
【図６Ｂ】
2010237968.tif 000009
【図７】
2010237968.tif 000010
【図８】
2010237968.tif 000011
【図９】
2010237968.tif 000012
【図１０】
2010237968.tif 000013
【図１１】
2010237968.tif 000014
【図１２】
2010237968.tif 000015
【図１３】
2010237968.tif 000016
【図１４】
2010237968.tif 000017