(57)【特許請求の範囲】
【請求項１】
低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルする方法であって、
コンピューティングデバイスを用いて、１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別することと、ここにおいて前記１つまたは複数のテクスチャロード命令の実行がテクスチャをメモリにロードさせる、ここにおいてＨＬ  ＣＦ命令の前記セットが１つまたは複数の分岐を備える、
前記１つまたは複数の関連するテクスチャロード命令が、前記１つまたは複数の分岐に関連するテクスチャロード命令の数に関して対称であるか、ほぼ対称であるかを判断することと、
前記１つまたは複数のテクスチャロード命令が対称またはほぼ対称であるという判断結果に基づいて、前記コンピューティングデバイスを用いて、ＨＬ  ＣＦ命令の前記識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換することと、ここにおいて前記述語構造を有する前記ＬＬ命令は分岐することなしに実行可能である、
前記１つまたは複数のテクスチャロード命令が対称またはほぼ対称ではないという判断結果に基づいて、前記ＨＬ  ＣＦ命令が変換されないように、ＨＬ  ＣＦ命令の前記識別されたセットを変換することを控えることと、
前記述語構造を有する前記変換されたＬＬ命令またはＨＬ  ＣＦ命令の前記変換されていないセットを出力することとを備える、方法。
【請求項２】
前記１つまたは複数のテクスチャロード命令の実行が、前記テクスチャをグラフィックス処理ユニットのローカルメモリに転送させる、請求項１に記載の方法。
【請求項３】
前記ＨＬ  ＣＦ命令を変換することが、前記変換された低レベル命令の無条件直列実行を可能にするために前記１つまたは複数の分岐を削除することを備える、請求項１に記載の方法。
【請求項４】
前記１つまたは複数の関連するテクスチャロード命令が対称であるか、ほぼ対称であるかを判断することが、前記１つまたは複数の分岐の各分岐に関連する等しい数のテクスチャロード命令を識別することを備える、請求項１に記載の方法。
【請求項５】
ＨＬ  ＣＦ命令の前記識別されたセットを変換することが、ＬＬ命令のセットを生成することを備え、ここにおいてＬＬ命令の前記セットの実行が、選択関数の結果に基づいてアドレスを割り当てさせ、前記割り当てられたアドレスからテクスチャをロードさせる、請求項１に記載の方法。
【請求項６】
ＨＬ  ＣＦ命令の前記セットを識別することが、条件を有するＩＦ−ＥＬＳＥ文を識別することを備え、ここにおいて前記条件が真である場合、ＨＬ  ＣＦ命令の前記セットが第１のメモリアドレスからテクスチャをロードさせ、前記条件が偽である場合、ＨＬ  ＣＦ命令の前記セットが第２のメモリアドレスから前記テクスチャをロードさせる、請求項１に記載の方法。
【請求項７】
ＨＬ  ＣＦ命令の前記セットを変換することが、ＬＬ命令のセットを生成することを備え、ここにおいてＬＬ命令の前記セットが、前記条件の結果に基づいてアドレスを予約させ、前記予約されたアドレスから前記テクスチャをロードさせる、請求項６に記載の方法。
【請求項８】
前記変換されたＬＬ命令を出力することが、前記変換されたＬＬ命令をメモリに記憶することを備える、請求項１に記載の方法。
【請求項９】
前記ＨＬ命令を変換することが、前記ＬＬ命令を生成するために前記ＨＬ命令をランタイムコンパイルすることを備え、グラフィックス処理ユニット上で前記出力されたＬＬ命令を実行することをさらに備える、請求項１に記載の方法。
【請求項１０】
前記出力されたＬＬ命令を実行することが、前記コンパイルされた命令を、前記ＨＬ  ＣＦ命令の条件と前記出力されたＬＬ命令の座標とが依存しない命令より前に実行されるようにスケジュールすることを備える、請求項９に記載の方法。
【請求項１１】
低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルするための装置であって、
１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別することと、ここにおいて前記１つまたは複数のテクスチャロード命令の実行がテクスチャをメモリにロードさせる、ここにおいてＨＬ  ＣＦ命令の前記セットが１つまたは複数の分岐を備える、
前記１つまたは複数の関連するテクスチャロード命令が、前記１つまたは複数の分岐に関連するテクスチャロード命令の数に関して対称であるか、ほぼ対称であるかを判断することと、
前記１つまたは複数のテクスチャロード命令が対称またはほぼ対称であるという判断結果に基づいて、ＨＬ  ＣＦ命令の前記識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換することと、ここにおいて前記述語構造を有する前記ＬＬ命令は、分岐することなしに実行される、
前記１つまたは複数のテクスチャロード命令が対称またはほぼ対称ではないという判断結果に基づいて、前記ＨＬ  ＣＦ命令が変換されないように、ＨＬ  ＣＦ命令の前記識別されたセットを変換することを控えることと、
前記述語構造を有する前記変換された（ＬＬ）命令またはＨＬ  ＣＦ命令の前記変換されていないセットを出力することと
を行うように構成された１つまたは複数の処理ユニットを備える、装置。
【請求項１２】
ローカルメモリをさらに備え、前記１つまたは複数のテクスチャロード命令の実行が、前記テクスチャを前記装置のローカルメモリに転送させる、請求項１１に記載の装置。
【請求項１３】
前記ＨＬ  ＣＦ命令を変換するために、前記１つまたは複数のプロセッサが、前記変換された低レベル命令の無条件直列実行を可能にするために前記１つまたは複数の分岐を削除するように構成された、請求項１１に記載の装置。
【請求項１４】
前記１つまたは複数の関連するテクスチャロード命令が対称であるか、ほぼ対称であるかを判断するために、前記１つまたは複数の処理ユニットが、前記１つまたは複数の分岐の各分岐に関連する等しい数のテクスチャロード命令を識別するように構成された、請求項１１に記載の装置。
【請求項１５】
ＨＬ  ＣＦ命令の前記識別されたセットを変換するために、前記１つまたは複数のプロセッサが、ＬＬ命令のセットを生成するように構成され、ＬＬ命令の前記セットの実行が、選択関数の結果に基づいてアドレスを割り当てさせ、前記割り当てられたアドレスからテクスチャをロードさせる、請求項１１に記載の装置。
【請求項１６】
ＨＬ  ＣＦ命令の前記セットを識別するために、前記１つまたは複数のプロセッサが、条件を有するＩＦ−ＥＬＳＥ文を識別するように構成され、前記条件が真である場合、ＨＬ  ＣＦ命令の前記セットが第１のメモリアドレスからテクスチャをロードさせ、前記条件が偽である場合、ＨＬ  ＣＦ命令の前記セットが第２のメモリアドレスから前記テクスチャをロードさせる、請求項１１に記載の装置。
【請求項１７】
ＨＬ  ＣＦ命令の前記セットを変換するために、前記１つまたは複数のプロセッサが、ＬＬ命令のセットを生成するように構成され、ＬＬ命令の前記セットが、前記条件の結果に基づいてアドレスを予約させ、前記予約されたアドレスから前記テクスチャをロードさせる、請求項１６に記載の装置。
【請求項１８】
前記変換されたＬＬ命令を出力するために、前記１つまたは複数のプロセッサが、前記変換されたＬＬ命令をメモリに記憶するように構成された、請求項１１に記載の装置。
【請求項１９】
前記ＨＬ命令を変換するために、前記１つまたは複数のプロセッサが、前記ＬＬ命令を生成するために前記ＨＬ命令をランタイムコンパイルするように構成され、前記出力されたＬＬ命令を実行することをさらに備える、請求項１１に記載の装置。
【請求項２０】
前記出力されたＬＬ命令を実行するために、前記１つまたは複数のプロセッサが、前記コンパイルされた命令を、前記ＨＬ  ＣＦ命令の条件と前記出力されたＬＬ命令の座標とが依存しない命令より前に実行されるようにスケジュールするように構成された、請求項１９に記載の装置。
【請求項２１】
低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルするためのコンピュータプログラムであって、実行されたとき、
１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別することと、ここにおいて前記１つまたは複数のテクスチャロード命令の実行がテクスチャをメモリにロードさせる、ここにおいてＨＬ  ＣＦ命令の前記セットが１つまたは複数の分岐を備える、
前記１つまたは複数の関連するテクスチャロード命令が、前記１つまたは複数の分岐に関連するテクスチャロード命令の数に関して対称であるか、ほぼ対称であるかを判断することと、
前記１つまたは複数のテクスチャロード命令が対称またはほぼ対称であるという判断結果に基づいて、ＨＬ  ＣＦ命令の前記識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換することと、ここにおいて前記述語構造を有する前記ＬＬ命令は分岐することなしに実行される、
前記１つまたは複数のテクスチャロード命令が対称またはほぼ対称ではないという判断結果に基づいて、前記ＨＬ  ＣＦ命令が変換されないように、ＨＬ  ＣＦ命令の前記識別されたセットを変換することを控えることと、
前記述語構造を有する前記変換された（ＬＬ）命令またはＨＬ  ＣＦ命令の前記変換されていないセットを出力することと
を１つまたは複数のプロセッサに行わせる命令を備える、コンピュータプログラム。
【請求項２２】
前記１つまたは複数のテクスチャロード命令の実行が、前記テクスチャをグラフィックス処理ユニットのローカルメモリに転送させる、請求項２１に記載のコンピュータプログラム。
【請求項２３】
前記ＨＬ  ＣＦ命令を変換することが、前記変換された低レベル命令の無条件直列実行を可能にするために前記１つまたは複数の分岐を削除することを備える、請求項２１に記載のコンピュータプログラム。
【請求項２４】
前記１つまたは複数の関連するテクスチャロード命令が対称であるか、ほぼ対称であるかを判断することために、前記命令が、前記１つまたは複数のプロセッサに、前記１つまたは複数の分岐の各分岐に関連する等しい数のテクスチャロード命令を識別させる、請求項２１に記載のコンピュータプログラム。
【請求項２５】
ＨＬ  ＣＦ命令の前記識別されたセットを変換することが、ＬＬ命令のセットを生成することを備え、ここにおいてＬＬ命令の前記セットの実行が、選択関数の結果に基づいてアドレスを割り当てさせ、前記割り当てられたアドレスからテクスチャをロードさせる、請求項２１に記載のコンピュータプログラム。
【請求項２６】
ＨＬ  ＣＦ命令の前記セットを識別することが、条件を有するＩＦ−ＥＬＳＥ文を識別することを備え、ここにおいて前記条件が真である場合、ＨＬ  ＣＦ命令の前記セットが第１のメモリアドレスからテクスチャをロードさせ、前記条件が偽である場合、ＨＬ  ＣＦ命令の前記セットが第２のメモリアドレスから前記テクスチャをロードさせる、請求項２１に記載のコンピュータプログラム。
【請求項２７】
ＨＬ  ＣＦ命令の前記セットを変換することが、ＬＬ命令のセットを生成することを備え、ここにおいてＬＬ命令の前記セットが、前記条件の結果に基づいてアドレスを予約させ、前記予約されたアドレスから前記テクスチャをロードさせる、請求項２６に記載のコンピュータプログラム。
【請求項２８】
前記変換されたＬＬ命令を出力することが、前記変換されたＬＬ命令をメモリに記憶することを備える、請求項２１に記載のコンピュータプログラム。
【請求項２９】
前記ＨＬ命令を変換することが、前記ＬＬ命令を生成するために前記ＨＬ命令をランタイムコンパイルすることを備え、実行されたとき、グラフィックス処理ユニット上で前記出力されたＬＬ命令を実行することを前記１つまたは複数のプロセッサに行わせる命令をさらに備える、請求項２１に記載のコンピュータプログラム。
【請求項３０】
前記出力されたＬＬ命令を実行することが、前記コンパイルされた命令を、前記ＨＬ  ＣＦ命令の条件と前記出力されたＬＬ命令の座標とが依存しない命令より前に実行されるようにスケジュールすることを備える、請求項２９に記載のコンピュータプログラム。
【請求項３１】
低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルするための装置であって、
１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別するための手段と、ここにおいて前記１つまたは複数のテクスチャロード命令の実行がテクスチャをメモリにロードさせる、ここにおいてＨＬ  ＣＦ命令の前記セットが１つまたは複数の分岐を備える、
前記１つまたは複数の関連するテクスチャロード命令が、前記１つまたは複数の分岐に関連するテクスチャロード命令の数に関して対称であるか、ほぼ対称であるかを判断するための手段と、
前記１つまたは複数のテクスチャロード命令が対称またはほぼ対称であるという判断結果に基づいて、ＨＬ  ＣＦ命令の前記識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換するための手段と、ここにおいて前記述語構造を有する前記ＬＬ命令は分岐することなしに実行可能である、
前記１つまたは複数のテクスチャロード命令が対称またはほぼ対称ではないという判断結果に基づいて、前記ＨＬ  ＣＦ命令が変換されないように、ＨＬ  ＣＦ命令の前記識別されたセットを変換することを控えるための手段と、
前記述語構造を有する前記変換されたＬＬ命令またはＨＬ  ＣＦ命令の前記変換されていないセットを出力するための手段とを備える、装置。
【請求項３２】
前記１つまたは複数のテクスチャロード命令の実行が、前記テクスチャをグラフィックス処理ユニットのローカルメモリに転送させる、請求項３１に記載の装置。
【請求項３３】
前記ＨＬ  ＣＦ命令を変換するための前記手段が、前記変換された低レベル命令の無条件直列実行を可能にするために前記１つまたは複数の分岐を削除するための手段を備える、請求項３１に記載の装置。
【請求項３４】
前記１つまたは複数の関連するテクスチャロード命令が対称であるか、ほぼ対称であるかを判断するための前記手段が、前記１つまたは複数の分岐の各分岐に関連する等しい数のテクスチャロード命令を識別するための手段を備える、請求項３１に記載の装置。
【請求項３５】
ＨＬ  ＣＦ命令の前記識別されたセットを変換するための前記手段が、ＬＬ命令のセットを生成するための手段を備え、ＬＬ命令の前記セットの実行が、選択関数の結果に基づいてアドレスを割り当てさせ、前記割り当てられたアドレスからテクスチャをロードさせる、請求項３１に記載の装置。
【請求項３６】
ＨＬ  ＣＦ命令の前記セットを識別するための前記手段が、条件を有するＩＦ−ＥＬＳＥ文を識別するための手段を備え、前記条件が真である場合、ＨＬ  ＣＦ命令の前記セットが第１のメモリアドレスからテクスチャをロードさせ、前記条件が偽である場合、ＨＬ  ＣＦ命令の前記セットが第２のメモリアドレスから前記テクスチャをロードさせる、請求項３１に記載の装置。
【請求項３７】
ＨＬ  ＣＦ命令の前記セットを変換するための前記手段が、ＬＬ命令のセットを生成するための手段を備え、ＬＬ命令の前記セットが、前記条件の結果に基づいてアドレスを予約させ、前記予約されたアドレスから前記テクスチャをロードさせる、請求項３６に記載の装置。
【請求項３８】
前記変換されたＬＬ命令を出力するための前記手段が、前記変換されたＬＬ命令をメモリに記憶するための手段を備える、請求項３１に記載の装置。
【請求項３９】
前記ＨＬ命令を変換するための前記手段が、前記ＬＬ命令を生成するために前記ＨＬ命令をランタイムコンパイルするための手段を備え、グラフィックス処理ユニット上で前記出力されたＬＬ命令を実行することをさらに備える、請求項３１に記載の装置。
【請求項４０】
前記出力されたＬＬ命令を実行するための前記手段が、前記コンパイルされた命令を、前記ＨＬ  ＣＦ命令の条件と前記出力されたＬＬ命令の座標とが依存しない命令より前に実行されるようにスケジュールするための手段を備える、請求項３９に記載の装置。
【発明の詳細な説明】
【関連出願】
【０００１】
[0001]本出願は、その内容全体が参照により本明細書に組み込まれる、２０１２年１月２０日に出願された米国仮特許出願第６１／５８９，０７２号の優先権を主張する。
【技術分野】
【０００２】
[0002]本開示は、コンピューティングデバイスに関し、より詳細には、グラフィックス処理デバイスに関する。
【背景技術】
【０００３】
[0003]コンパイラは、様々ないわゆる高レベルコンピュータプログラミング言語（例えば、Ｃ、Ｃ＋＋、Ｊａｖａ（登録商標）、Ｂａｓｉｃなど）に従って定義されるものなど、高レベルソフトウェア命令から、様々な機械またはアセンブリコンピュータプログラミング言語によって定義されるものなど、低レベルソフトウェア命令を生成するコンピュータプログラムである。コンピュータプログラマーは、一般に、高レベルソフトウェア命令を使用してコンピュータプログラムを定義し、低レベルソフトウェア命令を生成するためにコンパイラを呼び出す。低レベルソフトウェア命令は、低レベルソフトウェア命令の実行をサポートする所与のコンピューティングデバイスによって実行可能である高レベルソフトウェア命令に対応する。このようにして、コンパイラは、所与のコンピューティングデバイスが、高レベルプログラミング言語に従って定義されたソフトウェア命令を使用してコンピュータプログラマーによって定義されたコンピュータプログラムを実行し得るように、低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルする。
【発明の概要】
【０００４】
[0004]概して、本開示では、１つまたは複数のテクスチャロード命令（texture load instruction）を含む制御フロー命令のセットの効率的なコンパイルのための技法について説明する。「制御フロー」という句は、概して、何らかの条件文に基づいて、コンピュータプログラムを形成する高レベルソフトウェア命令の実行のフローを制御することを意図する、高レベルプログラミング言語に従って定義された命令のセットを指す。すなわち、例えば、制御フロー命令のセットの実行により、結果として、高レベルソフトウェア命令の２つ以上の分岐のうちのいずれが実行されるべきかに関する選定が行われ得る。テクスチャロード命令は、概して、実行されたとき、グラフィックス処理ユニット（ＧＰＵ）のローカルメモリにテクスチャをロードさせる命令を指す。例えば、テクスチャロード命令を実行することは、ＧＰＵの外部にあるメモリからＧＰＵのローカルメモリにテクスチャ（例えば、画像データ）を転送させ得る。
【０００５】
[0005]本開示の技法は、テクスチャロード命令を含む制御フロー（ＣＦ：control flow）命令のセットを、述語構造（predicate structure）を有する１つまたは複数の命令に変換することを含む。述語構造を有する命令は、（例えば、分岐することなしに）直列に実行され得る。一般に、ＣＦ文を、述語構造を有する命令に変換することは、分岐を削除することと、各分岐の全ての命令を実行することとを含み得る。しかしながら、本開示の技法によれば、１つまたは複数の関連するテクスチャロード命令を有するＣＦ命令のセットは、各分岐に関連するテクスチャロード命令のすべてが実行される必要がないような方法で述語構造に変換され得る。このようにして、本技法は、テクスチャロード命令を含むＣＦ文の効率的な変換を可能にし得る。
【０００６】
[0006]一例で、本開示の態様は、低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルする方法を意図する。本方法は、コンピューティングデバイスを用いて、１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ：high-level）制御フロー（ＣＦ）命令のセットを識別することであって、ＨＬ  ＣＦ命令のセットが１つまたは複数の分岐を備える、識別することと、コンピューティングデバイスを用いて、ＨＬ  ＣＦ命令の識別されたセットを、述語構造を有する低レベル（ＬＬ：low-level）命令に変換することと、述語構造を有する変換された（ＬＬ）命令を出力することとを含む。
【０００７】
[0007]別の例で、本開示の態様は、低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルするための装置を意図し、本装置は、１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別することであって、ＨＬ  ＣＦ命令のセットが１つまたは複数の分岐を備える、識別することと、ＨＬ  ＣＦ命令の識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換することと、述語構造を有する変換された（ＬＬ）命令を出力することとを行うように構成された１つまたは複数の処理ユニットを備える。
【０００８】
[0008]別の例で、本開示の態様は、低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルするためのコンピュータプログラム製品を意図し、本コンピュータプログラム製品は、実行されたとき、１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別することであって、ＨＬ  ＣＦ命令のセットが１つまたは複数の分岐を備える、識別することと、ＨＬ  ＣＦ命令の識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換することと、述語構造を有する変換された（ＬＬ）命令を出力することとを１つまたは複数のプロセッサに行わせる命令を記憶する。
【０００９】
[0009]別の例で、本開示の態様は、低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルするための装置を意図し、本装置は、１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別するための手段であって、ＨＬ  ＣＦ命令のセットが１つまたは複数の分岐を備える、識別するための手段と、ＨＬ  ＣＦ命令の識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換するための手段と、述語構造を有する変換された（ＬＬ）命令を出力するための手段とを備える。
【００１０】
[0010]１つまたは複数の例の詳細を添付の図面および以下の説明に記載する。他の特徴、目的、および利点は、これらの説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【００１１】
【図１】[0011]本開示で説明する技法を実装し得る開発システムを示すブロック図。
【図２】[0012]本開示で説明する技法を実装し得るコンピューティングデバイスを示すブロック図。
【図３】[0013]述語変換なしにならびに述語変換を用いてコンパイルされた制御フロー命令を含む例示的な擬似コード。
【図４】[0014]従来の述語変換を用いてコンパイルされた、テクスチャロードを有する制御フロー命令を含む例示的な擬似コード。
【図５】[0015]本開示の技法に従って変換された、テクスチャロードを有する制御フロー命令を含む例示的な擬似コード。
【図６】[0016]本開示で説明する技法の様々な態様を実装する際のコンパイラの例示的な動作を示すフローチャート。
【発明を実施するための形態】
【００１２】
詳細な説明
[0017]概して、本開示では、１つまたは複数のテクスチャロード命令を含む制御フロー文の効率的なコンパイルのための技法について説明する。「制御フロー」という句は、概して、何らかの条件文に基づいて、コンピュータプログラムを形成する高レベル（ＨＬ）ソフトウェア命令の実行のフローを制御することを意図する、ＨＬプログラミング言語に従って定義された命令のセットを指す。すなわち、制御フロー（ＣＦ）文の実行により、結果として、ＨＬソフトウェア命令の２つ以上の分岐のうちのいずれが実行されるべきかに関する選定が行われ得る。いくつかの事例で、ＣＦ文は、「フロー制御」文または「条件付きフロー制御」文と呼ばれることもある。
【００１３】
[0018]例えば、ＨＬ  ＣＦ文の１つのセットは、概して、「ｉｆ」命令と後続する条件文との使用を伴う。この条件文は、通常、ブール演算子を使用してブール文として定義される。１つの例示的な条件文は、変数の現在値が所与の値よりも大きいかどうかを判断するためのブール比較を伴い得、これは「ｘ＞１０」として表され得、但し、変数は、この文ではｘとして表され、大なり（greater than）演算子は、記号「＞」として定義される。この文は、それが、（通常、１として定義される）「真」または（通常、０として定義される）「偽」のいずれかのブール値を戻すので、ブールである。この「ｉｆ」命令の後に、１つまたは複数の追加の命令が続く。条件文が真である場合、追加の命令は実行される。条件文が偽である場合、追加の命令はスキップされるかまたは実行されず、実行のフローは追加の命令の後に再開する。
【００１４】
[0019]他のタイプのＨＬ  ＣＦ命令セットは、「ｉｆ」命令と後続する「ｅｌｓｅ」命令とを使用して定義されるもの（一般に「ｉｆ−ｅｌｓｅ」ＣＦ命令と呼ばれる）、演算子「：？」を使用して定義されるもの、および複数の「ｉｆ」文を使用して定義されるもの（一般に「ｉｆ−ｉｆ」ＣＦＣ命令と呼ばれる）を含む。
【００１５】
[0020]テクスチャロード命令は、概して、実行されたとき、ローカルメモリ（例えば、グラフィックス処理ユニット（ＧＰＵ）など、コンピューティングデバイスのローカルメモリ）にテクスチャをロードさせる命令を指す。「テクスチャ」は、概して、すべてが同じフォーマットを有する１つまたは複数の画像を含んでいるオブジェクト（例えば、特定のサイズおよび特定のフォーマットをもつ、ある次元数のピクセルのアレイ）を指す。すなわち、例えば、テクスチャは、オブジェクトにテクスチャのアピアランスを与えるピクセル色のビットマップであり得る。ＧＰＵにおいて、テクスチャロード命令を実行することは、外部メモリからＧＰＵのローカルメモリにテクスチャ（例えば、画像データ）を転送させ得る。外部メモリは、ＧＰＵに対してオフチップであり得、システムバスを介してアクセスされ得る。いくつかの事例では、以下でより詳細に説明するように、比較的長いレイテンシがそのようなデータ転送に関連し得る。例えば、外部メモリからローカルメモリにデータを転送することは、比較的多数のクロックサイクルを消費し得る。
【００１６】
[0021]本開示の技法は、テクスチャロード命令を含む制御フロー（ＣＦ）文を、述語構造を有する１つまたは複数の命令に変換することを含む。例えば、本開示の技法は、テクスチャロード命令を含む「ＩＦ」ＣＦ文を、述語構造を有する１つまたは複数の命令に変換することを含み得る。述語実行サポートは、命令ストリームから分岐をなくす方法を与える。例えば、述語実行は、述語と呼ばれるブールソースオペランドの値に基づく、命令の条件付き実行を指すことがある。述語実行サポートは、コンパイラが、条件付き分岐をプレディケートされた決定的な命令(predicated defining instructions)に変換し、各分岐の代替経路に沿った命令をプレディケートされた命令に変換することを可能にする。すなわち、プレディケートされた命令は、それらの述語値にかかわらずフェッチされ得る。述語が真である命令は正常に実行される。逆に、述語が偽である命令は無効にされ、従って、ＧＰＵの状態を変更するのを妨げられる。従って、述語構造を有する命令は、（例えば、分岐することなしに）直列に実行され得る。
【００１７】
[0022]プログラムのＣＦ命令を、述語構造を有する命令に変換することは、処理デバイスによって最終的に実行される命令の数を増加させ得る。例えば、プレディケーションを用いて、処理デバイスは、分岐の両側を効果的に評価し、結果のうちの１つを廃棄する。いくつかの事例で、分岐の両側を評価することは、特に、経路が大きいおよび／または複雑な文を含む場合、比較的コストがかかり得る。
【００１８】
[0023]しかしながら、いくつかの処理アーキテクチャは、プレディケートされた命令をＣＦ命令よりも効率的に実行し得る。例えば、（「ストリームプロセッサ」と呼ばれることがある）ＧＰＵの並列性質により、いくつかのＧＰＵアーキテクチャは、プレディケートされた命令をＣＦ命令よりも効率的に実行し得る。例えば、ＣＦ命令の分岐は、各クロックサイクルに実行されるために利用可能な独立した命令の数を制限する制御依存性を課し得る。さらに、いくつかの処理ユニットは、依存性に関連するレイテンシ(latency)を低減することを意図した推論的(speculative)実行を実行し得るが、分岐の誤予測も性能不利益をもたらし得る。
【００１９】
[0024]処理ユニット（例えば、ＧＰＵなど）が述語サポートを含む事例で、コンパイラは、完全述語変換または部分述語変換を実行し得る。完全述語サポートは、全てのＣＦ命令が述語構造に変換されることを可能にする。対照的に、部分述語サポートは、述語構造に変換され得る命令のタイプを制限する。例えば、いくつかのＧＰＵは部分述語サポートのみを可能にし、そのような事例で、対応するＧＰＵコンパイラは、条件付き移動命令（例えば、ＭＯＶＣ）および／または選択命令（例えば、ＳＥＬＥＣＴ）に変換される命令のセットを制限し得る。
【００２０】
[0025]いくつかのＧＰＵコンパイラなど、いくつかのコンパイラは、いくつかの命令を変換することのコストが述語構造の利益を上回り得るので、部分述語変換を実行しないことを選定し得る。例えば、上述したように、テクスチャロード命令は、外部メモリからＧＰＵのローカルメモリにテクスチャ（例えば、画像データ）を転送させ得る。いくつかの事例では、比較的長いレイテンシがそのようなデータ転送に関連し得る。テクスチャロード命令に関連する比較的長いレイテンシにより、コンパイラは、テクスチャロード命令を含むＣＦ命令のセットを述語構造に変換しないことがある。例えば、各分岐のテクスチャロード命令を実行することは、一般に、変換の利益を上回り得る。
【００２１】
[0026]本開示の技法は、１つまたは複数の関連するテクスチャロード命令を有するＣＦ命令のセットを、ＣＦ命令のセットの各分岐に関連するあらゆるテクスチャロード命令を実行することを回避するような方法で述語構造に変換することを含む。このようにして、本開示の技法を実装するＧＰＵコンパイラは、テクスチャロード命令に固有のレイテンシを最小限に抑えながら、ＧＰＵアーキテクチャに適した述語構造を実装し得る。
【００２２】
[0027]図１は、述語構造を有する命令（プレディケートされた命令）への、１つまたは複数の関連するテクスチャロード命令を有する制御フロー（ＣＦ）命令の変換を意図する本開示の技法を実装し得る開発システム１０を示すブロック図である。図１の例で、開発システム１０はコンピューティングデバイス１２を含む。コンピューティングデバイス１２は、デスクトップコンピュータ、（いわゆる「ネットブック」コンピュータを含む）ラップトップコンピュータ、ワークステーション、スレートまたはタブレットコンピュータ、携帯情報端末（ＰＤＡ）、（いわゆる「スマートフォン」を含む）モバイルまたはセルラーフォン、デジタルメディアプレーヤ、ゲームデバイス、あるいは、ソフトウェア開発者１３など、ユーザが、高レベル（ＨＬ）コードを定義することと、次いで、低レベル（ＬＬ）コードを生成するためにＨＬコードをコンパイルすることとを行うために対話し得る他のデバイスを備え得る。本開示では、「コード」という用語は、概して、コンピュータプログラム、ソフトウェア、または他の実行ファイルを定義する１つまたは複数のソフトウェア命令のセットを指す。
【００２３】
[0028]コンピューティングデバイス１２は制御ユニット１４を含む。制御ユニット１４は、プログラマブルマイクロプロセッサなど、１つまたは複数のプロセッサ（図１の例では図示せず）を備え得、そのプロセッサは、本明細書で説明する技法をプログラマブルプロセッサに実行させるための命令を記憶するストレージデバイス（例えば、磁気ハードディスクドライブ、ソリッドステートドライブ、またはオプティカルドライブ）、あるいは（フラッシュメモリ、ランダムアクセスメモリまたはＲＡＭなどの）メモリあるいは他のタイプの揮発性または不揮発性メモリなど、コンピュータ可読記憶媒体（同じく、図１の例では図示せず）に記憶された、ソフトウェアまたはコンピュータプログラムを定義するために使用されるものなど、ソフトウェア命令を実行する。代替として、制御ユニット１４は、本明細書で説明する技法を実行するための、１つまたは複数の集積回路、１つまたは複数の特定用途向け集積回路（ＡＳＩＣ）、１つまたは複数の特定用途向け専用プロセッサ（ＡＳＳＰ）、１つまたは複数のフィールドプログラマブルゲートアレイ（ＦＰＧＡ）など、専用ハードウェア、またはプログラマブルプロセッサ、専用ハードウェアなどの上記の例のうちの１つまたは複数の任意の組合せを備え得る。
【００２４】
[0029]制御ユニット１４は、ユーザインターフェース（ＵＩ）モジュール１６と、ソフトウェア開発モジュール１８と、コンパイラ２０とを実行するか、またはさもなければ実装する。すなわち、いくつかの例で、ＵＩモジュール１６、ソフトウェア開発モジュール１８、および／またはコンパイラ２０は、制御ユニット１４によって実行されるソフトウェアから構成され得る。ＵＩモジュール１６は、開発者１３などのユーザがソフトウェア開発モジュール１８およびコンパイラ２０と対話するためにインターフェースし得るユーザインターフェースを提示するモジュールを表す。ＵＩモジュール１６は、開発者１３がモジュール１８および２０とインターフェースするために対話し得る、コマンドラインインターフェース（ＣＬＩ）および／またはグラフィカルユーザインターフェース（ＧＵＩ）など、任意のタイプのユーザインターフェースを提示し得る。
【００２５】
[0030]ソフトウェア開発モジュール１８は、ＨＬプログラミング言語に関してソフトウェアの開発を可能にするモジュールを表す。一般に、ソフトウェア開発モジュール１８は、開発者１３にＵＩモジュール１６を介して１つまたは複数のユーザインターフェースを提示し、それによって、開発者１３は、高レベル（ＨＬ）コード２２の形態のソフトウェアを定義するために、これらのユーザインターフェースと対話する。以下でより詳細に説明するように、ＨＬコード２２は制御フロー（ＣＦ）命令を含み得る。この場合も、本開示で使用する「コード」という用語は、コンピュータプログラム、ソフトウェアまたは他の実行ファイルを定義する１つまたは複数のソフトウェア命令のセットを指す。ＨＬコード２２は、一般に、ＨＬプログラミング言語と一般に呼ばれるもので定義された命令を表す。ＨＬプログラミング言語は、概して、プロセッサのメモリアクセスモデルおよびプロセッサ内のスコープの管理など、コンピュータの基礎をなす詳細からの何らかの抽象化を伴うプログラミング言語を指す。
【００２６】
[0031]ＨＬプログラミング言語は、概して、機械プログラミング言語とアセンブリプログラミング言語とを概して指す用語である低レベル（ＬＬ）プログラミング言語よりも高いレベルの抽象化を行う。ＨＬプログラミング言語の例としては、Ｃプログラミング言語、いわゆる「Ｃ＋＋」プログラミング言語、Ｊａｖａプログラミング言語、ｖｉｓｕａｌ  ｂａｓｉｃ（ＶＢ）プログラミング言語、およびＢａｓｉｃプログラミング言語がある。いくつかの例で、ＨＬプログラミング言語は、グラフィックス処理ユニット（ＧＰＵ）の実行のためにＨＬコードを生成することなど、特定の目的のために適合され得る。そのようなＨＬプログラミング言語の例としては、Ｏｐｅｎ  Ｇｒａｐｈｉｃｓ  Ｌｉｂｒａｒｙ（ＧＬ）プログラミング言語、Ｏｐｅｎ  ＧＬ  Ｅｍｂｅｄｄｅｄ  Ｓｙｓｔｅｍｓ（ＥＳ）プログラミング言語、またはハイレベルシェーダー言語（ＨＬＳＬ：High Level Shader Language）がある。多くのＨＬプログラミング言語は、それらが、コンピューティングデバイスの基礎をなすアーキテクチャを考慮することなしに様々な問題を抽象的に解決するために、データを記憶することが可能であり、アルゴリズムによる操作を受け入れる、（例えば、命令、インターフェース、およびデータ構造を備え得る）オブジェクトの定義を可能にするという点で、オブジェクト指向である。
【００２７】
[0032]コンパイラ２０は、ＨＬプログラミング言語に従って定義されたＨＬ命令をＬＬプログラミング言語のＬＬ命令に縮小するモジュールを表す。コンパイルの後に、これらのＬＬ命令は、ＦＰＧＡ、ＡＳＩＣなど、特定のタイプのプロセッサまたは他のタイプのハードウェアによって実行されることが可能になる。ＬＬプログラミング言語は、それらが、プロセッサまたは他のタイプのハードウェアの命令セットアーキテクチャからの抽象化をほとんど行わないか、またはより低いレベルの抽象化を行うという意味において、低レベルと見なされ得る。ＬＬ言語は、概して、アセンブリ言語および／または機械語を指す。アセンブリ言語は、機械語よりもわずかに高度なＬＬ言語であるが、概して、アセンブリ言語は、コンパイラまたは他の変換モジュールを使用せずに機械語に変換され得る。機械語は、ｘ８６機械コードなど、基礎をなすハードウェア、例えば、プロセッサによってネイティブに実行されるものと、同じでなければ同様である命令を定義する何らかの言語を表す（ｘ８６は、Ｉｎｔｅｌ  Ｃｏｒｐｏｒａｔｉｏｎによって開発されたｘ８６プロセッサの命令セットアーキテクチャを指す）。
【００２８】
[0033]コンパイラ２０は、実際には、ＨＬプログラミング言語に従って定義されたＨＬ命令を、基礎をなすハードウェアによってサポートされるＬＬ命令に変換し、ＨＬプログラミング言語に関連する抽象化を除去するので、これらのＨＬプログラミング言語に従って定義されたソフトウェアは、実際の基礎をなすハードウェアによってより直接的に実行されることが可能になる。いくつかのコンパイラは、２つ以上のＨＬプログラミング言語に関連するＨＬ命令を、１つまたは複数のＬＬプログラミング言語に従って定義されたＬＬ命令に縮小し得るが、一般に、コンパイラ２０などのコンパイラは、単一のＨＬプログラミング言語に関連するＨＬ命令を、１つまたは複数のＬＬプログラミング言語に従って定義された命令を備える、ＬＬコード２４などのＬＬコードに縮小することが可能である。
【００２９】
[0034]説明のために、図１の例で、ソフトウェア開発モジュール１８とコンパイラ２０とは別々のモジュールとして示されているが、いくつかの例で、ソフトウェア開発モジュール１８とコンパイラ２０とは、一般に統合開発環境（ＩＤＥ）と呼ばれる単一のモジュールにおいて組み合わされ得る。本開示の技法は、この点において、図１の例に示された別々のモジュール１８および２０に限定されるべきではなく、ＩＤＥにおいてなど、これらが組み合わされた事例に適用され得る。ＩＤＥを用いて、開発者は、ＨＬ命令を使用してソフトウェアを定義することと、ＨＬ命令をＬＬ命令に変換するためにコンパイラを採用することによって、プロセッサ（例えば、ＧＰＵなど）または他のタイプのハードウェアによって実行されることが可能なＬＬ命令を備える実行ファイルを生成することの両方を行い得る。一般に、ＩＤＥは、開発者が、ＨＬ命令を使用してソフトウェアを定義し、定義されたソフトウェアをデバッグすることと、ＨＬ命令をＬＬ命令にコンパイルすることと、デバイス内に存在するか、またはセルラーフォンなど、別のデバイス内に存在するハードウェアによって実行されたとき、ＬＬ命令の実行がどのように機能するかを観察するために、ＬＬ命令の実行をモデル化することとを行うために対話し得る包括的なＧＵＩを提供する。
【００３０】
[0035]例えば、Ｏｐｅｎ  ＧＬ  ＥＳプログラミング言語は、（デスクトップおよびラップトップコンピュータによる実行ために開発された）Ｏｐｅｎ  ＧＬのバージョンであり、デスクトップおよびラップトップコンピュータなど、パーソナルコンピュータ上ではなく、（いわゆるスマートフォンを含む）セルラーフォン、ネットブックコンピュータ、タブレットコンピュータ、スレートコンピュータ、デジタルメディアプレーヤ、ゲームデバイス、および他のポータブルデバイスなど、モバイルデバイス上での実行に適応される。Ｏｐｅｎ  ＧＬおよび、従って、Ｏｐｅｎ  ＧＬ  ＥＳは、２次元（２Ｄ）グラフィックと３次元（３Ｄ）グラフィックの両方を定義、操作およびレンダリングするための包括的なアーキテクチャを提供する。パーソナルコンピュータにおいて一般的なものとは非常に異なる命令セットアーキテクチャを有するプロセッサを有し得るこれらのモバイルデバイスをＩＤＥ内でモデル化する能力は、モバイルデバイスのためのソフトウェアを開発しようとする開発者のための開発環境の選択肢としてＩＤＥのデザイアビリティをさらに高めた。図１の例には図示されていないが、制御ユニット１４はまた、モバイルプロセッサなど、しばしばコンピューティングデバイス１２内にネイティブに含まれないハードウェアによるＬＬソフトウェア命令の実行をモデル化することが可能なモデラモジュールを実行または実装し得る。
【００３１】
[0036]いずれの場合も、コンパイラ２０などのコンパイラの１つの機能は、述語構造をもつ命令を有する（例えば、ＬＬプログラミング言語に従って定義された）ＬＬコード２４への、（例えば、ＨＬプログラミング言語に従って定義された）ＨＬコード２２の制御フロー（ＣＦ）命令の変換を伴い得る。ＣＦ命令は、プロセッサによる命令の実行のフローが制御され得る何らかの命令を指す。例えば、多くのＨＬプログラミング言語は「ｉｆ」命令を指定し、そのシンタックスは、通常、この「ｉｆ」命令の呼出しに続いて条件文の定義を必要とする。この条件文は、通常、ブール演算子を使用してブール文として定義される。
【００３２】
[0037]１つの例示的な条件文は、変数の現在値が所与の値よりも大きいかどうかを判断するためのブール比較を伴い得、これは「ｘ＞１０」として表され得、但し、変数は、この文では「ｘ」として表され、大なりブール演算子は、記号「＞」として定義される。この文は、それが、（通常、１として定義される）「真」または（通常、０として定義される）「偽」のいずれかのブール値を戻すので、ブールである。この「ｉｆ」命令に後に、１つまたは複数の追加の命令が続き、条件文が真である場合、追加の命令は実行される。条件文が偽である場合、追加の命令はスキップされるかまたは実行されず、実行のフローは追加の命令の後に再開する。この意味で、「ｉｆ」命令は、条件付き文、しばしばブール文の評価に応じて、追加の命令の実行を決定し、それによって制御する。このために、「ｉｆ」命令は、一般にＣＦ命令と呼ばれる。
【００３３】
[0038]他のタイプのＨＬ  ＣＦ命令セットは、「ｉｆ」命令と後続する「ｅｌｓｅ」命令とを使用して定義されるもの（一般に「ｉｆ−ｅｌｓｅ」または「ｉｆ−ｔｈｅｎ−ｅｌｓｅ」ＣＦ命令と呼ばれる）、演算子「：？」を使用して定義されるもの、および複数の「ｉｆ」文を使用して定義されるもの（一般に「ｉｆ−ｉｆ」ＣＦ命令と呼ばれる）を含む。「ｉｆ−ｅｌｓｅ」命令セットでは、「ｉｆ」命令は上記で説明したものと同じであるが、実行のフローまたは制御は「ｅｌｓｅ」文によって変更され、従って、「ｉｆ」に続く条件文が偽であるとき、「ｅｌｓｅ」命令に続く追加の命令の第２のセットが実行される。追加の命令のこの第２のセットは、「ｉｆ」命令に続く条件文が偽である場合のみ実行され、それによって、命令の実行に対するさらなるレベルの制御を与える。
【００３４】
[0039]「：？」命令は、概して、「ｉｆ−ｅｌｓｅ」命令を模倣する三項演算子（ternary operator）を指す。この命令は、一般に「？：」命令として知られていることもある。一般に、「？」命令または演算子は、その前に条件文、しばしばブール文があり、その直後に、条件文が真である場合に変数に割り当てられるべき値が続く。次いで、この「真」の値の後に、「：」命令または演算子が続き、その後に、条件文が偽である場合に変数に割り当てられるべき値が続く。「ｉｆ−ｉｆ」命令セットは、概して、上記で定義した「ｉｆ」文と形式が同じであるか、または少なくとも同様である、一連の「ｉｆ」文を指す。「ｉｆ−ｉｆ」命令セットは、第１の「ｉｆ」命令の後に、ある条件文が続き、第１の「ｉｆ」命令に続く第２の「ｉｆ」命令が、第１の「ｉｆ」命令のために定義された条件文の逆を有するときなど、「ｉｆ−ｅｌｓｅ」命令セットの方法と同様の方法で採用され得る。
【００３５】
[0040]いくつかの例で、コンパイラ２０は部分述語サポートを含み得る。すなわち、例えば、コンパイラ２０は、他のタイプのＣＦ命令を変換することを控えながら、いくつかのタイプのＣＦ命令を有するＨＬコード２２を、述語構造を有する命令に変換し得る。一例で、コンパイラ２０は、他の条件付き命令、ループ命令、またはＣＦ命令を変換することを控えながら、ＨＬコード２２の移動命令（例えば、ＭＯＶＣ）および／または選択命令（例えば、ＳＥＬＥＣＴ）を、述語構造を有する命令に変換し得る。概して、ＨＬコード２２のＣＦ命令のセットを、述語構造を有する命令に変換することは、ＣＦ命令のセットの各分岐を評価し、結果のうちの１つを廃棄する、命令のセットを定義することを含み得る。
【００３６】
[0041]コンパイラ２０が、いわゆる部分述語コンパイラとして構成された例で、コンパイラ２０は、一般に、テクスチャロードに関連するレイテンシにより、テクスチャロード命令を有するＣＦ命令のセットを、述語構造を有する命令に変換しないことがある。例えば、テクスチャロード命令が実行されたとき、ＧＰＵは、外部メモリからＧＰＵのローカルメモリにテクスチャ（例えば、画像データ）をロードし得る。いくつかの事例では、比較的長いレイテンシがそのようなデータ転送に関連し得る。すなわち、外部メモリからローカルメモリにデータを転送することは、比較的多数のクロックサイクルを消費し得る。テクスチャロード命令を有するそのようなＣＦ命令のセットを変換することは、ＣＦ命令のセットに関連する全てのテクスチャロード命令を実行することと、適切なロードされたテクスチャを選択することとを伴い得る。ＣＦ命令のセットに関連する全てのテクスチャロード命令を実行するために必要な時間は、述語構造を有する命令への変換によって得られる効率（例えば、ハードウェア効率）を上回り得る。
【００３７】
[0042]本開示の技法は、１つまたは複数の関連するテクスチャロード命令を有するＣＦ命令のセットを含むＨＬコード２２を、ＬＬプログラミング言語に従って定義されたＬＬコード２４に変換することを含む。変換は、本開示の技法によれば、制御フローを削除し、ＣＦ命令のセットの各分岐に関連する全てのテクスチャロード命令を実行することを回避するような方法で実行され得る。
【００３８】
[0043]本開示のいくつかの態様によれば、テクスチャロード命令を有するＣＦ命令のセットは、テクスチャ座標上に述語構造を有する命令を生成することによって、述語構造を有する命令に変換され得る。座標は、例えば、メモリ中の特定のアドレスを含み得る。従って、述語構造を有する命令の結果は特定のメモリアドレスを指し得る。命令は、次いで、特定のメモリアドレスからテクスチャをロードするために使用され得る。このようにして、単一のテクスチャが、プレディケートされた命令に従って定義されたアドレスからロードされ得る。
【００３９】
[0044]説明のための非限定的な例で、ＨＬコード２２は、ｉｆ−ｅｌｓｅ文の各経路に関連するテクスチャロード命令を有するｉｆ−ｅｌｓｅ  ＣＦ文を含み得る。すなわち、例えば、ｉｆ−ｅｌｓｅ文の「ｉｆ」経路が真である場合、テクスチャは第１のメモリアドレスからロードされる。逆に、「ｉｆ」経路が偽である場合、ｉｆ−ｅｌｓｅ文の「ｅｌｓｅ」経路が実行され、テクスチャは第２のメモリアドレスからロードされる。そのようなｉｆ−ｅｌｓｅ文は、ｉｆ（ｃｏｎｄｉｔｉｏｎ）｛ｘ＝ｔｅｘｔｕｒｅ（ｃｏｏｒｄｉｎａｔｅ１）；｝ｅｌｓｅ｛ｘ＝ｔｅｘｔｕｒｅ（ｃｏｏｒｄｉｎａｔｅ２）；｝のように表され得る。
【００４０】
[0045]この例で、本開示の態様によれば、コンパイラ２０は、ｉｆ−ｅｌｓｅ  ＣＦ文を、述語構造をもつ命令を有するＬＬコード２４に変換し得る。すなわち、コンパイラ２０は、テクスチャ座標上に述語命令を生成し得る。例えば、上記で説明したｉｆ−ｅｌｓｅ文に関して、変換されたｉｆ−ｅｌｓｅ文は、｛ｎｅｗ＿ｃｏｏｒｄｉｎａｔｅ＝ｃｏｎｄｉｔｉｏｎ  ？  ｃｏｏｒｄｉｎａｔｅ１：ｃｏｏｒｄｉｎａｔｅ２；ｘ＝ｔｅｘｔｕｒｅ（ｎｅｗ＿ｃｏｏｒｄｉｎａｔｅ）；｝のように表され得る。ｉｆ−ｅｌｓｅ文を、テクスチャ座標上で実行される三項演算子と置き換えることによって、その文は、テクスチャをロードすることなしに実行され得る。さらに、ｉｆ−ｅｌｓｅ制御フローは削除され、命令は、分岐することなしに実行され得る。例について単一のｉｆ−ｅｌｓｅ文に関して説明したが、本開示の技法は、ネスト制御フロー構造を含む、ＣＦ命令の他のセットに関して一般化され得ることを理解されたい。
【００４１】
[0046]このようにして、制御ユニット１４によって実行されるコンパイラ２０は、テクスチャロード命令を有するＣＦ命令のセットを、述語構造を有する命令に変換するための本開示の技法を実装し得る。テクスチャロード命令を有するＣＦ命令のセットを変換することは、ＧＰＵなど、いくつか処理アーキテクチャのための効率を高め得る。例えば、述語構造を有する変換された命令は、（フィードバックループなしに）直列に実行され得る。その上、実行されるテクスチャロード命令の数を制限することによって、外部メモリからＧＰＵのオンチップメモリにデータを転送することに関連するレイテンシが最小限に抑えられ得る。
【００４２】
[0047]いくつかの例で、コンパイラ２０は、対称テクスチャロード命令を有するＣＦ命令のセットに本開示の技法を適用し得る。対称テクスチャロード命令は、概して、ＣＦ命令のセットの各経路に関連する同じまたはほぼ同じ数のテクスチャロード命令を有するＣＦ命令のセットを指す。説明のための一例で、ｉｆ−ｅｌｓｅ文は、文の「ｉｆ」部分に関連する第１の経路と、文の「ｅｌｓｅ」部分に関連する第２の経路とを有する。本開示の態様によれば、コンパイラ２０は、第１の経路に関連するテクスチャロード命令の数が、第２の経路に関連するテクスチャロード命令の数にほぼ等しいかどうかを判断し得る。
【００４３】
[0048]テクスチャロード命令がほぼ対称である場合、コンパイラ２０は、ＣＦ命令のセットを、述語構造を有する命令に変換するための本開示の技法を実行し得る。テクスチャロード命令が対称でない（例えば、一方の経路のみがテクスチャロード命令を含む）場合、コンパイラ２０は、ＣＦ命令を変換することを控え得る。コンパイラ２０は、命令を変換するためのインセンティブが潜在的により少ないので、非対称テクスチャロード命令を有するＣＦ命令のセットを変換しないことがある（例えば、ＣＦ命令はそのままであり得る）。例えば、ＣＦ命令のセットが、テクスチャロード命令を含むある経路と、テクスチャロード命令を含まない別の経路とを有する場合、テクスチャロード命令が実行されず、テクスチャロード命令に関連するレイテンシが生じない可能性（例えば、テクスチャロード命令なしの経路が真である場合）がある。この可能性により、コンパイラ２０は、ＣＦ命令のセットを変換することに関連する計算および／または時間コストをかけることを控え得る。
【００４４】
[0049]例について、ＣＦ命令のセットの各経路に関連する単一のテクスチャロード命令に関して説明したが、本開示の技法はこのように限定されない。すなわち、コンパイラ２０は、テクスチャロード命令が、ＣＦ命令のセットの２つ以上の分岐についてほぼ対称であるかどうかを判断し得る。その上、テクスチャロード命令は、本質的に、明示的に対称である必要はない。例えば、コンパイラ２０は、これらのロードのテクスチャ座標が適切にプレディケートされ得る限り、ある経路が、別の経路よりも多いまたは少ない関連するテクスチャロード命令を有する（例えば、ある経路が２つの関連するテクスチャロード命令を有し、別の経路が１つまたは３つのテクスチャロード命令を有する）にもかかわらず、ＣＦ命令を変換するための本開示の技法を実行し得る。
【００４５】
[0050]図２は、本開示で説明する技法を実装し得る別のコンピューティングデバイス７０を示すブロック図である。図２の例で、コンピューティングデバイス７０は、（いわゆる「スマートフォン」を含む）セルラーフォン、ラップトップコンピュータ、およびいわゆる「ネットブック」、または携帯情報端末（ＰＤＡ）、デジタルメディアプレーヤ、ゲームデバイス、地理的測位システム（ＧＰＳ：geographical positioning system）ユニット、埋込みシステム、ポータブルメディアシステム、または、一般に、ＯｐｅｎＧＬ  ＥＳ仕様に従ってＯｐｅｎＧＬ  ＥＳを実装またはサポートする他のタイプのコンピューティングデバイスの任意の組合せなど、モバイルデバイスを表す。但し、本開示の技法はモバイルデバイスに限定されないことを理解されたい。
【００４６】
[0051]図２の例で、コンピューティングデバイス７０は、中央処理ユニット（ＣＰＵ）７２と、グラフィックス処理ユニット（ＧＰＵ）７４と、ストレージユニット７６と、ディスプレイユニット７８と、ディスプレイバッファユニット８０と、ユーザインターフェースユニット８４とを含む。一例で、図１の例に示された制御ユニット１４は、ユニット７２〜７６および８０を備え得る。ＣＰＵ７２とＧＰＵ７４とは、図２の例で別々のユニットとして示されているが、ＣＰＵ７２とＧＰＵ７４とは、ＧＰＵがＣＰＵに統合される場合など、単一のユニットに統合され得る。ＣＰＵ７２は、機械命令またはＬＬ命令を実行することが可能である１つまたは複数のプロセッサを表す。いくつかの例で、ＣＰＵ７２はメモリ７５Ａを含み得る。
【００４７】
[0052]ＧＰＵ７４は、グラフィカル動作を実行するための１つまたは複数の専用プロセッサを表す。すなわち、例えば、ＧＰＵ７４は、グラフィックをレンダリングすること、およびＧＰＵアプリケーションを実行することのための、固定機能構成要素とプログラマブル構成要素とを有する専用ハードウェアユニットであり得る。ＧＰＵ７４はまた、ＤＳＰ、汎用マイクロプロセッサ、ＡＳＩＣ、ＦＰＧＡ、あるいは他の等価な集積回路またはディスクリート論理回路を含み得る。ＧＰＵ７４は、専用ＧＰＵメモリ７５Ｂなど、他の構成要素をも含み得る。
【００４８】
[0053]上述したように、ＣＰＵ７２およびＧＰＵ７４の各々は、メモリ７５Ａ、７５Ｂ（「メモリ７５」）を含み得る。メモリ７５は、機械コードまたはオブジェクトコードを実行する際に使用されるオンチップストレージまたはメモリを表し得る。メモリ７５は、それぞれ、固定数のデジタルビットを記憶することが可能なハードウェアメモリレジスタを備え得る。ＣＰＵ７２およびＧＰＵ７４は、それぞれ、例えばシステムバスを介してアクセスされ得るストレージユニット７６から値を読み取るか、またはそれに値を書き込むよりも迅速に、ローカルメモリ７５Ａ、７５Ｂから値を読み取り、またはそれに値を書き込むことが可能であり得る。いくつかの例で、メモリ７５Ａは、ＣＰＵ７２に関してオンチップメモリであり得、メモリ７５Ｂは、ＧＰＵ７４に関してオンチップメモリであり得る。
【００４９】
[0054]ストレージユニット７６は１つまたは複数のコンピュータ可読記憶媒体を備え得る。ストレージユニット７６の例としては、限定はしないが、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、電気消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ（登録商標））、ＣＤ−ＲＯＭまたは他の光ディスクストレージ、磁気ディスクストレージ、または他の磁気ストレージデバイス、フラッシュメモリ、あるいは命令またはデータ構造の形態の所望のプログラムコードを記憶するために使用され得、コンピュータまたはプロセッサによってアクセスされ得る、任意の他の媒体がある。
【００５０】
[0055]いくつかの例示的な実装形態で、ストレージユニット７６は、本開示においてＣＰＵ７２およびＧＰＵ７４に起因する機能をＣＰＵ７２および／またはＧＰＵ７４に実行させる命令を含み得る。ストレージユニット７６は、いくつかの例で、非一時的記憶媒体と見なされ得る。「非一時的」という用語は、記憶媒体が、搬送波または伝搬信号では実施されないことを示し得る。但し、「非一時的」という用語は、ストレージユニット７６が非可動であることを意味するものと解釈されるべきでない。一例として、ストレージユニット７６は、コンピューティングデバイス７０から取り外され、別のデバイスに移され得る。別の例として、ストレージユニット７６と実質的に同様のストレージユニットが、コンピューティングデバイス７０中に挿入され得る。いくつかの例で、非一時的記憶媒体は、時間経過に伴って変動し得るデータを（例えば、ＲＡＭに）記憶し得る。
【００５１】
[0056]ディスプレイユニット７８は、観察者による消費のために、ビデオデータ、画像、テキストまたは他のタイプのデータを表示することが可能なユニットを表す。ディスプレイユニット７８は、液晶ディスプレイ（ＬＣＤ）、発光ダイオード（ＬＥＤ）ディスプレイ、有機ＬＥＤ（ＯＬＥＤ）、アクティブマトリックスＯＬＥＤ（ＡＭＯＬＥＤ：active-matrix OLED）ディスプレイなどを含み得る。ディスプレイバッファユニット８０は、ディスプレイユニット７８のための、写真またはビデオフレームなど、像を表示するためのデータを記憶することに専用のメモリまたはストレージデバイスを表す。ユーザインターフェースユニット８４は、ユーザが、ＣＰＵ７２など、コンピューティングデバイス７０の他のユニットと対話するか、またはさもなければそれらのユニットと通信するためにインターフェースし得るユニットを表す。ユーザインターフェースユニット８４の例としては、限定はしないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスがある。ユーザインターフェースユニット８４はまた、タッチスクリーンであり得、ディスプレイユニット７８の一部として組み込まれ得る。
【００５２】
[0057]コンピューティングデバイス７０は、明快のために図２に示されていない追加のモジュールまたはユニットを含み得る。例えば、コンピューティングデバイス７０は、コンピューティングデバイス７０がモバイル無線電話である例において電話通信を実現するために、そのいずれも図２に示されていないスピーカーおよびマイクロフォンを含み、またはコンピューティングデバイス７０がメディアプレーヤである例においてスピーカーを含み得る。いくつかの事例で、ユーザインターフェースユニット８４およびディスプレイユニット７８は、コンピューティングデバイス７８が、外部ユーザインターフェースまたはディスプレイとインターフェースする能力があるデスクトップコンピュータまたは他のデバイスである例において、コンピューティングデバイス７８の外部にあり得る。
【００５３】
[0058]図２の例に示すように、ストレージユニット７６は、ＧＰＵドライバ８６と、ＧＰＵプログラム８８と、コンパイラ９２とを記憶する。以下でより詳細に説明するように、ストレージユニット７６はまた、ローカルでコンパイルされたＧＰＵプログラム９４とテクスチャデータ９６とを記憶し得る。ＧＰＵドライバ８６は、ＧＰＵ７４にアクセスするためのインターフェースを与えるコンピュータプログラムまたは実行可能コードを表す。ＣＰＵ７２は、ＧＰＵ７４とインターフェースするために、ＧＰＵドライバ８６またはそれの部分を実行し、このために、ＧＰＵドライバ８６は、ＣＰＵ７２内に「ＧＰＵドライバ８６」と標示された破線ボックスとして図２の例に示されている。ＧＰＵドライバ８６は、ＧＰＵプログラム８８を含む、ＣＰＵ７２によって実行されるプログラムまたは他の実行ファイルにとってアクセス可能である。
【００５４】
[0059]ＧＰＵプログラム８８は、（一般に「ＯｐｅｎＣＬ」として知られる）Ｏｐｅｎ−Ｃｏｍｐｕｔｉｎｇ  Ｌａｎｇｕａｇｅ、ＯｐｅｎＧＬ  ＥＳ、ＨＬＳＬ、またはＧＰＵ８８によって与えられる専用ＧＰＵ固有動作を利用する別のＨＬプログラミング言語など、ＨＬプログラミング言語で書かれたプログラムを備え得る。ＯｐｅｎＧＬ仕様を使用して開発されたＧＰＵプログラムはシェーダープログラムと呼ばれることがある。代替として、ＯｐｅｎＣＬ仕様を使用して開発されたＧＰＵプログラムはプログラムカーネルと呼ばれることがある。但し、本開示の技法は特定のＨＬプログラミング言語に限定されない。例えば、ＧＰＵプログラム８８は、ＣＰＵ７２上で実行する別のプログラム内に埋め込まれるか、またはさもなければ含まれ得る。
【００５５】
[0060]ＧＰＵプログラム８８は、ＧＰＵドライバ８６によって与えられる１つまたは複数の機能を呼び出すか、またはさもなければ含み得る。ＣＰＵ７２は、概して、ＧＰＵプログラム８８が埋め込まれたプログラムを実行し、ＧＰＵプログラム８８に遭遇すると、ＧＰＵプログラム８８をＧＰＵドライバ８６に受け渡す。ＣＰＵ７２は、ＧＰＵプログラム８８を処理するために、このコンテキストではＧＰＵドライバ８６を実行する。すなわち、例えば、ＧＰＵドライバ８６は、ＧＰＵプログラム８８を、ＧＰＵ７４によって実行可能なオブジェクトコードまたは機械コードにコンパイルすることによって、ＧＰＵプログラム８８を処理し得る。このオブジェクトコードは、ローカルでコンパイルされたＧＰＵプログラム９４として図３の例に示されている。
【００５６】
[0061]このＧＰＵプログラム８８をコンパイルするために、ＧＰＵドライバ８６は、ＧＰＵプログラム８８をコンパイルするコンパイラ９２を含む。すなわち、いくつかの例で、コンパイラ９２が、ＧＰＵプログラム８８が埋め込まれたプログラムの実行中に、ＧＰＵプログラム８８をコンパイルするためにリアルタイムまたはほぼリアルタイムで動作することを除いて、コンパイラ９２は、図１に関して上記で説明したコンパイラ２０と実質的に同様であり得る。コンパイラ９２は、テクスチャロード命令を有するＣＦ命令を、述語構造を有する命令に変換するための本開示の技法を利用し得る。
【００５７】
[0062]例えば、コンパイラ９２は、ＧＰＵプログラム８８を含むＨＬコードを実行するとき、ＣＰＵ７２からＧＰＵプログラム８８を受信し得る。コンパイラ９２は、ＬＬプログラミング言語（例えば、機械語またはアセンブリ言語など）に準拠するローカルでコンパイルされたＧＰＵプログラム９４を生成するために、ＧＰＵプログラム８８をコンパイルし得る。いくつかの例で、ＧＰＵプログラム９４は、ＯｐｅｎＧＬ  ＥＳシェーディング言語に従って定義され得る。ＧＰＵプログラム８８は、コンパイラ９２が本開示の技法に従ってコンパイルするテクスチャロード命令を含む、ＨＬ  ＣＦ命令または他のループ命令を含み得る。コンパイラ９２は、次いで、ＬＬ命令を含むローカルでコンパイルされたＧＰＵプログラム９４を出力する。
【００５８】
[0063]ＧＰＵ７４は、概して、（ＧＰＵ７４内に「ローカルでコンパイルされたＧＰＵプログラム９４」と標示された破線ボックスによって示されるように）ローカルでコンパイルされたＧＰＵプログラム９４を受信し、その後、いくつかの事例で、ＧＰＵ７４は、画像をレンダリングし、画像のレンダリングされた部分をディスプレイバッファユニット８０に出力する。ディスプレイバッファユニット８０は、画像全体がレンダリングされるまで、レンダリングされた画像のレンダリングされたピクセルを一時的に記憶し得る。ディスプレイバッファユニット８０は、このコンテキストでは画像フレームバッファと見なされ得る。ディスプレイバッファユニット８０は、次いで、ディスプレイユニット４８上に表示されるべきレンダリングされた画像を送信し得る。いくつかの代替例で、ＧＰＵ７４は、画像をディスプレイバッファユニット８０に一時的に記憶するのではなく、画像のレンダリングされた部分を表示のためにディスプレイユニット７８に直接出力し得る。ディスプレイユニット７８は、次いで、ディスプレイバッファユニット７８に記憶された画像を表示し得る。
【００５９】
[0064]コンパイルされたＧＰＵプログラム９４の実行中に、ストレージユニット７６とＧＰＵメモリ７５Ｂとの間でデータが転送され得る。例えば、（オンチップメモリであり得る）ＧＰＵメモリ７５Ｂの容量は、ストレージユニット７６の容量と比較して比較的小さいことがある。従って、プログラム９４を実行するとき、ＧＰＵ７４は、ストレージユニット７６からメモリ７５Ｂにデータを転送し、データを処理し、処理されたデータをストレージユニット７６および／またはディスプレイバッファ８０に記憶し得る。いくつかの事例で、ストレージユニット７６とメモリ７５Ｂとの間で転送されるデータの量および／またはデータが転送される回数を制限することは、性能を改善し得る。例えば、ストレージユニット７６とメモリ７５Ｂとの間でデータを転送することは、データ転送に関連するレイテンシを導入し得る。そのようなレイテンシは、特に、ランタイム中に（例えば、ＧＰＵプログラム８８が、コンパイルされたＧＰＵプログラム９４を形成するためにコンパイルされ、実行される間に）ストレージユニット７６からメモリ７５Ｂにデータがフェッチされる場合、ボトルネックを提示し得る。その上、ストレージユニット７６からデータをフェッチすることは電力を消費する。限られた電源を使用して電力供給される、コンピューティングデバイス７０などのコンピューティングデバイス（例えば、バッテリーによって電力供給されるモバイルコンピューティングデバイス）が電力消費を減少させることは、コンピューティングデバイス７０が充電間に動作し得る寿命を増加させる。
【００６０】
[0065]場合によって、ＧＰＵ７４は、コンパイルされたＧＰＵプログラム９４の実行中にテクスチャデータ９６を生成しおよび／またはそれにアクセスし得、テクスチャデータ９６をストレージユニット７６および／またはディスプレイバッファ８０に記憶し得る。テクスチャデータ９６は、例えば、同じフォーマットを有する１つまたは複数の画像を含んでいる１つまたは複数のオブジェクト（例えば、特定のサイズおよび特定のフォーマットをもつ、ある次元数のピクセルのアレイ）を含み得る。ＧＰＵ７４は、レンダリング中にテクスチャデータ９６が使用され得るように、テクスチャデータ９６をＧＰＵメモリ７５Ｂに記憶し得る。一例で、テクスチャデータ９６は、特定の色に関連するデータを含み得る。特定の色を含むピクセルデータをレンダリングするとき、ＧＰＵ７４は、ストレージユニット７６からメモリ７５Ｂに適切なテクスチャデータをロードし得る。すなわち、ＧＰＵ７４は、ストレージユニット７６からメモリ７５Ｂに特定のテクスチャを転送するために、コンパイルされたＧＰＵプログラム９４のテクスチャロード命令を実行し得る。ＧＰＵは、次いで、テクスチャを使用してピクセルデータをレンダリングし、レンダリングされたピクセルデータをディスプレイバッファユニット８０に記憶し得る。
【００６１】
[0066]本開示の態様によれば、コンパイラ９２は、テクスチャロード命令（例えば、ＧＰＵ７４に、ストレージユニット７６からローカルＧＰＵメモリ７５Ｂにテクスチャデータ９６をロードさせる命令）を含むＧＰＵプログラム８８のＨＬ  ＣＦ命令を、述語構造を有するＬＬ命令に変換し得る。例えば、コンパイラ９２は、ＨＬ命令を変換した後に、ＣＦ命令を削除する、ＧＰＵ７４が実行するためのローカルでコンパイルされたＧＰＵプログラム９４を生成し得る。コンパイラ９２は、ＣＦ命令のセットの各分岐に関連する全てのテクスチャロード命令を実行することを回避するような方法で、ＧＰＵプログラム８８のＨＬ  ＣＦ命令を変換し得、それによって、ストレージユニット７８へのアクセスの数を低減し得る。
【００６２】
[0067]いくつかの例で、コンパイラ９２は、テクスチャ座標上に述語構造を有するＬＬ命令を生成することによって、テクスチャロードを有するＨＬ  ＣＦ命令を、述語構造を有する命令に変換し得る。例えば、図５に関してより詳細に説明するように、コンパイラ９２は、述語構造を有する命令を生成し得、それらの命令の結果は、特定のメモリアドレス、例えば、メモリ７５Ｂ中のメモリアドレスを指し得る。コンパイラ９２はまた、例えば、述語構造を有する命令に基づいて、メモリ７５Ｂ中の特定のメモリアドレスにテクスチャをロードする命令を生成し得る。
【００６３】
[0068]このようにして、コンパイラ９２はＧＰＵ７４の効率を高め得る。例えば、テクスチャロード命令を有するＣＦ命令を、述語構造を有する命令に変換することは、ＧＰＵ７４が、コンパイルされたＧＰＵプログラム９４を（フィードバックループなしに）直列に実行することを可能にし得る。その上、実行されるテクスチャロード命令の数を制限することによって、ストレージユニット７６からメモリ７５Ｂにデータを転送することに関連するレイテンシが最小限に抑えられ得る。さらに、実行されるテクスチャロード命令の数を制限することはまた、例えば、ストレージユニット７６とメモリ７５Ｂとの間で転送されるデータの量を制限することによって、電力を温存するのを助け得る。
【００６４】
[0069]いくつかの例で、上記で図１に関して説明したように、コンパイラ９２は、対称テクスチャロード命令を有するＧＰＵプログラム８８のＣＦ命令に本開示の技法を適用し得る。すなわち、変換されるＣＦ命令のセットに関して、テクスチャロード命令がほぼ対称である（例えば、分岐が、比較的比例する数のテクスチャロード命令を有する）場合、コンパイラ９２は、ＣＦ命令のセットを、述語構造を有する命令に変換するために本開示の技法を実行し得る。しかしながら、テクスチャロード命令が対称でない（例えば、一方の経路のみがテクスチャロード命令を含む）場合、コンパイラ９２は、ＣＦ命令を変換することを控え得る。
【００６５】
[0070]本開示のいくつかの態様によれば、ＧＰＵプログラム８８から、関連するテクスチャロード命令を有するＣＦ命令を削除することによって、コンパイラ９２は、コンパイルされたＧＰＵプログラム９４の実行をスケジュールすることに関する増加したフレキシビリティを有し得る。例えば、テクスチャロードを有するＣＦ命令より前にＨＬ  ＧＰＵプログラム８８中に含まれる１つまたは複数の他の命令があり、（ＣＦ命令の）ＣＦ条件とテクスチャロード座標とがそれらの他の命令への依存性を有しない場合、コンパイラ２０は、テクスチャロード命令を１つまたは複数の他の命令より前に実行するようにスケジュールし得る。
【００６６】
[0071]図３に、例えば、コンパイラ２０または９２による、ＣＦ命令のセットを含むＨＬ擬似コード１００の、述語構造を有しない（「変換なし」の）ＬＬ命令１０４への変換と、述語構造を有する（「変換あり」の）ＬＬ命令１０８への変換とを示す。図３に示すように、変換なしのＬＬ命令１０４は、分岐（ＢＲ）およびジャンプ（ＪＭＰ）コマンドなどのＣＦ命令を含む。従って、ＬＬ命令１０４は直列に実行されないことがある。すなわち、例えば、ジャンプコマンドＪＭＰＬ２が実行され、それによって、（Ｌ１ではなく）Ｌ２が実行されるように命令ポインタレジスタを変更し得る。
【００６７】
[0072]しかしながら、ＬＬ命令１０８は、分岐（ＢＲ）およびジャンプ（ＪＭＰ）コマンドが削除されるように変換された。従って、ＬＬ命令１０８は直列に実行され得る。ＬＬ命令１０８を実行することにより、結果として、ＬＬ命令１０４と比較してより多くの命令が実行され得るが、ＣＦ命令を削除することによって、ＧＰＵ７４など、いくつかの処理ユニットは、ＬＬ命令１０４よりも迅速におよび／または高い精度でＬＬ命令１０８を実行し得る（例えば、適切な値が適切なレジスタに記憶されることになる）。例えば、ＧＰＵ７４（図示せず）中に含まれ得る算術論理ユニット（ＡＬＵ：arithmetic logic unit）の並列性質は、分岐、ジャンプ、または他のＣＦ命令を効率的に処理しないことがある。
【００６８】
[0073]いくつかの例で、（コンパイラ２０またはコンパイラ９２などの）コンパイラは、述語構造を有する命令に変換され得る命令において制限され得る。そのようなコンパイラは、コンパイラが、「移動」（例えば、ＭＯＶＣ）および「選択」（例えば、ＳＥＬＥＣＴ）命令など、命令の限られたセットのみを変換し得るので、「部分述語」コンパイラと呼ばれ得る。
【００６９】
[0074]図４に、述語構造を有するＬＬ命令１１６への、テクスチャロード命令（「ｔｅｘｔｕｒｅ（ａｄｄｒｅｓｓ１）」および「ｔｅｘｔｕｒｅ（ａｄｄｒｅｓｓ２）」）を有するＣＦ命令のセットを含むＨＬ擬似コード１１２の変換を示す。そのような変換は、コンパイラ２０（図１）またはコンパイラ９２（図２）など、コンパイラによって実行され得る。しかしながら、そのような変換は、ＣＦ命令１１２の両方のテクスチャロード命令が実行されなければならないので、一般に実行されないことがある。すなわち、図４に示す方法でＣＦ命令１１２を変換することによって、テクスチャロード命令の各々が実行され、適切なテクスチャが選択される。
【００７０】
[0075]上述したように、テクスチャロード命令を実行することにより、結果として、テクスチャデータが外部メモリからローカルメモリに転送される。従って、比較的高いレイテンシがテクスチャロード命令に関連し得る。この高いレイテンシにより、コンパイラは、図４の例に示される変換を実行しないことがある。
【００７１】
[0076]図５に、本開示の技法による、述語構造を有するＬＬ命令１２４への、テクスチャロード命令（「ｔｅｘｔｕｒｅ（ａｄｄｒｅｓｓ１）」および「ｔｅｘｔｕｒｅ（ａｄｄｒｅｓｓ２）」）を有するＣＦ命令のセットを含むＨＬ擬似コード１２０の変換を示す。そのような変換は、コンパイラ２０（図１）またはコンパイラ９２（図２）など、コンパイラによって実行され得る。図５のコードは説明のために与えたものにすぎないことを理解されたい。すなわち、図５はｉｆ−ｅｌｓｅ命令を示しているが、（より複雑な命令を含む）他のＣＦ命令および／またはループ命令が、同様にしてコンパイラによって述語命令に変換され得る。その上、ブロック１２４のＬＬアセンブリ言語命令は例として与えたものにすぎず、ＣＦ命令１２０は１つまたは複数の他のＬＬ言語にコンパイルされ得る。
【００７２】
[0077]図５に示すように、本開示の態様によれば、テクスチャロード命令を有するＣＦ命令のセット１２０は、述語構造を有するＬＬ命令１２４に変換され得る。変換は、例えば、述語構造を有するテクスチャ座標上にＬＬ命令１２４を生成することによって実行される。例えば、ＬＬ命令１２４は、変数ｐ０と条件（ｃｏｎｄ）との比較（ｃｍｐ）を含む。アドレス（ａｄｄｒ）が、条件の結果に基づいて予約される。アドレス呼出しが、選択関数（ｓｅｌ）と組み合わせて使用される（ａｄｄｒ）。すなわち、選択（例えば、ｓｅｌ  ｐ０が真である場合、ａｄｄｒｅｓｓ１におけるテクスチャを選択し、そうでない場合、ａｄｄｒｅｓｓ２におけるテクスチャを選択する）の結果に応じて、ａｄｄｒは、ａｄｄｒｅｓｓ１の値またはａｄｄｒｅｓｓ２の値のいずれかを保持する。次いで、結果コマンドが、適切なｔｅｘｔｕｒｅ（ａｄｄｒ）をロードするために使用される。このようにして、コマンドは直列に実行され得（例えば、ブランチコマンドまたはジャンプコマンドはない）、ただ１つのテクスチャがロードされる。従って、本開示の技法は、上記で説明した欠点（例えば、複数のテクスチャロードおよびメモリアクセス違反の可能性）なしに、テクスチャロードを有する制御フロー命令が述語命令に変換されることを可能にする。
【００７３】
[0078]いくつかの例で、（コンパイラ９２などの）コンパイラは、ＴＨＥＮブロックとＥＬＳＥブロックの両方から対称テクスチャロードを検出し、対称テクスチャロードに対する最適化のみを実行し得る。例えば、特定の命令が、１つの分岐中にのみテクスチャロードを含む場合（例えば、「ｘ」である場合は「ｙ」であり、他の場合は「テクスチャをロードする」、但し、「ｙ」はテクスチャロードではない）、変換は必要とされないことがあるので、そのような変換は実行されないことがある。すなわち、この例では、１つのテクスチャロードについての可能性のみがあり、従って、変換は、テクスチャロードをなくすことによって効率を高めない。
【００７４】
[0079]本開示の技法は、プレディケートされたテクスチャ座標を使用して、制御フロー外のテクスチャロードを「ホイスト」するために使用され得る。すなわち、テクスチャロードは、ジャンプ、分岐、またはテクスチャロードの結果に影響を及ぼし得る他の命令がないので、他の命令とは無関係に実行され得る（「ホイスティング」と呼ばれる）。従って、他の命令への依存性なしに、コンパイラは、レンダリングプロセスにおいて比較的初期に実行されるようにテクスチャロードをスケジュールし得る。このようにして、テクスチャがレンダリング中に必要とされるとき、テクスチャがメモリからロードされる（これは、比較的多数のクロックサイクルを消費し得る）のを待たなければならないのではなく、テクスチャは準備ができていることがある。
【００７５】
[0080]図６に、本開示の技法による、関連するテクスチャロード命令を有するＣＦ命令のセットを、述語構造を有する命令に変換する方法を示す。図６の方法について、コンピューティングデバイス７０（図２）のコンパイラ９２によって実行されるものとして説明するが、本開示の技法は、様々な他のコンピューティングデバイスおよびコンパイラによって実行され得ることを理解されたい。
【００７６】
[0081]図６の例では、コンパイラ９２が、関連するテクスチャロード命令を有するＨＬ  ＣＦ命令のセットを識別する（１３０）。ＨＬ  ＣＦ命令は、例えば、様々な条件付き命令および／またはループ命令を含み得る。例は、ｉｆ命令、ｉｆ−ｅｌｓｅ命令（ｉｆ−ｔｈｅｎ−ｅｌｓｅ命令）、ｉｆ−ｉｆ命令、またはプロセッサによる命令の実行のフローが制御され得る他の命令（例えば、命令ポインタレジスタを制御し得る命令）を含む。コンパイラ９２によって識別されたＣＦ命令のセットは、（例えば、分岐する経路を定義する）２つ以上の分岐を含み得、各分岐の各経路は１つまたは複数のテクスチャロード命令を含み得る。その上、いくつかの例で、ＣＦ命令のセットは、サブルーチンなど、命令のより大きいセットの一部分であり得る。
【００７７】
[0082]関連するテクスチャロード命令を有するＨＬ  ＣＦ命令のセットを識別した後に、コンパイラ９２は、ＨＬ  ＣＦ命令のセットを、述語構造を有するＬＬ命令に変換する（１３４）。すなわち、本開示の態様によれば、コンパイラ９２は、述語構造を有するＬＬ命令を生成する。その上、コンパイラ９２は、ＬＬ命令中に含まれるテクスチャロード命令の数を制限するようにＬＬ命令を生成する。例えば、上記で説明したように、コンパイラ９２は、ＨＬ  ＣＦ命令のテクスチャロード命令のすべてが、変換されたＬＬ命令中に含まれる必要がないように、テクスチャ座標上に命令を生成し得る。
【００７８】
[0083]本開示の態様によれば、コンパイラ９２は、例えば、ＨＬ  ＣＦ命令を含んでいるプログラムの実行中にランタイムコンパイラとして、ランタイムにおいて変換を実行し得る。従って、コンパイラ９２は、次いで、実行のために変換されたＬＬ命令を出力する（１３８）。但し、コンパイラ９２はまた、記憶のために、変換されたＬＬ命令を、例えば、ストレージユニット７６などの記憶媒体に出力する（１３８）。
【００７９】
[0084]例に応じて、図６に示した方法など、本明細書で説明した方法のいくつかの行為またはイベントは、異なるシーケンスで実行され得、互いに付加、マージ、または完全に除外され得る（例えば、全ての説明した行為またはイベントが、本方法の実施のために必要であるとは限らない）ことを理解されたい。さらに、いくつかの例で、行為またはイベントは、連続的にではなく、例えば、マルチスレッド処理、割込み処理、または複数のプロセッサを通して、同時に実行され得る。さらに、本開示のいくつかの態様は、明快のために単一のモジュールまたはユニットによって実行されるものとして説明したが、本開示の技法は、コンピューティングデバイスに関連するユニットまたはモジュールの組合せによって実行され得ることを理解されたい。
【００８０】
[0085]１つまたは複数の例で、説明した機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装される場合、機能は、１つまたは複数の命令またはコードとしてコンピュータ可読媒体上に記憶されるか、あるいはコンピュータ可読媒体を介して送信され得る。コンピュータ可読媒体は、ある場所から別の場所へのコンピュータプログラムの転送を可能にする任意の媒体を含む、コンピュータデータ記憶媒体または通信媒体を含み得る。データ記憶媒体は、本開示で説明した技法の実装のための命令、コードおよび／またはデータ構造を取り出すために１つまたは複数のコンピュータあるいは１つまたは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。
【００８１】
[0086]限定ではなく例として、そのようなコンピュータ可読媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭまたは他の光ディスクストレージ、磁気ディスクストレージ、または他の磁気ストレージデバイス、フラッシュメモリ、あるいは命令またはデータ構造の形態の所望のプログラムコードを搬送または記憶するために使用され得、コンピュータによってアクセスされ得る、任意の他の媒体を備えることができる。また、いかなる接続もコンピュータ可読媒体と適切に呼ばれる。例えば、ソフトウェアが、同軸ケーブル、光ファイバーケーブル、ツイストペア、デジタル加入者回線（ＤＳＬ）、または赤外線、無線、およびマイクロ波などの無線技術を使用して、ウェブサイト、サーバ、または他のリモートソースから送信される場合、同軸ケーブル、光ファイバーケーブル、ツイストペア、ＤＳＬ、または赤外線、無線、およびマイクロ波などの無線技術は、媒体の定義に含まれる。本明細書で使用するディスク（disk）およびディスク（disc）は、コンパクトディスク（disc）（ＣＤ）、レーザーディスク（登録商標）（disc）、光ディスク（disc）、デジタル多用途ディスク（disc）（ＤＶＤ）、フロッピー（登録商標）ディスク（disk）およびｂｌｕ−ｒａｙ（登録商標）ディスク（disc）を含み、ディスク（disk）は、通常、データを磁気的に再生し、ディスク（disc）は、データをレーザーで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含まれるべきである。
【００８２】
[0087]コードは、１つまたは複数のデジタル信号プロセッサ（ＤＳＰ）などの１つまたは複数のプロセッサ、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、あるいは他の等価な集積回路またはディスクリート論理回路によって実行され得る。従って、本明細書で使用する「プロセッサ」という用語は、前述の構造、または本明細書で説明した技法の実装に好適な他の構造のいずれかを指すことがある。さらに、いくつかの態様では、本明細書で説明した機能は、専用のハードウェアモジュールおよび／またはソフトウェアモジュール内に与えられ得る。また、本技法は、１つまたは複数の回路または論理要素中に十分に実装され得る。
【００８３】
[0088]本開示の技法は、無線ハンドセット、集積回路（ＩＣ）またはＩＣのセット（例えば、チップセット）を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示した技法を実行するように構成されたデバイスの機能的態様を強調するために様々な構成要素、モジュール、またはユニットについて説明したが、それらの構成要素、モジュール、またはユニットを、必ずしも異なるハードウェアユニットによって実現する必要があるとは限らない。むしろ、上記で説明したように、様々なユニットが、好適なソフトウェアおよび／またはファームウェアとともに、上記で説明した１つまたは複数のプロセッサを含めて、ハードウェアユニットにおいて組み合わせられるか、または相互動作ハードウェアユニットの集合によって与えられ得る。
【００８４】
[0089]本開示の多くの態様について説明した。特許請求の範囲から逸脱することなく、様々な変更が行われ得る。これらおよび他の態様は以下の特許請求の範囲内に入る。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
[Ｃ１]
低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルする方法であって、
コンピューティングデバイスを用いて、１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別することであって、ＨＬ  ＣＦ命令の前記セットが１つまたは複数の分岐を備える、識別することと、
前記コンピューティングデバイスを用いて、ＨＬ  ＣＦ命令の前記識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換することと、
前記述語構造を有する前記変換された（ＬＬ）命令を出力することと
を備える、方法。
[Ｃ２]
前記１つまたは複数のテクスチャロード命令の実行が、画像データをグラフィックス処理ユニットのローカルメモリに転送させる、Ｃ１に記載の方法。
[Ｃ３]
前記ＨＬ  ＣＦ命令を変換することが、前記変換された低レベル命令の無条件直列実行を可能にするために前記１つまたは複数の分岐を削除することを備える、Ｃ１に記載の方法。
[Ｃ４]
ＨＬ  ＣＦ命令の前記セットを識別することは、前記１つまたは複数の関連するテクスチャロード命令がＨＬ  ＣＦ命令の前記セットに関して対称であるかどうかを識別することを備え、前記１つまたは複数の関連するテクスチャロード命令が対称でない場合、ＨＬ  ＣＦ命令の前記識別されたセットを変換することを控えることをさらに備える、Ｃ１に記載の方法。
[Ｃ５]
ＨＬ  ＣＦ命令の前記識別されたセットを変換することが、ＬＬ命令のセットを生成することを備え、ＬＬ命令の前記セットの実行が、選択文の結果にアドレスを割り当てさせ、前記割り当てられたアドレスからテクスチャをロードさせる、Ｃ１に記載の方法。
[Ｃ６]
ＨＬ  ＣＦ命令の前記セットを識別することが、条件を有するＩＦ−ＥＬＳＥ文を識別することを備え、前記条件が真である場合、ＨＬ  ＣＦ命令の前記セットが第１のメモリアドレスからテクスチャをロードさせ、前記条件が偽である場合、ＨＬ  ＣＦ命令の前記セットが第２のメモリアドレスから前記テクスチャをロードさせる、Ｃ１に記載の方法。
[Ｃ７]
ＨＬ  ＣＦ命令の前記セットを変換することが、ＬＬ命令のセットを生成することを備え、ＬＬ命令の前記セットが、前記条件の結果に基づいてアドレスを予約させ、前記予約されたアドレスから前記テクスチャをロードさせる、Ｃ６に記載の方法。
[Ｃ８]
前記変換されたＬＬ命令を出力することが、前記変換されたＬＬ命令をメモリに記憶することを備える、Ｃ１に記載の方法。
[Ｃ９]
前記ＨＬ命令を変換することが、前記ＬＬ命令を生成するために前記ＨＬ命令をランタイムコンパイルすることを備え、グラフィックス処理ユニット上で前記出力されたＬＬ命令を実行することをさらに備える、Ｃ１に記載の方法。
[Ｃ１０]
前記出力されたＬＬ命令を実行することが、前記コンパイルされた命令を、前記ＨＬ  ＣＦ命令の条件と前記出力されたＬＬ命令の座標とが依存しない命令より前に実行されるようにスケジュールすることを備える、Ｃ９に記載の方法。
[Ｃ１１]
低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルするための装置であって、
１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別することであって、ＨＬ  ＣＦ命令の前記セットが１つまたは複数の分岐を備える、識別することと、
ＨＬ  ＣＦ命令の前記識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換することと、
前記述語構造を有する前記変換された（ＬＬ）命令を出力することと
を行うように構成された１つまたは複数の処理ユニットを備える、装置。
[Ｃ１２]
ローカルメモリをさらに備え、前記１つまたは複数のテクスチャロード命令の実行が、画像データを前記装置のローカルメモリに転送させる、Ｃ１１に記載の装置。
[Ｃ１３]
前記ＨＬ  ＣＦ命令を変換するために、前記１つまたは複数のプロセッサが、前記変換された低レベル命令の無条件直列実行を可能にするために前記１つまたは複数の分岐を削除するように構成された、Ｃ１１に記載の装置。
[Ｃ１４]
ＨＬ  ＣＦ命令の前記セットを識別するために、前記１つまたは複数のプロセッサは、前記１つまたは複数の関連するテクスチャロード命令がＨＬ  ＣＦ命令の前記セットに関して対称であるかどうかを識別するように構成され、前記１つまたは複数の関連するテクスチャロード命令が対称でない場合、ＨＬ  ＣＦ命令の前記識別されたセットを変換することを控えるようにさらに構成された、Ｃ１１に記載の装置。
[Ｃ１５]
ＨＬ  ＣＦ命令の前記識別されたセットを変換するために、前記１つまたは複数のプロセッサが、ＬＬ命令のセットを生成するように構成され、ＬＬ命令の前記セットの実行が、選択文の結果にアドレスを割り当てさせ、前記割り当てられたアドレスからテクスチャをロードさせる、Ｃ１１に記載の装置。
[Ｃ１６]
ＨＬ  ＣＦ命令の前記セットを識別するために、前記１つまたは複数のプロセッサが、条件を有するＩＦ−ＥＬＳＥ文を識別するように構成され、前記条件が真である場合、ＨＬ  ＣＦ命令の前記セットが第１のメモリアドレスからテクスチャをロードさせ、前記条件が偽である場合、ＨＬ  ＣＦ命令の前記セットが第２のメモリアドレスから前記テクスチャをロードさせる、Ｃ１１に記載の装置。
[Ｃ１７]
ＨＬ  ＣＦ命令の前記セットを変換するために、前記１つまたは複数のプロセッサが、ＬＬ命令のセットを生成するように構成され、ＬＬ命令の前記セットが、前記条件の結果に基づいてアドレスを予約させ、前記予約されたアドレスから前記テクスチャをロードさせる、Ｃ１６に記載の装置。
[Ｃ１８]
前記変換されたＬＬ命令を出力するために、前記１つまたは複数のプロセッサが、前記変換されたＬＬ命令をメモリに記憶するように構成された、Ｃ１１に記載の装置。
[Ｃ１９]
前記ＨＬ命令を変換するために、前記１つまたは複数のプロセッサが、前記ＬＬ命令を生成するために前記ＨＬ命令をランタイムコンパイルするように構成され、前記出力されたＬＬ命令を実行するようにさらに構成された、Ｃ１１に記載の装置。
[Ｃ２０]
前記出力されたＬＬ命令を実行するために、前記１つまたは複数のプロセッサが、前記コンパイルされた命令を、前記ＨＬ  ＣＦ命令の条件と前記出力されたＬＬ命令の座標とが依存しない命令より前に実行されるようにスケジュールするように構成された、Ｃ１９に記載の装置。
[Ｃ２１]
低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルするためのコンピュータプログラム製品であって、実行されたとき、
１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別することであって、ＨＬ  ＣＦ命令の前記セットが１つまたは複数の分岐を備える、識別することと、
ＨＬ  ＣＦ命令の前記識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換することと、
前記述語構造を有する前記変換された（ＬＬ）命令を出力することと
を１つまたは複数のプロセッサに行わせる命令を記憶する、コンピュータプログラム製品。
[Ｃ２２]
前記１つまたは複数のテクスチャロード命令の実行が、画像データをグラフィックス処理ユニットのローカルメモリに転送させる、Ｃ２１に記載のコンピュータプログラム製品。
[Ｃ２３]
前記ＨＬ  ＣＦ命令を変換することが、前記変換された低レベル命令の無条件直列実行を可能にするために前記１つまたは複数の分岐を削除することを備える、Ｃ２１に記載のコンピュータプログラム製品。
[Ｃ２４]
ＨＬ  ＣＦ命令の前記セットを識別することは、前記１つまたは複数の関連するテクスチャロード命令がＨＬ  ＣＦ命令の前記セットに関して対称であるかどうかを識別することを備え、前記１つまたは複数の関連するテクスチャロード命令が対称でない場合、ＨＬ  ＣＦ命令の前記識別されたセットを変換することを控えることをさらに備える、Ｃ２１に記載のコンピュータプログラム製品。
[Ｃ２５]
ＨＬ  ＣＦ命令の前記識別されたセットを変換することが、ＬＬ命令のセットを生成することを備え、ＬＬ命令の前記セットの実行が、選択文の結果にアドレスを割り当てさせ、前記割り当てられたアドレスからテクスチャをロードさせる、Ｃ２１に記載のコンピュータプログラム製品。
[Ｃ２６]
ＨＬ  ＣＦ命令の前記セットを識別することが、条件を有するＩＦ−ＥＬＳＥ文を識別することを備え、前記条件が真である場合、ＨＬ  ＣＦ命令の前記セットが第１のメモリアドレスからテクスチャをロードさせ、前記条件が偽である場合、ＨＬ  ＣＦ命令の前記セットが第２のメモリアドレスから前記テクスチャをロードさせる、Ｃ２１に記載のコンピュータプログラム製品。
[Ｃ２７]
ＨＬ  ＣＦ命令の前記セットを変換することが、ＬＬ命令のセットを生成することを備え、ＬＬ命令の前記セットが、前記条件の結果に基づいてアドレスを予約させ、前記予約されたアドレスから前記テクスチャをロードさせる、Ｃ２６に記載のコンピュータプログラム製品。
[Ｃ２８]
前記変換されたＬＬ命令を出力することが、前記変換されたＬＬ命令をメモリに記憶することを備える、Ｃ２１に記載のコンピュータプログラム製品。
[Ｃ２９]
前記ＨＬ命令を変換することが、前記ＬＬ命令を生成するために前記ＨＬ命令をランタイムコンパイルすることを備え、実行されたとき、グラフィックス処理ユニット上で前記出力されたＬＬ命令を実行することを前記１つまたは複数のプロセッサに行わせる命令をさらに備える、Ｃ２１に記載のコンピュータプログラム製品。
[Ｃ３０]
前記出力されたＬＬ命令を実行することが、前記コンパイルされた命令を、前記ＨＬ  ＣＦ命令の条件と前記出力されたＬＬ命令の座標とが依存しない命令より前に実行されるようにスケジュールすることを備える、Ｃ２９に記載のコンピュータプログラム製品。
[Ｃ３１]
低レベルソフトウェア命令を生成するために高レベルソフトウェア命令をコンパイルするための装置であって、
１つまたは複数の関連するテクスチャロード命令を有する高レベル（ＨＬ）制御フロー（ＣＦ）命令のセットを識別するための手段であって、ＨＬ  ＣＦ命令の前記セットが１つまたは複数の分岐を備える、識別するための手段と、
ＨＬ  ＣＦ命令の前記識別されたセットを、述語構造を有する低レベル（ＬＬ）命令に変換するための手段と、
前記述語構造を有する前記変換された（ＬＬ）命令を出力するための手段と
を備える、装置。
[Ｃ３２]
前記１つまたは複数のテクスチャロード命令の実行が、画像データをグラフィックス処理ユニットのローカルメモリに転送させる、Ｃ３１に記載の装置。
[Ｃ３３]
前記ＨＬ  ＣＦ命令を変換することが、前記変換された低レベル命令の無条件直列実行を可能にするために前記１つまたは複数の分岐を削除することを備える、Ｃ３１に記載の装置。
[Ｃ３４]
ＨＬ  ＣＦ命令の前記セットを識別することは、前記１つまたは複数の関連するテクスチャロード命令がＨＬ  ＣＦ命令の前記セットに関して対称であるかどうかを識別することを備え、前記１つまたは複数の関連するテクスチャロード命令が対称でない場合、ＨＬ  ＣＦ命令の前記識別されたセットを変換することを控えるための手段をさらに備える、Ｃ３１に記載の装置。
[Ｃ３５]
ＨＬ  ＣＦ命令の前記識別されたセットを変換することが、ＬＬ命令のセットを生成することを備え、ＬＬ命令の前記セットの実行が、選択文の結果にアドレスを割り当てさせ、前記割り当てられたアドレスからテクスチャをロードさせる、Ｃ３１に記載の装置。
[Ｃ３６]
ＨＬ  ＣＦ命令の前記セットを識別することが、条件を有するＩＦ−ＥＬＳＥ文を識別することを備え、前記条件が真である場合、ＨＬ  ＣＦ命令の前記セットが第１のメモリアドレスからテクスチャをロードさせ、前記条件が偽である場合、ＨＬ  ＣＦ命令の前記セットが第２のメモリアドレスから前記テクスチャをロードさせる、Ｃ３１に記載の装置。
[Ｃ３７]
ＨＬ  ＣＦ命令の前記セットを変換することが、ＬＬ命令のセットを生成することを備え、ＬＬ命令の前記セットが、前記条件の結果に基づいてアドレスを予約させ、前記予約されたアドレスから前記テクスチャをロードさせる、Ｃ３６に記載の装置。
[Ｃ３８]
前記変換されたＬＬ命令を出力することが、前記変換されたＬＬ命令をメモリに記憶することを備える、Ｃ３１に記載の装置。
[Ｃ３９]
前記ＨＬ命令を変換することが、前記ＬＬ命令を生成するために前記ＨＬ命令をランタイムコンパイルすることを備え、グラフィックス処理ユニット上で前記出力されたＬＬ命令を実行することをさらに備える、Ｃ３１に記載の装置。
[Ｃ４０]
前記出力されたＬＬ命令を実行することが、前記コンパイルされた命令を、前記ＨＬ  ＣＦ命令の条件と前記出力されたＬＬ命令の座標とが依存しない命令より前に実行されるようにスケジュールすることを備える、Ｃ３９に記載の装置。
【図１】
0006017586.tif 000002
【図２】
0006017586.tif 000003
【図３】
0006017586.tif 000004
【図４】
0006017586.tif 000005
【図５】
0006017586.tif 000006
【図６】
0006017586.tif 000007