(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-03-08
(45)【発行日】2024-03-18
(54)【発明の名称】コンパイラの精度選定によるシェーダプログラムの加速化
(51)【国際特許分類】
G06F 8/51 20180101AFI20240311BHJP
G06F 8/41 20180101ALI20240311BHJP
G06T 15/80 20110101ALI20240311BHJP
【FI】
G06F8/51
G06F8/41
G06T15/80
(21)【出願番号】P 2021571327
(86)(22)【出願日】2020-04-17
(86)【国際出願番号】 US2020028606
(87)【国際公開番号】W WO2020247073
(87)【国際公開日】2020-12-10
【審査請求日】2023-03-13
(32)【優先日】2019-06-03
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】314015767
【氏名又は名称】マイクロソフト テクノロジー ライセンシング,エルエルシー
(74)【代理人】
【識別番号】100107766
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100135079
【氏名又は名称】宮崎 修
(72)【発明者】
【氏名】ネブラエフ,イワン
(72)【発明者】
【氏名】シャルマ,ヴィシャル チャンドラ
【審査官】多賀 実
(56)【参考文献】
【文献】米国特許出願公開第2018/0315157(US,A1)
【文献】米国特許出願公開第2016/0357534(US,A1)
【文献】特開平11-073524(JP,A)
【文献】国際公開第2007/049610(WO,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/40- 8/54
G06T 1/00- 1/40
G06T 3/00- 5/50
G06T 11/00-19/20
(57)【特許請求の範囲】
【請求項1】
シェーダプログラムにおいて半精度のストレージおよび算術をサポートするグラフィックス処理装置(GPU)と、
データおよび命令を保管するためのメモリと、
前記メモリと通信するように構成された少なくとも1つのプロセッサと、
前記メモリおよび前記少なくとも1つのプロセッサと通信するコンパイラと、
を含み、
前記コンパイラは、
前記GPUで使用するシェーダプログラムのためのプログラムコードを受信し、
前記プログラムコードの構造を自動的に分析し、かつ、前記プログラムコードの中の一連のオペレーションを選択するために
、半精度をサポートするものとして前記一連のオペレーションを識別する前記分析に応答して、前記プログラムコード上で少なくとも1つのパスを実行して、前記一連のオペレーションによって使用される複数の計算の精度を低下させ、
前記分析は、半精度をサポートするものとして前記一連のオペレーションを識別するために、半精度をサポートする以前に定義されたオペレーションのリストと、精度の低下に敏感な以前に定義されたオペレーションのリストとの組み合わせでハードウェア情報を使用する訓練された探索であり、
前記複数の計算の各計算に対して計算精度を半精度に低下させることについて精度損失のリスクを評価し、
精度損失閾値を下回る前記精度損失のリスクに応答して、前記計算を半精度に書き換えることによって、編集されたプログラムコードを生成し、
前記精度損失閾値を上回る前記精度損失のリスクに応答して、可能性ある精度損失について警告を伴う通知を提供
し、かつ、
前記編集されたプログラムコードの精度に対して行われた変更の情報を伴うレポートを生成し、
前記レポートは、精度が低下した、前記編集されたプログラム内の1つ以上の計算を識別し、かつ、前記編集されたプログラムコード内の他の計算について精度を維持するための決定に関する情報を提供する、
ように動作可能である、
コンピュータ装置。
【請求項2】
前記精度損失閾値は、前記計算が半精度をサポートするか否かを識別
する、
請求項1に記載のコンピュータ装置。
【請求項3】
前記一連のオペレーションは、半精度をサポートするものとして以前に特定されていることに応答して、または、ユーザ入力に応答して選択される、
請求項1に記載のコンピュータ装置。
【請求項4】
前記精度損失のリスクを評価するために、前記コンパイラによって、前記GPUのハードウェアパラメータが使用される、
請求項1に記載のコンピュータ装置。
【請求項5】
前記精度損失のリスクは、前記計算が半精度をサポートしない場合に前記精度損失閾値を上回
る、
請求項1に記載のコンピュータ装置。
【請求項6】
前記精度損失のリスクは、前記計算が半精度をサポートする場合に前記精度損失閾値を下回る、
請求項1に記載のコンピュータ装置。
【請求項7】
前記コンパイラは、さらに、
前記一連のオペレーションの中の前記複数の計算の精度を低下させるか否かを決定する際に反復処理を実行するように動作可能である、
請求項1に記載のコンピュータ装置。
【請求項8】
前記レポートは、計算の精度に対して行われた変更を識別し、かつ、行われた変更の説明を提供する、
請求項1に記載のコンピュータ装置。
【請求項9】
前記コンパイラは、さらに、
ディスプレイ上に表示するための出力へと処理するために、前記GPUに対して前記編集されたプログラムコードを提供し、かつ、
前記ディスプレイ上のユーザインターフェイスに前記通知を提供する、
ように動作可能である、
請求項1に記載のコンピュータ装置。
【請求項10】
シェーダプログラムで使用される計算の精度を低下させるための方法であって、
コンピュータ装置におけるコンパイラで、前記シェーダプログラムの半精度のストレージおよび算術をサポートするグラフィックス処理装置(GPU)で使用するシェーダプログラムのためのプログラムコードを受信するステップと、
前記プログラムコードの構造を自動的に分析し、かつ、前記プログラムコードの中の一連のオペレーションを選択するために
、半精度をサポートするものとして前記一連のオペレーションを識別する前記分析に応答して、前記プログラムコード上で少なくとも1つのパスを実行するステップであり、前記一連のオペレーションによって使用される複数の計算の精度を低下させ
、
前記分析は、半精度をサポートするものとして前記一連のオペレーションを識別するために、半精度をサポートする以前に定義されたオペレーションのリストと、精度の低下に敏感な以前に定義されたオペレーションのリストとの組み合わせでハードウェア情報を使用する訓練された探索である、
ステップと、
前記複数の計算の各計算に対して計算精度を半精度に低下させることについて精度損失のリスクを評価するステップと、
精度損失閾値を下回る前記精度損失のリスクに応答して、前記計算を半精度に書き換えることによって、編集されたプログラムコードを生成するステップと、
前記精度損失閾値を上回る前記精度損失のリスクに応答して、精度損失について警告を伴う通知を提供するステップと、
前記編集されたプログラムコードの精度に対して行われた変更の情報を伴うレポートを生成するステップであり、
前記レポートは、精度が低下した、前記編集されたプログラム内の1つ以上の計算を識別し、かつ、前記編集されたプログラムコード内の他の計算について精度を維持するための決定に関する情報を提供する、
ステップと、
を含む、方法。
【請求項11】
前記精度損失閾値は、前記計算が半精度をサポートするか否かを識別
する、
請求項10に記載の方法。
【請求項12】
前記一連のオペレーションは、半精度をサポートするものとして以前に特定されていることに応答して、または、ユーザ入力に応答して選択される、
請求項
10に記載の方法。
【請求項13】
前記精度損失のリスクを評価するために、前記コンパイラによって、前記GPUのハードウェアパラメータが使用される、
請求項
10に記載の方法。
【請求項14】
前記精度損失のリスクは、前記計算が半精度をサポートしない場合に前記精度損失閾値を上回
る、
請求項10に記載の方法。
【請求項15】
前記精度損失のリスクは、前記計算が半精度をサポートする場合に前記精度損失閾値を下回る、
請求項
10に記載の方法。
【請求項16】
前記方法は、さらに、
前記一連のオペレーションの中の前記複数の計算の精度を低下させるか否かを決定する際に反復処理を実行するステップ、を含む、
請求項
10に記載の方法。
【請求項17】
前記
レポートは、計算の精度に対して
行われた変更を識別し、かつ、
行われた変更の説明を提供する
、
請求項
10に記載の方法。
【請求項18】
前記方法は、さらに、
ユーザの入力に応答して、前記プログラムコードにおける解析のレベルを調整するステップ、を含む、
請求項
10に記載の方法。
【請求項19】
前記方法は、さらに、
ディスプレイ上に表示するための出力へと処理するために、前記GPUに対して前記編集されたプログラムコードを提供するステップと、
前記ディスプレイ上のユーザインターフェイスに前記通知を提供するステップと、
を含む、請求項
10に記載の方法。
【請求項20】
コンピュータ装置によって実行可能な命令を保管している
非一時的なコンピュータで読取り可能な媒体であって、
シェーダプログラムにおいて半精度のストレージおよび算術をサポートするグラフィックス処理装置(GPU)で使用するシェーダプログラムのためのプログラムコードを受信するように、前記コンピュータ装置にさせるための少なくとも1つの命令と、
一連のオペレーションによって使用される複数の計算の精度を低下させるように、
前記プログラムコードの構造を自動的に分析し、かつ、前記プログラムコードの中の前記一連のオペレーションを選択するために
、半精度をサポートするものとして前記一連のオペレーションを識別する前記分析に応答して、前記プログラムコード上で少なくとも1つのパスを実行するように、前記コンピュータ装置にさせるための少なくとも1つの命令
であり、
前記分析は、半精度をサポートするものとして前記一連のオペレーションを識別するために、半精度をサポートする以前に定義されたオペレーションのリストと、精度の低下に敏感な以前に定義されたオペレーションのリストとの組み合わせでハードウェア情報を使用する訓練された探索である、
少なくとも1つの命令と、
前記複数の計算の各計算に対して計算精度を半精度に低下させることについて精度損失のリスクを評価するように、前記コンピュータ装置にさせるための少なくとも1つの命令と、
精度損失閾値を下回る前記精度損失のリスクに応答して、前記計算を半精度に書き換えることによって、編集されたプログラムコードを生成するように、前記コンピュータ装置にさせるための少なくとも1つの命令と、
前記精度損失閾値を上回る前記精度損失のリスクに応答して、精度損失について警告を伴う通知を提供するように、前記コンピュータ装置にさせるための少なくとも1つの命令と、
前記編集されたプログラムコードの精度に対して行われた変更の情報を伴うレポートを生成するように、前記コンピュータ装置にさせるための少なくとも1つの命令であり、
前記レポートは、精度が低下した、前記編集されたプログラム内の1つ以上の計算を識別し、かつ、前記編集されたプログラムコード内の他の計算について精度を維持するための決定に関する情報を提供する、
少なくとも1つの命令と、
を含む、コンピュータで読取り可能な媒体。
【発明の詳細な説明】
【背景技術】
【0001】
本開示は、コンピュータ装置におけるグラフィックス処理に関する。そして、より詳細には、シェーダプログラムコードをコンパイルする装置および方法に関する。
【0002】
ゲームは、典型的に、ゲーム内の画像に対して適切なレベルの色及び/又は特殊効果を生成するために、ゲーム内で何万ものグラフィックシェーダプログラムを使用する。開発者がシェーダプログラムのパフォーマンスを向上させようとすると、ゲーム内の多数のシェーダプログラムのせいで困難な時間が生じることがある。グラフィックシェーダ(graphic shader)の処理及び/又はパフォーマンスは、ゲームのパフォーマンス及び/又はコンピュータ装置の消費電力を決定し得る。
【0003】
従って、グラフィックシェーダのパフォーマンスを向上させる必要が存在している。
【発明の概要】
【0004】
以下は、そうした実施の基本的理解を提供するために、本開示の1つ以上の実施の簡略化された概要である。この概要は、全ての意図された実装の広範な概観ではなく、そして、全ての実装の鍵または重要な要素を特定することも、また、いくらか又は全ての実装の範囲を描くことも意図されていない。その唯一の目的は、後で提示される、より詳細な説明の前に、簡略化された形態で、本開示の1つ以上の実施の概念を提示することである。
【0005】
一つの例示的な実装はコンピュータ装置に関する。コンピュータ装置は、シェーダプログラムにおいて半精度のストレージおよび算術をサポートするグラフィックス処理装置(GPU)と、データおよび命令を保管するためのメモリと、前記メモリと通信するように構成された少なくとも1つのプロセッサと、前記メモリおよび前記少なくとも1つのプロセッサと通信するコンパイラと、を含む。ここで、前記コンパイラは、前記GPUで使用するシェーダプログラムのためのプログラムコードを受信し、前記プログラムコードの中の一連のオペレーションを選択するために前記プログラムコード上で少なくとも1つのパスを実行して、前記一連のオペレーションによって使用される複数の計算の精度を低下させ、前記複数の計算の各計算に対して計算精度を半精度に低下させることについて精度損失のリスクを評価し、精度損失閾値を下回る前記精度損失のリスクに応答して、前記計算を半精度に書き換えることによって、編集されたプログラムコードを生成し、かつ、前記精度損失閾値を上回る前記精度損失のリスクに応答して、可能性ある精度損失について警告を伴う通知を提供する、ように動作可能である。
【0006】
別の例示的な実装は、シェーダプログラムで使用される計算の精度を低下させるための方法に関する。本方法は、コンピュータ装置におけるコンパイラで、前記シェーダプログラムの半精度のストレージおよび算術をサポートするグラフィックス処理装置(GPU)で使用するシェーダプログラムのためのプログラムコードを受信するステップ、を含み得る。本方法は、前記プログラムコードの中の一連のオペレーションを選択するために前記プログラムコード上で少なくとも1つのパスを実行するステップであり、前記一連のオペレーションによって使用される複数の計算の精度を低下させる、ステップを含み得る。本方法は、前記複数の計算の各計算に対して計算精度を半精度に低下させることについて精度損失のリスクを評価するステップを含み得る。本方法は、精度損失閾値を下回る前記精度損失のリスクに応答して、前記計算を半精度に書き換えることによって、編集されたプログラムコードを生成するステップを含み得る。本方法は、前記精度損失閾値を上回る前記精度損失のリスクに応答して、精度損失について警告を伴う通知を提供するステップを含み得る。
【0007】
別の例示的な実装は、コンピュータ装置によって実行可能な命令を保管しているコンピュータで読取り可能な媒体に関する。本コンピュータで読取り可能な媒体は、シェーダプログラムにおいて半精度のストレージおよび算術をサポートするグラフィックス処理装置(GPU)で使用するシェーダプログラムのためのプログラムコードを受信するように、前記コンピュータ装置にさせるための少なくとも1つの命令を含み得る。本コンピュータで読取り可能な媒体は、一連のオペレーションによって使用される複数の計算の精度を低下させるように、前記プログラムコードの中の前記一連のオペレーションを選択するために前記プログラムコード上で少なくとも1つのパスを実行するように、前記コンピュータ装置にさせるための少なくとも1つの命令を含み得る。本コンピュータで読取り可能な媒体は、前記複数の計算の各計算に対して計算精度を半精度に低下させることについて精度損失のリスクを評価するように、前記コンピュータ装置にさせるための少なくとも1つの命令を含み得る。本コンピュータで読取り可能な媒体は、精度損失閾値を下回る前記精度損失のリスクに応答して、前記計算を半精度に書き換えることによって、編集されたプログラムコードを生成するように、前記コンピュータ装置にさせるための少なくとも1つの命令を含み得る。本コンピュータで読取り可能な媒体は、前記精度損失閾値を上回る前記精度損失のリスクに応答して、精度損失について警告を伴う通知を提供するように、前記コンピュータ装置にさせるための少なくとも1つの命令を含み得る。
【0008】
本開示の実施に関する追加的な利点および新規な特徴は、以下の説明の一部において記載され、そして、一部は、以下の検討またはその実施による学習により、当業者にとって、より明らかになる。
【図面の簡単な説明】
【0009】
【
図1】
図1は、本開示の一つの実施に従った、例示的なコンピュータ装置の概略ブロック図である。
【
図2】
図2は、本開示の一つの実施に従った、一連のオペレーションを伴う例示的な式木(expression tree)である。
【
図3】
図3は、本開示の一つの実施に従った、シェーダプログラムにおいて使用される計算の精度を低下させるための例示的な方法のフローチャートである。
【
図4】
図4は、本開示の一つの実施に従った、シェーダプログラムにおいて使用される計算の低い精度を評価するための例示的な方法のフローチャートである。
【
図5】
図5は、本開示の一つの実施に従った、例示的な装置の概略ブロック図である。
【発明を実施するための形態】
【0010】
この開示は、グラフィックス処理装置(GPU)といった、グラフィックスハードウェアと共に使用するためにシェーダプログラムにおいて使用される計算の精度を低下させる助けとなるコンパイラを使用するための装置および方法に関する。ゲームアプリケーションを実行するコンピュータ装置は、典型的に、ゲーム内の画像に対して適切なレベルの色及び/又は特殊効果を生成するために、ゲーム内で何万ものシェーダプログラムを使用する。例えば、シェーダプログラムは、コンピュータメモリの32ビットを占める、単一精度浮動小数点フォーマットといった、コンピュータ番号フォーマットで保管されたデータに基づいて動作することができる。現代のグラフィックスハードウェアは、シェーダプログラムにおける半精度のストレージ(half precision storage)及び/又は算術をサポートしている。ここで、半精度とは、コンピュータメモリの16ビットを占めるバイナリ浮動小数点コンピュータ番号フォーマットを指す。シェーダプログラムにおいて半精度のストレージ及び/又は算術を使用することは、実行中(in flight)のシェーダプログラムの数の増加によるシェーダプログラムのパフォーマンスに対して利益をもたらし、算術のスループットを改善し、かつ/あるいは、メモリアクセスを高速化している。
【0011】
しかしながら、シェーダプログラムで使用される全ての計算が、出力(例えば、ゲームまたはアプリケーションでレンダリングされたターゲット)での画質を劣化させることなく、低減された精度及び/又は範囲フォーマット(range format)を許容できるわけではない。加えて、シェーダプログラムに半精度を追加するコストを予測することは、単一精度から半精度および半精度への変換および戻りのせいで困難である。さらに、半精度を使用するためのシェーダプログラムの手動変換に関わる作業は、ゲーム内の多数のシェーダ(例えば、何万ものシェーダ)を考慮すると実用的ではないだろう。かくして、低減された精度、範囲、及び/又は、手作業でシェーダを編集することを許容できるシェーダプログラムの中の計算を特定することは、シェーダプログラムの開発者に対して非常に多くの作業を結果として生じる。
【0012】
本開示の装置および方法は、精度が低下、かつ/あるいは、精度ロス(loss)が許容され得る、シェーダプログラム内の計算を識別するためのコンパイラ内の自動化プロセスを提供し得る。例えば、コンパイラは、半精度を使用することが知られているシェーダプログラム内の出力から依存関係チェーン(dependency chain)を構築し得る(例えば、レンダリングターゲットへの出力、または、シェーダ内で半分としてマークされる任意の他の出力)。加えて、コンパイラは半精度を使用することが知られているシェーダプログラムの入力から依存関係チェーンを構築し得る。例えば、頂点シェーダ(Vertex Shader)への入力レイアウトは、半精度を使用することが知られている、R16G16B16A16_FLOATフォーマットを指定することができる。出力および対応する依存関係チェーンを識別した後で、コンパイラは、結果として生じる表現を評価し、そして、精度に敏感であり得る命令についてモニタリングしながら、出力の依存関係チェーン内の中間体(intermediates)、機能パラメータ、メモリ負荷、及び/又は、任意の他の命令に係る精度を低下させるように試みることができる。精度及び/又は精度の変化に対して敏感であり得る命令は、これらに限定されるわけではないが、三角関数命令(trigonometric instructions)または超越関数命令(transcendental instructions)を含み得る。例えば、命令は、精度が低下するときに、計算値が期待範囲及び/又は精度境界を超える場合に、精度及び/又は精度の変化に敏感であり得る。
【0013】
加えて、コンパイラは、精度が低下し得るか否か、及び/又は、精度損失が許容され得る場所を決定することにおいて、変換オペレーションのコスト、及び/又は、変換オペレーションからの電力消費の利益を重み付けすることができる。例えば、コンパイラは、変換のためのランタイムコスト(例えば、変換を実行することによって消費される時間及び/又は電力)を、精度が低下され得るか否かを決定するために、変換の利点と比較する。加えて、コンピュータ装置に対する電力消費の利益は、計算の精度を低下させることから生じる精度損失を上回ることがある。かくして、コンパイラは、半精度の計算を使用する場合に電力消費の節約から利益を得るために、精度損失が許容可能であり、かつ、計算の精度を低下させ得ることを判断することができる。精度損失のリスクが低い表現チェーン(expression chain)の部分について、コンパイラは、半精度算術を使用して表現を書き換えることによって、編集されたプログラムコードを生成することができる。コンパイラは、また、シェーダプログラムに対して行われた変更に関する情報を用いて、変更のレポートを提供することもできる。
【0014】
この開示のデバイスおよび方法は、また、識別された命令に対して精度が低下され得るか否かを評価するために、シェーダプログラム内の特定の命令の分析をターンオフまたはオンするユーザ入力を受け取ることもできる。かくして、装置および方法は、プログラムコード内の特定の命令の分析をターンオフまたはオンすることをより細かく制御するために、言語レベルでのメカニズムをユーザに提供することができる。
【0015】
この開示のデバイスおよび方法は、また、シェーダプログラムの開発中に、ユーザが使用するツールを提供することもでき、ツールは、シェーダプログラムのための編集されたプログラムコードにおける選択された計算の精度を低下させることによる精度損失を、ユーザが定量化するのを助ける。例えば、ツールにより、ユーザは、ゲーム及び/又はゲームのトレースをオープンすることができ、そうして、ユーザは、より低い精度で編集されたプログラムコードを実行し、かつ、より低い精度の結果としての画質出力がゲームでの使用に許容され得るか否かを評価することができる。ツールは、また、ユーザに、ゲームの出力において生じ得る精度損失について追加的な情報及び/又は説明を提供することができる。
【0016】
シェーダプログラム内の命令の一部の精度を低減することによって、一般的に、グラフィックス処理、および、特には、シェーダプログラムのパフォーマンスは、実行中(in flight)のシェーダプログラムの数を増加させ、算術のスループットを改善し、そして、メモリアクセスを高速化することによって、改善され得る。かくして、説明される方法および装置は、
精度が低減され得るシェーダプログラム内の命令及び/又は一連のオペレーションを識別すること、及び/又は、識別された命令のセットにおける精度を自動的に低減することによって、グラフィックス処理およびシェーダプログラムのパフォーマンスを改善することができる。
【0017】
これから
図1を参照すると、そこには、シェーダプログラム12内で使用される計算24における精度を低下させて使用するための一つの例示的なコンピュータ装置102が示されている。コンピュータ装置102は、コンピュータ装置102のプロセッサ54及び/又はシステムメモリ56によって実行または処理される複数のアプリケーション10を含み得る。ユーザは、表示されるべき画像のグラフィックスデータをレンダリングするためにグラフィックス処理装置44によって実行されるようにプロセッサ54がさせ得る、アプリケーション10の中の1つ以上のシェーダプログラム12のためのプログラムコード14を開発することができる。加えて、コンピュータ装置102、または別のコンピュータ装置は、1つ以上のシェーダプログラム12のためのプログラムコード14を自動的に生成することができる。例えば、アプリケーション10は、GPU44に、アプリケーション10の中のシェーダプログラム12のプログラムコード14の実行に関連する何万ものシェーダを使用させることができ、ゲームでの使用のため、といった、アプリケーション10の実行に関連する画像のための適切なレベルの色及び/又は特殊効果を生成する。従って、GPU44は、シェーダプログラムコード14を実行することができ、かつ、ディスプレイ48上の提示のために1つ以上のレンダリング画像47を含み得る出力46をレンダリングすることができる。
【0018】
加えて、GPU44は、シェーダプログラム12のプログラムコードの1つ以上の部分におけるデータストレージ、及び/又は、計算または算術において半精度をサポートすることができる。例えば、本開示は、ストレージ及び/又は算術において半精度38を使用して、ストレージ及び/又は算術に関連し、かつ、最初は単一精度フォーマットである部分といった、プログラムコード14の1つ以上の部分を、編集されたプログラムコード34の対応する1つ以上の部分と置き換えることを可能にする。半精度のストレージ及び/又は算術を使用することによって、編集されたプログラムコード34を伴うシェーダプログラム12のパフォーマンスが改善され得る。例えば、GPU44において実行中のシェーダプログラム12の数が増加され得る。加えて、シェーダプログラム12内で使用される単一精度26における算術計算24といった、プログラムコード14の残りの、編集されていない部分に係るGPU44におけるスループットも、また、GPU44によるメモリアクセスがスピードアップされ得るので、改善され得る。
【0019】
コンピュータ装置102は、ネットワークに接続可能な任意の移動式または固定式コンピュータ装置を含み得る。コンピュータ装置102は、例えば、デスクトップまたはラップトップもしくはタブレットコンピュータといったコンピュータ装置、モノのインターネット(IoT)装置、携帯電話、ゲーム装置、復号現実または仮想現実装置、音楽装置、テレビジョン、ナビゲーションシステム、カメラ、パーソナルデジタルアシスタント(PDA)、または、ハンドヘルドデバイス、もしくは、1つ以上の他の装置との有線及び/又は無線接続機能を有する他のコンピュータ装置、であり得る。
【0020】
コンピュータ装置102は、プロセッサ54及び/又はメモリ56によって実行されるオペレーティングシステム110を含み得る。コンピュータ装置102のメモリ56は、オペレーティングシステム110を定義し、かつ/あるいは、関連するデータ及び/又はコンピュータ実行可能命令を保管するように構成することができ、そして、プロセッサ54は、オペレーティングシステム110をインスタンス化するために、そうしたデータ及び/又は命令を実行することができる。メモリ56の例は、これらに限定されるわけではないが、ランダムアクセスメモリ(RAM)、リードオンリーメモリ(ROM)、テープ、磁気ディスク、光ディスク、揮発性メモリ、不揮発性メモリ、および、それらの任意の組み合わせといった、コンピュータによって使用可能なメモリのタイプを含み得る。プロセッサ54の例は、これらに限定されるわけではないが、コントローラ、マイクロコントローラ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、システムオンチップ(SoC)、または、他のプログラマブルロジック、もしくは、状態機械を含む、ここにおいて説明されるように特別にプログラムされた任意のプロセッサ、含み得る。
【0021】
オペレーティングシステム110は、プログラムコード14を検証及び/又は改良するために使用され得るコンパイラ16を含み得る。加えて、コンパイラ16は、シェーダプログラム12の中の演算の精度を単一精度26から半精度38へ安全に低下させることによって、プログラムコード14を半精度38算術へ移すために使用され得る。コンパイラ16は、また、より低い精度でプログラムコード14を修正する前に、より低い精度への潜在的な変更が、価値があるか否かを検証するために使用され得る。一つの態様において、コンピュータ装置102のユーザは、ユーザインターフェイス50を使用してプログラムコード14をコンパイラ16へとロードすることができる。別の態様において、アプリケーション10は、プログラムコード14をコンパイラ16に自動的に送信することができる。
【0022】
コンパイラ16は、プログラムコード14における精度低下のための機会を自動的に探索するために、プログラムコード14上で1つ以上のパス18を実行するように動作可能な精度低下マネージャ20を有し得る。精度低下マネージャ20は、より低い精度及び/又は範囲を許容し得るプログラムコード14内の一連のオペレーション22を識別し得る。一連のオペレーション22は、単一精度26で現在実行されている複数の計算24(n個まで、nは整数)を含み得る。
【0023】
精度低下マネージャ20は、一連のオペレーション22がより低い精度及び/又は範囲を許容するか否かを決定する際に、プログラムコード14、及び/又はシェーダプログラム12、及び/又はGPU44のハードウェアパラメータ45の構造を分析することができる。GPU44のハードウェアパラメータ45は、これらに限定されるわけではないが、GPU44の電力消費、GPU44が半精度38をサポートするか否か、及び/又は、GPU44のパフォーマンスを含み得る。加えて、半精度38をサポートする以前に定義されたオペレーションのリストは、精度低下マネージャ20によって、より低い精度及び/又は範囲を許容し得る一連のオペレーション22を決定する際に使用され得る。例えば、これらに限定されるわけではないが、画像及び/又はテクスチャからの読取り、バッファからの読取り、頂点からの低精度入力(例えば、8ビットまたは10ビット精度の色入力)、及び/又は、レンダリングターゲットへの出力といったオペレーションが、半精度38で動作することが知られ得る。さらに、精度低下マネージャ20によって知られている、精度に敏感なオペレーション(例えば、三角関数命令または超越関数命令)は、一連のオペレーション22に含まれなくてよい。
【0024】
精度低下マネージャ20は、一連のオペレーション22内で計算24の精度を低下させるか否かを決定することができる評価コンポーネント28を含み得る。評価コンポーネント28は、一連のオペレーション22の結果として生じる表現を評価することができ、変換オペレーションの精度及び/又はコスト(例えば、時間及び/又は電力消費)に敏感であり得る計算24について監視しながら、中間体、機能パラメータ、メモリ負荷、及び/又は、任意の他の計算24の精度を低下させるように試みることができる。かくして、評価コンポーネント28は、計算24が半精度38まで下げられた場合の可能な結果を識別することができる。
【0025】
評価コンポーネント28は、一連のオペレーション22内の各演算24に対して範囲および精度情報を添付することができ、そして、一連のオペレーション22を介して範囲および精度情報を追跡することができる。例えば、一連のオペレーション22は、指定された順序で実行され得る一連の計算(a chain of computations)24を有する式木(expression tree)であってよい。評価コンポーネント28は、各計算24についての範囲及び/又は精度情報を、計算経路上の値についての期待範囲35及び/又は精度境界37と比較することができる。計算経路上の各計算24について、評価コンポーネント28は、期待範囲35及び/又は精度境界37に対して可能性のある損失をスコア化することができる。評価コンポーネント28は、範囲および精度情報と、期待範囲35及び/又は精度境界37との比較を使用して精度損失のリスク31を決定することができる。
【0026】
例えば、評価コンポーネント28は、計算24の値についてx=7000の範囲を受け取ることができる。評価コンポーネント28は、x=7000の範囲が、計算24について期待範囲35内にあると決定することができる(例えば、範囲が半精度値の範囲内にある)。別の例において、評価コンポーネント28は、x=70000の範囲を受け取ることができる。評価コンポーネント28は、範囲x=70000が計算24について期待範囲35を超えることを決定し(例えば、範囲が半精度値の範囲外である)、そして、範囲が期待範囲35を超えることの決定に応答して精度損失のリスク31を設定することができる。
【0027】
一連のオペレーション22の各計算24について、評価コンポーネント28は、精度損失のリスク31を決定し、精度損失のリスクを精度損失閾値33と比較することができる。精度損失閾値33は、計算24が半精度38をサポートするか否か、及び/又は、計算24が半精度38に対して敏感であるか否かを識別することができる。例えば、計算24がより低い精度で動作しない場合、精度損失のリスク31は、精度損失閾値33を上回り得る(例えば、値を乗する(raising values to a power)。加えて、GPU44がより低い精度をサポートしない場合、精度損失のリスク31は、精度損失閾値33を上回り得る。精度損失のリスク31は、計算24がより低い精度をサポートする場合、及び/又は、GPU44がより低い精度をサポートする場合には、精度損失閾値33を下回り得る。
【0028】
精度損失のリスク31が精度損失閾値33を上回る場合、評価コンポーネント28は、計算24が半精度38をサポートしない可能性があることを示す警告を伴う通知32を生成することができる。コンパイラ16は、プログラムコード14を編集する際にユーザが情報を使用することができるように、通知32をユーザインターフェイス50に対して送信することができる。
【0029】
評価コンポーネント28は、また、精度を低下させることができるか否か、及び/又は、精度損失が一連のオペレーション22に対して許容可能であるか否かを決定する際に、変換オペレーションからの電力消費の利点を考慮することもできる。計算24において半精度38を使用するときに生じ得るコンピュータ装置102に対する電力消費の利益は、計算24の精度を低下させることから生じ得る精度損失を上回ることができる。例えば、評価コンポーネント28は、精度損失のリスク31が精度損失閾値33を上回ることを決定することができるが、計算24において半精度38を使用する場合に、コンピュータ装置102に対する電力消費節約の利益を得るために、精度損失が許容され得ることを決定することができる。かくして、評価コンポーネント28は、電力消費の利益が精度における損失を上回ることの決定に応答して、精度損失のリスク31を修正することができる。加えて、評価コンポーネント28は、計算24において半精度38を使用することによるコンピュータ装置102に対する潜在的な電力消費の利点に関する情報、及び/又は、半精度38を使用するための精度における潜在的な損失に関する情報を伴う通知32をコンピュータ装置102に送信することができる。
【0030】
精度損失のリスク31が精度損失閾値33を下回る場合、評価コンポーネント28は、計算36が半精度38をサポートすることを識別することができる。かくして、評価コンポーネント28は、一連のオペレーション22内の計算24の精度を低下させるか否かを決定する際に反復プロセスを実行することができる。
【0031】
一態様において、精度低下マネージャ20は、識別された計算36の精度を半精度38で書き換えることによって、編集されたプログラムコード34を自動的に生成することができる。精度低下マネージャ20は、また、精度に対して行われた変更の情報を伴うレポート40を生成することもできる。例えば、レポート40は、識別された計算36及び/又は一連のオペレーション22を含み得る。レポート40は、また、精度、及び/又は、精度を低下させない決定についての説明を含んでもよい。別の態様において、レポート40は、半精度38のための識別された計算36を含んでもよく、そして、レポート40は、ユーザが、レポート40において提供された情報に応答して、プログラムコード14をレビューし、かつ/あるいは、修正するために、ユーザインターフェイス50に送信されてよい。
【0032】
コンパイラ16は、編集されたプログラムコードを処理のためにGPU44へ送信することができる。GPU44は、識別された計算36について半精度38を使用して編集されたプログラムコード34を実行することができ、ディスプレイ48上で提示するための出力46を生成する。識別された計算36において半精度38を使用することによって、シェーダプログラム12で使用される識別された計算36のGPU44におけるスループットは、GPU44によるメモリアクセスの高速化と同様に、改善され得る。
【0033】
加えて、コンパイラ16は、編集されたプログラムコード34及び/又はレポート40を、表示のためにユーザインターフェイス50に送信することができる。一つの態様において、ユーザは、プログラムコード14及び/又は編集されたプログラムコード34に対するさらなる編集を実行し、そして、改訂(revised)されたプログラムコード52を作成するために、レポート40内の情報を使用することができる。例えば、ユーザは、プログラムコード14において識別された計算36の精度を変更することができる。さらに、ユーザは、識別された計算の一部を半精度38に変更するように選択することができる。かくして、ユーザは、シェーダプログラム12の中で精度を低下させるためのガイドとして提供された情報を使用することができる。
【0034】
ユーザは、また、シェーダプログラムコード14の中で精度が低下され得る1つ以上の計算24を識別し、そして、計算24を評価のためにコンパイラ16に送信することもできる。例えば、ユーザは、これらに限定されるわけではないが、ソースコード、ユーザ提供の属性、及び/又は注釈といった、そうした計算24を識別するために、言語レベルにおいて1つ以上のメカニズムを挿入することができる。評価コンポーネント28は、計算24について精度が低下され得るか否かを評価することができ、そして、可能性のある精度損失に関する警告を用いてユーザに対して通知32を提供することができる。ユーザは、コンパイラ16から受け取った情報に応答して計算24の精度を変更することができ、そして、改訂プログラムコード52を生成することができる。改訂プログラムコード52は、プログラムコード14に関して上述したように、さらなる評価のためにコンパイラ16に送信され得る。
【0035】
加えて、ユーザは、ユーザインターフェイス50を使用してアプリケーション10またはアプリケーション10のトレースを開くことができ、そして、出力46の品質が許容できるか否かを検証するために、アプリケーション10を使用してコンパイラ16から受け取った編集されたプログラムコード34を実行することができる。例えば、レンダリングされた画像47の品質が許容できるか否かを判断するために、レンダリングされた画像47の画質が品質閾値30と比較され得る。レンダリングされた画像47の画質が皆無かそれに近い場合、レンダリングされた画像47の画質は許容される。かくして、シェーダプログラム12は、出力46における画質を劣化させることなく、精度の低下を許容することができる。
【0036】
画像品質に損失がある場合、ユーザは、編集されたプログラムコード34を改訂し、そして、シェーダプログラム12で使用される低精度の量を変更する改訂プログラムコード52を生成することができる。加えて、画質に損失がある場合には、ユーザは、コンパイラ16によって実行される分析を調整することができる。ユーザは、例えば、コンパイラがより低い精度を許容するものとして命令を識別しないように、シェーダプログラムコード14内の計算チェーンに属性の注釈をつける(annotating)ことによって、コンパイラ16により実行される検索から特定の命令を除去することができる。加えて、ユーザは、精度が低下され得る一連のオペレーション22を識別するために、検索を実行するパス18をターンオフすることができる。
【0037】
かくして、ユーザは、シェーダプログラム12を安全かつ迅速に半精度38の算術へ移植することができる。さらに、精度が低下され得る一連のオペレーション22を自動的に識別し、かつ/あるいは、半精度38を含むようにプログラムコード14を自動的に編集するコンパイラ16によって、より多くのユーザが、シェーダプログラム12のパフォーマンスを改善することができる。かくして、シェーダプログラム12におけるパフォーマンスの改善は、より多くのシェーダプログラム12がハードウェアによってサポートされるより低い精度を使用することができるように、スケーラブルであってよい。
【0038】
次に、
図2を参照すると、一連のオペレーション22を伴う例示的な式木(expression tree)200が示されている。式木200は、指定された順序で実行される一連の計算202、204、210、212を有する一連のオペレーション22を含んでよい。例えば、一連の計算は、計算202で始まり、そして、計算212で式木200の終わりまで順番に進行することができる。
【0039】
評価コンポーネント28(
図1)は、計算202、204、210、212のいずれかを半精度38に低下され得るか否かを決定するために、式木200内の各計算202、204、210、212に対して範囲および精度情報を添付することができる。評価コンポーネント28は、式木200の底(例えば、計算212)から開始し、一連の計算を式木200の開始(例えば、計算202)まで作り上げる(work up)することができる。評価コンポーネント28は、計算202、204、210、212が半精度38に低下され得るか否かを決定するために、式木200を介して範囲および精度情報を追跡することができる。
【0040】
評価コンポーネント28は、各計算202、204、210、212についての範囲及び/又は精度情報を、計算経路上の値についての期待範囲35及び/又は精度境界37と比較することができる。計算経路上の各計算202、204、210、212に対して、評価コンポーネント28は、予想される範囲35及び/又は精度境界37に対して可能な損失をスコア付けすることができる。評価コンポーネント28は、期待範囲35及び/又は精度境界37との範囲と精度情報の比較を用いて精度損失のリスク31を決定することができる。
【0041】
212において、評価コンポーネント28は、式木200における一連のオペレーション22について、Zが半精度38で出力されることを知ることができる。例えば、評価コンポーネント28は、Zの出力が常に0から1までの範囲内にあること、および、式木200における一連のオペレーション22についてハードウェアがどのように動作するか、及び/又は、シェーダがどのように動作するかの知識に応じて、Zの精度が半精度38であることを知ることができる。例えば、式木200における一連のオペレーション22は、色を出力するためのものであってよく、そして、評価コンポーネント28は、色出力が半精度38で実行されることを知ることができる。
【0042】
計算210において、評価コンポーネント28は、Yに対する期待範囲35が-0.5から0.5までの間であり得ること、および、計算210が半精度38まで低下されることに応答して、精度境界37が同じに留まり得ることを決定することができる。かくして、評価コンポーネント28は、Yに対する期待範囲35が-0.5から0.5までの間であり、かつ、精度が同じに留まって、Zの出力が0から1の範囲内に存続し得るので、計算210が半精度38まで低下され得ることを決定することができる。
【0043】
計算204において、評価コンポーネント28は、Xの期待範囲が-1から1までの間であり得ること、および、計算204が半精度38まで低下されることに応答して、精度境界37が同じに留まり得ることを決定することができる。評価コンポーネント28は、Xに対する期待範囲35が-1から1までの間であり、かつ、精度が同じに留まって、Zの出力が0から1までの範囲内に存続し得るので、計算204が半精度38まで低下され得ることを決定することができる。
【0044】
かくして、評価コンポーネント28は、式木200における全ての計算202、204、210、212の精度を低下させるように決定することができる。
【0045】
別の例では、計算204において、評価コンポーネント28は、Xの期待範囲が-1から1までの間であり得るが、計算204が半精度38に低下されることに応じて、精度が0.3333まで変化することを決定することができる。評価コンポーネント28は、精度0.3333が精度境界37の外側にあること、および、精度が精度境界37を超えるので、計算204が半精度38まで低下され得ないことを判断することができる。評価コンポーネント28は、計算204を単一精度で維持しながら、計算210、212の精度を低下させるように決定することができる。
【0046】
かくして、評価コンポーネント28は、式木200における全ての計算の精度を低下させることができる。加えて、評価コンポーネント28は、式木200における他の計算を単一精度で維持しながら、式木200における計算の一部をより低い精度に低下させることができる。評価コンポーネント28は、また、式木200内のいずれの計算もより低い精度を使用することができず、かつ、式木200における全ての計算を単一精度で維持することができることを決定することができる。
【0047】
図3を参照すると、例示的な方法300は、シェーダプログラム12(
図1)で使用される計算24(
図1)の精度を低下させるために、コンピュータ装置102(
図1)によって使用され得る。方法300の動作が、
図1のアーキテクチャを参照して、以下に説明される。
【0048】
302において、方法300は、GPUで使用するシェーダプログラムのためのプログラムコードを受信することを含み得る。例えば、コンパイラ16は、シェーダプログラム12において半精度38ストレージ及び/又は算術をサポートする、GPU44で使用するシェーダプログラム12のためのプログラムコード14を受信することができる。コンピュータ装置102のユーザは、ユーザインターフェイス50を使用してプログラムコード14をコンパイラ16の中へロードすることができる。加えて、アプリケーション10は、プログラムコード14をコンパイラ16に自動的に送信することができる。
【0049】
304において、方法300は、複数の計算の精度を低下させるように一連のオペレーションを選択するために、プログラムコード上で少なくとも1つのパスを実行することを含み得る。コンパイラ16は、プログラムコード14における精度低下の機会を自動的に探索するために、プログラムコード14上で1つ以上のパス18を実行するように動作可能な精度低下マネージャ20を有し得る。精度低下マネージャ20は、より低い精度及び/又は範囲を許容し得るプログラムコード14内の一連のオペレーション22を識別することができる。例えば、精度損失閾値33は、期待範囲35及び/又は精度境界37について誤差値範囲(error value range)を決定することができる。一連のオペレーション22に対する誤差値範囲が精度損失閾値33よりも低い場合、一連のオペレーション22は、より低い精度を許容するものとして識別され得る。一連のオペレーション22は、現在、単一精度26で実行されている複数の計算24を含んでよい。さらに、一連のオペレーション22は、指定された順序で実行される複数の計算24を含んでよい。例えば、一連のオペレーション22は、ある順序で実行される一連の計算24を伴う式木であり得る。
【0050】
精度低下マネージャ20は、シェーダプログラム12の制御フロー、及び/又は、一連のオペレーション22がより低い精度及び/又は範囲を許容でし得るか否かを決定する際のGPU44のハードウェアパラメータ45といった、シェーダプログラム12の構造を分析することができる。加えて、半精度38をサポートする以前に定義されたオペレーションのリストは、精度低下マネージャ20によって、より低い精度及び/又は範囲を許容し得る一連のオペレーション22を決定する際に使用され得る。例えば、これらに限定されるわけではないが、画像及び/又はテクスチャからの読取り、バッファからの読取り、頂点からの低精度入力(例えば、8または10ビット精度の色入力)、及び/又は、レンダリングターゲットへの出力、といったオペレーションは、半精度38で動作することが知られている。さらに、精度低下マネージャ20によって知られている、精度に敏感なオペレーション(例えば、三角関数命令または超越関数命令)は、一連のオペレーション22に含まれなくてよい。かくして、精度低下マネージャ20によって実行される探索は、シェーダプログラム12によって使用されるハードウェア及び/又はオペレーションの以前の知識を通して訓練されたガイド及び/又はインテリジェンス探索(intelligence search)であり得る。
【0051】
306において、方法300は、複数の計算の各計算に対して、精度損失のリスクが精度損失閾値を下回るか否かを決定することを含み得る。精度低下マネージャ20は、一連のオペレーション22の結果として生じる表現を評価することによって、一連のオペレーション22における計算24の精度を低下させるか否かを決定し得る評価コンポーネント28を含み得る。評価コンポーネント28は、中間体、機能パラメータ、メモリ負荷、及び/又は、任意の他の計算24の精度を低下させるように試みることができ、一方で、変換オペレーションの精度、及び/又は、コストの重み付けに敏感であり得る計算24をモニタリングしている。例えば、計算24の値は、期待範囲35(例えば、値の最小値および最大値)、及び/又は、精度境界37(例えば、値の桁数)と比較され得る。計算24は、期待範囲35及び/又は精度境界37の外側にある値に応答して、精度に敏感であると考えられる。かくして、評価コンポーネント28は、計算24が半精度38まで低下された場合に、精度損失31の可能な結果及び/又はリスクを識別することができる。
【0052】
一連のオペレーション22の各計算24について、評価コンポーネント28は、精度損失のリスク31を決定し、そして、精度損失のリスクを精度損失閾値33と比較することができる。精度損失閾値33は、計算24が半精度38をサポートするか否か、及び/又は、計算24が半精度38に対して敏感であるか否かを識別することができる。かくして、評価コンポーネント28は、一連のオペレーション22の中で計算24の精度を低下させるか否かを決定する際に反復プロセスを実行することができる。
【0053】
評価コンポーネント28は、また、精度が低下され得るか否か、及び/又は、精度損失が一連のオペレーション22に対して許容可能であるかを決定する際に、変換オペレーションからの電力消費の利点を考慮することができる。計算24において半精度38を使用する場合に生じ得るコンピュータ装置102に対する電力消費の利益は、計算24の精度を低下させることから生じ得る精度損失を上回る(outweigh)ことがある。
【0054】
例えば、評価コンポーネント28は、式木における計算24の値についてx=70000の範囲を受け取ることができる。評価コンポーネント28は、範囲x=70000が計算24に対する期待範囲35を超える(例えば、範囲が半精度値の範囲外である)と判断することができ、そして、精度損失のリスク31が精度損失閾値33を超えると判断することができる。しかしながら、評価コンポーネント28は、計算24で半精度38を使用する場合に、コンピュータ装置102に対する電力消費節約の利益を得るために、損失の精度が許容可能であり得ることを判断することができる。評価コンポーネント28は、消費電力の利点が精度損失を上回ると決定することに応答して、精度損失のリスク31を修正することができる。
【0055】
308において、方法300は、精度損失のリスクが精度損失閾値を上回る場合に、可能な精度損失についての警告を伴う通知を提供することを含み得る。精度損失のリスク31が精度損失閾値33を上回る場合、評価コンポーネント28は、計算24が半精度38をサポートし得ないことを示す警告を伴う通知32を生成することができる。例えば、計算24がより低い精度で動作しない場合に、精度損失のリスク31は、精度損失閾値33を上回り得る(例えば、値を乗する)。加えて、GPU44がより低い精度をサポートしない場合に、精度損失のリスク31は、精度損失閾値33を上回り得る。加えて、通知32は、計算24において半精度38を使用することによるコンピュータ装置102に対する潜在的な電力消費の利益に関する情報、及び/又は、半精度38を使用するための精度における潜在的な損失に関する情報を含むことができる。コンパイラ16は、プログラムコード14を編集するときにユーザが情報を使用することができるように、通知32をユーザインターフェイス50に送信することができる。
【0056】
310において、方法300は、精度損失のリスクが精度損失閾値を下回る場合、計算を半精度に書き換えることによって、編集されたプログラムコードを生成することを含み得る。精度損失のリスク31が精度損失閾値33を下回る場合、評価コンポーネント28は、半精度38をサポートする計算36を識別することができる。精度損失のリスク31は、計算24がより低い精度をサポートする場合、及び/又は、GPU44がより低い精度をサポートする場合に、精度損失閾値33を下回り得る。
【0057】
精度低下マネージャ20は、識別された計算36の精度を半精度38で書き換えることによって、編集されたプログラムコード34を自動的に生成することができる。精度低下マネージャ20は、また、精度に対して成された変更の情報を有するレポート40を生成することができる。例えば、レポート40は、識別された計算36及び/又は一連のオペレーション22を含み得る。レポート40は、また、精度を低下させないための精度及び/又は決定についての説明を含んでもよい。別の態様において、レポート40は、半精度38のために識別された計算36を含んでよく、そして、レポート40は、レポート40に提供された情報に応答してプログラムコード14をユーザがレビュー及び/又は修正するために、ユーザインターフェイス50に送信され得る。
【0058】
312において、方法300は、編集されたプログラムコードを提供することを含み得る。コンパイラ16は、編集されたプログラムコードを処理のためにGPU44に送信することができる。GPU44は、識別された計算36について半精度38を使用して編集されたプログラムコード34を実行し、ディスプレイ48上に表示するための出力46を生成することができる。識別された計算36において半精度38を使用することによって、シェーダプログラム12で使用される識別された計算36のGPU44におけるスループットは、GPU44によるメモリアクセスの高速化と同様に、改善され得る。
【0059】
方法300は、シェーダプログラム12の中のオペレーションの精度を単一精度26から半精度38まで安全に低下させるために使用されてよく、そして、従って、シェーダプログラム12のパフォーマンスを向上させている。
【0060】
図4を参照すると、方法400は、シェーダプログラム12(
図1)で使用される計算24(
図1)のより低い精度を評価するためにコンピュータ装置102(
図1)によって使用され得る。方法400の動作が、
図1のアーキテクチャを参照して、以下に説明される。
【0061】
402において、方法400は、半精度を使用する計算を伴うシェーダプログラムのための編集されたプログラムコードを、コンパイラから受信することを含み得る。コンパイラ16は、編集されたプログラムコード34を表示のためにユーザインターフェイス50に送信することができる。
【0062】
404において、方法400は、任意的に、半精度を使用している計算を識別する変更のレポートを受信することを含み得る。一つの態様において、ユーザは、プログラムコード14及び/又は編集されたプログラムコード34に対する更なる編集を実行し、かつ、改訂されたプログラムコード52を作成するためのさらなる編集を実行するために、レポート40内の情報を使用することができる。例えば、ユーザは、プログラムコード14内の識別された計算36の精度を変更することができる。加えて、ユーザは、識別された計算の一部を半精度38に変更するように選択することができる。かくして、ユーザは、シェーダプログラム12の中で精度を低下させるためのガイドとして、提供された情報を使用し得る。
【0063】
406において、方法400は、編集されたプログラムコードを実行するためにアプリケーションを使用することを含み得る。ユーザは、ユーザインターフェイス50を使用して、アプリケーション10またはアプリケーション10のトレースを開くことができ、そして、アプリケーション10を使用して、コンパイラ16から受信した編集されたプログラムコード34を実行することができる。
【0064】
408において、方法400は、アプリケーションの出力の品質が品質閾値内にあるか否かを判断することを含み得る。シェーダプログラム12が出力46の画質を劣化させることなく低下された精度を許容できるか否かを判断するために、出力46の画質が評価され得る。例えば、レンダリングされた画像47の品質が品質閾値内にあるか否か判断するために、レンダリングされた画像47の画質を品質閾値30と比較することができる。レンダリングされた画像47の画質にほとんど又は全く損失が存在しない場合、レンダリングされた画像47の画質は、画質閾値を下回り得る。かくして、シェーダプログラム12は、出力46における画質を劣化させることなく、低下された精度を許容することができ、そして、310で方法300は終了する。
【0065】
レンダリングされた画像47の画質に損失がある場合、レンダリングされた画像47の画質は、画質閾値を上回り得る。かくして、シェーダプログラム12は、出力46における画質を劣化させることなく、低下された精度を許容しないことがあり、そして、シェーダプログラム12に対して修正及び/又は変更がさらに成され得る。
【0066】
412において、方法400は、任意的に、編集されたプログラムコードを修正することを含み得る。画像品質に損失がある場合、ユーザは、編集されたプログラムコード34を改訂し、そして、シェーダプログラム12で使用される精度低下の量を変更する改訂プログラムコード52を生成することができる。改訂プログラムコード52は、さらなる評価及び/又は修正のためにコンパイラ16に送信され得る。
【0067】
414において、方法400は、任意的に、コンパイラによって実行される分析を調整することを含み得る。加えて、画質に損失がある場合、ユーザは、コンパイラ16によって実行される分析に対して調整を行うことができる。例えば、コンパイラがより低い精度を許容するものとして命令を識別しないように、ユーザは、コンパイラ16によって実行される検索から特定の命令を除去することができる。加えて、ユーザは、精度が低下され得る一連のオペレーション22を識別するための検索を実行するパス18をターンオフすることができる。
【0068】
416において、方法400は、任意的に、コンパイラによって実行される分析から計算パスを追加または除去することを含み得る。ユーザは、また、シェーダプログラムコード14において精度が低下され得る1つ以上の計算24を識別し、そして、評価のために計算24をコンパイラ16に送信することもできる。評価コンポーネント28は、計算24について精度が低下され得るか否かを評価することができ、そして、可能な精度損失に関する警告を伴う通知32をユーザに提供することができる。ユーザは、コンパイラ16 14から受け取った情報に応答して計算24の精度を変更することができ、そして、改訂プログラムコード52を生成することができる。改訂プログラムコード52は、さらなる評価及び/又は修正のためにコンパイラ16に送信され得る。
【0069】
方法400は、シェーダプログラムにおいて精度を低下させるための対話式プロセスをユーザに提供することができる。加えて、方法400は、シェーダプログラムにおいて精度を低下させるための決定を行う際に使用する、より詳細な及び/又は情報をユーザに提供することができる。かくして、ユーザは、シェーダプログラムを開発するときに、精度損失をより容易に定量化できる。
【0070】
これから
図5を参照すると、一つの実施形態に従ってコンピュータ装置102として構成され得る例示的なコンピュータ500は、
図1と比較して追加的なコンポーネントの詳細を含んでいる。一つの例において、コンピュータ500は、ここにおいて説明される1つ以上のコンポーネントおよび機能に関連する処理機能を実行するためのプロセッサ54を含むことができる。プロセッサ54は、単一、または複数のプロセッサセット、もしくはマルチコアプロセッサを含むことができる。さらに、プロセッサ54は、統合処理システム及び/又は分散処理システムとして実装することができる。
【0071】
コンピュータ500は、さらに、プロセッサ54によって実行されるアプリケーションのローカルバージョンを保管するためといった、メモリ56を含み得る。メモリ56は、ランダムアクセスメモリ(RAM)、リードオンリーメモリ(ROM)、テープ、磁気ディスク、光ディスク、揮発性メモリ、不揮発性メモリ、および、それらの任意の組み合わせ、といった、コンピュータによって使用可能なタイプのメモリを含むことができる。追加的に、プロセッサ54は、オペレーティングシステム110(
図1)を含み、そして、実行することができる。
【0072】
さらに、コンピュータ500は、ここにおいて説明されるように、ハードウェア、ソフトウェア、およびサービスを利用している1つ以上の当事者との通信を確立および維持について提供する通信コンポーネント58を含み得る。通信コンポーネント58は、コンピュータ装置102上のコンポーネント間、並びに、コンピュータ装置102と、通信ネットワークにわたり配置されたデバイス及び/又はコンピュータ装置102に直列または局所的に接続されたデバイスといった外部デバイスとの間の通信を担持することができる。例えば、通信コンポーネント58は、1つ以上のバスを含むことができ、そして、外部装置とインターフェイスするために動作可能な送信器及び受信器に、それぞれ、関連付けられた送信チェーンコンポーネント及び受信チェーンコンポーネントをさらに含むことができる。
【0073】
さらに、コンピュータ500は、ハードウェア及び/又はソフトウェアの任意の適切な組み合わせであり得るデータストア60を含み得る。これは、ここにおいて説明される実施に関連して使用される情報、データベース、およびプログラムの大容量ストレージを提供する。例えば、データストア60は、アプリケーション10、GPU44、コンパイラ16、及び/又は、ディスプレイ48のためのデータリポジトリであり得る。
【0074】
コンピュータ500は、また、コンピュータ装置102のユーザから入力を受け取るように動作可能であり、そして、ユーザに対する提示のための出力を生成するようにさらに動作可能なユーザインターフェイスコンポーネント50を含み得る。ユーザインターフェイスコンポーネント50は、これらに限定されるわけではないが、キーボード、ナンバーパッド、マウス、ディスプレイ48(例えば、タッチ感知ディスプレイであり得る)、ナビゲーションキー、ファンクションキー、マイクロホン、音声認識コンポーネント、ユーザからの入力を受け取ることができる任意の他のメカニズム、または、それらの任意の組み合わせを含む、1つ以上の入力デバイスを含み得る。さらに、ユーザインターフェイスコンポーネント50は、これらに限定されるわけではないが、ディスプレイ、スピーカ、触覚フィードバックメカニズム、プリンタ、ユーザに対して出力を提示することができる任意の他のメカニズム、または、それらの任意の組合せを含む、1つ以上の出力装置を含み得る。
【0075】
一つの実装において、ユーザインターフェイスコンポーネント50は、アプリケーション10、GPU44、コンパイラ16、及び/又は、ディスプレイ48のオペレーションに対応するメッセージを送信及び/又は受信することができる。加えて、プロセッサ54は、アプリケーション10、GPU44、コンパイラ16、及び/又は、ディスプレイ48を実行し、そして、メモリ56またはデータストア60は、それらを保管することができる。
【0076】
この出願で使用されるように、用語「コンポーネント(“component”)」、「システム(“system”)」などは、これらに限定されるわけではないが、ハードウェア、ファームウェア、ハードウェアとソフトウェアの組み合わせ、ソフトウェア、または、実行中のソフトウェアといった、コンピュータ関連エンティティを含むように意図されている。例えば、コンポーネントは、これらに限定されるわけではないが、プロセッサ上で実行するプロセス、プロセッサ、オブジェクト、実行可能プログラム、実行スレッド、プログラム、及び/又は、コンピュータであり得る。例示として、コンピュータ装置上で実行されるアプリケーションおよびコンピュータ装置の両方が、コンポーネントであり得る。1つ以上のコンポーネントは、プロセス及び/又は実行スレッド内に存在することができ、そして、コンポーネントは、1つのコンピュータ上にローカライズされ、かつ/あるいは、2つ以上のコンピュータ間で分散され得る。加えて、これらのコンポーネントは、その上に保管された種々のデータ構造を有する様々なコンピュータ可読媒体から実行することができる。コンポーネントは、ローカルシステム、分散システム内、及び/又は、信号を経由して他のシステムを伴うインターネットといったネットワークにわたり、別のコンポーネントと相互作用している1つのコンポーネントからのデータといった、1つ以上のデータパケットを有する信号に従うといった、ローカルプロセス及び/又はリモートプロセスによって通信することができる。
【0077】
さらに、用語「または(“or”)」は、排他的な「または」ではなく、むしろ包括的な「または」を意味するように意図されている。すなわち、別段の規定がない限り、または、文脈から明確であるように、「XはAまたはBを使用する」というフレーズは、任意の自然な包括的な順列を意味するように意図されている。すなわち、「XはAまたはBを使用する」というフレーズは、XがAを使用すること、XがBを使用すること、または、XがAおよびBの両方を使用すること、のいずれかによって満足される。加えて、この出願で使用される冠詞「一つの(“a”および“an”)」は、文脈から別段の規定がない限り、または文脈から単数形を対象とすることが明確でない限り、「1つ以上の(“one or more”)」を意味するように一般的に解釈されるべきである。
【0078】
多くの装置、コンポーネント、モジュール、などを含み得るシステムに関して、種々の実装または特徴が提示されてきている。種々のシステムは、追加のデバイス、コンポーネント、モジュール、等を含んでよく、かつ/あるいは、図面に関連して説明された、デバイス、コンポーネント、モジュール、等の全てを含んでなくてもよいことが理解され、かつ、正しく理解されるべきである。これらのアプローチの組み合わせも、また、使用され得る。
【0079】
ここにおいて開示された実施形態に関連して説明された種々の例示的な論理、論理ブロック、および、方法の動作は、汎用プロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、または、他のプログラマブル論理デバイス、個別ゲートまたはトランジスタロジック、個別ハードウェアコンポーネント、もしくは、ここにおいて説明された機能を実行するように設計された任意のそれらの組み合わせ、のうち特別にプログラムされた1つを用いて実施または実行され得る。汎用プロセッサは、マイクロプロセッサであり得るが、代替的に、プロセッサは、任意の従来のプロセッサ、コントローラ、マイクロコントローラ、または、状態機械であり得る。プロセッサは、また、コンピュータ装置の組み合わせ、例えば、DSPとマイクロプロセッサの組み合わせ、複数のマイクロプロセッサ、DSPコアと組み合わせた1つ以上のマイクロプロセッサ、または、任意の他のそうした構成としても実装され得る。追加的に、少なくとも1つのプロセッサは、上述のステップ及び/又はアクションのうちの1つ以上を実行するように動作可能な1つ以上のコンポーネントを含み得る。
【0080】
さらに、ここにおいて開示される実施に関連して説明された方法またはアルゴリズムのステップ及び/又は動作は、ハードウェア、プロセッサによって実行されるソフトウェアモジュール、または、これ2つの組み合わせにおいて直接的に具現化され得る。ソフトウェアモジュールは、RAMメモリ、フラッシュメモリ、ROMメモリ、EPROMメモリ、EEPROMメモリ、レジスタ、ハードディスク、リムーバブルディスク、CD-ROM、または、当該技術分野で公知の任意の他の形式の記憶媒体に存在し得る。例示的な記憶媒体は、プロセッサが記憶媒体から情報を読み出し、かつ、記憶媒体に情報を書き込むことができるように、プロセッサに結合され得る。代替的には、記憶媒体は、プロセッサと一体であってよい。さらに、いくつかの実装において、プロセッサおよび記憶媒体は、ASIC内に存在し得る。加えて、ASICは、ユーザ端末内に存在し得る。代替的には、プロセッサおよび記憶媒体は、ユーザ端末における離散コンポーネントとして存在し得る。加えて、いくつかの実施において、方法またはアルゴリズムのステップ及び/又は動作は、コンピュータプログラム製品に組み込まれ得る、機械で読取り可能な媒体及び/又はコンピュータで読取り可能な媒体上のコード及び/又は命令のうち、1つ、または任意の組み合わせ、もしくは命令セットとして、存在し得る。
【0081】
1つ以上の実装において、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、または、それらの任意の組み合わせで実装され得る。ソフトウェアで実装される場合、機能は、コンピュータで読取り可能媒体上で、1つ以上の命令またはコードとして保管または送信されてよい。コンピュータで読取り可能媒体は、コンピュータ記憶媒体、および、ある場所から他の場所へのコンピュータプログラムの転送を促進する任意の媒体を含む通信媒体の両方を含む。記憶媒体は、コンピュータによってアクセス可能な任意の利用可能な媒体であり得る。例えば、限定するものではないが、そうしたコンピュータで読取り可能な媒体は、RAM、ROM、EEPROM、CD-ROM、または、他の光ディスク記憶装置、磁気ディスク記憶装置、または、他の磁気記憶装置、もしくは、命令またはデータ構造の形態で所望のプログラムコードを保管するために使用することができ、かつ、コンピュータによってアクセスすることができる任意の他の媒体、を含むことができる。ディスク(disk)およびディスク(disc)は、ここにおいて使用されるように、コンパクトディスク(CD)、レーザーディスク、光ディスク、デジタル多用途ディスク(DVD)、フロッピー(登録商標)ディスク、およびブルーレイ(登録商標)ディスクを含み、ここで、ディスク(disk)は、たいてい、磁気的にデータを再生するが、一方で、ディスク(disc)は、たいてい、レーザで光学的にデータを再生する。上記の組み合わせも、また、コンピュータで読取り可能な媒体の範囲内に含まれるべきである。
【0082】
本開示の実装が、その実施例に関して説明されてきたが、当業者であれば、これらの範囲から逸脱することなく、上述の実施例について変形および修正が成され得ることが理解されるだろう。他の実装は、本明細書の考察から、または、ここにおいて開示された実装に従った実施から、当業者にとって明らかであろう。