(57)【要約】【課題】配列変数へのアクセスを示す処理を含んだシングルプログラムであっても適切に並列プログラムを生成できる並列化方法、並列化ツールを提供すること。【解決手段】コンピュータ１０は、シングルプログラムから、複数の配列要素を含む配列変数であることを示す配列変数文字を検索して、配列変数を特定する（Ｓ１２）。また、コンピュータ１０は、配列変数が特定された場合、配列変数における配列要素ごとに、配列変数の名称である配列変数名と、配列要素の番号である要素番号と、配列変数文字とを結合した文字列を変数名として定義する（Ｓ１４）。そして、コンピュータ１０は、変数名が定義された定義済変数を含む変数をシングルプログラムから抽出して、変数にアクセスする複数の処理の依存関係を解析し、複数の処理の依存関係が保たれた並列プログラムを生成する（Ｓ１７）。【選択図】図３
2019049771.tif 000002
【特許請求の範囲】
【請求項１】
コアが一つであるシングルコアマイコン用に記述された複数の処理を含むシングルプログラムから、コアが複数であるマルチコアマイコン用に並列化可能な前記処理を並列化した並列プログラムを生成する並列化方法であって、
前記シングルプログラムから、複数の配列要素を含む配列変数であることを示す配列変数文字を検索して、前記配列変数を特定する配列変数特定手順（Ｓ１２）と、
前記配列変数が特定された場合、前記配列変数における前記配列要素ごとに、前記配列変数の名称である配列変数名と、前記配列要素の番号である要素番号と、前記配列変数文字とを結合した文字列を変数名として定義する変数名定義手順（Ｓ１４）と、
前記変数名定義手順で前記変数名が定義された定義済変数を含む変数を前記シングルプログラムから抽出して、前記変数にアクセスする複数の前記処理の依存関係を解析し、複数の前記処理の依存関係が保たれた前記並列プログラムを生成する生成手順（Ｓ１７）と、を備えている並列化方法。
【請求項２】
前記配列変数文字は、前記シングルプログラムの記述ルールに準拠した前記配列変数であることを示す文字である請求項１に記載の並列化方法。
【請求項３】
前記配列変数であることを示す文字を指定する文字指定手順（Ｓ２０）を備え、
前記配列変数文字は、前記文字指定手順で指定された前記配列変数であることを示す文字である請求項１に記載の並列化方法。
【請求項４】
前記配列変数特定手順で特定された前記配列変数における前記配列変数文字の後に、前記配列変数とは異なる別変数名が用いられていた場合、前記別変数名が取りうる値を前記シングルプログラムから解析して前記要素番号を特定する要素番号特定手順（Ｓ３０、Ｓ３１）を備え、
前記変数名定義手順は、前記要素番号特定手順で前記要素番号が特定された場合、特定された前記要素番号を用いて前記変数名を定義する請求項２又は３に記載の並列化方法。
【請求項５】
前記シングルプログラムにおける前記処理がアクセスする前記配列要素を含む要素情報リストを備えており、
前記配列変数特定手順で特定された前記配列変数における前記配列変数文字の後に、前記配列変数とは異なる別変数名が用いられていた場合、前記別変数名でアクセスする前記配列要素を前記要素情報リストから検索し、前記要素番号を特定する要素番号特定手順（Ｓ４０、Ｓ４１）と、を備え、
前記変数名定義手順は、前記要素番号特定手順で前記要素番号が特定された場合、特定された前記要素番号を用いて前記変数名を定義する請求項２又は３に記載の並列化方法。
【請求項６】
コアが一つであるシングルコアマイコン用に記述された複数の処理を含むシングルプログラムから、コアが複数であるマルチコアマイコン用に並列化可能な前記処理を並列化した並列プログラムを生成する、コンピュータを含む並列化ツールであって、
前記シングルプログラムから、複数の配列要素を含む配列変数であることを示す配列変数文字を検索して、前記配列変数を特定する配列変数特定部（Ｓ１２）と、
前記配列変数が特定された場合、前記配列変数における前記配列要素ごとに、前記配列変数の名称である配列変数名と、前記配列要素の番号である要素番号と、前記配列変数文字とを結合した文字列を変数名として定義する変数名定義部（Ｓ１４）と、
前記変数名定義部で前記変数名が定義された定義済変数を含む変数を前記シングルプログラムから抽出して、前記変数にアクセスする複数の前記処理の依存関係を解析し、複数の前記処理の依存関係が保たれた前記並列プログラムを生成する生成部（Ｓ１７）と、を備えている並列化ツール。
【請求項７】
前記配列変数文字は、前記シングルプログラムの記述ルールに準拠した前記配列変数であることを示す文字である請求項６に記載の並列化ツール。
【請求項８】
前記配列変数であることを示す文字を指定する文字指定部（Ｓ２０）を備え、
前記配列変数文字は、前記文字指定部で指定された前記配列変数であることを示す文字である請求項６に記載の並列化ツール。
【請求項９】
前記配列変数特定部で特定された前記配列変数における前記配列変数文字の後に、前記配列変数とは異なる別変数名が用いられていた場合、前記別変数名が取りうる値を前記シングルプログラムから解析して前記要素番号を特定する要素番号特定部（Ｓ３０、Ｓ３１）を備え、
前記変数名定義部は、前記要素番号特定部で前記要素番号が特定された場合、特定された前記要素番号を用いて前記変数名を定義する請求項７又は８に記載の並列化ツール。
【請求項１０】
前記シングルプログラムにおける前記処理がアクセスする前記配列要素を含む要素情報リストを備えており、
前記配列変数特定部で特定された前記配列変数における前記配列変数文字の後に、前記配列変数とは異なる別変数名が用いられていた場合、前記別変数名でアクセスする前記配列要素を前記要素情報リストから検索して前記要素番号を特定する要素番号特定部（Ｓ４０、Ｓ４１）と、を備え、
前記変数名定義部は、前記要素番号特定部で前記要素番号が特定された場合、特定された前記要素番号を用いて前記変数名を定義する請求項７又は８に記載の並列化ツール。
【請求項１１】
複数のコア（２１ｃ、２１ｄ）を有するマルチコアマイコン（２１）と、前記コアが一つであるシングルコアマイコン用のシングルプログラムにおける複数の処理から前記マルチコアマイコン用に並列化された並列プログラム（２１ａ１）と、を備えた車載装置であって、
前記並列プログラムは、
前記シングルプログラムから、複数の配列要素を含む配列変数であることを示す配列変数文字を検索して前記配列変数が特定され、
特定された前記配列変数における前記配列要素ごとに、前記配列変数の名称である配列変数名と、前記配列要素の番号である要素番号と、前記配列変数文字とを結合した文字列を変数名として定義され、
前記変数名が定義された定義済変数を含む変数を前記シングルプログラムから抽出して、前記変数にアクセスする複数の前記処理の依存関係を解析し、依存関係が保たれた状態で複数の前記処理が各コアに割り当てられており、
前記マルチコアマイコンは、各コアが割り当てられた前記処理を実行する車載装置。
【請求項１２】
前記配列変数文字は、前記シングルプログラムの記述ルールに準拠した前記配列変数であることを示す文字である請求項１１に記載の車載装置。
【請求項１３】
前記配列変数文字は、指定された前記配列変数であることを示す文字である請求項１１に記載の車載装置。
【請求項１４】
前記並列プログラムは、特定された前記配列変数における前記配列変数文字の後に、前記配列変数とは異なる別変数名が用いられていた場合に、前記別変数名が取りうる値を前記シングルプログラムから解析して前記要素番号が特定され、特定された前記要素番号を用いて前記変数名を定義されている請求項１２又は１３に記載の車載装置。
【請求項１５】
前記並列プログラムは、特定された前記配列変数における前記配列変数文字の後に、前記配列変数とは異なる別変数名が用いられていた場合に、前記シングルプログラムにおける前記処理がアクセスする前記配列要素を含む要素情報リストから、前記別変数名でアクセスする前記配列要素を検索して前記要素番号が特定され、特定された前記要素番号を用いて前記変数名が定義されている請求項１２又は１３に記載の車載装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、シングルコアマイコン用のシングルプログラムから、マルチコアマイコン用の並列プログラムを生成する並列化方法、並列化ツール、および並列化方法で生成された並列プログラムを備えた車載装置に関する。
【背景技術】
【０００２】
従来、シングルプログラムから並列プログラムを生成する並列化方法の一例として特許文献１に開示された並列化コンパイル方法がある。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１５−１８０７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ところで、シングルコアマイコンは、シングルプログラムを実行することで、配列変数にアクセスすることもありうる。つまり、シングルプログラムには、配列変数が含まれていることがある。上記並列化コンパイル方法では、このようなシングルプログラムから並列プログラムを生成する場合、配列変数の全要素をまとめて一つの変数として扱い、依存関係の解析、処理順序の抽出、各コアへの配置を行うことになる。
【０００５】
この場合、配列変数の各要素へのアクセスを示す各処理は、依存関係がないにもかかわらず、依存関係があるものとして扱われることがある。このため、並列化コンパイル方法で生成された並列プログラムは、依存関係がない処理間の依存関係を保つために、同期処理や空きが必要以上に多くなるという問題がある。また、マルチコアマイコンは、このような並列プログラムを実行することで、同期処理の分だけ処理負荷が増加したり、依存関係を保つための空きの分だけ処理効率が低下するという問題がある。
【０００６】
本開示は、上記問題点に鑑みなされたものであり、配列変数へのアクセスを示す処理を含んだシングルプログラムであっても適切に並列プログラムを生成できる並列化方法、並列化ツールを提供することを一つの目的とする。また、上記問題点に鑑みなされたものであり、複数のコアで適切に処理を行なうことができる車載装置を提供することを他の目的とする。
【課題を解決するための手段】
【０００７】
上記目的を達成するために本開示は、
コアが一つであるシングルコアマイコン用に記述された複数の処理を含むシングルプログラムから、コアが複数であるマルチコアマイコン用に並列化可能な処理を並列化した並列プログラムを生成する並列化方法であって、
シングルプログラムから、複数の配列要素を含む配列変数であることを示す配列変数文字を検索して、配列変数を特定する配列変数特定手順（Ｓ１２）と、
配列変数が特定された場合、配列変数における配列要素ごとに、配列変数の名称である配列変数名と、配列要素の番号である要素番号と、配列変数文字とを結合した文字列を変数名として定義する変数名定義手順（Ｓ１４）と、
変数名定義手順で変数名が定義された定義済変数を含む変数をシングルプログラムから抽出して、変数にアクセスする複数の処理の依存関係を解析し、複数の処理の依存関係が保たれた並列プログラムを生成する生成手順（Ｓ１７）と、を備えていることを特徴とする。
【０００８】
このように、本開示は、シングルプログラムから配列変数を特定すると、この配列変数における配列要素ごとに、配列変数の名称である配列変数名と、配列要素の番号である要素番号と、配列変数文字とを結合した文字列を変数名として定義する。このため、本開示は、配列変数を一つの変数として扱うのではなく、配列変数に含まれる複数の配列要素のそれぞれを一つの変数として扱うことができる。
【０００９】
そして、本開示は、このように定義した定義済変数を含む変数をシングルプログラムから抽出して、変数にアクセスする複数の処理の依存関係を解析し、複数の処理の依存関係が保たれた並列プログラムを生成する。ことのとき、本開示は、複数の配列要素のそれぞれを一つの変数として扱って依存関係を解析するので、依存関係がないにもかかわらず、依存関係があるとすることを抑制できる。よって、本開示は、同期処理や依存関係を保つための空きが必要以上に多くなることを抑制でき、適切に並列プログラムを生成できる。
【００１０】
また、上記目的を達成するさらなる特徴は、
コアが一つであるシングルコアマイコン用に記述された複数の処理を含むシングルプログラムから、コアが複数であるマルチコアマイコン用に並列化可能な処理を並列化した並列プログラムを生成する、コンピュータを含む並列化ツールであって、
シングルプログラムから、複数の配列要素を含む配列変数であることを示す配列変数文字を検索して、配列変数を特定する配列変数特定部（Ｓ１２）と、
配列変数が特定された場合、配列変数における配列要素ごとに、配列変数の名称である配列変数名と、配列要素の番号である要素番号と、配列変数文字とを結合した文字列を変数名として定義する変数名定義部（Ｓ１４）と、
変数名定義部で変数名が定義された定義済変数を含む変数をシングルプログラムから抽出して、変数にアクセスする複数の処理の依存関係を解析し、複数の処理の依存関係が保たれた並列プログラムを生成する生成部（Ｓ１７）と、を備えている点にある。
【００１１】
このように、並列化ツールでは、上記並列化方法と同様に、同期処理や依存関係を保つための空きが必要以上に多くなることを抑制でき、適切に並列プログラムを生成できる。
【００１２】
また、上記目的を達成するさらなる特徴は、
複数のコア（２１ｃ、２１ｄ）を有するマルチコアマイコン（２１）と、コアが一つであるシングルコアマイコン用のシングルプログラムにおける複数の処理からマルチコアマイコン用に並列化された並列プログラム（２１ａ１）と、を備えた車載装置であって、
並列プログラムは、
シングルプログラムから、複数の配列要素を含む配列変数であることを示す配列変数文字を検索して配列変数が特定され、
特定された配列変数における配列要素ごとに、配列変数の名称である配列変数名と、配列要素の番号である要素番号と、配列変数文字とを結合した文字列を変数名として定義され、
変数名が定義された定義済変数を含む変数をシングルプログラムから抽出して、変数にアクセスする複数の処理の依存関係を解析し、依存関係が保たれた状態で複数の処理が各コアに割り当てられており、
マルチコアマイコンは、各コアが割り当てられた処理を実行する点にある。
【００１３】
このように、本開示は、上記の並列化方法で説明したように、同期処理や依存関係を保つための空きが必要以上に多くなることが抑制され、適切に生成された並列プログラムを備えている。そして、本開示は、このような並列プログラムをマルチコアマイコンの各コアが実行する。このため、本開示は、同期処理の分だけ処理負荷が増加したり、依存関係を保つための空きの分だけ処理効率が低下することを抑制でき、複数のコアで適切に処理を行なうことができる。
【００１４】
なお、特許請求の範囲、およびこの項に記載した括弧内の符号は、一つの態様として後述する実施形態に記載の具体的手段との対応関係を示すものであって、本開示の技術的範囲を限定するものではない。
【図面の簡単な説明】
【００１５】
【図１】第１実施形態におけるコンピュータの概略構成を示すブロック図である。
【図２】第１実施形態における車載装置の概略構成を示すブロック図である。
【図３】第１実施形態におけるコンピュータの処理を示すフローチャートである。
【図４】第１実施形態における各処理と配列変数との関係を示すイメージ図である。
【図５】第１実施形態における並列化後の各処理と各コアとの一例を示すイメージ図である。
【図６】第１実施形態における並列化後の各処理と各コアとの他の例を示すイメージ図である。
【図７】第２実施形態におけるコンピュータの処理を示すフローチャートである。
【図８】第３実施形態におけるコンピュータの処理を示すフローチャートである。
【図９】第３実施形態におけるＣ言語で記述されたプログラムコード例である。
【図１０】第４実施形態におけるコンピュータの処理を示すフローチャートである。
【図１１】第４実施形態におけるＣ言語で記述されたプログラムコード例である。
【図１２】比較例における並列化後の各処理と各コアとの一例を示すイメージ図である。
【発明を実施するための形態】
【００１６】
以下において、図面を参照しながら、本開示を実施するための複数の形態を説明する。各形態において、先行する形態で説明した事項に対応する部分には同一の参照符号を付して重複する説明を省略する場合がある。各形態において、構成の一部のみを説明している場合は、構成の他の部分については先行して説明した他の形態を参照し適用することができる。
【００１７】
（第１実施形態）
図１〜図６を用いて、第１実施形態に関して説明する。本実施形態では、一つのコアを有するシングルコアマイコン用のシングルプログラムにおける並列可能な複数の処理を第１コア２１ｃと第２コア２１ｄを有するマルチコアマイコン用に並列化した並列プログラム２１ａ１を生成するコンピュータ１０を採用する。つまり、コンピュータ１０は、コアが一つであるシングルコアマイコン用に記述された複数の処理を含むシングルプログラムから、コアが複数であるマルチコアマイコン用に並列化可能な処理を並列化した並列プログラム２１ａ１を生成する。
【００１８】
なお、並列プログラム２１ａ１を生成する際には、特開２０１５−１８０７号公報に記載されているように、シングルプログラムを解析して、複数の処理を第１コア２１ｃと第２コア２１ｄに割り振る（配置する）処理などを行う。この点に関しては、特開２０１５−１８０７号公報を参照して適用できる。
【００１９】
図４に示すように、本実施形態では、複数の配列要素として第１要素Ｖ１１〜第４要素Ｖ１４を含む配列変数Ｖ１を有するシングルプログラムを採用する。例えばＣ言語の場合、配列変数Ｖ１は、Ａｒｒａｙ［４］などと記述することができる。そして、Ａｒｒａｙ［４］は、要素数が四であり、配列要素としてＡｒｒａｙ［０］、Ａｒｒａｙ［１］、Ａｒｒａｙ［２］、Ａｒｒａｙ［３］を含んでいる。
【００２０】
この場合、Ａｒｒａｙ［４］における［は、配列変数であることを示す配列変数文字に相当する。Ａｒｒａｙ［４］におけるＡｒｒａｙは、配列変数の名称である配列変数名に相当する。配列要素における０〜３のそれぞれは、配列要素の番号である要素番号に相当する。なお、Ａｒｒａｙ［４］における４は、要素数と言える。また、要素番号は、添字と言い換えることもできる。なお、これらは、配列変数文字、配列変数名、要素番号の一例である。つまり、配列変数文字、配列変数名、要素番号は、これに限定されず、シングルプログラムの記述ルールに則したものであれば採用できる。
【００２１】
また、図４に示すように、本実施形態では、複数の処理として、第１処理ＭＴ１〜第５処理ＭＴ５を採用する。第１処理ＭＴ１は、第１要素Ｖ１１への書き込みを示す処理である。第２処理ＭＴ２は、第２要素Ｖ１２への書き込みを示す処理である。第３処理ＭＴ３は、第３要素Ｖ１３への書き込みを示す処理である。第４処理ＭＴ４は、第４要素Ｖ１４への書き込みを示す処理である。第５処理ＭＴ５は、第１要素Ｖ１１〜第４要素Ｖ１４の全ての読み込みを示す処理である。よって、本実施形態では、第１処理ＭＴ１〜第４処理ＭＴ４の間には依存間隔がなく、第１処理ＭＴ１〜第４処理ＭＴ４のそれぞれと第５処理ＭＴ５との間のみ依存関係があるものとする。なお、処理は、処理ブロックやマクロタスクと言い換えることができる。
【００２２】
さらに、依存関係は、処理順とみなすことができる。つまり、第１処理ＭＴ１〜第４処理ＭＴ４のそれぞれの間では、どのような処理順であってもよい。しかしながら、第５処理ＭＴ５は、第１処理ＭＴ１〜第４処理ＭＴ４のそれぞれよりも処理順が遅い。
【００２３】
ここで、コンピュータ１０と、車載装置２０の構成に関して説明する。コンピュータ１０は、並列化方法を実行する並列化ツールに相当する。また、コンピュータ１０は、並列プログラム２１ａ１を生成するため、プログラム生成ツールとも言える。図１に示すように、コンピュータ１０は、ディスプレイ１１、ＨＤＤ１２、ＣＰＵ１３、ＲＯＭ１４、ＲＡＭ１５、入力装置１６、読取部１７などを備えて構成されている。また、コンピュータ１０は、記憶媒体１８に記憶された記憶内容を読み取り可能に構成されている。記憶媒体１８には、自動並列化コンパイラ１が記憶されている。コンピュータ１０および記憶媒体１８の構成は、特開２０１５−１８０７号公報に記載されたパーソナルコンピュータ１００および記憶媒体１８０を参照して適用できる。
【００２４】
自動並列化コンパイラ１は、並列化方法に相当する。つまり、自動並列化コンパイラ１は、並列化手順、言い換えると並列化方法が記述されたプログラムである。コンピュータ１０は、自動並列化コンパイラ１を実行することで、並列プログラム２１ａ１を生成する。このため、自動並列化コンパイラ１は、プログラム生成方法とも言える。自動並列化コンパイラ１は、特開２０１５−１８０７号公報に記載されたものを参照して適用できる。特に、自動並列化コンパイラ１は、配列変数特定手順と、変数名定義手順とを含んでいる。配列変数特定手順と変数名定義手順に関しては、後程詳しく説明する。
【００２５】
なお、自動並列化コンパイラ１は、依存関係を保つための同期処理や空きの挿入手順などを含んでいてもよい。この同期処理は、例えば、第１処理ＭＴ１〜第４処理ＭＴ４が終了するのを待って第５処理ＭＴ５が実行されるようにするための処理である。本実施形態では、図５に示すように、同期処理の一例として、第１同期処理Ｗ１と第２同期処理Ｗ２が挿入される例を採用している。また、本実施形態では、図５、図６に示すように、依存関係を保つための空きの一例として、第２の空きＥ２と第６の空きＥ６が挿入される例を採用している。
【００２６】
コンピュータ１０は、自動並列化コンパイラ１を実行することで、図５、図６に示すような、各コア２１ｃ、２１ｄに対応した並列プログラム２１ａ１を生成する。つまり、コンピュータ１０は、第１処理ＭＴ１〜第５処理ＭＴ５などを第１コア２１ｃや第２コア２１ｄに配置、言い換えると割り当てられた並列プログラム２１ａ１を生成する。
【００２７】
図５に示す並列プログラム２１ａ１では、第１処理ＭＴ１、第３処理ＭＴ３、第５処理ＭＴ５が第１コア２１ｃに配置され、第２処理ＭＴ２、第４処理ＭＴ４が第２コア２１ｄに配置されている。さらに、図５に示す並列プログラム２１ａ１では、第１同期処理Ｗ１、第１の空きＥ１が第１コア２１ｃに配置され、第２同期処理Ｗ２、第２の空きＥ２、第３の空きＥ３が第２コア２１ｄに配置されている。
【００２８】
一方、図６に示す並列プログラム２１ａ１では、第１処理ＭＴ１〜第５処理ＭＴ５の全てが第１コア２１ｃに配置されている。さらに、図６に示す並列プログラム２１ａ１では、第４の空きＥ４が第１コア２１ｃに配置され、第５の空きＥ５〜第７の空きＥ７が第２コア２１ｄに配置されている。
【００２９】
なお、本実施形態では、一例として、図５、図６に示す並列プログラム２１ａ１を採用している。しかしながら、本開示は、これに限定されない。
【００３０】
車載装置２０は、図２に示すように、マルチコアプロセッサ２１、ＲＯＭ２１ａ、ＲＡＭ２１ｂ、第１コア２１ｃ、第２コア２１ｄ、通信部２２、センサ部２３、入出力ポート２４を備えて構成されている。車載装置２０は、例えば、自動車に搭載されたエンジン制御装置やハイブリッド制御装置などに適用できる。ここでは、一例として、車載装置２０をエンジン制御装置に適用した例を採用する。この場合、並列プログラム２１ａ１は、エンジン制御などの自動車制御プログラムと言える。なお、マルチコアプロセッサ２１は、マルチコアマイコンに相当する。また、コアは、プロセッサエレメントとも称することができる。
【００３１】
ＲＡＭ２１ｂ、通信部２２、センサ部２３、入出力ポート２４は、特開２０１５−１８０７号公報に記載されたＲＡＭ４２０、通信部４３０、センサ部４５０、入出力ポート４６０を参照して適用できる。
【００３２】
ＲＯＭ２１ａには、第１コア２１ｃと第２コア２１ｄが実行可能な並列プログラム２１ａ１が含まれている。つまり、車載装置２０は、シングルプログラムにおける複数の処理ＭＴ１〜ＭＴ５からマルチコアプロセッサ２１用に並列化された並列プログラム２１ａ１を備えていると言える。
【００３３】
マルチコアプロセッサ２１は、各コア２１ｃ、２１ｄに割り当てられた処理を各コア２１ｃ、２１ｄが実行する。第１コア２１ｃと第２コア２１ｄは、並列プログラム２１ａ１を実行することで、例えばエンジン制御などを行う。言い換えると、第１コア２１ｃと第２コア２１ｄは、並列プログラム２１ａ１に従って制御ロジックを実行することで、エンジン制御などを行う。
【００３４】
なお、本実施形態では、マルチコアプロセッサ２１が車載装置２０に搭載された例を採用している。しかしながら、本開示は、これに限定されず、マルチコアプロセッサ２１が、車載装置２０とは異なる機器、例えばパソコンなどに搭載されていてもよい。さらに、本実施形態では、二つのコア２１ｃ、２１ｄを備えたマルチコアプロセッサ２１を採用している。しかしながら、本開示は、三つ以上のコアを備えたマルチコアプロセッサ２１であっても採用できる。
【００３５】
次に、図３を用いて、コンピュータ１０の処理動作に関して説明する。ＣＰＵ１３は、例えば入力装置１６によって挿入処理の実行指示がなされた場合に、図３に示すフローチャートを実行する。ＣＰＵ１３は、自動並列化コンパイラ１を実行することで、シングルプログラムから並列プログラム２１ａ１を生成する。ＣＰＵ１３は、特開２０１５−１８０７号公報に記載された手順に従って並列プログラム２１ａ１を生成する際に、下記のステップＳ１０〜Ｓ１７を実行する。
【００３６】
ステップＳ１０では、抽出対象ファイルを選定する。ＣＰＵ１３は、シングルプログラムから抽出対象ファイル、すなわち処理を選定する。ステップＳ１１では、アクセスする変数を検索する。ＣＰＵ１３は、ステップＳ１０で選定した処理でアクセスする変数を検索する。
【００３７】
ステップＳ１２では、配列変数文字の有無を判定する。ＣＰＵ１３は、ステップＳ１１の検索結果である変数に配列変数文字が含まれているか否かを判定する（配列変数特定部）。つまり、ＣＰＵ１３は、ステップＳ１１の検索で得られた変数が配列変数であるか否かを判定する。ＣＰＵ１３は、変数に配列変数文字が含まれていると判定しなかった場合、その変数が配列変数ではないとみなしてステップＳ１３へ進む。一方、ＣＰＵ１３は、変数に配列変数文字が含まれていると判定した場合、その変数が配列変数であるとみなしてステップＳ１４へ進む。このように、ＣＰＵ１３は、シングルプログラムから、配列変数であることを示す配列変数文字を検索して、配列変数を特定する。
【００３８】
本実施形態では、シングルプログラムの記述ルールに準拠した配列変数であることを示す文字を、配列変数文字として採用している。ＣＰＵ１３は、配列変数である事を判定する際に、シングルプログラムの記述ルールに則った、配列変数である事を示す文字があるか否かを判定する。Ｃ言語プログラムでの配列変数記述ルールでは、配列変数の場合、変数名の後に必ず［］が存在する。このため、ＣＰＵ１３は、［の有無で変数が配列変数であるか否かを判定することができる。
【００３９】
ＣＰＵ１３は、自動並列化コンパイラ１を実行することで配列変数を特定する。このため、自動並列化コンパイラ１は、配列変数特定手順を含んでいると言える。つまり、自動並列化コンパイラ１は、シングルプログラムから、複数の配列要素を含む配列変数であることを示す配列変数文字を検索して、配列変数を特定する配列変数特定手順を含んでいる。
【００４０】
ステップＳ１３では、検索結果から変数名を抽出する。ＣＰＵ１３は、ステップＳ１１で検索した変数から変数名を抽出する。
【００４１】
ステップＳ１４では、配列変数名、要素番号、配列変数文字を結合した文字列を変数名として定義する（変数名定義部）。ＣＰＵ１３は、配列変数が特定された場合、配列変数における配列要素ごとに、配列変数名と、要素番号と、配列変数文字とを結合した文字列を変数名として定義する。ＣＰＵ１３は、例えば配列変数としてＡｒｒａｙ［４］が特定された場合、配列要素ごとに、Ａｒｒａｙ［０］、Ａｒｒａｙ［１］、Ａｒｒａｙ［２］、Ａｒｒａｙ［３］と変数名を定義する。これは、配列変数を一つの変数として扱うのではなく、各配列要素のそれぞれを一つの変数として扱って、並列プログラム２１ａ１を生成するためである。ここで変数名が定義された変数は、定義済変数に相当する。
【００４２】
このように、ＣＰＵ１３は、配列変数の各要素へアクセスする場合、必ず要素番号が指定されるため、その要素番号を含めて変数名として定義する。ＣＰＵ１３は、シングルプログラムの記述ルールに則った文字を含めて変数名として定義する事で、シングルプログラム内での配列変数の要素毎の検索が容易になり、後程説明するステップＳ１７の処理に要する時間を短くすることができる。つまり、ＣＰＵ１３は、依存関係の解析にかかる時間を短くすることができる。
【００４３】
ＣＰＵ１３は、自動並列化コンパイラ１を実行することで配列要素ごとに変数名を定義する。このため、自動並列化コンパイラ１は、変数名定義手順を含んでいると言える。つまり、自動並列化コンパイラ１は、配列変数が特定された場合、配列変数における配列要素ごとに、配列変数の名称である配列変数名と、配列要素の番号である要素番号と、配列変数文字とを結合した文字列を変数名として定義する変数名定義手順を含んでいる。
【００４４】
ステップＳ１５では、全ての変数名を検索したか否かを判定する。ＣＰＵ１３は、ステップＳ１０で選定した処理がアクセスする全ての変数名を検索したか否かを判定し、検索したと判定した場合はステップＳ１６へ進み、検索したと判定しなかった場合はステップＳ１１へ戻る。
【００４５】
ステップＳ１６では、全てのファイルから抽出したか否かを判定する。ＣＰＵ１３は、シングルプログラムの全てのファイルから処理を抽出したか否かを判定し、抽出したと判定した場合はステップＳ１７へ進み、抽出したと判定しなかった場合はステップＳ１０へ戻る。
【００４６】
ステップＳ１７では、並列プログラムを生成する（生成部）。ＣＰＵ１３は、ステップＳ１４で変数名が定義された定義済変数を含む変数をシングルプログラムから抽出して、変数にアクセスする複数の処理の依存関係の解析、処理順序の抽出などを行い、複数の処理の依存関係が保たれた並列プログラムを生成する。つまり、ＣＰＵ１３は、ステップＳ１４で変数名が定義された定義済変数と、ステップＳ１３で変数名が抽出された変数とにアクセスする複数の処理の依存関係の解析などを行い、複数の処理の依存関係が保たれた並列プログラム２１ａ１を生成する。つまり、ＣＰＵ１３は、複数の処理を第１コア２１ｃと第２コア２１ｄのいずれかに配置する。このステップＳ１７は、特開２０１５−１８０７号公報を参照して適用できる。なお、ステップＳ１３で変数名が抽出された変数は、シングルプログラムに含まれる配列変数ではない変数とみなすことができる。
【００４７】
ＣＰＵ１３は、自動並列化コンパイラ１を実行することで並列プログラム２１ａ１を生成する。このため、自動並列化コンパイラ１は、生成手順を含んでいると言える。つまり、自動並列化コンパイラ１は、定義済変数を含む変数をシングルプログラムから抽出して、変数にアクセスする複数の処理の依存関係の解析などを行い、複数の処理の依存関係が保たれた並列プログラム２１ａ１を生成する生成手順を含んでいる。
【００４８】
このように、本実施形態では、コンピュータ１０が、ステップＳ１０〜Ｓ１７を実行することで、図５や図６に示す並列プログラム２１ａ１を生成する。しかしながら、本開示はこれに限定されない。作業者などが、特開２０１５−１８０７号公報に記載された並列化方法に加えて、ステップＳ１０〜Ｓ１７を行うことで、並列プログラム２１ａ１を生成してもよい。
【００４９】
ここで、コンピュータ１０と比較例の並列化ツールとを対比しつつ、本開示の効果を説明する。比較例の並列化ツールは、配列変数を一つの変数として扱う点がコンピュータ１０と異なる。
【００５０】
比較例の並列化ツールでは、シングルプログラムから変数名を抽出および定義し、依存関係の解析などを行い、第１コア２１ｃと第２コア２１ｄに配置する。つまり、比較例の並列化ツールは、図３のステップＳ１２、Ｓ１４を行うことなく、ステップＳ１０、Ｓ１１、Ｓ１３、Ｓ１５〜Ｓ１７を行うことになる。
【００５１】
よって比較例の並列化ツールは、依存関係が無い配列要素間であっても依存関係が有るものとして扱うことになる。このため、比較例の並列化ツールは、図４に示す第１処理ＭＴ１〜第５処理ＭＴ５を並列化した場合、図１２の第１パターンや第２パターンのような並列プログラムを作成することになる。
【００５２】
第１パターンは、第１処理ＭＴ１、第３処理ＭＴ３、第５処理ＭＴ５が第１コア２１ｃに配置され、第２処理ＭＴ２、第４処理ＭＴ４が第２コア２１ｄに配置されている。さらに、第１パターンは、四つの同期処理Ｗ１０〜Ｗ１３と依存関係を保つための二つの空きＥ１０、Ｅ１１が第１コア２１ｃに配置され、四つの同期処理Ｗ１４〜Ｗ１７と依存関係を保つための三つの空きＥ１２〜Ｅ１４が第２コア２１ｄに配置されている。
【００５３】
第１パターンは、図５に示す並列プログラム２１ａ１と比べると、同期処理と依存関係を保つための空きが多くなっている。このように、比較例の並列化ツールは、実際には無い依存関係を保つために、同期処理と空きが多くなる。
【００５４】
一方、第２パターンは、第１処理ＭＴ１〜第５処理ＭＴ５の全てが第１コア２１ｃに配置されている。さらに、第２パターンは、一つの空きＥ１５が第１コア２１ｃに配置され、一つの空きＥ１７と依存関係を保つための空きＥ１６が第２コア２１ｄに配置されている。
【００５５】
第２パターンは、図６に示す並列プログラム２１ａ１と比べると、依存関係を保つための空きが多く（長く）なっている。このように、比較例の並列化ツールは、実際には無い依存関係を保つために、空きが多くなる。
【００５６】
これに対して、コンピュータ１０は、シングルプログラムから配列変数Ｖ１を特定する。そして、コンピュータ１０は、この配列変数Ｖ１における配列要素Ｖ１１〜Ｖ１４ごとに、配列変数Ｖ１の名称である配列変数名と、配列要素の番号である要素番号と、配列変数文字とを結合した文字列を変数名として定義する。このため、コンピュータ１０は、配列変数Ｖ１を一つの変数として扱うのではなく、配列変数Ｖ１に含まれる複数の配列要素Ｖ１１〜Ｖ１４のそれぞれを一つの変数として扱うことができる。つまり、コンピュータ１０は、各配列要素Ｖ１１〜Ｖ１４を個別の変数として扱うことができる。
【００５７】
そして、コンピュータ１０は、このように定義した定義済変数を含む変数をシングルプログラムから抽出する。また、コンピュータ１０は、この変数にアクセスする複数の処理ＭＴ１〜ＭＴ５などの依存関係の解析などを行い、複数の処理ＭＴ１〜ＭＴ５の依存関係が保たれた並列プログラム２１ａ１を生成する。ことのとき、コンピュータ１０は、複数の配列要素Ｖ１１〜Ｖ１４のそれぞれを一つの変数として扱って依存関係の解析などを行うので、依存関係がないにもかかわらず、依存関係があるとすることを抑制できる。よって、コンピュータ１０は、同期処理や依存関係を保つための空きが必要以上に多くなることを抑制でき、適切に並列プログラム２１ａ１を生成できる。つまり、コンピュータ１０は、上記のように比較例の並列化ツールよりも、同期処理や依存関係を保つための空きが少ない、並列プログラム２１ａ１を生成できる。
【００５８】
コンピュータ１０は、自動並列化コンパイラ１を実行することで、同期処理や依存関係を保つための空きが必要以上に多くなることを抑制でき、適切に並列プログラム２１ａ１を生成できる。よって、自動並列化コンパイラ１は、コンピュータ１０と同様に、同期処理や依存関係を保つための空きが必要以上に多くなることを抑制でき、適切に並列プログラム２１ａ１を生成できる。
【００５９】
また、車載装置２０におけるシングルプログラムでは、配列要素毎に依存関係がない場合が多数存在する。例えば、４気筒エンジンを駆動制御するためのシングルプログラムは、配列要素を四つ用意して、各配列要素を各気筒特有の制御用データとして使う。このような場合、コンピュータ１０および自動並列化コンパイラ１は有効である。
【００６０】
さらに、車載装置２０は、コンピュータ１０で生成された並列プログラム２１ａ１を備えている。つまり、車載装置２０は、同期処理や依存関係を保つための空きが必要以上に多くなることが抑制され、適切に生成された並列プログラム２１ａ１を備えている。そして、車載装置２０は、このような並列プログラム２１ａ１をマルチコアプロセッサ２１の各コア２１ｃ、２１ｄが実行する。このため、車載装置２０は、同期処理の分だけ処理負荷が増加したり、依存関係を保つための空きの分だけ処理効率が低下することを抑制でき、複数のコア２１ｃ、２１ｄで適切に処理を行なうことができる。
【００６１】
以上、本開示の好ましい実施形態について説明した。しかしながら、本開示は、上記実施形態に何ら制限されることはなく、本開示の趣旨を逸脱しない範囲において、種々の変形が可能である。以下に、本開示のその他の形態として、第２実施形態〜第４実施形態に関して説明する。上記実施形態および第２実施形態〜第４実施形態は、それぞれ単独で実施することも可能であるが、適宜組み合わせて実施することも可能である。本開示は、実施形態において示された組み合わせに限定されることなく、種々の組み合わせによって実施可能である。
【００６２】
（第２実施形態）
図７を用いて、第２実施形態に関して説明する。第２実施形態では、主に、上記実施形態と異なる部分に関して説明する。また、本変形例は、自動並列化コンパイラ１が、配列変数であることを示す文字を指定する文字指定手順を含んでいる点が上記実施形態と異なる。同様に、本変形例は、コンピュータ１０が、配列変数であることを示す文字を指定する文字指定部を含んでいる点が上記実施形態と異なる。なお、本実施形態では、上記実施形態と同様の処理に同じステップ番号を付与しているため、上記実施形態を参照して適用できる。
【００６３】
図７を用いて、コンピュータ１０の処理動作に関して説明する。ＣＰＵ１３は、例えば入力装置１６によって挿入処理の実行指示がなされた場合に、図７に示すフローチャートを実行する。ＣＰＵ１３は、自動並列化コンパイラ１を実行することで、シングルプログラムから並列プログラム２１ａ１を生成する。ＣＰＵ１３は、特開２０１５−１８０７号公報に記載された手順に従って並列プログラム２１ａ１を生成する際に、下記のステップＳ２０、Ｓ１０〜Ｓ１７を実行する。また、ＣＰＵ１３は、ステップＳ１０の前にステップＳ２０を実行する。
【００６４】
ステップＳ２０では、配列変数であることを示す文字を指定する（文字指定部）。ＣＰＵ１３は、例えばソフト設計者などが指定した、配列変数であることを示す文字を指定する。この文字は、シングルプログラムの記述ルールに則った文字でなく、ソフト設計者などが任意で指定した文字である。
【００６５】
ＣＰＵ１３は、自動並列化コンパイラ１を実行することで配列変数であることを示す文字を指定する。このため、自動並列化コンパイラ１は、文字指定手順を含んでいると言える。つまり、自動並列化コンパイラ１は、配列変数であることを示す文字を指定する文字指定手順を含んでいる。
【００６６】
このため、ＣＰＵ１３は、ステップＳ１２において、ステップＳ２０で指定された文字を用いて、配列変数文字の有無を判定する。しかしながら、ＣＰＵ１３は、ステップＳ２０で指定された文字に加えて、上記実施形態と同様に、シングルプログラムの記述ルールに準拠した配列変数であることを示す文字があるか否かを判定してもよい。
【００６７】
コンピュータ１０および自動並列化コンパイラ１は、上記実施形態と同様の効果を奏することができる。さらに、コンピュータ１０および自動並列化コンパイラ１は、配列変数であることを示す文字を指定できるため、使用するプログラム言語が変更になり、配列変数である事を示す文字が変わったとしても並列プログラム２１ａ１を生成できる。よって、コンピュータ１０および自動並列化コンパイラ１は、プログラム言語の変更によるソフト開発プロセスの改定およびツールの再購入の抑制や、バージョンアップの手間を削減することができる。これに伴って、コンピュータ１０および自動並列化コンパイラ１は、コストの削減が期待できる。
【００６８】
車載装置２０は、上記実施形態と同様に、コンピュータ１０で生成された並列プログラム２１ａ１を備えている。よって、車載装置２０は、上記実施形態と同様の効果を奏することができる。
【００６９】
（第３実施形態）
図８、図９を用いて、第３実施形態に関して説明する。第３実施形態では、主に、上記実施形態と異なる部分に関して説明する。また、本変形例は、自動並列化コンパイラ１が、要素番号特定手順を含んでいる点が上記実施形態と異なる。同様に、本変形例は、コンピュータ１０が、要素番号特定部を含んでいる点が上記実施形態と異なる。なお、本実施形態では、上記実施形態と同様の処理に同じステップ番号を付与しているため、上記実施形態を参照して適用できる。
【００７０】
図９に、一例として、Ｃ言語で記述されたシングルプログラムの一部（プログラムコード例）を示す。シングルプログラムは、例えばＡｒｒａｙ［０］〜Ａｒｒａｙ［３］に０を代入したい場合、汎用性向上のためにＡｒｒａｙ［ｉｎｄｅｘ］と記述される場合がある。このように、シングルプログラムは、配列変数文字の後、例えば配列要素番号に該当する箇所に、配列変数とは異なる別変数名が用いられることがある。この場合、配列変数名の抽出結果は、Ａｒｒａｙ［ｉｎｄｅｘ］となる。
【００７１】
そこで、コンピュータ１０（ＣＰＵ１３）は、ステップＳ１２でＹＥＳ判定した場合、ステップＳ３０に進む。ステップＳ３０では、配列変数文字の後に変数名が指定されているか否かを判定する（要素番号特定部）。つまり、ＣＰＵ１３は、ステップＳ１２で特定された配列変数における配列変数文字の後に、配列変数とは異なる別変数名が用いられているか否かを判定する。そして、ＣＰＵ１３は、指定されていると判定した場合はステップＳ３１へ進み、指定されていると判定しなかった場合はステップＳ１４へ進む。
【００７２】
ステップＳ３１では、ＣＰＵ１３は、配列変数文字の後の変数名を全ファイルに対して検索およびコード解析を行い、要素番号を特定する（要素番号特定部）。つまり、ＣＰＵ１３は、別変数名が取りうる値をシングルプログラムから解析して要素番号を特定する。図９の例では、要素番号として０、１、２、３を特定することになる。このため、ＣＰＵ１３は、ステップＳ３１を経てステップＳ１４へ進んだ場合、ステップＳ３１で特定された要素番号を用いて変数名を定義する（変数名定義部）。
【００７３】
ＣＰＵ１３は、自動並列化コンパイラ１を実行することで、上記のように要素番号を特定する。このため、自動並列化コンパイラ１は、要素番号特定手順を含んでいると言える。つまり、自動並列化コンパイラ１は、ステップＳ１２で特定された配列変数における配列変数文字の後に別変数名が用いられていた場合、別変数名が取りうる値をシングルプログラムから解析して要素番号を特定する要素番号特定手順を含んでいる。
【００７４】
このため、コンピュータ１０および自動並列化コンパイラ１は、配列変数文字の後に別変数名が記載されていた場合であっても、各配列要素を個別の変数として扱うことができる。よって、コンピュータ１０および自動並列化コンパイラ１は、配列変数文字の後に別変数名が記載されていた場合であっても、第１実施形態と同様の効果を奏することができる。
【００７５】
車載装置２０は、第１実施形態と同様に、コンピュータ１０で生成された並列プログラム２１ａ１を備えている。よって、車載装置２０は、第１実施形態と同様の効果を奏することができる。
【００７６】
なお、第３実施形態は、第２実施形態と組み合わせて実施することもできる。すなわち、コンピュータ１０は、ステップＳ１０の前にステップＳ２０を実施してもよい。また、自動並列化コンパイラ１は、配列変数であることを示す文字を指定する文字指定手順を含んでいてもよい。
【００７７】
（第４実施形態）
図１０、図１１を用いて、第４実施形態に関して説明する。第４実施形態では、主に、上記実施形態と異なる部分に関して説明する。また、本変形例は、自動並列化コンパイラ１が、要素番号特定手順を含んでいる点が上記実施形態と異なる。同様に、本変形例は、コンピュータ１０が、要素番号特定部を含んでいる点が上記実施形態と異なる。なお、本実施形態では、上記実施形態と同様の処理に同じステップ番号を付与しているため、上記実施形態を参照して適用できる。
【００７８】
図１１に、一例として、Ｃ言語で記述されたシングルプログラムの一部（プログラムコード例）を示す。シングルプログラムは、Ａｒｒａｙ［０］〜［３］に０を代入、またはＡｒｒａｙ［０］〜［２］に０を代入したい場合、汎用性向上やＲＯＭ容量削減のために、図１１のように記述される場合がある。このように、シングルプログラムは、配列変数文字の後、例えば配列要素番号に該当する箇所に、配列変数とは異なる別変数名が用いられることがある。この場合、配列変数名の抽出結果は、Ａｒｒａｙ［ｄａｔａ１］となる。なお、この例のＦｕｎｃＡでは、Ａｒｒａｙ［０］〜［３］に０を代入する。一方、ＦｕｎｃＢでは、Ａｒｒａｙ［０］〜［２］に０を代入する。
【００７９】
このように、図１１に示すプログラムコード例は、図９に示すプログラムコード例よりも複雑化していると言える。このため、上記第３実施形態では、要素番号を特定するためのコード解析に多くの時間を要する可能性がある。
【００８０】
そこで、コンピュータ１０は、シングルプログラムにおける処理がアクセスする配列要素を含む要素情報リストを備えておく。要素情報リストは、ＦｕｎｃＡの場合、Ａｒｒａｙ［０］、Ａｒｒａｙ［１］、Ａｒｒａｙ［２］、Ａｒｒａｙ［３］が記載されており、ＦｕｎｃＢの場合、Ａｒｒａｙ［０］、Ａｒｒａｙ［１］、Ａｒｒａｙ［２］が記載されている。
【００８１】
そして、コンピュータ１０（ＣＰＵ１３）は、ステップＳ１２でＹＥＳ判定した場合、ステップＳ４０に進む。ステップＳ４０では、ステップＳ３０と同様に、配列変数文字の後に変数名が指定されているか否かを判定する（要素番号特定部）。
【００８２】
ＣＰＵ１３は、ステップＳ４１において、配列変数の要素情報リストを検索し、要素番号を特定する（要素番号特定部）。つまり、ＣＰＵ１３は、別変数名でアクセスする配列要素を要素情報リストから検索し、要素番号を特定する。図１１の例では、ＦｕｎｃＡの場合、要素番号として０、１、２、３を特定することになり、ＦｕｎｃＢの場合、要素番号として０、１、２を特定することになる。このため、ＣＰＵ１３は、ステップＳ４１を経てステップＳ１４へ進んだ場合、ステップＳ４１で特定された要素番号を用いて変数名を定義する（変数名定義部）。
【００８３】
ＣＰＵ１３は、自動並列化コンパイラ１を実行することで、上記のように要素番号を特定する。このため、自動並列化コンパイラ１は、要素番号特定手順を含んでいると言える。つまり、自動並列化コンパイラ１は、ステップＳ１２で特定された配列変数における配列変数文字の後に別変数名が用いられていた場合、別変数名でアクセスする配列要素を要素情報リストから検索し、要素番号を特定する要素番号特定手順を含んでいる。
【００８４】
このため、コンピュータ１０および自動並列化コンパイラ１は、第１実施形態および第３実施形態と同様の効果を奏することができる。さらに、コンピュータ１０および自動並列化コンパイラ１は、要素情報リストを検索して要素番号を特定するため、第３実施形態よりも短時間で要素番号を特定できる。
【００８５】
車載装置２０は、第１実施形態と同様に、コンピュータ１０で生成された並列プログラム２１ａ１を備えている。よって、車載装置２０は、第１実施形態と同様の効果を奏することができる。
【００８６】
なお、第４実施形態は、第２実施形態と組み合わせて実施することもできる。すなわち、コンピュータ１０は、ステップＳ１０の前にステップＳ２０を実施してもよい。また、自動並列化コンパイラ１は、配列変数であることを示す文字を指定する文字指定手順を含んでいてもよい。
【符号の説明】
【００８７】
１…自動並列化コンパイラ、１０…コンピュータ、１１…ディスプレイ、１２…ＨＤＤ、１３…ＣＰＵ、１４…ＲＯＭ、１５…ＲＡＭ、１６…入力装置、１７…読取部、１８…記憶媒体、２０…車載装置、２１…マルチコアプロセッサ、２１ａ…ＲＯＭ、２１ａ１…並列プログラム、２１ｂ…ＲＡＭ、２１ｃ…第１コア、２１ｄ…第２コア、２２…通信部、２３…センサ部、２４…入出力ポート
【図１】
2019049771.tif 000003
【図２】
2019049771.tif 000004
【図３】
2019049771.tif 000005
【図４】
2019049771.tif 000006
【図５】
2019049771.tif 000007
【図６】
2019049771.tif 000008
【図７】
2019049771.tif 000009
【図８】
2019049771.tif 000010
【図９】
2019049771.tif 000011
【図１０】
2019049771.tif 000012
【図１１】
2019049771.tif 000013
【図１２】
2019049771.tif 000014