(57)【特許請求の範囲】
【請求項１】
プロセッサが、ソフトウェアプログラムのコードのコンパイルの最適化フェーズ中に前記コードを最適化するための複数の最適化パスのうちの第１の最適化パスの実行のための予算時間を決定することと、
前記プロセッサが、前記第１の最適化パスの実行のための第１の実時間を決定することと、
前記プロセッサが、実行のための前記第１の実時間が前記第１の最適化パスの実行のための前記予算時間を超えたかどうかに少なくとも部分的に基づいて、前記複数の最適化パスのうちの第２の最適化パスの実行のための割り当て時間を決定することと、ここにおいて、前記第２の最適化パスは、第１の数の命令を定義する、と、
前記プロセッサが、前記ソフトウェアプログラムの前記コードから最適化されたコードを作り出すために前記コードで前記第２の最適化パスの第２の数の前記命令を実行することと、ここにおいて、前記第２の数は前記第１の数よりも少ない、と、
前記第２の最適化パスの実行のための実時間が実行のための前記割り当て時間を超えたという決定に応答して、前記プロセッサが、前記第２の最適化パスのその後の命令の実行を防ぐことと、
前記その後の命令の実行を防いだ後に、前記最適化されたコードから前記ソフトウェアプログラムのオブジェクトコードを生成することと
を備える、方法。
【請求項２】
前記割り当て時間を決定することが、前記第２の最適化パスの優先度、全体の最適化時間予算内の残りの時間の量、前記第２の最適化パスを実行するデバイスの電力状態、前記ソフトウェアプログラムの最適化に割り当てられる重要性値、およびユーザ選択のうちの少なくとも１つに基づいて前記割り当て時間を決定することを備える、請求項１に記載の方法。
【請求項３】
前記第１の最適化パスの実行のための前記第１の実時間に基づいて前記最適化フェーズの１つまたは複数のその後の最適化パスのための割り当て時間を調整することをさらに備える、請求項１に記載の方法。
【請求項４】
前記最適化フェーズの前記複数の最適化パスを実行するための時間予算を決定することと、
前記複数の最適化パスに前記時間予算の部分を割り当てることと
をさらに備える、請求項１に記載の方法。
【請求項５】
前記第２の最適化パスが、現在の最適化パスであり、
前記現在の最適化パスの実行に先立って、
前記ソフトウェアプログラムの前記コードのための最適化パス構成データのセットを決定することと、ここにおいて、前記最適化パス構成データは、コンパイルの前記最適化フェーズ中に前記ソフトウェアプログラムの前記複数の最適化パスのうちの最適化パスのシーケンスを定義し、ここにおいて、最適化パスの前記シーケンスは前記現在の最適化パスを含む、と、
最適化パスの前記シーケンスを実行するための時間予算を決定することと、
前記現在の最適化パスが前記シーケンス内の最後の最適化パスではないときに、および前記現在の最適化パスの実行を終了した後に、前記最適化パス構成データのセットに基づいて最適化パスの前記シーケンス内の次の最適化パスを実行することと
をさらに備える、請求項１に記載の方法。
【請求項６】
ソフトウェアプログラムのコードのコンパイルの最適化フェーズ中に前記コードを最適化するための複数の最適化パスのうちの第１の最適化パスの実行のための予算の時間を決定することと、
前記最適化パスのうちの第１の最適化パスの実行のための第１の実時間を決定することと、
実行のための前記第１の実時間が前記第１の最適化パスの実行のための前記予算の時間を超えたかどうかに少なくとも部分的に基づいて、前記複数の最適化パスのうちの第２の最適化パスの実行のための割り当て時間を決定することと、ここにおいて、前記第２の最適化パスは、第１の数の命令を定義する、と、
前記ソフトウェアプログラムの前記コードから最適化されたコードを作り出すために前記コードで前記第２の最適化パスの第２の数の前記命令を実行することと、ここにおいて、前記第２の数は前記第１の数よりも少ない、と、
前記第２の最適化パスの実行のための実時間が実行のための前記割り当て時間を超えたという決定に応答して、前記第２の最適化パスのその後の命令の実行を防ぐことと、
前記その後の命令の実行を防いだ後に、前記最適化されたコードから前記ソフトウェアプログラムのオブジェクトコードを生成することと
を行うように構成された１つまたは複数のプロセッサを備える、デバイス。
【請求項７】
前記１つまたは複数のプロセッサが、前記第２の最適化パスの優先度、全体の最適化時間予算内の残りの時間の量、前記デバイスの電力状態、前記ソフトウェアプログラムの最適化に割り当てられる重要性値、およびユーザ選択のうちの少なくとも１つに基づいて前記割り当て時間を決定するように構成された、請求項６に記載のデバイス。
【請求項８】
前記１つまたは複数のプロセッサがさらに、前記第１の最適化パスの実行のための前記第１の実時間に基づいて前記最適化フェーズの１つまたは複数のその後の最適化パスのための割り当て時間を調整するように構成された、請求項６に記載のデバイス。
【請求項９】
前記１つまたは複数のプロセッサがさらに、前記最適化フェーズの前記複数の最適化パスを実行するための時間予算を決定することと、前記複数の最適化パスに前記時間予算の部分を割り当てることとを行うように構成された、請求項６に記載のデバイス。
【請求項１０】
前記第２の最適化パスが、現在の最適化パスであり、そして、前記１つまたは複数のプロセッサがさらに、前記現在の最適化パスの実行に先立って、前記ソフトウェアプログラムの前記コードのための最適化パス構成データのセットを決定することと、ここにおいて、前記最適化パス構成データは、コンパイルの前記最適化フェーズ中に前記ソフトウェアプログラムの前記複数の最適化パスのうちの最適化パスのシーケンスを定義し、最適化パスの前記シーケンスは前記現在の最適化パスを含み、最適化パスの前記シーケンスを実行するための時間予算を決定することとを行うように構成され、前記現在の最適化パスが前記シーケンス内の最後の最適化パスではないときおよび前記現在の最適化パスの実行を終了した後に、前記１つまたは複数のプロセッサが、前記最適化パス構成データの前記セットに基づいて最適化パスの前記シーケンス内の次の最適化パスを実行するように構成された、請求項６に記載のデバイス。
【請求項１１】
グラフィックス処理ユニット（ＧＰＵ）をさらに備え、ここにおいて、前記ソフトウェアプログラムが前記ＧＰＵのためのシェーダプログラムを備え、そして、前記１つまたは複数のプロセッサが、前記ＧＰＵに前記シェーダプログラムのためのコンパイルされたコードを提供するように構成された、請求項６に記載のデバイス。
【請求項１２】
ソフトウェアプログラムのコードのコンパイルの最適化フェーズ中に前記コードを最適化するための複数の最適化パスのうちの第１の最適化パスの実行のための予算の時間を決定するための手段と、
前記第１の最適化パスの実行のための第１の実時間を決定するための手段と、
実行のための前記第１の実時間が前記第１の最適化パスの実行のための前記予算の時間を超えたかどうかに少なくとも部分的に基づいて、前記複数の最適化パスのうちの第２の最適化パスの実行のための割り当て時間を決定するための手段と、ここにおいて、前記第２の最適化パスは、第１の数の命令を定義する、と、
前記ソフトウェアプログラムの前記コードから最適化されたコードを作り出すために前記コードで前記第２の最適化パスの第２の数の前記命令を実行するための手段と、ここにおいて、前記第２の数は前記第１の数よりも少ない、と、
前記第２の最適化パスの実行のための実時間が実行のための前記割り当て時間を超えたという決定に応答して、前記第２の最適化パスのその後の命令の実行を防ぐための手段と、
前記その後の命令の実行を防いだ後に、前記最適化されたコードから前記ソフトウェアプログラムのオブジェクトコードを生成するための手段と
を備える、デバイス。
【請求項１３】
前記割り当て時間を決定するための前記手段が、前記第２の最適化パスの優先度、全体の最適化時間予算内の残りの時間の量、前記第２の最適化パスを実行するデバイスの電力状態、前記ソフトウェアプログラムの最適化に割り当てられる重要性値、およびユーザ選択のうちの少なくとも１つに基づいて前記割り当て時間を決定するための手段を備える、請求項１２に記載のデバイス。
【請求項１４】
前記第１の最適化パスの実行のための前記第１の実時間に基づいて前記最適化フェーズの１つまたは複数のその後の最適化パスのための割り当て時間を調整するための手段をさらに備える、請求項１２に記載のデバイス。
【請求項１５】
前記最適化フェーズの前記複数の最適化パスを実行するための時間予算を決定するための手段と、
前記複数の最適化パスに前記時間予算の部分を割り当てるための手段と
をさらに備える、請求項１２に記載のデバイス。
【請求項１６】
前記第２の最適化パスが、現在の最適化パスであり、
前記現在の最適化パスの実行に先立って、前記ソフトウェアプログラムの前記コードのための最適化パス構成データのセットを決定するための手段と、ここにおいて、前記最適化パス構成データは、コンパイルの前記最適化フェーズ中に前記ソフトウェアプログラムの前記複数の最適化パスのうちの最適化パスのシーケンスを定義し、最適化パスの前記シーケンスは前記現在の最適化パスを含む、と、
最適化パスの前記シーケンスを実行するための時間予算を決定するための手段と、
前記現在の最適化パスが前記シーケンス内の最後の最適化パスではないときにおよび前記現在の最適化パスの実行を終了した後に、最適化パス構成データの前記セットに基づいて最適化パスの前記シーケンス内の次の最適化パスを実行するための手段と
をさらに備える、請求項１２に記載のデバイス。
【請求項１７】
実行されるときに、プロセッサに
ソフトウェアプログラムのコードのコンパイルの最適化フェーズ中に前記コードを最適化するための複数の最適化パスのうちの第１の最適化パスの実行のための予算の時間を決定することと、
前記第１の最適化パスの実行のための第１の実時間を決定することと、
実行のための前記第１の実時間が前記第１の最適化パスの実行のための前記予算の時間を超えたかどうかに少なくとも部分的に基づいて、前記複数の最適化パスのうちの第２の最適化パスの実行のための割り当て時間を決定することと、ここにおいて、前記第２の最適化パスは、第１の数の命令を定義する、と、
前記ソフトウェアプログラムの前記コードから最適化されたコードを作り出すために前記コードで前記第２の最適化パスの第２の数の前記命令を実行することと、ここにおいて、前記第２の数は前記第１の数よりも少ない、と、
前記第２の最適化パスの実行のための実時間が実行のための前記割り当て時間を超えたという決定に応答して、前記第２の最適化パスのその後の命令の実行を防ぐことと、
前記その後の命令の実行を防いだ後に、前記最適化されたコードから前記ソフトウェアプログラムのオブジェクトコードを生成することと
を行わせる命令が記憶された、コンピュータ可読記憶媒体。
【請求項１８】
前記割り当て時間を前記プロセッサに決定させる前記命令が、前記第２の最適化パスの優先度、全体の最適化時間予算内の残りの時間の量、前記第２の最適化パスを実行するデバイスの電力状態、前記ソフトウェアプログラムの最適化に割り当てられる重要性値、およびユーザ選択のうちの少なくとも１つに基づいて前記割り当て時間を前記プロセッサに決定させる命令を備える、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項１９】
前記第１の最適化パスの実行のための前記第１の実時間に基づいて前記最適化フェーズの１つまたは複数のその後の最適化パスのための割り当て時間を前記プロセッサに調整させる命令をさらに備える、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項２０】
前記最適化フェーズの前記複数の最適化パスを実行するための時間予算を決定することと、
前記複数の最適化パスに前記時間予算の部分を割り当てることと
を前記プロセッサに行わせる命令をさらに備える、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項２１】
前記第２の最適化パスが、現在の最適化パスであり、
前記現在の最適化パスの実行に先立って、
前記ソフトウェアプログラムの前記コードのための最適化パス構成データのセットを決定することと、ここにおいて、前記最適化パス構成データは前記コンパイルの前記最適化フェーズ中に前記ソフトウェアプログラムの前記複数の最適化パスのうちの最適化パスのシーケンスを定義し、最適化パスの前記シーケンスは前記現在の最適化パスを含む、と、
最適化パスの前記シーケンスを実行するための時間予算を決定することと、
前記現在の最適化パスが前記シーケンス内の最後の最適化パスではないときにおよび前記現在の最適化パスの実行を終了した後に、最適化パス構成データの前記セットに基づいて最適化パスの前記シーケンス内の次の最適化パスを実行することと
を前記プロセッサに行わせる命令をさらに備える、請求項１７に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]本開示は、コンパイラに関する。
【背景技術】
【０００２】
[0002]ビジュアル提示の内容を提供するデバイスは、一般に、ＧＰＵを含む。ＧＰＵは、ディスプレイ上のコンテンツを表すピクセルをレンダリングする。ＧＰＵは、ディスプレイ上の各ピクセルの１つまたは複数のピクセル値を生成し、ディスプレイ上の各ピクセルのピクセル値にグラフィック処理を実行して、提示のために各ピクセルをレンダリングする。そのレンダリングプロセスは、ピクセル値を修正することができる１つまたは複数のシェーダプログラムの実行を含み得る。
【０００３】
[0003]プログラマは、通常は、ソフトウェア、すなわち、コンピュータのための命令集合、を開発するために人間のユーザに理解可能である高水準のコーディング言語を使用する。そのような命令は、通常は、コンパイルされる、すなわち、プロセッサ、たとえば、汎用プロセッサまたはグラフィックス処理ユニット（ＧＰＵ）、によって実行することができる低水準のオブジェクトコード（時に機械コードと呼ばれる）に高水準のコーディング言語から変換される。コンパイルは、実行より前に、または、時に「ジャストインタイム」コンパイルと呼ばれる、実行時間に、実行することができる。たとえば、ＧＰＵのためのシェーダプログラムは、しばしば、ジャストインタイムでコンパイルされる。
【０００４】
[0004]コンパイラは、様々な最適化タスクを実行するように構成することができる。そのような最適化は、コンパイルされたコードが実行され得る速度を上げるためなどに、コンパイルされたコードの実行中に消費されるメモリを減らそうとすることを含み得る。いくつかのコード最適化問題は、非決定的多項式時間（ＮＰ）完全、または決定不能ですらあるように示された。したがって、コード最適化プロセスは、実行に比較的長い時間がかかり、プロセッサとメモリの両方の負荷が大きくなり得る。
【発明の概要】
【０００５】
[0005]一般に、本開示は、コンパイラ最適化を強化することに関連する様々な技法を説明する。そのような技法は、たとえばシェーダプログラムをコンパイルするための、ジャストインタイムコンパイル、または、他のコンパイル時間、たとえばソフトウェア開発および／または試験、の間に使用することができる。本開示は、コンパイラがコンパイル中にコードを最適化して費やす時間の量を減らすことができる技法を説明する。本開示はまた、コンパイルされることになる特定の命令集合に最も適した、最適化プロセスの組合せ、およびそれらのプロセスのためのパラメータを決定するための技法を説明する。本開示の様々な技法は、単独でまたは任意の組合せでともに使用することができる。
【０００６】
[0006]一例で、方法は、ソフトウェアプログラムのコードを最適化するための最適化パスの実行のための割り当て時間を決定することと、そのコードで最適化パスの少なくともいくつかの命令を実行することと、その最適化パスの実行のための実時間が実行のための割り当て時間を超えたという決定に応答して、その最適化パスのその後の命令の実行を防ぐこととを含む。
【０００７】
[0007]別の例で、デバイスは、ソフトウェアプログラムのコードを最適化するための最適化パスの実行のための割り当て時間を決定することと、そのコードでその最適化パスの少なくともいくつかの命令を実行することと、その最適化パスの実行のための実時間が実行のための割り当て時間を超えたという決定に応答して、その最適化パスのその後の命令の実行をプリベンティングすることとを行うように構成された１つまたは複数のプロセッサを含む。
【０００８】
[0008]別の例で、デバイスは、ソフトウェアプログラムのコードを最適化するための最適化パスの実行のための割り当て時間を決定するための手段と、そのコードで最適化パスの少なくともいくつかの命令を実行するための手段と、その最適化パスの実行のための実時間が実行のための割り当て時間を超えたという決定に応答して、その最適化パスのその後の命令の実行を防ぐための手段とを含む。
【０００９】
[0009]別の例で、コンピュータ可読記憶媒体は、実行されるときに、プロセッサにソフトウェアプログラムのコードを最適化するための最適化パスの実行のための割り当て時間を決定させ、そのコードでその最適化パスの少なくともいくつかの命令を実行させ、その最適化パスの実行のための実時間が実行のための割り当て時間を超えたという決定に応答して、その最適化パスのその後の命令の実行を防がせる命令がそこに記憶されてある。
【００１０】
[0010]別の例で、方法は、コンパイルされることになるソフトウェアプログラムのコードのための最適化パス構成データのセットを決定することと、ここにおいて、最適化パス構成データは、コンパイル中にそのソフトウェアプログラムのための最適化パスのシーケンスを定義する、その最適化パス構成データのセットに基づいてそのソフトウェアプログラムのコードでその最適化パスのシーケンスを実行することとを含む。
【００１１】
[0011]別の例で、デバイスは、コンパイルされることになるソフトウェアプログラムのコードのための最適化パス構成データのセットを決定することと、ここにおいて、その最適化パス構成データは、コンパイル中にそのソフトウェアプログラムのための最適化パスのシーケンスを定義する、その最適化パス構成データのセットに基づいてそのソフトウェアプログラムのコードでその最適化パスのシーケンスを実行することとを行うように構成された、１つまたは複数のプロセッサを含む。
【００１２】
[0012]別の例で、デバイスは、コンパイルされることになるソフトウェアプログラムのコードのための最適化パス構成データのセットを決定するための手段と、ここにおいて、最適化パス構成データは、コンパイル中にそのソフトウェアプログラムのための最適化パスのシーケンスを定義する、その最適化パス構成データのセットに基づいてそのソフトウェアプログラムのコードでその最適化パスのシーケンスを実行するための手段とを含む。
【００１３】
[0013]別の例で、コンピュータ可読記憶媒体は、実行されるときに、コンパイルされることになるソフトウェアプログラムのコードのための最適化パス構成データのセットを決定することと、ここにおいて、最適化パス構成データは、コンパイル中にそのソフトウェアプログラムのための最適化パスのシーケンスを定義する、その最適化パス構成データのセットに基づいてそのソフトウェアプログラムのコードでその最適化パスのシーケンスを実行することとをプロセッサに行わせる命令がそこに記憶されてある。
【００１４】
[0014]１つまたは複数の例の詳細が、添付の図面および次の記述で説明される。他の特徴、目的、および利点が、それらの記述および図面から、そして特許請求の範囲から、明らかとなろう。
【図面の簡単な説明】
【００１５】
【図１】[0015]例示的コンピューティングデバイスを示すブロック図。
【図２】[0016]コンパイラの構成要素の例示的セットを示すブロック図。
【図３】[0017]本開示の技法によるコンパイルの最適化フェーズの時間予算を使用するための例示的方法を示す流れ図。
【図４】[0018]本開示の技法によるコンパイラを動的に構成するための例示的方法を示す流れ図。
【発明を実施するための形態】
【００１６】
[0019]概して、本開示は、コンパイル中のコンピュータプログラムのコードの最適化に関する技法を説明する。そのコンパイルプロセスは、通常は、３つのフェーズを含む：（１）ソースコードが中間表現に変換される、構文解析と、（２）中間表現が変形されて、よりよくされる、最適化（たとえば、メモリ消費、処理効率、より高速のコード、改善された並行処理などに関する）と、（３）最適化された中間表現がオブジェクトコードに変換される、コード生成。
【００１７】
[0020]通常は、最適化フェーズは、最適化パスと呼ばれる一連のパスを介して実行される。たとえば、最適化パスは、ループ最適化パス、データフロー最適化パス、コードジェネレータ最適化パス、関数型言語最適化パスなどを含み得る。いくつかの最適化パスは、最適化された中間表現への影響が大きく、比較的複雑であるが、他のパスは、最適化された表現への影響が比較的小さく、比較的単純である。
【００１８】
[0021]コンパイラ（ソフトウェアで実装し、１つまたは複数のハードウェアベースのプロセッサによって実行することができる）は、通常は、順々に各最適化パスを繰り返す。ある種のパス（たとえば、より複雑なパス）は、実行を終了するために比較的多くの時間を必要とし得る。これは、大きいソフトウェア製品の最終ビルドが消費者への流通向けにコンパイルされるときなど、いくつかの場合に許容可能であるが、他の場合に、コンパイルの遅延は、ユーザ体験の縮小をもたらし得る。
【００１９】
[0022]たとえば、コンピュータゲーム、コンピュータ動画、ウェブベースのプログラムなどで一般に使用される、ジャストインタイム（ＪＩＴ）コンパイル中に実行される最適化は、ユーザがプログラムの開始を要求する時間とプログラムが実行することができる時間の間の許容不可能な遅延をもたらし得る。別の例として、コード開発サイクル中に実行される最適化は、コードがコンパイルされるときと、プログラマがそのコードを試験し、バグを取ることができる間の時間を遅らせ得る。さらに別の例として、スマートフォンおよびタブレットコンピューティングデバイスなどのモバイルデバイスで、電池残量は限られていることがあり、コードの最適化に過度の時間が費やされることは、電池寿命に否定的な影響を及ぼし得る。
【００２０】
[0023]本開示は、ユーザ体験を改善することができる、コンパイルの最適化フェーズ中に消費される時間の量の低減に関するある種の技法を説明する。たとえば、本開示のある種の技法によれば、コンパイラのパスマネージャは、様々な最適化パスの間で割り当てることができる最大最適化時間（たとえば、最適化時間予算）を定義するデータで構成することができる。パスマネージャは、より大量の時間をより複雑なパスに割り振り、より少ない時間をより単純なパスに割り当てる、各パスに同量の時間を割り当てる、または様々な他の割り当て方式を適用することができる。本開示は、そこに属する機能を実行する、ハードウェア、ソフトウェア、またはその任意の組合せのいずれで実装されても、任意のユニット、モジュール、または構成要素を「パスマネージャ」と呼ぶ。そのコンパイラは、離散的パスマネージャ要素を含むことなしに、これらの機能自体を実行するように構成することができる。同様に、コードジェネレータなどのコンパイラの特定の要素は、本開示のパス管理技法を実行するように構成することができる。
【００２１】
[0024]場合によって、パスマネージャは、より複雑なパスが割り当て時間の量を超えることを可能にし、次いで、複雑なパスの間に費やされた過度の時間に従って、他のパスに割り当て時間の量を減らすことができる。場合によって、パスマネージャは、たとえば、パスに割り当て時間の量をゼロにセットすることによって、ある特定のパスを完全になくすることができる。
【００２２】
[0025]パスマネージャが、異なる量の時間を異なるパスに割り当てるとき、特定のパスに割り当て時間の量は、様々なデータに依存し得る。たとえば、パスマネージャは、そのパスの優先度（他のパスに対する）、全体の最適化予算内で残っている時間の量、電力状態、コンパイルされているプログラムのための最適化の重要性を示す重要性値、ユーザ選択などに基づいて、特定のパスに割り当て時間の量を決定することができる。構成データは、様々なパスに優先度値を割り当てることができる。たとえば、構成データは、その数値がパス間の相対的優先順位を決定するために比較され得るような、パスの優先順位の数値表現を含み得る。電力状態は、たとえば、「満充電」、「半分充電」、「４分の１充電」、「１０パーセント充電」など、モバイルデバイスの蓄電池の様々なレベルの電池残量を備え得る。
【００２３】
[0026]本開示はまた、コンパイラの動的構成を介してコンパイルの最適化フェーズを改善することに関する他の技法を説明する。たとえば、特定の、固定のシーケンスで最適化パスを実行するのではなくて、本開示は、たとえば、どのプログラムがコンパイルされることになるかに基づいて、たとえば、プログラムの識別子に基づいておよび／またはコンパイルされることになるプログラムの識別特性に基づいて、最適化パスを並べ替えること、同最適化パスを複数回、しかし異なるパラメータで実行すること、および／または、ある特定の最適化パスを完全になくすることによって、最適化パスのシーケンスを選択的に修正するための技法を説明する。その識別子は、ファイル名、プログラムのファイルのハッシュ、または他の識別する情報を備えることができ、一方、識別特性は、たとえば、ファイル拡張子、そのプログラムが書かれた言語、または、他の識別特性を備え得る。最適化パスのシーケンス、および最適化パスのパラメータは、前もって決定することができ、コンパイラに提供することができる。たとえば、コンパイラは、ネットワーク資源を参照して最適化パスのシーケンスおよび最適化パスのパラメータを定義するデータを要求するように構成することができる。
【００２４】
[0027]図１は、例示的コンピューティングデバイス１０のブロック図である。この例で、コンピューティングデバイス１０は、制御ユニット２０およびディスプレイ出力インターフェース４０を含む。制御ユニット２０に起因する機能は、ハードウェア、ソフトウェア、ファームウェア、またはその任意の組合せを使用して実現することができる。ソフトウェアまたはファームウェアで実装されるとき、ソフトウェアまたはファームウェア命令を記憶するためのコンピュータ可読媒体およびその命令を実行するための１つまたは複数のプロセッサなど、必要なハードウェアもまた用意されると推定される。たとえば、制御ユニット２０は、１つまたは複数のプロセッサを含み得る。同様に、制御ユニット２０は、１つまたは複数のプロセッサが実行することができる命令を記憶するための１つまたは複数のコンピュータ可読記憶媒体を含み得る。
【００２５】
[0028]この例で、制御ユニット２０は、グラフィックスプログラム２２およびグラフィックス処理ユニット（ＧＰＵ）ドライバ３０を含む。グラフィックスプログラム２２は、たとえば、動画プログラム、ビデオゲーム、グラフィックス開発プログラム、または他のコンピュータベースのグラフィックス生成プログラムを備え得る。この例で、グラフィックスプログラム２２は、データ定義グラフィックスオブジェクト２４およびデータ定義シェーダプログラム２６を含む。グラフィックスオブジェクト２４は、一般に、ディスプレイ出力インターフェース４０のＧＰＵ４２などのＧＰＵによってレンダリングすることができるグラフィックスオブジェクトに対応する。グラフィックスオブジェクト２４は、たとえば、点、線、三角形、長方形、および他の多角形などのグラフィックスプリミティブの定義、ならびに、たとえば、２次元のまたは３次元のメッシュなどの複数のプリミティブで構成される構造体を含み得る。グラフィックスオブジェクト２４は、２次元のまたは３次元のグラフィックスオブジェクトに対応し得る。
【００２６】
[0029]ディスプレイ出力インターフェース４０は、データ定義グラフィックスオブジェクト２４をレンダリングすることができるＧＰＵ２４を含む。そのレンダリングプロセスは、グラフィックスオブジェクトから、画像の各ピクセルの光の三原色のトリプレット値の値などのピクセルデータを生成するために、実行される。この方式で、本開示により参照されるレンダリングプロセスは、たとえば、ＪＰＥＧ（Ｊｏｉｎｔ  Ｐｈｏｔｏｇｒａｐｈｉｃ  Ｅｘｐｅｒｔｓ  Ｇｒｏｕｐ）符号化された画像を復号することなどの画像の符号化された表現を復号することとは異なる。すなわち、符号化された画像の復号は、一般に、符号化されたピクセルデータまたは一般に画像のピクセルを表す他のデータの復号を含み、一方、レンダリングプロセスは、一般に、いくつかの例ではカメラ視点、照明効果、および他のそのような要因をさらに考慮することができる、２次元または３次元のグラフィックスオブジェクト（たとえば、グラフィックスプリミティブ）などのデータの高次表現からピクセルデータを生成することを含む。レンダリングプロセスに続いて実際に表示される画像の部分は、符号化された画像の復号の結果として生じ得るが、表示される画像の少なくともいくらかの部分は、たとえば、レンダリングプロセス中にグラフィックス処理データを適用することによって、グラフィックス処理データから生成される。
【００２７】
[0030]レンダリングプロセスの部分として、ＧＰＵ４２は、シェーダプログラム２６のうちの１つまたは複数を実行することができる。シェーダプログラムは、柔軟な形で様々なグラフィックス処理機能を実行するために、ＧＰＵのプログラマブルシェーダプロセッサコアで実行するソフトウェアアプリケーションである。実行されるときに、シェーダプログラム２６は、光源および互いに対するグラフィックスオブジェクト２４の位置に基づいて、グラフィックスオブジェクト２４から生成されるピクセルに照明または影を追加することなど、様々なタスクのために使用することができる。たとえば、頂点シェーダ、幾何学シェーダ、およびピクセルシェーダなど、様々なタイプのシェーダプログラムが、使用され得る。図１の例で、グラフィックスプログラム２２は、シェーダプログラム２６を定義するソースコードデータを含む。他の例で、１つまたは複数のシェーダプログラムを定義するソースコードデータは、たとえば、グラフィックスプログラム２２がアクセスを有する１つまたは複数の動的にリンクされたライブラリなど、他のどこかに記憶することができる。そのような動的にリンクされたライブラリは、制御ユニット２０のコンピュータ可読媒体（図１に示さず）に記憶することができる。
【００２８】
[0031]ＧＰＵドライバ３０は、制御ユニット２０とＧＰＵ４２の間のインターフェースを表す。ＧＰＵドライバ３０は、コンピューティングデバイス１０のオペレーティングシステム内にインストールすることができる。この方式で、グラフィックスプログラム２２は、コンピューティングデバイス１０にディスプレイ出力インターフェース４０に結合されたディスプレイ上に画像を表示させるために、ＧＰＵドライバ３０を介してＧＰＵ４２にコマンドを発行することができる。たとえば、グラフィックスプログラム２２は、１つまたは複数のグラフィックスオブジェクト２４のデータおよび／またはシェーダプログラム２６のうちの１つまたは複数を定義するデータをＧＰＵドライバ３０を介してＧＰＵ４２に送信することができる。本開示の技法によれば、ＧＰＵドライバ３０は、コンパイラ５０がプログラム（たとえば、シェーダプログラム２６のうちの１つ）をコンパイルするために呼び出されるたびに、コンパイラ５０の特定の構成を決定することができる。加えてまたは代替で、コンパイラ５０は、コンパイルされることになるプログラムの識別する情報に基づいて構成を決定するように構成することができる。
【００２９】
[0032]コンパイラ５０の起こり得る構成は、ＧＰＵドライバ３０とは別個のデータベース内に、ＧＰＵドライバ３０自体によって、コンパイラ５０によって、またはＧＰＵドライバ３０にアクセス可能な他のメモリで、記憶することができる。一例として、その構成データは、ネットワークを介してアクセス可能なデータベースに記憶することができる。図１の例で、ＧＰＵドライバ３０は、様々なコンパイル目標に基づいて、コンパイラ５０のための様々な潜在的構成を記憶する、構成データベース３２を含む。ＧＰＵドライバ３０内に示されるが、構成データベース３２は、他のどこか、たとえば、制御ユニット２０内またはコンピューティングデバイス１０の外部で、記憶され得ることを理解されたい。そのような例で、ＧＰＵドライバ３０は、データを検索または受信するように構成されたインターフェースを介して構成データを検索または受信することができる。したがって、ＧＰＵドライバ３０、またはコンパイラ５０は、コンパイルのための特定の時間に１つまたは複数の様々なコンパイル目標に基づいてコンパイラ５０のための特定の構成を決定するように構成することができる。たとえば、目標が節電である場合、ＧＰＵドライバ３０は、最適化パス、たとえば、そのパスのための実行時間（すなわち、実行のためにそのパスに割り当て時間の量）および／または実行される最適化パスの数、を減らす構成を選択することができる。一例として、ＧＰＵドライバ３０は、ループ最適化をなくし、単純な線形走査レジスタアロケータを使用する構成を選択して節電することができる。代替で、ループ最適化は、ループを有するシェーダのためにとっておくことができ、そして、ＧＰＵドライバ３０は、グラフ彩色レジスタ割振りパスを使用するようにコンパイラ５０を構成することができる。
【００３０】
[0033]代替で、目標が、最適に近いコードである場合、ＧＰＵドライバ３０は、多数の最適化パスが実行できるようにする構成を選択することができ、そして、データベースは、各々のシェーダプログラム２６の最もよく知られているコンパイラ構成を記憶することができる。さらに別の例として、目標がメモリの節約である場合、ＧＰＵドライバ３０は、メモリ使用量の改善に向けられた最適化パスが実行されることを確保し、他の最適化パスを選択的に使用するまたは飛ばすことができる。さらに別の例として、システム負荷が、考慮すべき事項であることがある。したがって、ＧＰＵドライバ３０は、現在のシステム負荷の検出に応答して、コンパイラ５０の構成を選択することができる。たとえば、ＧＰＵドライバ３０は、システム負荷が比較的高いかまたは比較的低いかをチェックし、どの最適化パスまたは最適化パスのどのバージョンを実行するかを選択することができる。
【００３１】
[0034]それによって、コンパイラ５０は、それらのそれぞれの時間の１つまたは複数のコンパイル目標に基づいて、異なる時間にシェーダプログラム２６のうちの同じもののために異なるオブジェクトコードを作り出すことができる。この方式で、ＧＰＵドライバ３０は、様々なコンパイル目標に応じて、異なって、コンパイラ５０を動的におよび自動的に再構成することができる。すなわち、コンパイラ５０の実行に先立って、ＧＰＵドライバ３０は、たとえば、１つまたは複数の現在のコンパイル目標に基づいておよび／またはコンパイルされることになるプログラム（たとえば、シェーダプログラム２６のうちの１つ）に基づいて、構成データベース３２からのデータを使用してコンパイラ５０を構成することができる。
【００３２】
[0035]図１の例で、コンピューティングデバイス１０はまた、ネットワークインターフェース４４を含む。この例で、ＧＰＵドライバ３０は、コンパイルされることになるシェーダプログラム２６のうちの１つに基づいてネットワークインターフェース４４を使用してコンパイラ５０のコンパイラ構成データを検索するように構成することができる。すなわち、ＧＰＵドライバ３０は、シェーダプログラム２６のうちの１つをコンパイルするときに使用するためのコンパイラ構成を検索するために、ネットワークの場所にアクセスすることができる。それによって、ＧＰＵドライバ３０は、ネットワークインターフェース４４を介して検索された構成データを使用し、構成データベース３２を更新することができる。いくつかの例で、ＧＰＵドライバ３０は、最新のコンパイラ構成がシェーダプログラム２６のコンパイルに先立って使用可能であるように、定期的に、たとえば、週に１度または月に１度、そのような構成を検索することができる。
【００３３】
[0036]図１の例で、データ定義シェーダプログラム２６は、ソースコード（すなわち、コンパイルされていないコード）の形で記憶される。したがって、ＧＰＵ４２によって実行可能であるために、グラフィックスプログラム２２は、シェーダプログラム２６のソースコードをコンパイルのためにＧＰＵドライバ３０に送信する。したがって、ＧＰＵドライバ３０は、コンパイラ５０を含む。コンパイラ５０は、一般に、シェーダプログラム２６のソースコードをＧＰＵ４２によって実行され得るオブジェクトコードに変換する、制御ユニット２０のプロセッサによって実行され得る、プログラムに相当する。したがって、シェーダプログラム２６は、グラフィックスプログラム２２の実行中にコンパイルすることができる。言い換えれば、シェーダプログラム２６のためのソースコードは、ジャストインタイムでコンパイルすることができる。
【００３４】
[0037]ＧＰＵドライバ３０および／またはコンパイラ５０は、コンパイラ５０によって生成されるオブジェクトコードの最適化に関する本開示の様々な技法を実行するように構成することができる。前述のように、コンパイラ５０は、複数の異なる最適化パスの定義を含み得る。各最適化パスは、コードの特定の態様、たとえば、メモリ管理、コード速度など、を最適化するように構成することができる。ある特定の最適化パスは、他よりも比較的より複雑であることがある。すなわち、ある特定の最適化パスは、他よりもより多くの実行時間および／またはより多くのコンピューティング資源を通常は必要とすると知られていることがある。本開示の技法によれば、コンパイラ５０は、最適化パスのうちの１つまたは複数が実行することを許される実行時間の量を制限するように構成することができる。
【００３５】
[0038]一例として、コンパイラ５０は、全体の最適化時間予算および／または１つまたは複数の個々の最適化パス時間予算を決定することができる。「時間予算」は、一般に、時間の量が満たされたまたは超過された後は、コンパイラ５０が、さらなる実行（たとえば、現在の最適化パスのおよび／またはその後の最適化パスの）を停止するような、その間に実行が許される時間の量に相当する。したがって、全体の最適化予算は、たとえば、いくつかのミリ秒、秒、計算周期などで定義される、その間に最適化フェーズが実行することが許される期間に相当し得る。同様に、個々の最適化パス予算は、それぞれの最適化パスが実行することを許される期間に相当し得る。最適化パスの実行中、コンパイラ５０は、費やされた時間の量をモニタし、予算の時間量が満たされたまたは超過されたときに、最適化パスの実行を終了することができる。代替で、コンパイラ５０は、ある特定の最適化パスが予算の時間量を超えることを可能にし得るが、１つまたは複数のその後の最適化パスのための予算を減らすことによって、超過分を相殺することができる。
【００３６】
[0039]加えて、または代替で、コンパイラ５０は、シェーダプログラム２６のうちのどの１つがコンパイルされているかに基づいて、異なるセットの最適化パス（たとえば、省略されることになる１つまたは複数の起こり得る最適化パス）および最適化パスの順序付けを決定することができる。たとえば、ある種のシェーダプログラムは、使用可能な最適化パスのサブセットを使用し、よりよく最適化することができ、さらに、ある特定の順番でおよび／またはある特定のパラメータを使用してそれらの最適化パスを実行することができる。同様に、他のシェーダプログラムは、使用可能な最適化パスの異なるサブセットを使用し、この場合も同様に、ある特定の順番でおよび／またはある特定のパラメータを使用して、よりよく最適化することができる。
【００３７】
[0040]コンパイラ５０は、これらの様々な技法を単独でまたはともに実行するように構成することができる。たとえば、コンパイラ５０は、コンパイルされることになるシェーダプログラム２６のうちの１つ、ならびに、その最適化パスを実行するための時間予算に基づいて、実行する使用可能な最適化パスのサブセットを決定するように構成することができる。そのサブセットの最適化パスを完了した後に時間予算内の時間が残っている場合、コンパイラ５０は、時間予算が使い果たされるまで、追加の最適化パスを実行することができる。代替でまたは加えて、コンパイラ５０は、使用可能な最適化パスの選択されたサブセット内の各最適化パスの個々の時間予算を決定することができる。
【００３８】
[0041]この方式で、コンパイラ５０は、コンパイルの最適化フェーズの改善に関する本開示の技法のうちの１つまたは複数を実行するように構成することができる。すなわち、構文解析に続いて、コンパイラ５０は、たとえば、シェーダプログラム２６のうちの１つの、ソースコードの構文解析された中間表現を最適化することができる。中間表現を最適化した後、本開示の技法によれば、コンパイラ５０は、最適化された中間表現を使用してオブジェクトコードを生成することができる。
【００３９】
[0042]コンパイラ５０は、プログラム、たとえば、シェーダプログラム２６のうちの１つ、のソースコードに対応する実質的に最適化されたオブジェクトコードを生成することができる。オブジェクトコードを生成した後、ＧＰＵドライバ３０は、たとえば、ＧＰＵ４２にそのコードを渡すこと、または、ＧＰＵ４２に、ＧＰＵ４２によってアクセス可能なメモリ内で、そのコードのアドレスを送信することによって、そのオブジェクトコードをＧＰＵ４２に実行させることができる。その結果、ＧＰＵ４２は、シェーダプログラムのためのコンパイルされたオブジェクトコードを実行することができる。たとえば、グラフィックスオブジェクト２４のうちの１つまたは複数を定義するデータをレンダリングする間に、ＧＰＵ４２は、１つまたは複数のシェーダプログラムのオブジェクトコードを実行することができる。画像を完全にレンダリングした後、ディスプレイ出力インターフェース４０は、ディスプレイのディスプレイデバイス（図示せず）によって検索することができる、画像バッファで画像のデータを記憶することができる。
【００４０】
[0043]図１の例は、ＧＰＵドライバの部分としてコンパイラ５０を示すが、本開示の技法は他の状況でも使用され得ることを理解されたい。一般に、本開示の技法は、任意のコンパイラ、必ずしもＧＰＵドライバのコンパイラでなくてもよい、によって使用され得る。たとえば、本開示の技法は、コード開発および／またはデバッギング中にコンパイラによって使用され得る。同様に、これらの技法は、Ｊａｖａ（登録商標）向けのコンパイラなど、他のジャストインタイムコンパイラによって使用され得る。
【００４１】
[0044]図２は、コンパイラ５０の構成要素の例示的セットを示すブロック図である。図２の例で、コンパイラ５０は、パーサ５２、トークナイザ５４、トークンデータ５６、グラマ５８、オプティマイザ６０、コードジェネレータ８０、およびオブジェクトコードデータ８２を含む。図１に関して説明されたように、コンパイラ５０は、プログラム、たとえば、シェーダプログラム、のソースコードを受信することができる。図２は、パーサ５２によって受信されるソースコードを示す。一般に、パーサ５２は、ソースコードのテキスト（すなわち、すべての入力文字）を構文解析する。図２の例で、パーサ５２は、構文解析プロセス中にトークナイザ５４を使用する。トークナイザ５４は、入力ソースコードをトークン化する。トークン化は、一般に、入力ソースコードから個々のトークンを抽出することを含む。トークンは、一般に、ソースコード（たとえば、変数、関数、数値、コマンド、演算子、シンボルなど）の個々の意味論的ユニットに相当する。
【００４２】
[0045]パーサ５２は、トークナイザ５４に次のトークンを要求することができ、そして、応答して、トークナイザ５４が、パーサ５２に入力ソースコードから次のトークンを表すデータを返すことができる。たとえば、次のトークンを表すデータは、「トークンテキスト」値および「トークンタイプ」値を備えることができ、トークンテキストは、ソースコードから抽出された文字テキストであり、トークンタイプは、トークンテキストのタイプ、たとえば、純粋なテキスト、英数字テキスト（文字および数字の組合せを含むテキスト）、数字テキスト、シンボル、または余白（たとえば、スペース、キャリッジリターン、タブなど）、を表す値である。トークンデータ５６は、テキストのタイプを定義する。この方式で、トークナイザ５４は、余白のセットの間のすべての非余白テキストを検索し、トークンデータ５６から検索テキストのタイプを決定することができる。トークナイザ５４は、非余白トークンの間の余白を同様に検索し、トークンデータ５６を使用して、その余白を、たとえば、余白トークンとして、分類することができる。
【００４３】
[0046]トークナイザ５４からトークンデータを受信した後、パーサ５２は、トークンの意味論的意味を決定する。たとえば、パーサ５２は、グラマ５８を定義するデータを使用してトークンの意味論を決定することができる。グラマ５８は、文脈のないグラマを備え得る。パーサ５２は、再帰的下降パーサを備え得る。それによって、パーサ５２は、グラマ５８を使用し、現在の状態および受信されたトークンに基づいて、様々な状態間を移行することができる。それらの様々な状態は、パーサ５２がどのように各トークンに意味論を割り当てるかに影響を及ぼし得る。パーサ５２は、次いで、ソースコードの様々なトークンについて決定された意味論を使用し、そのソースコードの中間表現を作り出すことができる。
【００４４】
[0047]パーサ５２は、次いで、オプティマイザ６０にソースコードの中間表現を提供することができる。オプティマイザ６０は、本開示の技法のうちの１つまたは複数を単独でまたは任意の組合せで使用し、中間表現を最適化することができる。一般に、オプティマイザ６０は、中間表現に適用されることになる最適化パス７４のうちの１つまたは複数を実行することができる。以下で説明するように、オプティマイザ６０は、最適化パスの実行が所定の実行時間予算を超えないことを確保するように構成することができ、および／または、たとえば、コンパイルされるプログラムの識別および／またはそのプログラムの識別特性に基づいて、実行するための最適化パス７４のサブセットを選択して中間表現を最適化することができる。
【００４５】
[0048]図２の例で、オプティマイザ６０は、パスマネージャ６２および最適化エンジン７２を含む。最適化エンジン７２は、パスマネージャ６２の指示で様々な最適化パス７４を実行する。パスマネージャ６２は、順に、予算モニタ６４およびパススケジューラ６８を含み、予算データ６６およびパスデータベース（ＤＢ）７０を保持する。予算データ６６は、一般に、その間に最適化プロセスが実行し得る全体的時間予算および／または最適化パス７４のうちの個々のパスの時間予算、ならびに、コンパイルされている現在のプログラムの最適化に関する追跡データを定義することができる。たとえば、予算モニタ６４は、以前に実行された最適化パス７４の実行の時間、最適化パス７４の優先順位のランキング、最適化パス７４の最初の時間割振り、最適化パス７４の修正された時間割振りなどに関する統計量を保持することができる。
【００４６】
[0049]最適化エンジン７２は、たとえば、最適化パスの実行中にまたは最適化パスの実行の開始に先立って、最適化パス７４のうちの現在のパスの実行を進めるかどうかを決定するために、パスマネージャ６２と通信することができる。たとえば、各命令の後、最適化エンジン７２は、パスマネージャ６２にメッセージを送信して、現在の最適化パスを継続するか、現在の最適化パスを終了させるかを決定することができる。場合によって、最適化パス７４のうちの１つの実行のための時間が経過したが、その最適化パスが実行をまだ完了していない場合、最適化エンジン７２は、その最適化パスの実行を潔く終了させ、次いで、続けて、その後の最適化パスを実行するかまたはその最適化プロセスを終了することができる。
【００４７】
[0050]この方式で、オプティマイザ６０は、命令ストリームに適用される最適化および他の変形の自動的制限を介して、過度のコンパイル時間を防ぐことができる。コンパイラ５０は、実行時間予算を提供され得る。パスマネージャ６２は、最適化パス７４およびコードジェネレータ８０を横切ってこの予算を分割することができる。言い換えれば、パスマネージャ６２は、最適化フェーズ（またはコンパイラ５０自体の実行）の実行時間予算を妥当な実行時間、たとえば、５秒、に制限することができる。コード生成は、すべての最適化パスが完了された場合ほどよくないことがあるが、コード生成プロセスは、正しいコードをやはりもたらすことになり、コンパイル時間の開始と完了の間の不当な遅延を回避することによって、よりよいユーザ体験を提供することができる。
【００４８】
[0051]パスマネージャ６２は、様々なパラメータを使用し、実行時間予算を決定することができる。そのようなパラメータは、コンパイラ５０を実行するＣＰＵの速度、コンパイラ５０がマルチスレッドである場合には、そのＣＰＵ内のコアの数、システム負荷などのうちの１つまたは複数を含み得る。総時間予算が、以下にさらに詳しく説明されるように、様々な割振り技法を使用し、最適化パス７４の間で割り当てられ得る。一例として、パスマネージャ６２は、パスごとの実行時間を制限し、実行する最適化パスの数を制限することができ、および／または、最適化パス７４のうちのどれを実行するか、およびどのくらい長く実行するかを決定するための動的アルゴリズムを使用することができる。加えて、または代替で、高価なパスは、より単純なパスと置き換えることができる。たとえば、複雑なスケジューラパスは、より効率の低いコードを生み出し得る、より単純なスケジューラアルゴリズムで置き換えることができる。一例として、グラフ彩色を使用する複雑なレジスタ割振りアルゴリズムは、線形走査を使用するより単純なアルゴリズムで置き換えることができる。
【００４９】
[0052]いくつかの例で、最適化パス７４の間の実行時間予算の配分は、コンパイラ５０が異なるシーケンスで異なるオプションを有する異なる最適化パスを実行するときに、異なり得る。同様に、総予算および配分は、他の外部要因、たとえば、システム負荷、により異なる時間で同コンパイラおよびプログラムについて異なり得る。
【００５０】
[0053]一例で、パスマネージャ６２は、最適化パス７４を実行するときにバックオフアルゴリズムを使用するように構成され得る。すなわち、５秒の総予算がある場合、パスマネージャ６２は、各々の最適化パス７４が、最適化エンジン７２が実行を終了する前に２００ミリ秒より長く実行しないことを確保することができる。そのような終了が起きる場合、テレスコーピングパターンが使用されて、残りのパスのリストから残りのパスの半分を選別することができる。このパターンは、５秒制限が決して到達されないことを確保し、さらなるパス時間切れについて繰り返され得る。時間切れの結果は、最適ではないコード生成である。そのコードは、やはり正しく動作することになるが、最適ではない。
【００５１】
[0054]前述のバックオフアルゴリズムに加えてまたはそれの代替で、パスマネージャ６２は、パスの時間制限の階層化されたシステムで構成され得る。すなわち、予算データ６６は、最適化パス７４の異なる類別の異なる実行時間（または全体的実行時間の割合）を定義することができる。たとえば、最適化エンジン７２は、テレスコピック選別アルゴリズムを実行するように構成することができ、そのテレスコピック選別アルゴリズムでは、複雑なパス（たとえば、ループ分析最適化パス）のみが各々２００ミリ秒かけることができ、一方、より単純なパス（たとえば、デッドコード削除最適化パス）は５０ミリ秒のみかけることができる。予算データ６６は、各々の最適化パス７４を「複雑な」または「単純な」のいずれかとして分類し、それに応じて実行時間を割り当てることができる。テレスコピック選別アルゴリズムは、残りの複雑な予算をより単純なパスに転送し、より短い最適化パスの前に複雑な最適化パスを省くことができる。これは、複雑なパスよりもより単純なパスの実行を優先する。言い換えれば、最適化エンジン７２は、実行時間予算内の残された時間に応じて、最適化パス７４のうちの１つの早期の終了の後に「複雑な」パスの半分を実行することができる。すべての複雑なパスが飛ばされた後、最適化エンジン７２は、「簡単な」（単純な）パスを飛ばし始めることができる。本技法は、問題のコンパイラによって処理される特定のプログラムドメインについて微調整することができる。
【００５２】
[0055]予算データ６６は、様々な入力基準に基づいて様々な実行時間予算を定義することができる。たとえば、予算データ６６は、コンパイルされることになるソースコードが書き込まれた言語に基づいて異なる実行時間予算を定義することができる。そのような言語は、たとえば、ＯｐｅｎＧＬ、ＯｐｅｎＣＬ、ＤｉｒｅｃｔＸ、ＧＬｓｌａｎｇ、ＲｅｎｄｅｒＭａｎシェーディング言語などを含み得る。
【００５３】
[0056]これらの技法は、様々な利点を実現することができる。たとえば、本技法は、最適化フェーズが過度の実行時間を費やさないことを確保するためにユーザ影響が必要とされないという点で、自動である。したがって、コンパイラ５０は、複雑な最適化パスを使用して、より多くの時間を費やし得る。したがって、コンパイラ５０の開発者は、大きな（しかし稀有な）プログラムでの最適化パスの最悪の場合の実行時間について心配する必要はない。これは、コンパイラ５０が、最悪の場合とは反対に、平均的（そして、恐らく最善の）場合について最適化することを可能にする。同様に、これらの技法は、きめの細かい制御、たとえば、グラフィックスプログラム（たとえば、ＯｐｅｎＧＬで書かれたプログラム）のための２０ミリ秒予算および計算プログラム（たとえば、ＯｐｅｎＣＬで書かれたプログラム）プログラム最適化のための５秒、を可能にすることができる。
【００５４】
[0057]加えて、コード生成中、より複雑な、時間のかかるパスは、深くネスト化した機能コールフローを有するソースプログラムなど、稀有な周辺条件に対処する必要なしにコンパイラパイプライン内に置くことができる。より単純な最適化パスの実行時間に基づいて、パスマネージャ６２は、より積極的な最適化パスのためにどのくらいの時間が使用可能であるかを推定し、これらをパイプラインに追加することができる。起こり得る修正形態は、より積極的なループ分析および／またはより積極的なレジスタ割振りおよび命令スケジューリングを含み得る。
【００５５】
[0058]時間予算編成アルゴリズムはまた、１つまたは複数の様々なシステム目標に従って調整することができる。すなわち、異なる最適化パスパラメータプロファイルが、様々なシステム目標を達成するために開発可能であり、予算データ６６に記憶され得る。たとえば、１つの目標は、たとえば、電池式のデバイスにおける、省電力化である。コンパイル時間リミタとして省電力プロファイルを使用することによって、パスマネージャ６２は、コンパイラ５０が、効率的に電力を消費するための最大限の能力を有することを確保しようと試みることができる。たとえば、省電力を目的とする効率的コンパイル時間は、ＣＰＵ時間の５秒に相当し得る。
【００５６】
[0059]本開示の技法の開発中の発見的試験は、ソースコードパターンの特質、および、本開示の技法を適用することなしに、それらに適用される最適化パスの複雑性が原因で、コンパイルするために比較的長い時間がかかる様々なプログラムを識別した。すなわち、本開示の技法なしには、コンパイル開始時間と完了時間の間に長い遅延が存在し得る。たとえば、いくつかのシェーダプログラムは、コンパイラ５０の実行が「ロックアップする」、すなわち妥当な時間内に完了することに失敗する、結果をもたらし得る莫大な量のＣＰＵ時間をｏｐｔ（すなわち、コンパイル最適化フェーズ）およびｃｏｄｅｇｅｎ（すなわち、最適化に続く、オブジェクトコードの生成）に消費させる、複雑なパターンを含む。ＧＰＵシェーダおよびカーネルの場合、これはまた、プログラム（たとえば、シェーダを使用するゲームまたはカーネルを使用するオペレーティングシステム）の開始を遅らせ得る。したがって、コンパイル遅延（たとえば、最適化によって引き起こされる遅延）は、乏しいユーザ体験をもたらし得る。いくつかの極端な場合には、本開示の技法なしにコンパイラは、プロセスのユーザインターフェースを「ロックアップ」させ得る。
【００５７】
[0060]一例として、ＯｐｅｎＣＬ（オープンコンピューティング言語）で書かれた例示的ビットコインプログラムのコンパイルの試験は、８０６４ＧＰＵコンパイラでコンパイルするのに１時間以上かかった。この例で、ビットコインマイナはｐｈａｔｋ２．ｃｌであり、そして、コンパイラはＯｐｅｎＣＬコンパイラであった。そのような遅延は、乏しいユーザ体験をもたらすのみでなく、悪意あるユーザは、そのような遅延を利用するなどの方法でソースコードを書き込み、それによって、サービス妨害攻撃を引き起こすことができる。したがって、コンパイル遅延は、潜在的セキュリティリスクをもたらし得る。したがって、本開示の技法を使用することで、そのような遅延を回避し、改善されたユーザ体験をもたらすことができ、セキュリティの強化も実現することができる。すなわち、本開示の実行時間制限技法は、コンパイラ５０が過度のＣＰＵ時間を消費するのを防ぐことができる。
【００５８】
[0061]加えて、または代替で、パスマネージャ６２は、そのサブセットが、多くのプログラムについて、過度の時間を消費することがない最適化パスを含むように、最適化パス７４のサブセットを選択することができる。すなわち、パスマネージャ６２は、最適化パス７４のうちの様々な最適化パスの統計量を記録して、実行中に消費される平均時間、ならびに、その最適化パスを実行することによって達成される最適化の相対的量（たとえば、どのくらい上手くその最適化パスがメモリ使用量を達成するか、ループを改善するか、実行速度を改善するかなど）を決定することができる。パスマネージャ６２は、次いで、ソースコードを十分に最適化することなしに過度の実行時間を消費するそれらの最適化パスをなくすることができる。
【００５９】
[0062]加えて、または代替で、最適化フェーズ中に、コンパイラ５０を実行するＣＰＵは、様々な最適化フェーズの１つまたは複数の新しいスレッドを生じさせることができる。ＣＰＵ（たとえば、ＧＰＵドライバ３０を実行する）は、コンパイルスレッドが時間制限を超えたかを検出することができ、次いで、そのスレッドが時間制限を超えたと決定したときに、そのスレッドをキルすることができる。
【００６０】
[0063]本開示の技法の実装は、大多数の状況で通常のコンパイルビヘイビアを保ちながら、コンパイル時間が高くなり過ぎたときにユーザ知覚可能な遅延を回避することができる。明白な無応答の代わりに、コンパイル時間が過度であった可能性があるとき、ユーザは、ソースコードのコンパイルに由来するプログラムがＧＰＵで（または、場合により、ＣＰＵで）高速で実行しないことを経験し得る。
【００６１】
[0064]前述のコンパイル時間リミタ技法に加えて、またはその代替で、コンパイラ５０はまた、コンパイルされることになる特定のプログラムに基づいて、実行するための最適化パス７４のサブセットを選択するように構成することができる。それによって、最適化ビヘイビア（たとえば、引数としてコンパイラに渡され得る−Ｏ２、−Ｏ３、−Ｏｓ、および−非インラインスイッチ）を修正するためにユーザに使用可能な従来のコンパイラオプションに加えて（または代替で）、パスマネージャ６２は、たとえば、ユーザ入力なしに、最適化ビヘイビアを修正するための１つまたは複数のオプションを自動的に選択することができる。言い換えれば、あらゆる入力ソースコードプログラムの最適化パスの固定のシーケンスを実行するのではなくて、オプティマイザ６０は、たとえば、コンパイルされることになるプログラムに基づいて、動的に最適化パスを実行することができる。さらに、オプティマイザ６０は、特定の順序で、複数回、様々なパラメータ、または、たとえば、コンパイルされることになるプログラムに基づく、他の修正形態で、最適化パス７４またはそのサブセットを実行することができる。
【００６２】
[0065]パスデータベース７０は、最適化パス７４の順序付けのうちの１つまたは複数、最適化パス７４のうちの１つまたは複数の最適化パスが異なるパラメータ（ならびにそのようなパスのために使用されることになるパラメータ）で複数回実行されるべきか、最適化パス７４のうちの１つまたは複数の最適化パスが飛ばされるべきかを定義するデータを含む。パスデータベース７０は、様々な構成のそのようなデータの１つまたは複数の組合せを記憶することができる。いくつかの例で、ドライバ（たとえば、図１のＧＰＵドライバ３０）は、パスデータベース７０で記憶された構成のうちの１つを選択する、または、それらの構成のうちのどれをパスデータベース７０から検索するかに関してコンパイラ５０に命令を送信することができる。加えて、パスデータベース７０はまた、実行されることになる最適化パスのうちのいずれかまたはすべての実行時間予算および／または最適化フェーズの全体的時間予算を定義するために、予算データ６６へのマッピングを含み得る。
【００６３】
[0066]最適化エンジン７２は、最適化パス７４のうちのどれが最適化パスのシーケンスで次に実行すべきかを決定するために、パスマネージャ６２と通信することができる。加えて、パススケジューラ６８は、最適化パス７４のうちの１つまたは複数の最適化パスの最適化エンジン７２へのパラメータ、たとえば、いつ最適化パス７４のうちの１つまたは複数の最適化パスが異なるパラメータで複数回実行されることになるか、を提供することができる。すなわち、コンパイラ５０（図１のＧＰＵ４２など、ＧＰＵのコンパイラに対応し得る）は、最適化パス７４のうちの１つまたは複数の最適化パスが省略され得る、最適化パス７４が様々な異なる順序で、異なる回数、および／または各パスについて異なるパラメータで実行され得るように、柔軟な形で構造化され得る。
【００６４】
[0067]好ましい最適化パス構成データは、プログラムもしくはプログラムの特性について、プログラムを実行するデバイスの特性について、および／または、１つまたは複数の現在のコンパイル目標について、具体的に定義され得る。たとえば、異なるセットの好ましい最適化パス構成データは、プログラムのソースコードをコンパイルするように構成されたデバイスがパーソナルコンピュータ、スマートフォン、タブレットコンピュータ、ラップトップコンピュータなどであるかどうかに基づいて、定義することができる。この方式で、好ましい最適化パス構成データが、好ましい最適化パス構成データがそのプログラムおよびデバイスの所望のコンパイル最適化特性をもたらすように、コンパイルを実行していることになるデバイスについて個々に調整され得る。図１に関して論じたように、好ましい最適化パス構成データは、たとえば、構成データベース３２（図１）内の、コンパイラ５０から別個に記憶することができる。
【００６５】
[0068]１つまたは複数の最適化パス７４の実行に続いて、オプティマイザ６０は、コードジェネレータ８０に最適化された中間表現を提供する。「最適化された中間表現」は、中間表現が完全に最適化されたことを必ずしも意味しないことを、理解されたい。そうではなくて、「最適化された中間表現」は、オプティマイザ６０によって処理されたものとしての、パーサ５２によって作り出された、中間表現を指すことを、理解されたい。すなわち、オプティマイザ６０は、最適化パス７４のすべてを実行していないことがあり、時期尚早に最適化パス７４のうちの１つまたは複数の最適化パスの実行を終了した可能性があり、および／または、最も最適な中間表現をもたらす最適化パス７４のうちの１つまたは複数の最適化パスのパラメータを選択していないことがある。しかし、オプティマイザ６０は、最適化フェーズが過度の時間を消費しないことを確保するためにおよび／または他のコンパイル目標、たとえば、省電力、現在のシステム負荷に従うことなど、に従うために、そのようなアクションを実行した可能性がある。
【００６６】
[0069]コードジェネレータ８０は、オプティマイザ６０から最適化された中間表現を受信し、オブジェクトコードデータ８２を使用してその最適化された中間表現をオブジェクトコードに翻訳する。オブジェクトコードデータ８２は、ＧＰＵ４２（図１）などの特定のプロセッサのために、オブジェクトコード構造、形式、内容などを定義することができる。すなわち、オブジェクトコードデータ８２は、対応するプロセッサによって実行することができる整形式のオブジェクトコードの構文および意味論を定義することができる。それによって、コードジェネレータ８０は、オブジェクトコードデータ８２を使用し、対応するプロセッサによって実行することができる形式でオブジェクトコードを生成することができる。オプティマイザ６０が最適化パスを実行するものとして記載されるが、コードジェネレータ８０もまた（すなわち、加えてまたは代替で）、１つまたは複数の最適化パスを実行するように構成され得る。
【００６７】
[0070]一例として、最適化された中間表現は、「ｄｏ−ｗｈｉｌｅ」ループを定義するデータを含み得る。オブジェクトコードデータ８２を使用する、コードジェネレータ８０は、「ｄｏ−ｗｈｉｌｅ」ループを定義するデータを、そのループ内の一連の命令、真理比較演算、および、真理比較演算が「真」値（たとえば、非ゼロ値）を返す場合に一連の命令の最初にあるアドレスをプロセッサに返させる飛越し命令に翻訳することができる。別の例として、最適化された中間表現は、「ｉｆ−ｅｌｓｅ」ステートメントを定義するデータを含み得る。オブジェクトコードデータ８２を使用する、コードジェネレータ８０は、「ｉｆ−ｅｌｓｅ」ステートメントを定義するデータを真理比較演算、真理比較演算が「真」値を産出する場合にプロセッサを第１の一連の命令のアドレスに飛び越させる第１の飛越し動作、真理比較が「偽」値を産出する場合にプロセッサを第２の一連の命令のアドレスに飛び越させる第２の飛越し動作、第２の一連の命令に続くアドレスにプロセッサを飛び越させる飛越し動作がその後に続く第１の一連の命令のデータ、および、第２の一連の命令のデータに翻訳することができる。
【００６８】
[0071]この方式で、コンピューティングデバイス１０（図１）は、ソフトウェアプログラムのコードを最適化するための最適化パスの実行のための割り当て時間を決定することと、そのコードでその最適化パスの少なくともいくつかの命令を実行することと、その最適化パスの実行のための実時間が実行のための割り当て時間を超えたという決定に応答して、その最適化パスのその後の命令の実行をプリベンティングすることとを行うように構成された、１つまたは複数のプロセッサを含むデバイスの一例を表す。
【００６９】
[0072]同様に、コンピューティングデバイス１０（図１）は、コンパイルされることになるソフトウェアプログラムのコードのための最適化パス構成データのセットを決定することと、ここにおいて、その最適化パス構成データは、コンパイル中にそのソフトウェアプログラムのための最適化パスのシーケンスを定義する、その最適化パス構成データのセットに基づいてそのソフトウェアプログラムのコードでその最適化パスのシーケンスを実行することとを行うように構成された１つまたは複数のプロセッサを含むデバイスの一例を表す。
【００７０】
[0073]図２のコンパイラ５０の例は、コンパイラ５０がＧＰＵ４２のオブジェクトコードを生成するコンパイラを表す、図１のコンピューティングデバイス１０との関連で論じられる。しかし、本開示の技法は、汎用ＣＰＵのコンパイラに同様に適用され得ることを、理解されたい。したがって、様々な例で、本開示の技法を実装するコンパイラは、ＯｐｅｎＧＬ、ＯｐｅｎＣＬ、またはＤｉｒｅｃｔＸなどのＧＰＵプログラミング言語のためのコンパイラ、ＧＬシェーディング言語（ＧＬｓｌａｎｇ）もしくはＲｅｎｄｅｒＭａｎシェーディング言語などのシェーダ言語、または、Ｃ／Ｃ＋＋、Ｃ＃、Ｒｕｂｙ、Ｆｏｒｔｒａｎ、Ｈａｓｋｅｌｌ、Ｃｙｔｈｏｎ、Ｏｂｊｅｃｔｉｖｅ−Ｃなどの一般プログラミング言語のためのコンパイラなどを備え得る。
【００７１】
[0074]図３は、本開示の技法によるコンパイルの最適化フェーズの時間予算を使用するための例示的方法を示す流れ図である。例示を目的として、図３の方法は、図１および図２の要素、たとえば、制御ユニット２０（プロセッサを含み得る）、ＧＰＵドライバ３０、およびコンパイラ５０、に関して説明される。しかし、同様の方法が、ＧＰＵではなくて、他のデバイスおよび構成要素、たとえば、汎用プロセッサのためのコードをコンパイルするための構成要素、によって実行され得ることを、理解されたい。
【００７２】
[0075]最初に、ＧＰＵドライバ３０が、コンパイルされることになるソースコードを受信することができる（１００）。図１の例で、そのソースコードは、シェーダプログラム２６のうちの１つのソースコードに対応し得る。そのソースコードは、シェーダ言語などのグラフィックスプログラミング言語に準拠し得る。様々な要因に応じて、ＧＰＵドライバ３０は、最適化時間予算、すなわち、その間にコンパイラ５０がコンパイルの最適化フェーズを実行することができる割り当て時間の量、を計算することができる（１０２）。この時間は、たとえば、５秒、１０秒などでもよく、秒、ミリ秒、クロックチックなどで表すことができる。
【００７３】
[0076]ＧＰＵドライバ３０は、たとえば、ユーザ選択、システム負荷、電力考慮事項、コンパイルされることになるプログラムの識別子、または他の要因など、１つまたは複数の様々な要因に基づいて最適化時間予算を計算することができる。ＧＰＵドライバ３０は、次いで、最適化時間予算を示すデータをコンパイラ５０に提供することができる。コンパイラ５０は、次いで、最適化パス７４のうちの１つまたは複数の最適化パスに時間予算を割り当てることができる（１０４）。いくつかの例で、コンパイラ５０は、同等に最適化パスの間で時間を割り当てることができる。最適化パスが、割り当て時間の前に終了する場合、コンパイラ５０は、１つまたは複数のその後の最適化パスに残りの時間を割り当てることができる。
【００７４】
[0077]コンパイラ５０は、次いで、ソースコードを構文解析して中間表現を形成することができる（１０６）。具体的には、パーサ５２は、中間表現を形成するとき、トークナイザ５４を使用してソースコードからトークンを検索し、グラマ５８を使用してそのトークンから意味論を決定することができる。中間表現は、ソースコードを表すコンパイラ５０のメモリで記憶された１つまたは複数のデータ構造体を備え得る。パーサ５２は、次いで、最適化のためにオプティマイザ６０に中間表現を提供することができる。
【００７５】
[0078]オプティマイザ６０は、最適化時間予算の割振りに従って、パスマネージャ６２に最適化エンジン７２を管理させることができる。パスマネージャ６２は、最初に最適化エンジン７２に第１の最適化パスを開始させ（１０８）、第１の最適化パスのための最適化時間予算の割り振られた部分に対応するタイマを始動させることができる。最適化エンジン７２は、次いで、その最適化パスの１つまたは複数の命令を実行することができる（１１０）。最適化エンジン７２は、次いで、その命令がその最適化パスの最後の命令であるかどうかを決定することができる（１１２）。実行された命令が、最後の命令ではない場合（１１２の「いいえ」分岐）、最適化エンジン７２は、現在の最適化パスのための実行時間が現在の最適化パスの実行のための割り当て時間を超えたかどうかに関してパスマネージャ６２に照会することができる（１１４）。
【００７６】
[0079]現在のパスのための実行時間が、現在の最適化パスのための割り当て時間を超えていない場合（１１４の「いいえ」分岐）、最適化エンジン７２は、現在の最適化パスの１つまたは複数のその後の命令を続けて実行することができる（１１０）。他方で、前に実行された命令がその最適化パスの最後の命令であった場合（１１２の「はい」分岐）、あるいは、現在のパスのための実行時間が現在の最適化パスのための割り当て時間を超えた場合（１１４の「はい」分岐）、最適化エンジン７２は、その最適化パスを終了させることができ、そして、パスマネージャ６２は、前の最適化パスが実行されるべき最後の最適化パスであったかどうかを決定することができる（１１６）。この方式で、最適化パスの実行のための実時間がその最適化パスの実行のための割り当て時間を超えた場合（１１４の「はい」分岐により）、コンパイラ５０は、その最適化パスのその後の命令の実行を防ぐことができる。
【００７７】
[0080]図３の例で、パスマネージャ６２は、最適化パスのための実行時間がその最適化パスのための割り当て時間を超えた後に、その最適化パスの実行を終了する。しかし、他の例で、パスマネージャ６２は、１つまたは複数の最適化パスが割り当て時間を超えることと、１つまたは複数のその後の最適化パスのために割り当て時間を調整してその差を埋め合わせることとを可能にし得ることを、理解されたい。したがって、パスマネージャ６２は、現在の（および／または１つまたは複数の前の）最適化パスの実行のための実時間に基づいて１つまたは複数のその後の最適化パスのための割り当て時間を調整するように構成され得る。
【００７８】
[0081]前の最適化パスが最後の最適化パスではなかった場合（１１６の「いいえ」分岐）、パスマネージャ６２は、最適化エンジン７２に次の最適化パスを始めさせ（１０８）、この次の最適化パスに割り当て時間の量のためのタイマを再始動させることができる。他方では、最後の最適化パスを実行した後（１１６の「はい」分岐）、オプティマイザ６０は、最適化された中間表現からオブジェクトコードを生成することができるコードジェネレータ８０にその最適化された中間表現を提供することができる（１１８）。コンパイラ５０は、次いで、たとえば、ＧＰＵ４２（図１）に生成されたコードを提供することによって、生成されたコードを出力することができる（１２０）。
【００７９】
[0082]この方式で、図３の方法は、ソフトウェアプログラムのコード（たとえば、コンパイルされることになるコードの中間表現）を最適化するための最適化パスの実行のための割り当て時間を決定することと、そのコンパイルされたコードで最適化パスの少なくともいくつかの命令を実行することと、その最適化パスの実行のための実時間が実行のための割り当て時間を超えたという決定に応答して、その最適化パスのその後の命令の実行を防ぐこととを含む、方法の一例を表す。本方法はさらに、最適化されたコードからソフトウェアプログラムのためのコンパイルされたコード（すなわち、オブジェクトコード）を生成することを含み得る。
【００８０】
[0083]図４は、本開示の技法によるコンパイラを動的に構成するための例示的方法を示す流れ図である。例示を目的として、図４の方法は、図１および図２の要素、たとえば、制御ユニット２０（プロセッサを含み得る）、ＧＰＵドライバ３０、およびコンパイラ５０、に関して説明される。しかし、同様の方法が、他のデバイスおよび構成要素、たとえば、ＧＰＵではなくて、汎用プロセッサのためのコードをコンパイルするための構成要素、によって実行され得ることを、理解されたい。
【００８１】
[0084]ＧＰＵドライバ３０は、構成データベース３２が更新されるべきかどうかを定期的に決定するように構成することができる。たとえば、ＧＰＵドライバ３０は、毎月、毎週、毎日、または他の間隔で、構成データベース３２の更新をチェックするように構成することができる。したがって、ＧＰＵドライバ３０は、更新された構成データが、たとえば、ネットワークの場所でアクセス可能であり得る、構成データベースから、使用可能であるかどうかを決定することができる（１５０）。更新された構成データが使用可能である場合（１５０の「はい」分岐）、ＧＰＵドライバ３０は、たとえば、ネットワークの場所から、更新された構成データを検索することができる（１５２）。たとえば、ＧＰＵドライバ３０は、シェーダプログラム２６のいずれかまたはすべてなど、前にコンパイルされたまたは今後コンパイルされることになる様々なプログラムの記録を構成データベース３２で保持することができる。ＧＰＵドライバ３０はまた、検索された更新された最適化情報で構成データベース３２を更新することができる。
【００８２】
[0085]更新された構成データが使用可能でない場合（１５０の「いいえ」分岐）、または構成データベース３２を更新した後、ＧＰＵドライバ３０は、コンパイルされることになるプログラムのソースコードを受信することができる（１５４）。そのソースコードは、図１および図２の例で、シェーダプログラム２６のうちの１つに対応し得る。ＧＰＵドライバ３０はさらに、コンパイルされることになるプログラムの識別を決定することができる（１５６）。たとえば、ＧＰＵドライバ３０は、そのプログラムの名、そのプログラムのハッシュ、またはそのプログラムの他の識別情報を決定することができる。ＧＰＵドライバ３０は、次いで、プログラム識別に基づいて、最適化構成情報を決定することができる（１５８）。加えてまたは代替で、ＧＰＵドライバ３０は、たとえば、そのプログラムが書かれた言語、そのプログラムのファイルのファイル名の拡張子など、そのプログラムの識別特性に基づいて、最適化構成情報を決定することができる。
【００８３】
[0086]すなわち、ＧＰＵドライバ３０は、コンパイルされることになるプログラムの決定された識別を使用して構成データベース３２を照会し、構成データベース３２がそのプログラムの識別と関連付ける構成情報でコンパイラ５０を構成することができる。この情報は、たとえば、最適化パス７４のうちのどれがそのプログラムを実行するか、最適化パス７４のうちのいずれかが複数回実行されるべきかどうか、実行されることになる最適化パスのパラメータ、最適化パスが実行されることになる順番などを示し得る。加えて、その構成情報は、前述で図３に関して論じられたように使用することができるコンパイルの最適化フェーズを実行するための時間予算を、示すことができる、あるいは、ＧＰＵドライバ３０がその時間予算を決定することができる。
【００８４】
[0087]前述のようにコンパイラ５０を構成した後、ＧＰＵドライバ３０は、コンパイルのためにコンパイラ５０にそのプログラムのソースコードを提供することができる。それによって、パーサ５２は、そのソースコードを受信し、そのソースコードを構文解析して中間表現を形成することができる（１６０）。具体的には、パーサ５２は、中間表現を形成するとき、トークナイザ５４を使用してそのソースコードからトークンを検索すること、およびグラマ５８を使用してそのトークンの意味論を決定することができる。その中間表現は、そのソースコードを表すコンパイラ５０のメモリで記憶された１つまたは複数のデータ構造体を備え得る。パーサ５２は、次いで、最適化のためのオプティマイザ６０にその中間表現を提供することができる。
【００８５】
[0088]オプティマイザ６０は、たとえば、パスデータベース７０で記憶されたものとしての最適化のための構成情報を決定することができる。この情報は、前述のように、最適化パス７４のうちのどれが実行されることになるかを指示することができる。それによって、パスマネージャ６２は、パスデータベース７０から、最適化パス７４のうちのどれが実行されることになるか、それらの最適化パスが実行されるべき順序、最適化パスを実行するためのパラメータ、ある特定の最適化パスが複数回実行されるべきかどうかなどを決定することができる。この方式で、パスマネージャ６２は、最適化構成情報を使用して実行するための最適化パスのセットを決定することができる（１６２）。いくつかの例で、１つまたは複数の最適化パス７４は、それぞれのパスのビヘイビアを変更するパラメータを受け付けることができる。たとえば、そのようなパラメータは、最適化パスのためのアンロール要因またはスケジューリング戦略を指定することができる。そのような場合、パスマネージャ６２は、パスマネージャ６２がどのパスが実行されることになるかを選択する方式と実質的に同様の方式で適切なパラメータを選択することができる。すなわち、パスデータベース７０は、最適化パス７４に渡されることになる様々なパラメータの値を定義するデータを含み得る。
【００８６】
[0089]パススケジューラ６８は、実行するための決定された最適化パスのうちの第１の最適化パスをスケジュールすることができるので、パススケジューラ６８は、次いで、次の最適化パスを始めることができ（１６４）、そして、最適化エンジン７２は、最適化パスを実行することができる。すなわち、最適化エンジン７２は、最適化構成情報によって決定されたものとしての最適化パスのパラメータを使用して、最適化パスの実行を介してプログラムの受信された中間表現を修正することができる。最適化パスの実行を終了した後、パスマネージャ６２は、最近完了した最適化パスが最後のパスであったかどうかを決定することができる（１６６）。
【００８７】
[0090]最近完了した最適化パスが最後のパスでなかった場合（１６６の「いいえ」分岐）、パスマネージャ６２は、最適化エンジン７２にその後の最適化パスを実行させることができる。他方で、最近完了した最適化パスが最後のパスであった場合（１６６の「はい」分岐）、パスマネージャ６２は、オプティマイザ６０に最適化された中間表現をコードジェネレータ８０に提供させることができる。加えて、図３に関して論じたように、パスマネージャ６２はまた、最適化フェーズの時間予算を保持することができ、決定された最適化パスのうちのすべてが完了していなくても時間予算が終了した後にコードジェネレータ８０に最適化された中間表現を提供することができる。オプティマイザ６０が、概して、最適化パスを実行するものとして説明されるが、コードジェネレータ８０もまた（すなわち、加えてまたは代替で）、最適化パスを実行するように構成することができることを理解されたい。この方式で、コードジェネレータ８０は、本開示の技法のうちの１つまたは複数を実装するように構成することができる。
【００８８】
[0091]コードジェネレータ８０が最適化された中間表現を取得した後（または、コードジェネレータ８０が中間表現を最適化した後）、コードジェネレータ８０は、最適化された中間表現からオブジェクトコードを生成することができる（１６８）。オブジェクトコードを生成することは、図３のステップ１１８の論考に実質的に対応し得る。コードジェネレータ８０はまた、たとえば、ＧＰＵ４２に、生成されたコードを出力することができる（１７０）。
【００８９】
[0092]この方式で、図４の方法は、コンパイルされることになるプログラムの最適化パス構成データのセットを決定することと、ここにおいて、最適化パス構成データはコンパイル中にそのプログラムの最適化パスのシーケンスを定義する、その最適化パス構成データのセットに基づいてそのプログラムのコードで最適化パスのシーケンスを実行することとを含む、方法の一例を表す。
【００９０】
[0093]例として、そして限定ではなく、そのようなコンピュータ可読記憶媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ（登録商標）、ＣＤ−ＲＯＭまたは他の光ディスク記憶装置、磁気ディスク記憶装置、または他の磁気記憶デバイス、フラッシュメモリ、あるいは、命令またはデータ構造体の形式で所望のプログラムコードを記憶するために使用され得るおよびコンピュータによってアクセスされ得る任意の他の媒体を備え得る。また、任意の接続が、適切にコンピュータ可読媒体と呼ばれる。たとえば、命令が、同軸ケーブル、光ファイバケーブル、ツイストペア、デジタル加入者線（ＤＳＬ）、あるいは、赤外線、無線、およびマイクロ波などのワイヤレス技術を使用して、ウェブサイト、サーバ、または他の遠隔ソースから送信される場合、そのとき、同軸ケーブル、光ファイバケーブル、ツイストペア、ＤＳＬ、あるいは、赤外線、無線、およびマイクロ波などのワイヤレス技術が、媒体の定義に含まれる。しかし、コンピュータ可読記憶媒体およびデータ記憶媒体は、接続、搬送波、信号または他の一時的媒体を含まないが、その代わりに、非一時的、有形記憶媒体を対象とすることを、理解されたい。本明細書で、ディスク（ｄｉｓｋおよびｄｉｓｃ）は、コンパクトディスク（ｄｉｓｃ）（ＣＤ）、レーザーディスク（登録商標）（ｄｉｓｃ）、光ディスク（ｄｉｓｃ）、デジタル多用途ディスク（ｄｉｓｃ）（ＤＶＤ）、フロッピー（登録商標）ディスク（ｄｉｓｋ）およびブルーレイ（登録商標）ディスク（ｄｉｓｃ）を含み、ディスク（ｄｉｓｋ）は、通常は、磁気的にデータを再生し、ディスク（ｄｉｓｃ）は、レーザーで光学的にデータを再生する。前述の組合せもまた、コンピュータ可読媒体の範囲内に含まれるべきである。
【００９１】
[0094]命令は、１つまたは複数のデジタル信号プロセッサ（ＤＳＰ）、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルロジックアレイ（ＦＰＧＡ）、または他の同等の統合されたもしくは離散的論理回路など、１つまたは複数のプロセッサによって実行することができる。したがって、本明細書で、「プロセッサ」という用語は、前述の構造体または本明細書に記載の技法の実装に適した任意の他の構造体のいずれかを示し得る。加えて、いくつかの態様で、本明細書に記載の機能は、符号化および復号のために構成された専用ハードウェアおよび／またはソフトウェアモジュール内で提供され得る、あるいは結合されたコーデックに組み込むことができる。また、本技法は、１つまたは複数の回路または論理要素で完全に実装することができる。
【００９２】
[0095]本開示の技法は、ワイヤレスハンドセット、集積回路（ＩＣ）またはＩＣのセット（たとえば、チップセット）を含む、多種多様なデバイスまたは装置で実装することができる。様々な構成要素、モジュール、またはユニットが、開示される技法を実行するように構成されたデバイスの機能的態様を強調するために本開示で説明されるが、異なるハードウェアユニットによる実現を必ずしも必要としない。そうではなくて、前述のように、様々なユニットは、コーデックハードウェアユニットで結合され得る、または、適切なソフトウェアおよび／またはファームウェアとともに、前述のように１つまたは複数のプロセッサを含む、相互に動作するハードウェアユニットの一群によって提供され得る。
【００９３】
[0096]様々な例が、記載された。これらのおよび他の例は、次の特許請求の範囲の範囲内にある。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］
ソフトウェアプログラムのコードを最適化するための最適化パスの実行のための割り当て時間を決定することと、
前記コードで前記最適化パスの少なくともいくつかの命令を実行することと、
前記最適化パスの実行のための実時間が実行のための前記割り当て時間を超えたという決定に応答して、前記最適化パスのその後の命令の実行を防ぐことと
を備える、方法。
［Ｃ２］
前記最適化パスが、複数の最適化パスのうちの第２の最適化パスを備え、そして、前記第２の最適化パスの実行のための実時間が、実行のための第２の実時間を備え、前記方法がさらに、
前記最適化パスの第１の最適化パスの実行のための第１の実時間を決定すること
を備え、ここにおいて、前記実行のための割り当て時間を決定することが、前記第１の最適化パスの実行のための前記第１の実時間に少なくとも部分的に基づいて前記第２の最適化パスの前記実行のための割り当て時間を決定することを備える、Ｃ１に記載の方法。
［Ｃ３］
前記実行のための割り当て時間を決定することがさらに、実行のための前記第１の実時間が前記第１の最適化パスの実行のための予算の時間を超えたかどうかを決定することを備える、Ｃ２に記載の方法。
［Ｃ４］
前記割り当て時間を決定することが、前記最適化パスの優先度、全体の最適化時間予算内の残りの時間の量、前記最適化パスを実行するデバイスの電力状態、前記プログラムの最適化に割り当てられる重要性値、およびユーザ選択のうちの少なくとも１つに基づいて前記割り当て時間を決定することを備える、Ｃ１に記載の方法。
［Ｃ５］
実行のための前記実時間に基づいて１つまたは複数のその後の最適化パスのための割り当て時間を調整することをさらに備える、Ｃ１に記載の方法。
［Ｃ６］
前記最適化パスが、現在の最適化パスを備え、
前記現在の最適化パスを含む複数の最適化パスを実行するための時間予算を決定することと、
前記複数の最適化パスに前記時間予算の部分を割り当てることと
をさらに備える、Ｃ１に記載の方法。
［Ｃ７］
前記最適化パスが、現在の最適化パスを備え、
前記現在の最適化パスの実行に先立って、
前記ソフトウェアプログラムの前記コードのための最適化パス構成データのセットを決定することと、ここにおいて、前記最適化パス構成データは、コンパイル中に前記プログラムの最適化パスのシーケンスを定義し、ここにおいて、最適化パスの前記シーケンスは前記現在の最適化パスを含む、
最適化パスの前記シーケンスを実行するための時間予算を決定することと、
前記現在の最適化パスが前記シーケンス内の最後の最適化パスではないときに、および前記現在の最適化パスの実行を終了した後に、前記最適化パス構成データのセットに基づいて最適化パスの前記シーケンス内の次の最適化パスを実行することと
をさらに備える、Ｃ１に記載の方法。
［Ｃ８］
前記コードで前記最適化パスの少なくともいくつかの命令を実行することが、最適化されたコードを作り出し、前記方法がさらに、前記最適化されたコードから前記ソフトウェアプログラムのオブジェクトコードを生成することを備える、Ｃ１に記載の方法。
［Ｃ９］
ソフトウェアプログラムのコードを最適化するための最適化パスの実行のための割り当て時間を決定することと、前記コードで前記最適化パスの少なくともいくつかの命令を実行することと、前記最適化パスの実行のための実時間が実行のための前記割り当て時間を超えたという決定に応答して、前記最適化パスのその後の命令の実行をプリベンティングすることとを行うように構成された１つまたは複数のプロセッサを備える、デバイス。
［Ｃ１０］
前記最適化パスが、複数の最適化パスのうちの第２の最適化パスを備え、そして、前記第２の最適化パスの実行のための実時間が、実行のための第２の実時間を備え、そして、前記１つまたは複数のプロセッサがさらに、前記最適化パスの第１の最適化パスの実行のための第１の実時間を決定することと、前記第１の最適化パスの実行のための前記第１の実時間に少なくとも部分的に基づいて前記第２の最適化パスの実行のための割り当て時間を決定することとを行うように構成された、Ｃ９に記載のデバイス。
［Ｃ１１］
実行のための前記割り当て時間を決定するために、前記１つまたは複数のプロセッサがさらに、実行のための前記第１の実時間が前記第１の最適化パスの実行のための予算時間を超えたかどうかを決定するように構成された、Ｃ１０に記載のデバイス。
［Ｃ１２］
前記１つまたは複数のプロセッサが、前記最適化パスの優先度、全体の最適化時間予算内の残りの時間の量、前記デバイスの電力状態、前記プログラムの最適化に割り当てられる重要性値、およびユーザ選択のうちの少なくとも１つに基づいて前記割り当て時間を決定するように構成された、Ｃ９に記載のデバイス。
［Ｃ１３］
前記１つまたは複数のプロセッサがさらに、実行のための前記実時間に基づいて１つまたは複数のその後の最適化パスのための割り当て時間を調整するように構成された、Ｃ９に記載のデバイス。
［Ｃ１４］
前記最適化パスが、現在の最適化パスを備え、そして、前記１つまたは複数のプロセッサがさらに、前記現在の最適化パスを含む複数の最適化パスを実行するための時間予算を決定することと、前記複数の最適化パスに前記時間予算の部分を割り当てることとを行うように構成された、Ｃ９に記載のデバイス。
［Ｃ１５］
前記最適化パスが、現在の最適化パスを備え、そして、前記１つまたは複数のプロセッサがさらに、前記現在の最適化パスの実行に先立って、前記ソフトウェアプログラムの前記コードのための最適化パス構成データのセットを決定することと、ここにおいて、前記最適化パス構成データは、コンパイル中に前記プログラムの最適化パスのシーケンスを定義し、ここにおいて、最適化パスの前記シーケンスは前記現在の最適化パスを含む、最適化パスの前記シーケンスを実行するための時間予算を決定することとを行うように構成され、ここにおいて、前記現在の最適化パスが前記シーケンス内の最後の最適化パスではないときおよび前記現在の最適化パスの実行を終了した後に、前記１つまたは複数のプロセッサが、前記最適化パス構成データの前記セットに基づいて最適化パスの前記シーケンス内の次の最適化パスを実行するように構成された、Ｃ９に記載のデバイス。
［Ｃ１６］
グラフィックス処理ユニット（ＧＰＵ）をさらに備え、ここにおいて、前記ソフトウェアプログラムが前記ＧＰＵのためのシェーダプログラムを備え、そして、前記１つまたは複数のプロセッサが、前記ＧＰＵに前記シェーダプログラムのためのコンパイルされたコードを提供するように構成された、Ｃ９に記載のデバイス。
［Ｃ１７］
ソフトウェアプログラムのコードを最適化するための最適化パスの実行のための割り当て時間を決定するための手段と、
前記コードで前記最適化パスの少なくともいくつかの命令を実行するための手段と、
前記最適化パスの実行のための実時間が実行のための割り当て時間を超えたという決定に応答して、前記最適化パスのその後の命令の実行を防ぐための手段と
を備える、デバイス。
［Ｃ１８］
前記最適化パスが、複数の最適化パスのうちの第２の最適化パスを備え、そして、前記第２の最適化パスの実行のための実時間が、実行のための第２の実時間を備え、
前記最適化パスのうちの第１の最適化パスの実行のための第１の実時間を決定するための手段
をさらに備え、ここにおいて、実行のための前記割り当て時間を決定するための前記手段が、前記第１の最適化パスの実行のための前記第１の実時間に少なくとも部分的に基づいて前記第２の最適化パスの実行のための割り当て時間を決定するための手段を備える、Ｃ１７に記載のデバイス。
［Ｃ１９］
前記実行のための割り当て時間を決定するための前記手段が、実行のための前記第１の実時間が前記第１の最適化パスの実行のための予算時間を超えたかどうかを決定するための手段をさらに備える、Ｃ１８に記載のデバイス。
［Ｃ２０］
前記割り当て時間を決定するための前記手段が、前記最適化パスの優先度、全体の最適化時間予算内の残りの時間の量、前記最適化パスを実行するデバイスの電力状態、前記プログラムの最適化に割り当てられる重要性値、およびユーザ選択のうちの少なくとも１つに基づいて前記割り当て時間を決定するための手段を備える、Ｃ１７に記載のデバイス。
［Ｃ２１］
実行のための前記実時間に基づいて１つまたは複数のその後の最適化パスのための割り当て時間を調整するための手段をさらに備える、Ｃ１７に記載のデバイス。
［Ｃ２２］
前記最適化パスが、現在の最適化パスを備え、
前記現在の最適化パスを含む複数の最適化パスを実行するための時間予算を決定するための手段と、
前記複数の最適化パスに前記時間予算の部分を割り当てるための手段と
さらに備える、Ｃ１７に記載のデバイス。
［Ｃ２３］
前記最適化パスが、現在の最適化パスを備え、
前記現在の最適化パスの実行に先立って、前記ソフトウェアプログラムの前記コードのための最適化パス構成データのセットを決定するための手段と、ここにおいて、前記最適化パス構成データは、コンパイル中に前記プログラムの最適化パスのシーケンスを定義し、ここにおいて、最適化パスの前記シーケンスは前記現在の最適化パスを含む、
最適化パスの前記シーケンスを実行するための時間予算を決定するための手段と、
前記現在の最適化パスが前記シーケンス内の最後の最適化パスではないときにおよび前記現在の最適化パスの実行を終了した後に、最適化パス構成データの前記セットに基づいて最適化パスの前記シーケンス内の次の最適化パスを実行するための手段と
をさらに備える、Ｃ１７に記載のデバイス。
［Ｃ２４］
実行されるときに、プロセッサに
ソフトウェアプログラムのコードを最適化するための最適化パスの実行のための割り当て時間を決定することと、
前記コードで前記最適化パスの少なくともいくつかの命令を実行することと、
前記最適化パスの実行のための実時間が実行のための割り当て時間を超えたという決定に応答して、前記最適化パスのその後の命令の実行を防ぐことと
を行わせる命令がそこに記憶された、コンピュータ可読記憶媒体。
［Ｃ２５］
前記最適化パスが、複数の最適化パスのうちの第２の最適化パスを備え、そして、前記第２の最適化パスの実行のための実時間が実行のための第２の実時間を備え、前記プロセッサに
前記最適化パスの第１の最適化パスの実行のための第１の実時間を決定させる
命令をさらに備え、
ここにおいて、前記プロセッサに実行のための前記割り当て時間を決定させる前記命令が、前記プロセッサに前記第１の最適化パスの実行のための前記第１の実時間に少なくとも部分的に基づいて前記第２の最適化パスの実行のための前記割り当て時間を決定させる命令を備える
Ｃ２４に記載のコンピュータ可読記憶媒体。
［Ｃ２６］
前記プロセッサに実行のための前記割り当て時間を決定させる前記命令がさらに、実行のための前記第１の実時間が前記第１の最適化パスの実行のための期待された時間を超えたかどうかを前記プロセッサに決定させる命令を備える、Ｃ２５に記載のコンピュータ可読記憶媒体。
［Ｃ２７］
前記割り当て時間を前記プロセッサに決定させる前記命令が、前記最適化パスの優先度、全体の最適化時間予算内の残りの時間の量、前記最適化パスを実行するデバイスの電力状態、前記プログラムの最適化に割り当てられる重要性値、およびユーザ選択のうちの少なくとも１つに基づいて前記割り当て時間を前記プロセッサに決定させる命令を備える、Ｃ２４に記載のコンピュータ可読記憶媒体。
［Ｃ２８］
実行のための前記実時間に基づいて１つまたは複数のその後の最適化パスのための割り当て時間を前記プロセッサに調整させる命令をさらに備える、Ｃ２４に記載のコンピュータ可読記憶媒体。
［Ｃ２９］
前記最適化パスが、現在の最適化パスを備え、
前記現在の最適化パスを含む複数の最適化パスを実行するための時間予算を決定することと、
前記時間予算の部分を前記複数の最適化パスに割り当てることと
を前記プロセッサに行わせる命令をさらに備える、Ｃ２４に記載のコンピュータ可読記憶媒体。
［Ｃ３０］
前記最適化パスが、現在の最適化パスを備え、
前記現在の最適化パスの実行に先立って、
前記ソフトウェアプログラムの前記コードのための最適化パス構成データのセットを決定することと、ここにおいて、前記最適化パス構成データはコンパイル中に前記プログラムの最適化パスのシーケンスを定義し、ここにおいて、最適化パスの前記シーケンスは前記現在の最適化パスを含む、
最適化パスの前記シーケンスを実行するための時間予算を決定することと、
前記現在の最適化パスが前記シーケンス内の最後の最適化パスではないときにおよび前記現在の最適化パスの実行を終了した後に、最適化パス構成データの前記セットに基づいて最適化パスの前記シーケンス内の次の最適化パスを実行することと
を前記プロセッサに行わせる命令をさらに備える、Ｃ２４に記載のコンピュータ可読記憶媒体。
【図１】
0005985766.tif 000002
【図２】
0005985766.tif 000003
【図３】
0005985766.tif 000004
【図４】
0005985766.tif 000005