(57)【要約】  本発明はプロファイル駆動型コンパイルにおけるデジタルデバイス中のプログラムコードのコンパイル方を開示している。前記コンパイラに追加の知性を与えることによってプログラムコードの実行を最適化する手法が提供され、前記コンパイラは監視オペレーションを有する単一の決定木を有するべきか、あるいは複数の決定木を有するべきかを決定する。本発明による方法は、コンパイラ駆動型の最適化及びプログラマによる手動の最適化双方において、最適化されたプログラムコードを得るように条件コード分岐のオーバーヘッドを低減することにおいて有益である。
2009528611.tif 000002
【特許請求の範囲】
【請求項１】
プロファイル駆動型コンパイルにおけるデジタルデバイス中のプログラムコードのコンパイル方法であって、前記プログラムコードはメインコードとブランチコードを具え、
前記ブランチコードのジャンプ命令を含む超長命令語の数から成る前記ブランチコードのブランチコードロードを測定するステップと、
前記プロファイル駆動型コンパイルの第１段である事前コンパイル実行中に、前記ブランチコードの実行頻度を測定するステップと、
監視オペレーションを有する単一の決定木を使用することによって形成される、追加のロードから成る増加したメインコードロードの測定をするステップと、
前記事前コンパイルの実行時に前記メインコードの実行頻度を測定するステップと、
前記ブランチコードを実行するプロセシングロードが閾値よりも小さいか否かを測定し、小さければ前記ブランチコードのために分離した決定木を形成するステップと、
前記ブランチコードを実行するプロセシングロードが閾値よりも大きいか否かを測定し、大きければ監視オペレーションを用いて前記メインコードの決定木の一部として前記ブランチコードを組み込むステップと、
を具えるコンパイル法。
【請求項２】
前記ブランチコードの実行の前記プロセシングロードは、前記事前コンパイルの前記ブランチコードロードと前記ブランチコードの実行頻度の積で定義されることを特徴とする、請求項１に記載の方法。
【請求項３】
コンパイラが前記ブランチコードの実行に対して、監視オペレーションか分離した決定木かを決定することを特徴とする、請求項１に記載の方法。
【請求項４】
前記閾値が、前記事前コンパイル中の前記増加したメインコードのロードと前記メインコードの実行頻度の積で決定されることを特徴とする、請求項１に記載の方法。
【請求項５】
前記ブランチコードが前記プログラムコード中に条件命令を含むことを特徴とする、請求項１に記載の方法。
【請求項６】
前記デジタルデバイスがコンピュータを具え、前記プログラムコードがコンピュータプログラムコードを具えることを特徴とする、請求項１に記載の方法。
【請求項７】
前記事前コンパイルの実行後に、前記ブランチコードの実行頻度と、前記メインコードの実行頻度がコンパイラに入力されることを特徴とする、請求項１に記載の方法。
【請求項８】
前記方法が複数の超長命令語処理装置のコンパイラチェーンに適用されることを特徴とする、請求項１に記載の方法。
【発明の詳細な説明】
【背景技術】
【０００１】
本発明は包括的にはコンピュータシステムに関するものであり、より詳細にはコンピュータシステムのための実行プログラムコードを生成するコンパイラに関するものである。
【０００２】
コンピュータ時代の幕開けによって、コンピュータシステムは極めて洗練されたデバイスへと進化し、様々な多くの場所で見つけることができる。ハードウェアとソフトウェア（つまりコンピュータプログラム）の双方における飛躍的な進化は、コンピュータシステムの性能を大幅に改善した。初期のコンピュータプログラムと比較した場合、現代のソフトウェアは極めて複雑になった。コンピュータプログラムの実行時間（従って性能）はコンピュータプログラムが実行するときに実行される命令の数に極めて密接に関連している。従って、コンピュータプログラムのサイズと複雑さが増すにつれ、コンピュータプログラムの実行時間も同様に増加することになる。
【０００３】
初期のコンピュータプログラムとは異なり、現代のコンピュータプログラムは通常、人間のプログラマーが理解しやすい高級言語で記述されている。コンパイラとして知られる特別なソフトウェアツールは、「ソースコード」として知られる、人間が読むことが出来るコンピュータプログラムを解釈し、それをコンピュータシステムが実行できる「マシンコード」あるいは「オブジェクトコード」命令へと変換する。コンパイラは最終的にコンピュータシステム上で実行されるマシンコード命令の流れを生成するため、コンパイラがソースコードをオブジェクトコードへ変換する方法はコンピュータプログラムコードの実行時間に影響を与える。
【０００４】
コンピュータプログラム、特に複雑なコンピュータプログラムの実行時間は、コンピュータプログラム内部における命令の構成とタイプの関数である。ループはコンピュータプログラムの実行時間に悪影響を与える。コンピュータプログラムが多くのループ、または著しく多く実行されるループを含む場合、ループを実行するために消費される時間は、コンピュータプログラムの実行時間に重大な影響を与える。
【０００５】
ＶＬＩＷ構造における性能のための必要な要素は、コンパイラの命令スケジューラである。前記命令スケジューラはコアコンパイラによって生成されるシーケンシャルコードを超長命令語（ＶＬＩＷ）命令へ変換することを担っており、前記ＶＬＩＷ命令のそれぞれは、ＶＬＩＷによって並行して出される独立なオペレーションを含んでいる。命令スケジューラはスケジューリングユニットと称される基本ブロックに動作する。スケジューリングユニットの例には決定木及び監視決定木がある。
【０００６】
現代のコンピュータプログラムの性能を最適化するために、コンピュータプログラムの実行性能を予測及び／または測定するようにプロファイラが改良されてきた。プロファイラは一般にどれだけ頻繁にコンピュータプログラムの異なる部分が実行されるかを評価するプロファイルデータを生成する。前記プロファイルデータを使用することによって、オプティマイザ（最適化するコンパイラなど）はコンピュータプログラムの実行速度を改善するために、コンピュータプログラム中のループを最適化する決定をすることができる。
【０００７】
特許文献１は、コンパイラが知的な相反決定をすることが出来るプロファイル駆動型のコンパイル法を開示している。それは、プログラムの分岐先を予測するために超長命令語（ＶＬＩＷ）処理装置のコンパイラ中に配置されている。しかしこれらの既知の方法では、コンパイラはプログラムコード中で条件付実行が要求されると、監視オペレーションか専用の決定木かの最適な選択をするためのガイドを必要とする。従って、プログラムコード中で条件付実行が要求されたときに、監視オペレーションか決定木かを決定する改良されたコンパイル法に対する満足されていない要求が存在する。
【特許文献１】国際公開第２００３／００３１９５号明細書
【発明の開示】
【０００８】
本発明はプロファイル駆動型コンパイルにおけるデジタルデバイス中のプログラムコードのコンパイル法を開示する。前記コンパイラに追加の知性を与えることによって、プログラムコードの実行最適化のための手法が提供されている。本発明は条件分岐に対する手法を提供し、前記手法は監視命令あるいは分離した決定木のどちらかを使用するために前記コンパイラに提供される情報に基づいている。「ホットスポット」と呼ばれるコードのセクションは、プロファイル駆動型コンパイルの最初のコンパイルラン（コンパイル実行）段で特定され、決定木を追加するか、あるいは特定された条件コード分岐への監視オペレーションを有するかを決定するために、オーバーヘッドの推定をする。この情報はプロファイル駆動型コンパイルの最終段に対する入力として提供される。
【０００９】
コンパイルプログラムコードの異なるセクションを特定するために、プロファイル駆動型コンパイルの事前コンパイルが実行される。メインコードとブランチコードが事前コンパイル段で特定される。ブランチコードのロード（ＢＣＬＤ）と増加したメインコードのロード（ＩＭＣＬＤ）もまた測定され、ＢＣＬＤはブランチコードにおけるジャンプ命令を含む超長命令語（ＶＬＩＷ）の数として定義される。ＩＭＣＬＤは、ブランチコードを対応するメインループの決定木の中に組み込むための監視オペレーションの導入によって形成される追加のロード数として定義される。前記パラメータの推定時に、プロファイル駆動型コンパイルのラン（実行）段の間、メインコードの実行頻度（ＮＭＥ）並びにブランチコードの実行頻度（ＮＢＥ）もまた推定される。ブランチコードの実行確率が低い場合、ＢＣＬＤとＮＢＥの積を取ることによって決定される、対応するプロセシングロードもまた低くなる。ブランチコードのプロセシングロードが閾値よりも低ければ、分岐のための分離した決定木によって生成される追加のプロセシングロードは、監視オペレーションを有する単一の決定木を使用することによって形成されるロードと比較して小さい。その閾値はＩＭＣＬＤとＮＭＥの積を取ることにより決定される。
【００１０】
ＮＢＥ及びＮＭＥの値は最初の実行後にコンパイラに提供される。従って、プログラムコードのホットスポットに対して単一の決定木を有するか、多数の決定木を有するべきか、コンパイラは賢明な決定をする。ホットスポットはプログラムコードの異なるセクションとして定義されるが、前記ホットスポットは多量のプロセシングロードから成り、従って最適化に適した候補となる。条件コードを有するプログラム中のホットスポットを特定したあと、決定をするためにコンパイラはプロファイル駆動型コンパイルにおける前記条件を検証しなければならない。
【００１１】
本発明の一実施例において、プログラムコードはメインコードとブランチコードを有しており、実行しているブランチコードのプロセッシングロードが閾値よりも小さい場合、コンパイラはメインコードとブランチコードに対する命令スケジューリングユニットを、監視オペレーションを使用する単一の決定木として決定する。実行しているブランチコードのプロセシングロードが閾値よりも大きい場合には、コンパイラはメインコードとブランチコードのための命令スケジューリングユニットを、ブランチコードが分離した決定木を有する２つの分離した決定木として決定する。
【００１２】
本発明の１つの目的は、プログラムコード中において条件実行が要求される時に、監視オペレーションか、あるいは決定木かの最適な選択をすることにある。
【００１３】
本発明の別の目的は、手動の最適化を行うことによってプログラマーが最適化されたプログラムコードを有するように支援することにある。
【００１４】
本発明の更なる目的は、プログラムコード中の条件コード分岐のオーバーヘッドを低減することにある。
【００１５】
本発明の前記要約は本発明の開示されたそれぞれの実施例を説明することを意図してはいない。続く図及び詳細な説明は本発明の追加の特徴を提供している。  
【００１６】
本発明はコンパイラに追加の知性を提供することによって、プログラムコードの実行を最適化するための方法を提供する。続く説明において、本発明をさらに徹底して理解するために多くの明確な詳細が説明されている。しかし当業者にとって本発明がこれらの明確な詳細なしに実施可能なことは明らかである。他の実施例においては、本発明を分かりづらくすることを避けるため、良く知られた特徴は説明されていない。
【００１７】
図１は、プロファイル駆動型コンパイルにおける、デジタルデバイス中のプログラムコードのコンパイル方法を示している。プログラムコードのコンパイルの間に最適なスキームを選択するために、プログラムコードの事前コンパイルを実行する（１０１）。この事前コンパイルにおいて、コンパイラはプログラムコードの異なるセクションを特定する。続いてコンパイラはプログラムコード中にメインコードとブランチコードを特定する（１０２、１０３）。
【００１８】
事前コンパイル段の実行時に、ブランチコード中のジャンプ命令を含めた超長命令語（ＶＬＩＷ）の数が測定される（１０４）。このＶＬＩＷの数はジャンプ命令を含んでいるが、ブランチコードロード（ＢＣＬＤ）と称する。事前コンパイル実行中のブランチコードの実行頻度（ＮＢＥ）と、事前コンパイル実行中のメインコードの実行頻度（ＮＭＥ）が測定される（１０５及び１０７）。監視オペレーションのための単一の決定木を使用することによって生成された追加のロードである、増加したメインコードロード（ＩＭＣＬＤ）が測定される（１０６）。
【００１９】
プログラムコード中の特定のセクションに対して、単一の決定木あるいは多数の決定木を持つべきかの賢明な決定をコンパイラが出来るように、条件を検証しなければならない。前記条件が以下に説明されている。閾値はＩＭＣＬＤ及びＮＭＥの積をとることによって決定される。ブランチコードの実行確率が低ければ、ブランチコードの対応する全プロセシングロード（これ以降「プロセシングロード」と称する）もまた低いはずである。ブランチコード実行のプロセシングロードは、ＢＣＬＤ及びＮＢＥの積をとることによって決定される。ブランチコードを実行するプロセシングロードが閾値よりも低ければ、分岐するための分離した決定木によって生成された追加のロードは、監視オペレーションを有する単一の決定木を使用して生成されたロードと比較して小さいと判断する（１０８）。
【００２０】
この条件はコンパイル−実行−再コンパイルのシナリオにおいて使用され、ＮＢＥ及びＮＭＥは最初の実行の後にコンパイラに対する入力となり得る。そこでプログラムコード中の特定のセクションに対して、コンパイラは、単一の決定木あるいは多数の決定木を有するべきかの賢明な決定をすることができる。プログラム中のこれらのセクションと特定した後、コンパイラは決定をするためにプロファイル駆動型コンパイルにおける上記の条件を検証しなければならない。
【００２１】
図２は典型的なプログラムソースコード２０１の構造を示している。このプログラムソースコード２０１はメインコードセクション２０１とブランチコードセクション２０３を具える。ブランチコードセクション２０３はメインコードセクション２０２中の条件コードセクションである。コンパイルの間、コンパイラの命令スケジューラは（ｉ）ブランチコード２０３のための監視オペレーションを使用する「ブランチコード」２０３を有する「メインコード」セクション２０２中に、全コードのための単一の決定木を形成する（ｉｉ）「メインコード」の決定木以外の「ブランチコード」のための分離した決定木を形成する、選択肢を有する。
【００２２】
図３はプログラムコード２０１（図２に示す）中のスケジューリングユニットの構造を示しており、ブランチコードとメインコードは同じ決定木３０１に属している。この図は、ブランチコード３０３（図２に示すように、ソースコード２０１におけるブランチコード２０３に対応している）あるいは条件コードセクションが監視オペレーションとされ、ブランチコードセクション３０３及びメインコードセクション３０２（図２に示すようにソースコードのメインコード２０２に対応している）は同じ決定木３０１に属しているような場合に対応している。ブランチコード３０３あるいは条件コードセクションは主に「ＩＦ  ＴＨＥＮ」及び「ＩＦ  ＥＬＳＥ」のような条件の文節を含んでいる。図２におけるＶＬＩＷｍ命令、ＶＬＩＷ及びＶＬＩＷｂは以下のように定義される。ＶＬＩＷｍはメインコード３０２におけるＶＬＩＷ命令に対する略語であり、ＶＬＩＷｂはブランチロード３０３におけるＶＬＩＷ命令に対する略語である。
【００２３】
図４はプログラムコードのスケジューリングユニットの構造を示しており、ブランチコードはメインの決定木４０１（図２に示すようにソースコード２０１におけるメインコード２０２に対応している）から分離されている。つまり、メインコードとブランチコードはそれぞれ分離した決定木４０１及び４０２に属している。この図はプログラムコードがメインコードとブランチコードを有し、コンパイラがメインコード及びブランチコード用の命令スケジューリングユニットを２つの分離した決定木として決定する場合に関係しており、その場合にはブランチコードは分離した決定木４０２を有している。前記ブランチコード４０２（図２に示すようにソースコード２０１においてブランチコード２０３に対応している）あるいは条件コードセクションは主に「ＩＦ  ＴＨＥＮ」及び「ＩＦ  ＥＬＳＥ」の条件の文節を含んでいる。図４におけるＶＬＩＷ命令、ＶＬＩＷｍ及びＶＬＩＷｂは以下のように定義される。ＶＬＩＷｍはメインコード４０１におけるＶＬＩＷ命令に対する略語であり、ＶＬＩＷｂはブランチコード４０２におけるＶＬＩＷ命令に対する略語である。
【００２４】
コンパイラがブランチコード２０３を単一の決定木に収容しようとするとき、コンパイラは幾つかの監視オペレーションを実行しなければならず、前記監視オペレーションは通常、メインループ中のＶＬＩＷ命令の数、つまり「ＶＬＩＷｍ」を増加させる。これは、ブランチコード２０３とメインコード２０２が同じ決定木（図３に示すように）に属する時のメインコード２０１（図２に示すように）中のＶＬＩＷ命令の数は、コンパイル時に（図４に示すように）メインコード２０２とブランチコード２０３用の分離した決定木が割り当てられた時のメインコード４０１（図４に示すように）中のＶＬＩＷ命令の数よりも多いことを暗示している。
【００２５】
図５は決定ブロックを示しており、プログラムコード５０１における特定のセクションに対して、単一の決定木あるいは多数の決定木を有するべきかコンパイラが決定するために検証されるべき条件を表している。
【００２６】
コンパイラは単一の決定木あるいは複数の決定木を有するべきかを以下の条件を使用して決定する。
ＢＣＬＤ×ＮＢＥがＩＭＣＬＤ×ＮＭＥよりも小さければ、メインコードとブランチコードに対して異なる二つの決定木へ進め。
ＢＣＬＤ×ＮＢＥがＩＭＣＬＤ×ＮＭＥよりも大きければ、（監視オペレーションを有する）単一の決定木へ進め。
【００２７】
実行しているブランチコードのプロセシングロードが閾値よりも小さければ、ブランチコード用に分離した決定木によって生成される追加のロードは、監視オペレーションを有する単一の決定木を使用することによって生成されるロードと比較して小さい。ここではコンパイラにとって、新しい決定木を形成することが理に叶っている。
【図面の簡単な説明】
【００２８】
【図１】プロファイル駆動型コンパイルにおける、デジタルデバイス中のプログラムコードのコンパイル方法を示している。
【図２】メインコード部とブランチコード部を具えるプログラムソースコードの構造を示している。
【図３】ブランチコード及びメインコードが同じ決定木に属するプログラムコードのスケジューリングユニットの構造を示している。
【図４】ブランチコードとメインコードが分離した決定木に属するプログラムコードのスケジューリングユニットの構造を示している。
【図５】プログラムコードの特定のセクションに対して、単一の決定木か、または複数の決定木を有するかをコンパイラが決定するように検証された条件を表す決定ブロックを示している。
【図１】
2009528611.tif 000003
【図２】
2009528611.tif 000004
【図３】
2009528611.tif 000005
【図４】
2009528611.tif 000006
【図５】
2009528611.tif 000007
【国際調査報告】
2009528611.tif 000008
2009528611.tif 000009
2009528611.tif 000010