(57)【要約】【課題】並列化される処理単位に割り当てるべき処理性能をＯＳまたはスケジューラに指示する情報（例えば相対優先度）を付加する作業を効率化するプログラム変換装置を提供する。【解決手段】本発明のプログラム変換装置は、目的プログラム２０１の全体または一部に対する要求性能を示す要求情報１０２を受け付ける要求情報入力部２と、並列化可能な複数の処理単位のうち少なくとも一つの処理量を算出し、要求情報１０２に示される要求性能を満たすように、前記複数の処理単位に分割する分割部３と、分割された処理単位のうち少なくとも一つに対する割り当てるべき処理性能をプロセッサに指示する指示情報ファイル２０４を生成する指示情報出力部４とを備える。【選択図】図１
2009169862.tif 000002
【特許請求の範囲】
【請求項１】
入力プログラムを目的プログラムに変換するプログラム変換装置であって、
前記入力プログラムの少なくとも一部を並列化可能な複数の処理単位に分割する分割手段と、
前記複数の処理単位のうち少なくとも一つに対して割り当てるべき処理性能をプロセッサに指示する指示情報を生成する生成手段と
を備えることを特徴とするプログラム変換装置。
【請求項２】
前記分割手段は、さらに、前記複数の処理単位のうち少なくとも一つの処理量を算出し、
前記生成手段は、前記分割手段により算出された処理量に従って前記指示情報を生成する
ことを特徴とする請求項１記載のプログラム変換装置。
【請求項３】
前記プログラム変換装置は、さらに、目的プログラムの全体または一部に対する要求性能を示す要求情報を受け付ける受付手段を備え、
前記分割手段は、さらに、前記要求情報に示される要求性能を満たすように、前記複数の処理単位に分割する
ことを特徴とする請求項１記載のプログラム変換装置。
【請求項４】
前記分割手段は、
並列化可能な複数の分割箇所を決定する決定部と、
前記複数の分割箇所のうち少なくとも１つの分割箇所の処理量を算出する算出部と、
算出された前記処理量が前記要求情報に示される要求性能を満たすか否か判定する判定部と、
前記判定部によって満たすと判定されたとき、前記複数の分割箇所に従って前記入力プログラムの少なくとも一部を、複数の処理単位に分割する分割処理部と
を備え、
前記決定部は、前記判定部によって前記処理量が前記要求性能を満たさないと判定されたとき、前記分割箇所を変更する
ことを特徴とする請求項３記載のプログラム変換装置。
【請求項５】
前記分割手段は、複数の処理単位のために生じるオーバヘッドを含めた処理量を算出することを特徴とする請求項２または３記載のプログラム変換装置。
【請求項６】
前記分割手段は、前記入力プログラムに付加されたプロファイル情報に基づいて前記処理量を算出することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項７】
前記分割手段は、前記入力プログラムに付加されたヒント情報に基づいて前記処理量を算出することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項８】
前記ヒント情報は、前記複数の処理単位の全部または一部の処理にかかるサイクル数に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項９】
前記ヒント情報は、前記目的プログラム全体の処理量に対する、前記複数の処理単位の全部または一部の処理量の割合に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項１０】
前記ヒント情報は、前記目的プログラムの実行時に値が決定する前記入力プログラム内の変数の値に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項１１】
前記決定部は、前記分割箇所を変更できないとき、その旨を示すメッセージを出力することを特徴とする請求項４に記載のプログラム変換装置。
【請求項１２】
前記指示情報は、前記複数の処理単位の全部または一部の処理にかかるサイクル数に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項１３】
前記指示情報は、前記複数の処理単位の全部または一部の処理にかかる時間に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項１４】
前記指示情報は、全体の処理量に対する、前記複数の処理単位の全部または一部の処理量の割合に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項１５】
前記指示情報は、前記複数の処理単位の全部または一部の優先度に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項１６】
前記指示情報は、前記複数の処理単位の全部または一部に割り当てるべき処理量に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項１７】
前記生成手段は、前記指示情報をファイルとして出力することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項１８】
前記生成手段は、前記指示情報を前記目的プログラムの一部分として出力することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項１９】
前記要求情報は、二つ以上の処理単位に対する性能要求であることを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項２０】
前記要求情報は、前記目的プログラムの全体または一部の処理にかかるサイクル数の上限値に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項２１】
前記要求情報は、前記目的プログラムの全体または一部の処理にかかる時間の上限値に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項２２】
前記要求情報は、前記目的プログラムの全体または一部の処理の命令数の上限値に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項２３】
前記要求情報は、前記目的プログラムの全体または一部の処理のコードサイズの上限値に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項２４】
前記要求情報は、前記複数の処理単位の全部または一部に割り当てるべき処理性能の割合の上限値に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項２５】
前記要求情報は、前記目的プログラムの全体または一部で使用するハードウェア資源の使用量の上限値に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項２６】
前記要求情報は、前記目的プログラムの全体または一部の処理フローを制御する情報に関することを特徴とする請求項２から５の何れかに記載のプログラム変換装置。
【請求項２７】
入力プログラムを目的プログラムに変換するプログラム変換方法であって、
前記入力プログラムの少なくとも一部を、並列化可能な複数の処理単位に分割する分割ステップと、
前記複数の処理単位のうち少なくとも一つに対する割り当てるべき処理性能をプロセッサに指示する指示情報を生成する生成ステップと
を有することを特徴とするプログラム変換方法。
【請求項２８】
請求項２７に記載のプログラム変換方法の各ステップをコンピュータに実行させることを特徴とするコンピュータ読み取り可能なプログラム。
【請求項２９】
請求項２８に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｃ言語やアセンブリ言語で記述された入力プログラムを機械語の目的プログラムに変換するプログラム変換装置及び方法に関し、特に、並列化機能を有し、並列化により分割されるスレッド等の処理単位に対して自動的に性能を確保できる形でプログラムを変換することを可能とするプログラム変換装置、方法、プログラムおよび記録媒体に関する。
【背景技術】
【０００２】
従来の並列化コンパイラは、入力プログラム内に明示的に指定された並列実行可能部分を複数の処理単位に分割するか、自動的に並列実行可能部分を検出して複数の処理単位に分割する。これらは並列化による処理速度の向上を目的としたものである。
【０００３】
メディア処理の実行環境では、処理性能の保証が重要とされる。処理性能の保証とは、一定時間内にあるタスクが完了することを保証することである。処理性能を保証するために、プログラマはタスクに相対優先度を設定する。相対優先度が設定されたタスクは、性能保証タスクとして、オペレーティングシステムもしくはハードウェアのスケジューラによって、相対優先度に応じた時間割り当てが行なわれる。これにより、性能保証タスクは他のタスクに影響を受けることなく、割り当てられた時間は実行環境を優先的に使用することができるため、処理性能が保証される。
【０００４】
メディア処理の実行環境における並列化では、処理速度の向上よりも処理性能の保証が重要とされる。性能保証タスクに対して並列化を行なうと、複数の処理単位に分割されるため、処理性能が保証できなくなる。そのため、分割されるそれぞれの処理単位に対して、相対優先度を付加しなければならない。
【０００５】
これに対して、従来は、例えば特許文献１のようにプログラムの指定区間に対して相対優先度を与えることにより、該当区間を自動的にタスクに分割して相対優先度を付加する方法があった。
【特許文献１】特開２００６−１２６９７７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
従来の手法では、プログラマが並列化によって分割されるそれぞれの処理単位に対して、相対優先度を付加する。相対優先度は目的プログラムがプログラマの要求する処理性能を保証できる値でなければならない。そのため、処理単位に対して相対優先度を付加するには、各処理単位の処理量を求め、その処理量に応じて相対優先度を付加しなければならない。しかし、並列化によって分割された処理単位には、並列化コンパイラによって並列に実行するために必要な処理が追加される。この追加された処理にかかる処理量を並列化のオーバヘッドと呼ぶ。処理単位の処理量を求める際は、この並列化のオーバヘッドも考慮しなければならない。そのため、ソースコードから各処理単位の処理量を求めるのは大変困難となっており、プログラマはトライアンドエラーを繰り返して、要求する処理性能を保証できる相対優先度を求めるしか方法がなく、大変な時間を要する。その上、前記方法で求めた相対優先度は、処理性能を最低限保証する相対優先度であり、スケジューラが余剰な時間を割り当ててしまう、精度の低い相対優先度である可能性が高い。
【０００７】
本発明の目的は、並列化される処理単位に割り当てるべき処理性能をＯＳまたはスケジューラに指示する情報（例えば相対優先度）を付加する作業を効率化するプログラム変換装置方法、プログラムおよび記録媒体を提供することを目的とする。
【０００８】
また、本発明の他の目的は、並列化される処理単位に割り当てるべき処理性能をＯＳまたはスケジューラに指示する情報の精度を向上させるプログラム変換装置方法、プログラムおよび記録媒体を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記目的を達成するために、本発明に係るプログラム変換装置は、入力プログラムを目的プログラムに変換するプログラム変換装置であって、前記入力プログラムの少なくとも一部を並列化可能な複数の処理単位に分割する分割手段と、前記複数の処理単位のうち少なくとも一つに対して割り当てるべき処理性能をプロセッサに指示する指示情報を生成する生成手段とを備えることを特徴とする。
【００１０】
この構成によれば、前記入力プログラムを変換する際に、並列化される処理単位に割り当てるべき処理性能をＯＳまたはスケジューラに指示する指示情報（例えば相対優先度）を付加する作業の効率を向上させることができる。
【００１１】
ここで、前記分割手段は、さらに、前記複数の処理単位のうち少なくとも一つの処理量を算出し、前記生成手段は、前記分割手段により算出された処理量に従って前記指示情報を生成するようにしてもよい。
【００１２】
この構成によれば、分割手段に算出された処理量に従って前記指示情報を生成でき、処理単位に対する指示情報を決定する効率が向上する。
【００１３】
ここで、前記プログラム変換装置は、さらに、目的プログラムの全体または一部に対する要求性能を示す要求情報を受け付ける受付手段を備え、前記分割手段は、さらに、前記要求情報に示される要求性能を満たすように、前記複数の処理単位に分割するようにしてもよい。
【００１４】
この構成によれば、プログラマが要求情報を作成しておくだけで、前記目的プログラムの全体または一部に対するプログラマの要求を満たす指示情報を生成でき、処理単位に対する処理性能を設定する作業の効率化と指示情報の精度を向上させることができる。
【００１５】
ここで、前記分割手段は、並列化可能な複数の分割箇所を決定する決定部と、前記複数の分割箇所のうち少なくとも１つの分割箇所の処理量を算出する算出部と、算出された前記処理量が前記要求情報に示される要求性能を満たすか否か判定する判定部と、前記判定部によって満たすと判定されたとき、前記複数の分割箇所に従って前記入力プログラムの少なくとも一部を、複数の処理単位に分割する分割処理部とを備え、前記決定部は、前記判定部によって前記処理量が前記要求性能を満たさないと判定されたとき、前記分割箇所を変更するようにしてもよい。
【００１６】
この構成によれば、並列化される処理単位に割り当てるべき処理性能を設定するためのプログラマのトライアンドエラー作業を大幅に削減することができる。
【００１７】
ここで、前記分割手段は、複数の処理単位のために生じるオーバヘッドを含めた処理量を算出するようにしてもよい。
【００１８】
この構成によれば、前記複数の処理単位のうち、前記入力プログラムを変換する際に前記プログラム変換装置が保有する情報で処理量が決定する処理単位に対して、並列化のオーバヘッドを考慮した処理単位ごとの指示情報を生成でき、並列化される処理単位に割り当てるべき処理性能の精度が向上する。
【００１９】
ここで、前記分割手段は、前記入力プログラムに付加されたプロファイル情報に基づいて前記処理量を算出するようにしてもよい。
【００２０】
これによって、前記入力プログラムを変換する際に前記プログラム変換装置が保有していない情報によって処理量が決定する処理単位に対しても、並列化のオーバヘッドを考慮した処理単位ごとの指示情報を生成でき、算出される処理量の精度が向上する。
【００２１】
ここで、前記分割手段は、前記入力プログラムに付加されたヒント情報に基づいて前記処理量を算出するようにしてもよい。
【００２２】
ここで、前記ヒント情報は、前記複数の処理単位の全部または一部の処理にかかるサイクル数に関する情報であってもよい。
【００２３】
ここで、前記ヒント情報は、前記目的プログラム全体の処理量に対する、前記複数の処理単位の全部または一部の処理量の割合に関連してもよい。
【００２４】
ここで、前記ヒント情報は、前記目的プログラムの実行時に値が決定する前記入力プログラム内の変数の値に関する情報であってもよい。
【００２５】
これによって、ヒント情報が付加された処理単位の処理量を求める時間を短縮でき、変換速度が向上する。さらに、前記入力プログラムを変換する際に前記プログラム変換装置が保有していない情報によって処理量が決定する処理単位に対してヒント情報が付加された場合は、指示情報が出力できるようになり、処理単位に対する相対優先度を決定する効率と相対優先度の精度が向上する。
【００２６】
ここで、前記決定部は、前記分割箇所を変更できないとき、その旨を示すメッセージを出力してもよい。
【００２７】
これによって、目的プログラムを実行することなく、期待する処理性能を満たさないことが確認でき、処理単位に対して指示情報を設定する作業効率が向上する。
【００２８】
ここで、前記指示情報は、前記複数の処理単位の全部または一部の処理にかかるサイクル数に関する情報であってもよい。
【００２９】
ここで、前記指示情報は、前記複数の処理単位の全部または一部の処理にかかる時間に関連してもよい。
【００３０】
ここで、前記指示情報は、全体の処理量に対する、前記複数の処理単位の全部または一部の処理量の割合に関する情報であってもよい。
【００３１】
ここで、前記指示情報は、前記複数の処理単位の全部または一部の優先度に関連してもよい。
【００３２】
ここで、前記指示情報は、前記複数の処理単位の全部または一部に割り当てるべき処理量に関する情報であってもよい。
【００３３】
これによって、指示情報の精度を向上させ、ひいては処理単位に割り当てるべき処理性能の精度を向上させることができる。
【００３４】
ここで、前記生成手段は、前記指示情報をファイルとして出力してもよい。
これによって、プログラマはファイル中の指示情報を見ることができ、指示情報がファイルなので、プログラマによる修正を容易にする。
【００３５】
ここで、前記生成手段は、前記指示情報を前記目的プログラムの一部分として出力してもよい。
【００３６】
これによって、プログラマはプログラム中の指示情報を見ることができ、プログラマによる修正を容易にする。また、指示情報を目的プログラムにまとめて配置すればプログラマは前記目的プログラムのみを管理すればよいため、プログラムファイルの管理が容易になる。また、前記複数の処理単位の全部または一部に対する前記指示情報をそれぞれ前記目的プログラム内に分けて配置すれば、スケジューラは前記目的プログラム内の処理単位の実行時に、前記目的プログラム内を検索することなく指示情報を取得することができるため、スケジューラの処理速度が向上する。
【００３７】
ここで、前記要求情報は、二つ以上の処理単位に対する性能要求であってもよい。
ここで、前記要求情報は、前記目的プログラムの全体または一部の処理にかかるサイクル数の上限値に関する情報であってもよい。
【００３８】
これによって、処理単位に対する、要求情報が示すサイクル数を満たした相対優先度を決定する効率が向上する。
【００３９】
ここで、前記要求情報は、前記目的プログラムの全体または一部の処理にかかる時間の上限値に関する情報であってもよい。
【００４０】
これによって、処理単位に対する、要求する処理時間を満たした相対優先度を決定する効率が向上する。
【００４１】
ここで、前記要求情報は、前記目的プログラムの全体または一部の処理の命令数の上限値に関する情報であってもよい。
【００４２】
これによって、処理単位に対する、要求情報が示す命令数を満たした相対優先度を決定する効率が向上する。
【００４３】
ここで、前記要求情報は、前記目的プログラムの全体または一部の処理のコードサイズの上限値に関する情報であってもよい。
【００４４】
これによって、処理単位に対する、要求情報が示すコードサイズを満たした相対優先度を決定する効率が向上する。
【００４５】
ここで、要求情報は、前記複数の処理単位の全部または一部に割り当てるべき処理性能の割合の上限値に関する情報であってもよい。
【００４６】
これによって、目的プログラムの全体または一部の処理を情報が示す割り当て性能の範囲内で処理することを可能とする相対優先度を決定する効率が向上する。
【００４７】
ここで、前記要求情報は、前記目的プログラムの全体または一部で使用するハードウェア資源の使用量の上限値に関する情報であってもよい。
【００４８】
これによって、処理単位に対する、要求情報が示すハードウェア資源の使用量を満たした相対優先度を決定する効率が向上する。
【００４９】
ここで、前記要求情報は、前記目的プログラムの全体または一部の処理フローを制御する情報に関する情報であってもよい。
【００５０】
これによって、処理単位に対する、前記目的プログラムの全体または一部の処理フローを実行する際の処理性能を決定する効率が向上する。
【００５１】
なお、本発明は、このような特徴的な機能を有するプログラム変換装置として実現することができるだけでなく、当該プログラム変換装置に含まれる特徴的な機能をステップとするプログラム変換方法として実現したり、当該プログラム変換装置に含まれる特徴的な機能をコンピュータに実行させるコンパイラとして実現したりすることもできる。そして、そのようなコンパイラは、Compact Disc-Read Only Memory (CD-ROM)などの記録媒体やインターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
【発明の効果】
【００５２】
並列化によって分割される各処理単位の処理量に対応した指示情報を出力することにより、それぞれの処理単位に割り当てるべき処理性能を決定する作業効率と、処理単位に割り当てるべき処理性能の精度が向上する。
【発明を実施するための最良の形態】
【００５３】
以下、図面を参照しながら本発明の実施の形態に係るコンパイラシステムについて説明する。
【００５４】
図１は、本発明に係るコンパイラシステム１の構成を示すブロック図である。
コンパイラシステム１は、要求情報入力部２と、分割部３と、指示情報出力部４とにより構成される。
【００５５】
要求情報入力部２は、目的プログラム２０１の全体または一部に対する要求性能を示す要求情報１０２を受け付ける受付手段として機能する。ここで、要求情報１０２は、並列化すべき処理単位に対して割り当てるべき性能要求を示す。例えば、要求情報１０２は、目的プログラム２０１の全体または一部の処理にかかるサイクル数の上限値、目的プログラム２０１の全体または一部の処理にかかる時間の上限値、前記目的プログラムの全体または一部の処理の命令数の上限値、前記目的プログラムの全体または一部の処理のコードサイズの上限値、前記複数の処理単位の全部または一部に割り当てるべき処理性能の割合の上限値に、前記目的プログラムの全体または一部で使用するハードウェア資源の使用量の上限値、前記目的プログラムの全体または一部の処理フローを制御する情報等の１つ以上を含む。
【００５６】
分割部３は、入力プログラムの少なくとも一部を並列化可能な複数の処理単位に分割する。その際、分割部３は、並列化可能な複数の処理単位のうち少なくとも一つの処理量を算出し、要求情報１０２に示される要求性能を満たすように、前記複数の処理単位に分割する。より具体的には、分割部３は、並列化可能な複数の分割箇所を決定し、前記複数の分割箇所のうち少なくとも１つの分割箇所の処理量を算出し、算出された処理量が要求情報１０２に示される要求性能を満たすか否か判定し、満たすと判定したとき、当該複数の分割箇所に従って前記入力プログラムの少なくとも一部を、複数の処理単位に分割する。また、満たさないと判定したときは、分割箇所を変更して、再度処理量の算出から繰り返す。
【００５７】
指示情報出力部４は、前記複数の処理単位のうち少なくとも一つに対する割り当てるべき処理性能をプロセッサに指示する指示情報を生成する生成手段として機能する。ここで、指示情報は、複数の処理単位の全部または一部の処理にかかるサイクル数、複数の処理単位の全部または一部の処理にかかる時間、複数の処理単位の全部または一部の処理量の割合の少なくとも１つに関し、ＯＳまたはスケジューラによって解釈され複数の処理単位の全部または一部の処理のスケジューリングに適用される。同図では指示情報は指示情報ファイル２０４として生成される。
【００５８】
１．  要求情報入力部２
ここでは、入力プログラム１０１として、図２に示すようなＣ言語で記述されたものを例として説明する。ただし、本発明は言語や文法を規定するものではない。
【００５９】
要求情報入力部２が入力プログラムに付加された要求情報１０２を取得する過程を図３のフローを用いて説明する。要求情報１０２を取得するためには、入力プログラムの字句解析を行い、予め定められた予約語を検出する必要があるが、本発明では字句解析の方法については規定しない。ここでは、Ｃ言語のコンパイラへの指示行を示す“#pragma”を用い、要求情報と要求情報に対応する対応範囲の開始行と終端行を示す予約語を仮に“_req”、“_req_start”、“_req_end”とする。要求情報の種別を示す予約語を仮に、処理にかかるサイクル数の上限値を“cycle”、処理にかかる時間(単位はms)の上限値を“time”、処理の命令数の上限値を“instruction”、処理のコードサイズ(単位はbit)の上限値を“size”、システムの使用可能性能を１としたときの要求情報の対応範囲内の処理単位に割り当てる性能の上限値を“ratio”、使用するプロセッサの使用量の上限値を“processor”、使用するメモリの使用量(byte)の上限値を“memory”、処理フローを制御する情報を“path”の８種類とする。
【００６０】
ステップb001は、“#pragma _req(種別, 数値)”の行を検出し、種別と数値を要求情報として取得する。ステップb001は、“#pragma _req_start”を取得するまで繰り返す。
【００６１】
ステップb002は、“#pragma _req_start”から“#pragma _req_end”までの区間を要求情報に対応する対応範囲として取得する。
【００６２】
次にステップb003は、ステップb001にて取得した要求情報とステップb002にて取得した対応範囲を図４に示す要求情報リストに登録する。この登録時に、要求情報の種別に対応した図５に示す変換式を適用し、後に説明する分割部で使用する情報へ変換する。変換対象となる種別は、“time”、“instruction”の２種である。それぞれの変換式について説明する。“time”は1000で割り、単位を秒に変換した後、実行環境のプロセッサ周波数“frequency”をかけ、“cycle”に変換する。“time”と“cycle”の両方が付加された場合は、より要求が厳しい情報を要求情報リストに登録する。“instruction”は１命令のビット長“instruction bit”をかけ、“size”に変換する。“instruction”と“size”の両方が付加された場合は、より要求が厳しい情報を要求情報リストに登録する。これらの変換を行うことにより、要求情報リストに保持する情報が減るため、コンパイラシステム１のメモリ使用量を削減できる。
【００６３】
上記、ステップb001からステップb003を入力プログラム１０１の終端行まで繰り返し、要求情報の対応範囲ごとに要求情報リストを作成する。
【００６４】
図２のものを入力した場合の動作の具体例を説明する。
ステップb001は、a002〜a004で、種別である「time」と数値である「80」を要求情報a002、種別である「ratio」と数値である「0.1」を要求情報a003、種別である「processor」と数値である「2」を要求情報a004として取得する。
【００６５】
ステップb002は、a005の“#pragma _req_start”からa007の“#pragma _req_end”で囲まれたa006の関数「para_func()」を対応範囲として取得する。
【００６６】
ステップb003は、要求情報リストの対応範囲に「para_func()」を登録する。続いて、要求情報a002、要求情報a003、要求情報a004の登録を行う。要求情報a002の種別は“time”なので、変換対象となる。そのため、“time”を1000でわり、実行環境のプロセッサ周波数“frequency”（ここでは「50MHz」とする）をかけた数値「4,000,000」を“cycle”に登録する。要求情報a003、要求情報a004は、種別が“ratio”と“processor”で変換対象でないため、それぞれ“ratio”に「0.1」、“processor”に「2」を登録する。
【００６７】
図２のものには、終端行までの間に、他に要求情報の対応範囲が無いため、これで要求情報入力部２の処理は終了する。
【００６８】
なお、上記説明では、使用するハードウェア資源としてプロセッサとメモリを例として上げたが、これは使用するハードウェア資源をプロセッサとメモリに制限するものではない。
【００６９】
なお、上記図２のものを入力した例では、要求情報を入力プログラム内に“#pragma”を用いて記載したが、要求情報とその要求情報に対応する対応範囲は要求情報リストとして、入力ファイルとは別の要求情報ファイルに記載してもよい。その場合は入力プログラムと要求情報ファイルを入力とし、入力プログラムに対しては通常の字句解析を行い、要求情報入力部は要求情報ファイルの内容を、要求情報リストに登録すればよい。このようにファイルを分けることにより、入力プログラムを書き換えずにすむため、入力ファイルの流用性が高くなる利点がある。その一方、ファイルが複数になることによる、構成管理の手間が増えるという欠点もある。
【００７０】
なお、ステップb003で要求情報リストの種別を８項目に拡張し、種別に応じた要求情報の変換を行わず、そのまま登録してもよい。その場合は、後に説明する分割部３で変換を行えばよい。ただし、要求情報リストに保持する情報が増えるため、コンパイラシステム１のメモリ使用量が増加する欠点がある。
【００７１】
なお、ステップb003で１命令のビット長が固定ではなく、可変である場合は要求情報取得時に“instruction”を“size”に変換することができない。このような場合は、要求情報リストに“instruction”の項目を追加し、要求情報の対応範囲の命令列が決定した後、“size”に変換すればよい。
【００７２】
なお、図４では要求情報リストの種別に６項目を記載しているが、この項目はコンパイラシステム１が要求情報として入力可能とする種別に応じて増減させても良い。これにより、新しく要求情報の種別が追加された場合にも柔軟に対応できる。また、種別の項目数を可変とし、入力された要求情報の種別に応じて項目を決定しても良い。これにより、入力されなかった種別の項目が必要なくなり、コンパイラシステム１のメモリ使用量を削減できる。
【００７３】
２．  分割部３
分割部３が並列実行可能部分を複数の処理単位に分割する過程を図６のフローを用いて説明する。
【００７４】
ステップe001は、入力プログラム１０１内の処理単位に分割可能な並列実行可能部分を決定する。並列実行可能部分の決定方法は、従来の並列化コンパイラと同様に入力プログラム内に明示的に指定された並列実行可能部分を検出したり、自動的に並列実行可能部分を検出したりすればよい。本発明では、並列実行可能部分の決定方法については規定しない。ステップe001では、処理単位の分割は行わず、分割はステップe006で行う。ステップe002〜e005では、分割後の処理単位を想定して処理を行う。
【００７５】
ステップe002は、ステップe001で決定した分割する処理単位ごとの処理量を求める。ここでの処理量とは、分割する処理単位の処理に必要とするサイクル数である。分割する処理単位の処理量は、分割する処理単位の理想サイクル数と並列化のオーバヘッドから求めることが可能である。理想サイクル数とは、分割する処理単位内の命令列と各命令にかかるサイクル数から求めたサイクル数である。処理単位に追加される並列実行に必要な処理は、処理単位の生成・開放、処理単位間の同期といった、あらかじめ決められた処理であるため、並列化のオーバヘッドはコンパイラシステム１の内部に必要サイクル数を保持しておき、分割する処理単位の処理量を求める際に加算すればよい。
【００７６】
分割する処理単位の制御の流れが、目的プログラム２０１の実行時に値が決定する変数に依存する場合、上記の方法では処理量を求めることができない。このような場合は、目的プログラム２０１のプロファイル情報を利用するか、入力プログラム１０１に付加されたヒント情報を利用することで、処理量を求めることができる。
【００７７】
まず、プロファイル情報を利用する方法について説明する。プロファイル情報とは、目的プログラムを実際の実行環境もしくはシミュレータ上で実行して得られる情報である。本発明では、プロファイル情報の取得方法については規定しない。プロファイル情報が利用できる場合、ステップe002は、分割する処理単位ごとの処理量をプロファイル情報から取得すればよい。
【００７８】
次にヒント情報利用する方法について説明する。ヒント情報とは、目的プログラムを実行させることなく、プログラマが把握している情報である。本発明では、ヒント情報の記載方法については規定しないが、Ｃ言語のコンパイラへの指示行を示す“#pragma”を用いる方法がある。ヒント情報として分割する処理単位の一部または全部の処理に必要なサイクル数の場合は、サイクル数が記載されていない箇所の理想サイクル数を求めて、分割する処理単位の処理量を求める。ヒント情報として目的プログラム２０１に対する分割する処理単位の一部または全部の処理量の割合の場合は、分割する処理単位の一部または全部の処理量から目的プログラム２０１の処理量を求める。ヒント情報として実行時に値が決定する分割する処理単位内の変数の値の場合は、この値を用いて分割する処理単位の理想サイクル数を求める。
【００７９】
ステップe003は、処理単位分割後の目的プログラム２０１が、入力プログラム１０１に付加された要求情報１０２を満たすかどうかを判定する。この判定方法について説明する。
【００８０】
まず、分割する処理単位内の処理の一部もしくは全部が要求情報リストに登録されている対応範囲に含まれるかどうかを判定する。含まれる場合は要求情報の種別ごとに要求を満たすかどうかを判定する。要求情報の種別が“cycle”の場合は、分割する処理単位内の処理量から、要求情報を満たすかどうかを判定する。要求情報の種別が“size”の場合は、分割する処理単位内の命令数と１命令のビット長からサイズを求め、要求情報を満たすかどうかを判定する。要求情報の種別が“ratio”の場合は、分割する処理単位の処理量が処理単位に対する割り当て性能の範囲内で処理可能かを判定する。要求情報の種別が“processor”の場合は、分割する処理単位の数と“processor”の値を比較し、要求情報を満たすかどうかを判定する。要求情報の種別が“memory”の場合は、分割する処理単位内で使用するメモリ使用量を求め、要求情報を満たすかどうかを判定する。要求情報の種別が“path”の場合は、“path”に指定された処理フローの場合に他の要求情報を満たすかどうかを判定する。以上の判定をすべての分割する処理単位と要求情報リストに対して繰り返す。
【００８１】
ステップe003で、要求情報を満たす場合は、ステップe006を実施する。要求情報を満たさない場合は、ステップe004を実施する。
【００８２】
ステップe004は、満たさなかった要求情報に応じて、分割方法を変更する。満たさなかった要求情報の種別が“cycle”の場合、並列に実行する処理単位の数を増加させることにより、処理単位あたりの処理量を削減する。満たさなかった要求情報の種別が“size”の場合、分割する処理単位の数を減らすことにより、分割する処理単位に追加される並列実行に必要な処理を減らし、コードサイズを削減する。満たさなかった要求情報の種別が“ratio”の場合、“cycle”の場合と同様に並列に実行する処理単位の数を増加させることにより、処理単位あたりの処理量を削減する。満たさなかった要求情報の種別が“processor”の場合、並列に実行する処理単位の数を減少させる。満たさなかった要求情報の種別が“memory”の場合は、“size”の場合と同様に分割する処理単位の数を減らすことにより、分割する処理単位ごとに使用するメモリ使用量を削減する。
【００８３】
ステップe004で、分割方法が変更できた場合は、ステップe002に戻り、再度処理量を求め、ステップe003で要求情報を満たすかどうかを判定する。分割方法を変更できない場合は、ステップe005を実施する。ステップe002〜e004を繰り返すうちに一度実施した分割方法になる場合や、要求情報が矛盾し満たすことができない場合もステップe005を実施する。
【００８４】
ステップe005は、満たさなかった要求情報についてメッセージを出力する。このメッセージにより、プログラマは見直す要求情報の特定が容易になる。
【００８５】
ステップe006は、処理単位を分割する。処理単位の分割方法に関しても、従来の並列化コンパイラと同様の方法でよいため、本発明では、処理単位の分割方法については規定しない。
【００８６】
図２のものを入力した場合の動作の具体例を説明する。
ここでは、Ｃ言語のコンパイラへの指示行を示す“#pragma”を用い、並列実行可能部分の指示を示す予約語を仮に“_para_sections”とし、“#pragma _para_sections”の検出行に続く“{”から、対応する“}”までを並列実行可能部分とする。並列実行可能部分内の分割箇所を示す予約語を仮に“_para_section”とし、“#pragma _para_section”の検出行に続く“{”から、対応する“}”までを分割箇所とする。
【００８７】
ステップe001は、a008の“#pragma _para_sections”に続く“{”から、対応する“}”までのa001を並列実行可能部分として検出する。次に、並列実行可能部分a001内のa009、a010、a011の各“#pragma _para_section”に続く、“{”から、対応する“}”までを分割箇所a012、a013、a014として検出する。続いて、検出した分割箇所a012、a013、a014を処理単位に分割する箇所として決定する。
【００８８】
ステップe002は、ステップe001で処理単位に分割する箇所として決定した分割箇所a012、a013、a014の処理量を求める。ここでは、並列化のオーバヘッドを「100,000cycle」とし、a012の理想サイクル数を「2,400,000cycle」、a013の理想サイクル数を「1,700,000cycle」、a014の理想サイクル数を「1,100,000cycle」とする。また、要求情報の対応範囲であるa006の「para_func()」から並列実行可能部分a001を除いた逐次実行部分の理想サイクル数を「500,000cycle」とする。
【００８９】
ステップe003は、要求情報リストの対応範囲にa012、a013、a014が含まれるかを判定する。要求情報の対応範囲であるa006の「para_func()」にa012、a013、a014が含まれるので、並列実行可能部分a001内の分割箇所を処理単位に分割後の「para_func()」が要求を満たすかどうかを判定する。
【００９０】
並列実行可能部分a001内の分割箇所を処理単位に分割後の「para_func()」の実行イメージを図７に示す。「para_func()」の並列実行可能部分の前後の逐次実行部分とa012をあわせた処理単位を“main”、a013、a014をそれぞれ処理単位に分割したものを“sub1”、“sub2”で示し、並列化のオーバヘッドを“OH”で示す。「para_func()」は“プロセッサ1”で実行を開始し、並列実行部分の処理に移る際に処理単位“sub1”、“sub2”がそれぞれ“プロセッサ2”、“プロセッサ3”で起動され、“main”、“sub1”、“sub2”が並列に処理される。並列実行部分の処理が完了後、“プロセッサ1”で“main”の残りの逐次実行部分が処理される。
【００９１】
ステップe002で求めた処理量から、処理単位“main”の並列実行部分、“sub2”、“sub3”の処理量はそれぞれ「2,500,000cycle」、「1,800,000cycle」、「1,200,000cycle」であることが分かる。“main”の逐次実行部分の処理量は「500,000cycle」であるので、「para_func()」全体の処理量は「3,000,000cycle」である。「para_func()」に対する要求情報は、“cycle”の「4,000,000」、“ratio”の「0.1」、“processor”の「2」である。「para_func()」全体の処理量は「3,000,000cycle」であるので、“cycle”の要求を満たしている。ここでは、システムの使用可能性能はプロセッサ周波数“frequency”と同じ「50MHz」とする。“ratio”は「0.1」であるので、プロセッサごとの割り当て性能は「5MHz」となり、1秒あたり「5,000,000cycle」となる。処理単位“main”、“sub1”、“sub2”の処理量は、「5,000,000cycle」以内であるので、“ratio”の要求を満たしている。ステップe001で処理単位を“main”、“sub1”、“sub2”に分割したため、３つのプロセッサを使用する。これは、“processor”の要求を満たさない。要求情報を満たさないため、ステップe004を実施する。
【００９２】
ステップe004は、ステップe003で満たさなかった“processor”の要求を満たすように処理単位の分割方法を変更する。“processor”の要求は「2」であるので、２つの処理単位に変更する。処理量の少ない処理単位“sub1”、“sub2”を１つの処理単位に結合し、処理単位“sub”とする。分割方法を変更できたので、再度ステップe002を実施する。
【００９３】
２度目のステップe002は、ステップe004で変更した処理単位“sub”の処理量を求める。図８に分割方法の変更前と変更後の処理量を示す。処理単位“sub”の処理量は、a013、a014の理想サイクル数と並列化のオーバヘッドを足した「2,900,000cycle」となる。
【００９４】
２度目のステップe003は、分割方法変更後の「para_func()」が要求情報を満たすかどうかを判定する。分割方法変更後の「para_func()」の実行イメージを図９に示す。分割方法を変更したことにより、「para_func()」全体の処理量は「3,400,000cycle」となる。よって、“cycle”の要求を満たしている。次に、処理単位“main”、“sub”の処理量は、「5,000,000cycle」以内であるので、“ratio”の要求を満たしている。処理単位は“main”、“sub”の２つなので、“processor”の要求を満たしている。要求情報を満たしているので、ステップe006を実施する。
【００９５】
ステップe006は、「para_func()」の逐次実行部分とa012を処理単位“main”に、a013とa014 を処理単位“sub”に分割する。
【００９６】
以上で、分割部３の並列実行可能部分を複数の処理単位に分割する処理は終了する。
なお、上記説明では、処理単位の分割をステップe006で行なったが、ステップe001、ステップe004で分割箇所が決定する度に行なってもよい。ただし、分割方法の変更時に分割前の状態に戻す必要がある場合、余分に処理が必要となる欠点がある。また、分割前の状態を保持したまま、分割を行なうこともできるが、分割方法の変更の度にメモリ使用量が倍増する欠点がある。
【００９７】
３．  指示情報出力部４
指示情報出力部４が処理単位ごとに指示情報を出力する過程を図１０のフローを用いて説明する。ここでは、指示情報を目的プログラムとは別の指示情報ファイルに、すべての処理単位に対応する指示情報をまとめて出力するものとして説明する。
【００９８】
ステップj001は、目的プログラム内の処理単位ごとに、対応する指示情報を出力する。出力する指示情報は、処理単位を示す名前と分割部３のステップe002で求めた処理量を合わせて出力する。
【００９９】
オペレーティングシステムもしくはハードウェアのスケジューラは、指示情報ファイル内の指示情報を相対優先度として解釈し、目的プログラムのスケジューリングを行うことにより、処理性能を保証する。
【０１００】
図２のものを入力した場合の動作の具体例を説明する。
図２のものを入力した場合に指示情報出力部４が出力する指示情報ファイルを図１１に示す。ここでは、指示情報の出力フォーマットとして、仮に“DI_QUANTUM(処理単位名, 指示情報)”で出力するものとする。
【０１０１】
ステップj001は、まず目的プログラム内の処理単位“main”に対する指示情報を出力する。処理単位“main”の処理量は、「3,400,000cycle」であるので、k001のように“DI_QUANTUM(main, 3400000)”と出力する。続いて、処理単位“sub”に対する指示情報を出力する。処理単位“sub”の処理量は、「2,900,000cycle」であるので、k002のように“DI_QUANTUM(sub, 2900000)”と出力する。
【０１０２】
以上で、指示情報出力部４が処理単位ごとに指示情報を出力する処理は終了する。
なお、上記説明では、指示情報を目的プログラムとは別の指示情報ファイルに、すべての処理単位に対応する指示情報をまとめて出力するものとして説明したが、本発明はこの出力方法に限定されるものではない。例えば、処理単位ごとに指示情報ファイルを分けて出力してもよいし、指示情報ファイルに出力するのではなく、目的プログラム内に出力してもよい。目的プログラム内に出力する場合は、指示情報をまとめて出力してもよいし、処理単位ごとに出力してもよい。
【０１０３】
なお、上記説明では、すべての処理単位に対して指示情報を出力したが、処理量が求まらない場合は、一部の処理単位に対して指示情報を出力してもよい。
【０１０４】
なお、上記説明では、指示情報としてサイクル数を出力したが、時間を示す値を出力してもよい。その場合は、時間[ms] = (サイクル数/プロセッサ周波数) * 1000で処理にかかる時間を求めることができる。
【０１０５】
なお、上記説明では、指示情報としてサイクル数を出力したが、単位時間あたりのサイクル数を出力してもよい。その場合は、単位時間あたりのサイクル数 = サイクル数 * (1 / 単位時間) で求めることができる。
【０１０６】
なお、上記説明では、指示情報としてサイクル数を出力したが、単位時間あたりの時間を示す値を出力してもよい。その場合は、単位時間あたりの時間[ms] = (サイクル数/プロセッサ周波数) * 1000 * (1 / 単位時間) で求めることができる。
【０１０７】
なお、上記説明では、指示情報としてサイクル数を出力したが、目的プログラム全体の処理量に対する処理単位の処理量の割合を出力してもよい。
【０１０８】
なお、上記説明では、指示情報としてサイクル数を出力したが、目的プログラムの実行環境の可能処理量に対する処理単位の処理量の割合を出力してもよい。
【０１０９】
なお、上記説明では、指示情報としてサイクル数を出力したが、優先度を示す値を出力してもよい。優先度は、処理量の多い処理単位から順に高い優先度を示す値を設定すればよい。
【０１１０】
なお、上記説明では、指示情報は相対優先度を一意に決定する情報であるものとして、オペレーティングシステムもしくはハードウェアのスケジューラは指示情報をそのまま相対優先度として使用したが、指示情報を相対優先度の決定のための参考値として使用してもよい。即ち、プログラマが目的プログラムの実行状況に応じて修正してもかまわないし、オペレーティングシステムもしくはハードウェアのスケジューラが扱いやすい指標に変更してもよい。
【０１１１】
以上、本発明に係るコンパイラシステムおよびその構成要素について、実施の形態に基づいて説明したが、本発明はこの実施形態に限られない。即ち、
【０１１２】
（１）上記実施の形態では、Ｃ言語向けのコンパイラシステムを想定していたが、本発明はＣ言語のみに限定されるものではない。他のプログラミング言語を採用した場合でも本発明の有意性は保たれる。
【０１１３】
（２）上記実施の形態では、コンパイラシステムのみで構成されていたが、本発明はこの構成に限定されるものではない。例えば、より多くの構成要素・サブツールに分解されていてもよい。
【０１１４】
（３）上記実施の形態では、入力プログラムに要求情報が付加されていることを想定していたが、要求情報が付加されていない入力プログラムに対して、処理単位に分割する場合も指示情報を出力しても良い。その場合は図１の要求情報１０２と要求情報入力部２は必要なく、図１２のようにコンパイラシステムＬ１は、要求情報が付加されていない入力プログラムＬ１０１を入力とし、分割部Ｌ３で処理単位に分割する。分割部Ｌ３の処理フローを図１３に示す。分割部Ｌ３は、ステップm001で処理単位に分割する箇所を決定し、ステップm002で分割する処理単位ごとの処理量を求める。ステップm003で処理単位に分割し、処理は終了する。指示情報出力部Ｌ４は、図１の指示情報出力部４と同様に、分割部Ｌ３で求めた処理量を指示情報Ｌ２０３として指示情報ファイルに出力すればよい。
【産業上の利用可能性】
【０１１５】
本発明は、Ｃ言語やアセンブリ言語で記述されたソースプログラムを機械語プログラムに変換するコンパイラシステムに適用できる。
【図面の簡単な説明】
【０１１６】
【図１】本発明の実施の形態に係るコンパイラシステムの構成を示すブロック図
【図２】図１のコンパイラシステムが変換する前の入力プログラムの一例を示す図
【図３】図１のコンパイラシステムにおける要求情報入力部２の動作を示すフローチャート
【図４】図１のコンパイラシステムにおける要求情報入力部２で生成する要求情報リストの一例を示す表
【図５】図１のコンパイラシステムにおける要求情報入力部２で検出した要求情報の変換に使用する変換式を示す表
【図６】図１のコンパイラシステムにおける分割部３の動作を示すフローチャート
【図７】図１のコンパイラシステムにおける分割部３のステップe001によって分割を行なった図２の入力プログラムの実行イメージを示す図
【図８】図１のコンパイラシステムにおける分割部３のステップe004で図２の入力プログラムに対する分割方法を変更する前後の処理単位とその処理量を示す表
【図９】図１のコンパイラシステムにおける分割部３のステップe004によって分割を行なった図２の入力プログラムの実行イメージを示す図
【図１０】図１のコンパイラシステムにおける指示情報出力部４の動作を示すフローチャート
【図１１】図１のコンパイラシステムにおける指示情報出力部４が図２の入力プログラムに対して出力する指示情報の一例を示す図
【図１２】要求情報を入力がない場合のコンパイラシステムの構成を示すブロック図
【図１３】図１２のコンパイラシステムにおける分割部３の動作を示すフローチャート
【符号の説明】
【０１１７】
１  コンパイラシステム
２  要求情報入力部
３  分割部
４  指示情報出力部
１０１  入力プログラム
１０２  要求情報
２０１  目的プログラム
２０２  処理単位
２０３  指示情報
２０４  指示情報ファイル
【図１】
2009169862.tif 000003
【図２】
2009169862.tif 000004
【図３】
2009169862.tif 000005
【図４】
2009169862.tif 000006
【図５】
2009169862.tif 000007
【図６】
2009169862.tif 000008
【図７】
2009169862.tif 000009
【図８】
2009169862.tif 000010
【図９】
2009169862.tif 000011
【図１０】
2009169862.tif 000012
【図１１】
2009169862.tif 000013
【図１２】
2009169862.tif 000014
【図１３】
2009169862.tif 000015