[0001] 本開示は、クロックレート調整に関し、より具体的には、グラフィック処理ユニット(GPU)のクロックレート調整に関する。
[0002] モバイルデバイスは、限られたサイズおよび/または能力のバッテリによって電力供給される。典型的には、モバイルデバイスは、特に、電話をかける、電子メールをチェックする、画像/ビデオを録画/再生する、ラジオを聴く、ナビゲーション、ウェブブラウジング、ゲームをする、デバイスを管理する、および計算を行うために使用される。これらのアクションの多くは、いくつかのタスクを行うためにグラフィックス処理ユニット(GPU:graphics processing unit)を利用する。例となるGPUのタスクは、ディスプレイへのコンテンツのレンダリングと、(例えば、汎用GPU(GPGPU:general purpose GPU)動作における)汎用コンピュート計算を行うこととを含む。それゆえ、GPUは典型的には、モバイルデバイスにおいて電力を多く消費する。したがって、バッテリ寿命を長くするために、GPUの電力消費を管理することが有益である。
[0003] 一般に、本開示は、グラフィックス処理ユニット(GPU)のクロック信号の周波数を事前に(proactively)調整するための技法を説明する。いくつかの例では、中央処理ユニット(CPU)は、GPUが1つのフレームのレンダリングを完了したときと、GPUが直前のフレーム(immediately preceding frame)のレンダリングを完了したときとの間の時間間隔を決定する。CPUはまた、この時間間隔中GPUがどのくらいビジー状態(busy)であったかを決定し、時間間隔中GPUがどのくらいビジー状態であったかの決定に基づいてGPUのクロック信号の周波数を決定する。このように、CPUは、クロック信号の周波数を決定する前に複数のフレームが処理されるのを待機するのではなく、単一フレームについてのビジーレベル(busy level)に基づいて、クロック信号の周波数を迅速に決定し得る。
[0004] 1つの例では、本開示はクロックレート決定の方法を説明しており、本方法は、プロセッサを用いて、グラフィックス処理ユニット(GPU)が第1のフレームのレンダリングを完了した第1の時間インスタンス(time instance)を決定することと、前記プロセッサを用いて、前記GPUが前記第1のフレームの直前にある(immediately precedes)第2のフレームのレンダリングを完了した第2の時間インスタンスを決定することと、前記プロセッサを用いて、前記第1の時間インスタンスおよび前記第2の時間インスタンスに基づいて時間間隔を決定することと、前記プロセッサを用いて、前記時間間隔中に前記第1のフレームをレンダリングするための前記GPUのビジーレベルを決定することと、前記決定されたビジーレベルに基づいて前記GPUのクロックレートを設定することと、を備える。
[0005] 1つの例では、本開示は、クロックレート決定のためのデバイスを説明し、本デバイスは、第1のフレームおよび第2のフレームをレンダリングするためにグラフィックス処理ユニット(GPU)によって使用されるグラフィックスデータを記憶するように構成されたメモリと、集積回路を備えるプロセッサとを備え、前記プロセッサは、前記GPUが前記第1のフレームのレンダリングを完了した第1の時間インスタンスを決定することと、前記GPUが前記第2のフレームのレンダリングを完了した第2の時間インスタンスを決定することと、前記第1の時間インスタンスおよび前記第2の時間インスタンスに基づいて時間間隔を決定することと、前記時間間隔中に前記第1のフレームをレンダリングするための前記GPUのビジーレベルを決定することと、前記決定されたビジーレベルに基づいて前記GPUのクロックレートを設定することと、を行うように構成される。
[0006] 1つの例では、本開示は、命令を記憶した非一時的なコンピュータ可読記憶媒体を説明し、本命令は、実行されると、1つまたは複数のプロセッサに、グラフィックス処理ユニット(GPU)が第1のフレームのレンダリングを完了した第1の時間インスタンスを決定することと、前記GPUが前記第1のフレームの直前にある第2のフレームのレンダリングを完了した第2の時間インスタンスを決定することと、前記第1の時間インスタンスおよび前記第2の時間インスタンスに基づいて時間間隔を決定することと、前記時間間隔中に前記第1のフレームをレンダリングするための前記GPUのビジーレベルを決定することと、前記決定されたビジーレベルに基づいて前記GPUのクロックレートを設定することと、を行わせる。
[0007] 1つの例では、本開示は、クロックレート決定のためのデバイスを説明し、本デバイスは、グラフィックス処理ユニット(GPU)が第1のフレームのレンダリングを完了した第1の時間インスタンスを決定するための手段と、前記GPUが前記第1のフレームの直前にある第2のフレームのレンダリングを完了した第2の時間インスタンスを決定するための手段と、前記第1の時間インスタンスおよび前記第2の時間インスタンスに基づいて時間間隔を決定するための手段と、前記時間間隔中に前記第1のフレームをレンダリングするための前記GPUのビジーレベルを決定するための手段と、前記決定されたビジーレベルに基づいて前記GPUのクロックレートを設定するための手段と、を備える。
[0008] 1つまたは複数の例の詳細が、添付の図面および以下の説明において述べられる。他の特徴、目的、および利点は、その説明、図面、および特許請求の範囲から明らかになるであろう。
[0009] 本開示において説明される1つまたは複数の例となる技法にしたがった、データを処理するための例となるデバイスを例示するブロック図。
[0010] より詳細に、図1に例示されているデバイスのコンポーネントを例示するブロック図。
[0011] グラフィックス処理ユニット(GPU)がフレームをレンダリングするためのコマンドを受信する一例を例示するタイミング図。
グラフィックス処理ユニット(GPU)がフレームをレンダリングするためのコマンドを受信する一例を例示するタイミング図。
グラフィックス処理ユニット(GPU)がフレームをレンダリングするためのコマンドを受信する一例を例示するタイミング図。
[0012] GPUがフレームをレンダリングするためのコマンドを受信する別の例を例示するタイミング図。
[0013] ある時間の期間にわたってGPUが実行することになるコマンドの数を例示するグラフ。
[0014] 1つの例となる技法を利用する、図5に例示されている時間の期間にわたるビジーレベル率(busy level percentage)の決定を例示するグラフ。
[0015] 別の例となる技法を利用する、図5に例示されている時間の期間にわたるビジーレベル率の決定を例示するグラフ。
[0016] 本開示において説明されている技法による、クロックレート決定の例となる方法を例示するフローチャート。
詳細な説明
[0017] グラフィックス処理ユニット(GPU)のような処理ユニットは、GPUが命令を処理するレートを設定する(例えば、GPUの動作周波数を設定する)内部クロックを含む。より高いクロックレートは、GPUによるより高い電力消費をもたらすが、GPUが毎秒より多くのコマンドを処理することを可能にする。言い換えると、より高いクロックレートは、GPUがより高いパフォーマンスを提供することを可能にするが、より高い電力消費という代償を払う。より低いクロックレートは、GPUによるより少ない電力消費をもたらすが、GPUが毎秒処理することができるコマンドの数を低減する。言い換えると、より低いクロックレートは、GPUがより低いパフォーマンスを提供することを引き起こすが、より低い電力消費という利益がある。例えば、GPUまたはGPU内の発振器に印加される電圧レベルがクロックレートを設定し、より高い電圧レベルは、より高いクロックレートをもたらすが、より多くの電力消費をもたらし、より低い電圧レベルは、より低いクロックレート、およびより低い電力消費をもたらす。
[0018] いくつかの例では、ホストプロセッサ(例えば、中央処理ユニット(CPU))は、GPUが動作するべき周波数を決定し得る。上述されたように、より高い周波数で動作することは、高速完了をもたらすが、余分な電力消費という代償を払う。したがって、ホストプロセッサは、適時の(timely)完了に影響を与えることなく電力消費を低く保つようにGPUの動作周波数を設定しようと試みる。
[0019] 説明しやすくするために、本開示は、GPUの動作周波数(例えば、クロックレート)を決定するホストプロセッサを説明する。しかしながら、本開示において説明される技法はそのように限定されるものではなく、例となる技法は、以下でも説明されるように、GPUに対して適用され得る。
[0020] 本開示は、1つのフレームをレンダリングするためにGPUによって使用されたリソースに基づいてGPUのクロックレートを事前に調整する(例えば、GPUの動作周波数を調整する)ための例となる方法を説明する。動作周波数を決定するために、ホストプロセッサは、ある特定量の時間にわたってどのくらいビジー状態であるか(例えば、いくつの演算ユニットが動作可能であるか)を決定する。1つの例として、ホストプロセッサは、設定された時間間隔においてGPUがどのくらいビジー状態であったかを決定し得る。別の例として、ホストプロセッサは、GPUがアイドル状態(idle)である度にGPUがどのくらいビジー状態であったか(例えば、GPUが前回アイドル状態であったときからGPUが再度アイドル状態であったインスタンスまでの時間間隔)を決定し得る。いくつかのケースでは、GPUが処理することになるデータ量は比較的に一定であり得るが、GPUは、規則的間隔でデータを受信しないこともある。それゆえ、設定された間隔で、またはGPUがアイドル状態である度にGPUがどのくらいビジー状態であるかを決定することは、ホストプロセッサが、大きく変動するGPUの動作周波数レベルを決定することをもたらし得る。GPUがそのクロックレートを決定する例では、GPUは、ホストプロセッサについて上述されたものと同様の機能を実行し得、ホストプロセッサのように、GPUは、大きく変動する動作周波数レベルを決定し得る。
[0021] 本開示において説明される技法では、ホストプロセッサは、GPUがいつフレームをレンダリングし終えたかを(例えば、GPUがフレームの処理を完了し、フレームの終わりに達する度に)決定する。ホストプロセッサは次いで、フレームの処理の完了から、すぐ前のフレームの処理の完了までGPUがどのくらいビジー状態であったかを決定する。GPUがどのくらいビジー状態であるかをフレームごとに(frame-to-frame)測定することによって、ホストプロセッサは、GPUの動作周波数をより正確に決定し得る。いくつかの例では、GPUは、フレームの処理の完了から、すぐ前のフレームの処理の完了までGPUがどのくらいビジー状態であったかを決定し、GPUの動作周波数を決定し得る。
[0022] ホストプロセッサが、GPUがいつフレームの処理を完了したかを決定し得る様々な方法があり得る。1つの例として、GPUは、フレームを処理するのに必要な複数のタスクのうちの1つのタスクをGPUが完了する度にホストプロセッサに示し得る。最後のタスクを完了した後、ホストプロセッサは、GPUがフレームの終わりにあることを決定し得る。いくつかのケースでは、GPUがフレームの処理を完了した後、ホストプロセッサは、次のフレームの処理のためのバッファ空間を空けるためにバッファをスワップ(swap)する機能を実行する。例えば、バッファをスワップする機能は、一方のフレームバッファを読取りから書込みに変更し、他方を書込みから読取りに変更し、その結果、一方は他方が表示されている間に書き込まれる。バッファをスワップする機能は、ホストプロセッサがそれからフレームの終わりを決定することができる命令を含むように構成され得る。
[0023] GPUがそれ自体のクロックレートを設定する例では、GPUは(例えば、コントローラを介して)、GPUが各フレームの処理をいつ完了したかを決定し得る。これに応答して、コントローラは、GPUがどのくらいビジー状態であったかをフレームごとに決定し、フレームごとのビジー時間に基づいてクロックレートを決定し得る。
[0024] 例となる技法は、ホストプロセッサ、GPU、または一部の機能を実行するホストプロセッサと一部の機能を実行するGPUとの何らかの組合せによってインプリメントされ得るので、本開示において説明される技法は、プロセッサによって行われるとみなされ得る。プロセッサの1つの例は、ホストプロセッサであり(例えば、ここで、ホストプロセッサはGPUについてのクロックレートを決定し、GPUにクロックレートを設定するように命令する)、プロセッサの1つの例はGPUであり(例えば、ここで、GPUはそれ自体のクロックレートを決定し、それに応じてクロックレートを設定する)、プロセッサの1つの例はホストプロセッサとGPUの組合せである(例えば、ここで、ホストプロセッサとGPUが共に、GPUのクロックレートを決定し、GPUのクロックレートを設定する)。
[0025] したがって、プロセッサは、GPUが第1のフレームの処理を完了した第1の時間インスタンスと、GPUが第1のフレームの直前にある第2のフレームの処理を完了した第2の時間インスタンスとを決定し得る。プロセッサは、第1および第2の時間インスタンスに基づいて時間間隔を決定し、その時間間隔中のGPUのビジーレベルを決定し得る。ビジーレベルに基づいて、プロセッサはGPUのクロックレートを設定する。
[0026] 例えば、プロセッサは、ビジーレベルに基づいてGPUの動作周波数(例えば、クロックレート)を決定し得る。ホストプロセッサがクロックレートを決定する例では、ホストプロセッサは、GPUに、決定されたクロックレートに基づいてクロックレートを設定するように命令し得る。GPUがクロックレートを決定する例では、GPUは、決定されたクロックレートに基づいてクロックレートを設定し得る。
[0027] 図1は、本開示の技法をインプリメントするために使用され得る例となるコンピューティングデバイス2を例示するブロック図である。コンピューティングデバイス2は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォームまたはコンソール、ワイヤレス通信デバイス(例えば、モバイル電話、セルラ電話、衛星電話、および/またはモバイル電話ハンドセット、等)、固定電話、インターネット電話、ポータブルビデオゲームデバイスまたは携帯情報端末(PDA)のようなハンドヘルドデバイス、パーソナルミュージックプレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス(intermediate network device)、メインフレームコンピュータ、あるいはグラフィカルデータを処理および/または表示する他の任意のタイプのデバイスを備え得る。
[0028] 図1の例に例示されるように、コンピューティングデバイス2は、ユーザ入力インターフェース4、CPU6、メモリコントローラ8、システムメモリ10、グラフィックス処理ユニット(GPU)12、ローカルメモリ14、ディスプレイインターフェース16、ディスプレイ18、およびバス20を含む。ユーザ入力インターフェース4、CPU6、メモリコントローラ8、GPU12、およびディスプレイインターフェース16は、バス20を使用して互いに通信し得る。バス20は、第3世代バス(例えば、HyperTransportバスまたはInfiniBandバス)、第2世代バス(例えば、Advanced Graphics Portバス、PCI(Peripheral Component Interconnect)エクスプレスバス、またはAXI(Advanced eXentisible Interface)バス)、あるいは別のタイプのバスまたはデバイス相互接続のような、様々なバス構造のうちの任意のものであり得る。図1に示されている異なるコンポーネント間のバスおよび通信インターフェースの特定の構成は実例的なものにすぎず、同一または異なるコンポーネントを有する他のグラフィックス処理システムおよび/またはコンピューティングデバイスの他の構成が、本開示の技法をインプリメントするために使用され得ることが留意されるべきである。
[0029] CPU6は、コンピューティングデバイス2の動作を制御する汎用プロセッサまたは専用プロセッサを備え得る。ユーザは、CPU6に1つまたは複数のソフトウェアアプリケーションを実行させるために、コンピューティングデバイス2への入力を提供し得る。CPU6上で実行されるソフトウェアアプリケーションは、例えば、オペレーティングシステム、ワードプロセッサアプリケーション、電子メールアプリケーション、表計算アプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、または別のプログラムを含み得る。ユーザは、キーボード、マウス、マイクロフォン、タッチパッド、または、ユーザ入力インターフェース4を介してコンピューティングデバイス2に結合された別の入力デバイスのような1つまたは複数の入力デバイス(図示せず)を介してコンピューティングデバイス2への入力を提供し得る。
[0030] CPU6上で実行されるソフトウェアアプリケーションは、CPU6にディスプレイ18へのグラフィックスデータのレンダリングをさせるように命令する、1つまたは複数のグラフィックスレンダリング命令を含み得る。いくつかの例では、ソフトウェア命令は、例えば、OpenGL(登録商標)(Open Graphics Library)グラフィックスアプリケーションプログラミングインターフェース(API)、OpenGL ES(Open Graphics Library Embedded Systems)API、OpenCL API、Direct3D API、X3D API、RenderMan API、WebGL API、または他の任意の公のまたは専有の標準的なグラフィックスAPIのような、APIに準拠し得る。本技法は、特定のAPIを必要とするように限定されるものとみなされるべきではない。
[0031] グラフィックスレンダリング命令を処理するために、CPU6は、GPU12にグラフィックスデータのレンダリングの一部または全部を行わせるように1つまたは複数のグラフィックスレンダリングコマンドをGPU12に発行し得る。いくつかの例では、レンダリングされることになるグラフィックスデータは、例えば、点、線、三角形、四角形、三角形ストリップ等の、グラフィックスプリミティブのリストを含み得る。
[0032] メモリコントローラ8は、システムメモリ10に出入りするデータの転送を容易にする。例えば、メモリコントローラ8は、コンピューティングデバイス2内のコンポーネントにメモリサービスを提供するために、メモリ読取りおよび書込みコマンドを受信し、メモリ10に関連するそのようなコマンドをサービスし得る。メモリコントローラ8は、システムメモリ10に通信的に結合される。メモリコントローラ8は、CPU6およびシステムメモリ10の両方から分離している処理モジュールであるとして図1の例となるコンピューティングデバイス2に例示されているが、他の例では、メモリコントローラ8の機能の一部または全部は、CPU6およびシステムメモリ10の一方または両方でインプリメントされ得る。
[0033] システムメモリ10は、CPU6による実行のためにアクセス可能なプログラムモジュールおよび/または命令、ならびに/あるいは、CPU6上で実行されるプログラムによる使用のためのデータを記憶し得る。例えば、システムメモリ10は、ユーザアプリケーションと、これらアプリケーションに関連付けられたグラフィックスデータとを記憶し得る。システムメモリ10は、追加的に、コンピューティングデバイス2の他のコンポーネントによる使用のための、および/またはそれらによって生成される、情報を記憶し得る。例えば、システムメモリ10は、GPU12のためのデバイスメモリとして機能し得、GPU12によって作用されるデータに加え、GPU12によって行われる動作に起因するデータを記憶し得る。例えば、システムメモリ10は、テクスチャバッファ、深度バッファ、ステンシルバッファ、頂点バッファ、フレームバッファ、又は同様のものの任意の組合せを記憶し得る。加えて、システムメモリ10は、GPU12による処理のためのコマンドストリームを記憶し得る。システムメモリ10は、例えば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、読取専用メモリ(ROM)、消去可能なプログラマブルROM(EPROM)、電気的に消去可能なプログラマブルROM(EEPROM(登録商標))、フラッシュメモリ、磁気データ媒体、または光記憶媒体のような、1つまたは複数の揮発性または不揮発性メモリあるいは記憶デバイスを含み得る。
[0034] いくつかの態様では、システムメモリ10は、CPU6および/またはGPU12に、本開示においてCPU6およびGPU12に帰するとされる機能を行わせる命令を含み得る。したがって、システムメモリ10は、実行されると、1つまたは複数のプロセッサ(例えば、CPU6およびGPU12)に様々な機能を実行させる命令を記憶したコンピュータ可読記憶媒体であり得る。
[0035] いくつかの例では、システムメモリ10は、非一時的な記憶媒体である。「非一時的」という用語は、記憶媒体が、搬送波または伝播信号で具現化されないことを示す。しかしながら、「非一時的」という用語は、システムメモリ10が移動不可であること、またはそのコンテンツが静的であることを意味するように解釈されるべきではない。1つの例として、システムメモリ10は、デバイス2から取り外され、別のデバイスに移動され得る。別の例として、システムメモリ10と実質的に同様のメモリが、デバイス2へと挿入され得る。ある特定の例では、非一時的な記憶媒体は、時間にわたって変化し得るデータを(例えば、RAMに)記憶し得る。
[0036] GPU12は、ディスプレイ18に1つまたは複数のグラフィックスプリミティブをレンダリングするためにグラフィックス動作を行うように構成され得る。よって、CPU6上で実行されるソフトウェアアプリケーションのうちの1つがグラフィックス処理を必要とするとき、CPU6は、ディスプレイ18へのレンダリングのために、GPU12にグラフィックスコマンドおよびグラフィックスデータを提供し得る。グラフィックスコマンドは、例えば、ドローコール(draw call)のような描画コマンド、GPU状態プログラミングコマンド、メモリ転送コマンド、汎用計算コマンド、カーネル実行コマンド、等を含み得る。いくつかの例では、CPU6は、コマンドおよびグラフィックスデータをメモリ10に書き込むことによって、コマンドおよびグラフィックスデータをGPU12に提供し得、それらはGPU12によってアクセスされ得る。いくつかの例では、GPU12は、CPU6上で実行されるアプリケーションのための汎用計算を行うようにさらに構成され得る。
[0037] GPU12は、いくつかの事例では、CPU6よりも効率的なベクトル演算の処理を提供する、並列性の高い構成(highly-parallel structure)で構築され得る。例えば、GPU12は、並列的に複数の頂点またはピクセルに作用するように構成された複数の処理要素を含み得る。GPU12の並列性の高い性質は、いくつかの事例では、GPU12が、グラフィックス画像(例えば、GUIおよび2次元(2D)および/または3次元(3D)グラフィックスシーン)を、CPU6を使用してこれらシーンを直接ディスプレイ18に描画するよりも迅速に、ディスプレイ18上へと描画することを可能にし得る。加えて、GPU12の並列性の高い性質は、GPU12が、CPU6よりも迅速に、汎用計算アプリケーションのためのある特定のタイプのベクトルおよび行列演算を処理することを可能にし得る。
[0038] GPU12は、いくつかの事例では、コンピューティングデバイス2のマザーボードへと一体化され得る。他の事例では、GPU12は、コンピューティングデバイス2のマザーボード内のポートにインストールされたグラフィックスカード上に存在し得るか、またはそうでない場合、コンピューティングデバイス2と相互動作するように構成された周辺デバイス内に組み込まれ得る。さらなる事例では、GPU12は、システムオンチップ(SoC)を形成するCPU6と同じマイクロチップ上に位置付けられ得る。GPU12およびCPU6は、1つまたは複数のマイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、デジタルシグナルプロセッサ(DSP)、または他の同等の集積回路またはディスクリート論理回路のような、1つまたは複数のプロセッサを含み得る。
[0039] GPU12は、ローカルメモリ14に直接結合され得る。よって、GPU12は、バス20を必ずしも使用することなく、ローカルメモリ14からデータを読み取り、それにデータを書き込み得る。言い換えると、GPU12は、オフチップメモリではなくローカル記憶装置を使用してローカルにデータを処理し得る。これは、重いバストラフィックを経験し得る、GPU12がバス20を介してデータを読み取るおよび書き込む必要性を取り除くことによって、GPU12が、より効率的に動作することを可能にする。しかしながら、いくつかの事例では、GPU12は、別個のキャッシュを含まないこともあり、代わりにバス20を介してシステムメモリ10を利用し得る。ローカルメモリ14は、例えば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、消去可能なプログラマブルROM(EPROM)、電気的に消去可能なプログラマブルROM(EEPROM)、フラッシュメモリ、磁気データ媒体、または光記憶媒体のような、1つまたは複数の揮発性または不揮発性メモリあるいは記憶デバイスを含み得る。
[0040] CPU6および/またはGPU12は、レンダリングされた画像データを、システムメモリ10内に割り当てられたフレームバッファに記憶し得る。ディスプレイインターフェース16は、フレームバッファからデータを取り出し、レンダリングされた画像データによって表わされる画像を表示するようにディスプレイ18を構成し得る。いくつかの例では、ディスプレイインターフェース16は、フレームバッファから取り出されたデジタル値を、ディスプレイ18によって消費可能なアナログ信号へと変換するように構成されたデジタル・アナログ変換器(DAC)を含み得る。他の例では、ディスプレイインターフェース16は、デジタル値を、処理のためにディスプレイ18に直接渡し得る。ディスプレイ18は、モニタ、テレビジョン、投影デバイス、液晶ディスプレイ(LCD)、プラズマディスプレイパネル、発光ダイオード(LED)アレイ、ブラウン管(CRT)ディスプレイ、電子ペーパー、表面伝導型電子放出素子ディスプレイ(SED:surface-conduction electron-emitted display)、レーザテレビジョンディスプレイ、ナノ結晶ディスプレイ、または別のタイプのディスプレイユニットを含み得る。ディスプレイ18は、コンピューティングデバイス2内に一体化され得る。例えば、ディスプレイ18は、モバイル電話ハンドセットまたはタブレットコンピュータのスクリーンであり得る。代替的に、ディスプレイ18は、ワイヤードまたはワイヤレス通信リンクを介してコンピューティングデバイス2に結合されたスタンドアロンデバイスであり得る。例えば、ディスプレイ18は、ケーブルまたはワイヤレスリンクを介してパーソナルコンピュータに接続されたコンピュータモニタまたはフラットパネルディスプレイであり得る。
[0041] 説明されたように、CPU6は、超並列演算(massive parallel operations)を必要とするタスクのような、グラフィックス処理をGPU12にオフロード(offload)し得る。1つの例として、グラフィックス処理は超並列演算を必要とし、CPU6は、そのようなグラフィックス処理タスクをGPU12にオフロードし得る。しかしながら、行列演算のような他の演算もまた、GPU12の並列処理能力から恩恵を受け得る。これらの例では、CPU6は、GPU12に非グラフィックス関連の演算を行わせるためにGPU12の並列処理能力を活用し得る。
[0042] 本開示において説明されている技法では、第1の処理ユニット(例えば、CPU6)がある特定のタスクを第2の処理ユニット(例えば、GPU12)にオフロードする。タスクをオフロードするために、CPU6は、GPU12によって実行されることになるコマンドと、それらコマンドのオペランド(operands)であるデータ(例えば、コマンドが作用するデータ)とを、システムメモリ10に、および/または直接GPU12に出力する。GPU12は、CPU6から直接、および/またはシステムメモリ10からコマンドおよびデータを受信し、コマンドを実行する。いくつかの例では、GPU12によって実行されることになるコマンドと、それらコマンドのためのデータオペランドとをシステムメモリ10に記憶するのではなくむしろ、CPU6は、GPU12およびCPU6を含むICに対してローカルであり、CPU6およびGPU12の両方によって共有されるローカルメモリ(例えば、ローカルメモリ14)に、コマンドおよびデータオペランドを記憶し得る。一般に、本開示において説明されている技法は、CPU6がGPU12上での実行のためにコマンドを利用可能にし得る様々な方法に適用可能であり、本技法は上記例に限定されるものではない。
[0043] GPU12がコマンドを実行するレートは、クロック信号の周波数(GPU12のクロックレートまたは動作周波数とも称される)によって設定される。例えば、GPU12は、クロック信号の立ち上がりエッジまたは立ち下がりエッジごとにコマンドを実行し得るか、またはクロック信号の立ち上がりエッジごとに1つのコマンドを実行し、立ち下がりエッジごとに別のコマンドを実行し得る。したがって、クロック信号の立ち上がりエッジまたは立ち下がりエッジが、ある時間期間内にどのくらいの頻度で生じるか(例えば、クロック信号の周波数)は、時間期間内にGPU12がいくつのコマンドを実行するかを設定する。
[0044] CPU6がGPU12によって実行されることになるコマンドをメモリ(例えば、システムメモリ10またはローカルメモリ)に記憶する例のような、いくつかの例では、CPU6は、GPU12が実行することになるコマンドのグループを識別するメモリアドレス情報を出力し得る。GPU12が実行することになるコマンドのグループは、サブミットされたコマンド(submitted commands)と称される。CPU6がGPU12にコマンドを直接出力する例では、サブミットされたコマンドは、CPU6がGPU12にすぐに実行するように命令するコマンドを含む。
[0045] CPU6がコマンドをグループ化し得る様々な方法があり得る。1つの例として、コマンドのグループは、1つのフレームをレンダリングするのにGPU12によって必要とされる全コマンドを含む。別の例として、コマンドのグループは、GPU12が他のコマンドにスイッチすることなく共に実行されることになる、いわゆる「アトミックコマンド(atomic commands)」であり得る。GPU12にサブミットされるコマンドをグループ化する他の方法が可能であり得、本開示は、上記例となる技法に限定されるものではない。
[0046] いくつかのケースでは、GPU12は、サブミットされたコマンドを設定された時間期間内に実行し得る。例えば、デバイス2はハンドヘルドデバイスであり得、ここでは、ディスプレイ18はまた、ユーザインターフェースとして機能する。1つの例として、スタッターフリー(stutter free)(ジャンクフリー(jank-free)とも称される)ユーザインターフェースを達成するために、GPU12は、60フレーム毎秒というフレームレートを仮定して、約16ミリ秒(ms)以内に、サブミットされたコマンドの実行を完了し得る(他の時間期間が可能)。この16msの時間期間は、「vsync」ウィンドウと称され得、GPU12がvsyncウィンドウ内にサブミットされたコマンドの実行を完了しない場合、ジャンクで満ちた(jank filled)ユーザインターフェースを引き起こす「バブル(bubbles)」がGPU12の実行パイプラインに存在し得る。
[0047] GPU12の実行パイプラインにおける「バブル」は、コマンドを実行しているGPU12のユニットが、いくつかの中間データ(intermediate data)を生成するためにコマンドの実行を部分的に完了しているが、中間データを受信することになるGPU12のユニットが、中間データが構築し続けることを引き起こす他のコマンドを実行するのに依然としてビジー状態である状態を指す。例えば、GPU12の実行パイプラインは一連のユニットを含み、その各々が、その一連の中の(すなわち、パイプラインにおける)次のユニットによってさらに処理される、中間データを生成する。いくつかのケースでは、GPU12の実行パイプラインのアップストリームユニットは、GPU12の実行パイプラインのダウンストリームユニットが消費することができるよりも速く中間データを生成しており、いわゆるバブルを作り出している。
[0048] CPU6がサブミットするコマンドの量と、CPU6がコマンドをサブミットするときのタイミングは必ずしも一定である必要はない。GPU12が実行することになるコマンドの数に流入(influx)または低減があり得る。例えば、CPU6上で実行されるアプリケーション(例えば、サードパーティのアプリケーション)は、GPU12によって実行されることになるコマンドの数を増加または減少させ得るか、またはCPU6上で実行されるオペレーティングシステム(例えば、フレームワーク自体)は、GPU12によって実行されることになるコマンドの数を増加または減少させ得る。別の例として、CPU6は、時間0で第1のグループのコマンドをサブミットし、時間1で第2のグループのコマンドをサブミットし、時間2で第3のグループのコマンドをサブミットし得る。しかしながら、第1のグループのコマンドのサブミッション(submission)と第2のグループのコマンドのサブミッションとの間の時間間隔は、第2のグループのコマンドのサブミッションと第3のグループのコマンドのサブミッションとの間の時間間隔とは異なり得る。
[0049] 設定された時間期間(例えば、16ms)内にGPU12が実行することになるコマンドの量が変化し得るので、GPU12のクロック信号の周波数(すなわち、GPU12のクロックレートまたはGPU12の動作周波数)は増加または減少する必要があり得、その結果、GPU12は、不必要に電力消費を増加させることなく、設定された時間期間内にコマンドを実行することができる。設定された時間期間内に実行される必要のあるコマンドのグループに、より多くのコマンドまたはより少ないコマンドがあるので、設定された時間期間内に実行される必要のあるコマンドのグループの数に増加または減少があるので、またはその2つの組合せにより、設定された時間期間内にGPU12が実行する必要があるコマンドの量は変化し得る。
[0050] クロック信号の周波数が比較的高い周波数で恒久的に保たれたら、GPU12は、ほとんどの事例でサブミットされたコマンドを適時に実行することができるであろう。しかしながら、比較的高い周波数でコマンドを実行すると、GPU12の電力消費が増加することを引き起こす(例えば、より高いクロックレートでGPU12を駆動するのにより多くの電気電力が必要である)。クロック信号の周波数が比較的低い周波数で恒久的に保たれた場合、GPU12の電力消費は低減され得る(例えば、より低いクロックレートでGPU12を駆動するのにより少ない電気電力が必要である)が、GPU12は、ほとんどの事例でサブミットされたコマンドを適時に実行することができないこともあり、ジャンキー挙動(janky behavior)および可能性として他の望まない効果につながる。
[0051] 本開示において説明されている技法は、特定の時間間隔にわたるGPU12の使用量(usage)に基づいてGPU12のクロックレート(すなわち、クロック信号の周波数)を事前に増加または減少させる例となる方法を説明する。GPU12のクロックレートを決定するために使用される時間間隔の1つの例は、GPU12が現在のフレームのレンダリングを完了したときと、GPU12が現在のフレームの直前にある、前のフレームのレンダリングを完了したときとの間の時間間隔である。フレームのレンダリングの完了は、本開示で使用される場合、必ずしも常に含むわけではないが、レンダリングされたフレームをシステムメモリ10に記憶するためのコマンドを含む、GPU12がフレームをレンダリングするのに必要な全コマンドを実行することを指す。例えば、フレームのレンダリングの完了は、GPU12がフレームの最後のピクセルのピクセル値を決定したインスタンス、またはGPU12がフレームの最後のピクセルのピクセル値をシステムメモリ10に書き込んだインスタンスとしてみなされ得る。
[0052] フレームは、本開示で使用される場合、提示されることができるフル画像を指すが、いくつかの例ではフル画像の一部分であり得る。例えば、毎回再レンダリングされない静的バックグラウンドがあり得るが、GPU12によってレンダリングされるフレームは、フル画像を生成するように静的バックグラウンドと(例えば、ディスプレイインターフェース16によって)合成され得る。別の例として、ディスプレイインターフェース16は、GPU12によってレンダリングされるフレームとビデオを組み合わせ得る。
[0053] フレームは、グラフィカルコンテンツを表す複数のピクセルを含み、各ピクセルはピクセル値を有する。例えば、GPU12がフレームをレンダリングした後、GPU12は、システムメモリ10内にあり得る、フレームバッファにフレームのピクセルの結果として生じるピクセル値を記憶する。ディスプレイインターフェース16は、ディスプレイ18にフレームのグラフィカルコンテンツを表示させるために、フレームバッファからフレームのピクセルのピクセル値を受信し、それらピクセル値に基づく値を出力する。いくつかの例では、ディスプレイインターフェース16は、ディスプレイ18に60フレーム毎秒(fps)というレートでフレームを表示させる(例えば、フレームはほぼ16.67msごとに表示される)。
[0054] 以下の説明では、CPU6がGPU12のビジーレベルを決定し、GPU12のクロックレートを設定することに関連して、例となる技法が説明される。しかしながら、このような技法はまた、GPU12によって、またはCPU6とGPU12によって共同で、インプリメントされ得る。
[0055] 60fps要件が満たされることを確実にするのに十分高い、ただし高すぎない動作周波数でGPU12が動作していることを確実にするために、CPU6は、フレームをレンダリングするためにGPU12がどのくらいビジー状態であったかを示す、GPU12のビジーレベルを決定し得る。ビジーレベルは、GPU12が時間間隔中にフレームをレンダリングするためのコマンドを実行していた時間量を指す。別の方法を考慮すると、ビジーレベルは、フレームをレンダリングするために時間間隔中にいくつのGPUサイクル(例えば、GPU12のクロックサイクル)が使用されたかを示す。ビジーレベル測定は、時間の単位であり得、時として割合(percentage)(例えば、ビジー状態の時間量、割ることの時間間隔に100を乗じたもの)として表され得る。一般に、ビジーレベルは、GPU12がフレーム作業負荷(workload)を完了するのにかかる時間量を指す。
[0056] GPU12は、GPU12内のユニットが1つまたは複数の汎用レジスタ(GPR:general purpose register)にデータを記憶し、および/またはそれからデータを読み取る度に、カウンタをインクリメント(increment)する回路を含み得る。時間間隔の終局に(例えば、GPU12がフレームのレンダリングを完了した後)、CPU6は、フレームをレンダリングするためにGPU12内のユニットが1つまたは複数GPRにアクセスした回数を決定し得る。例えば、CPU6は、GPU12内のユニットがフレームをレンダリングするために1つまたは複数のGPRにアクセスした回数を決定するために、直前のフレームのレンダリングの完了の終わりのときのカウンタ値と、現在のフレームのレンダリングの完了の終わりのときのカウンタ値との間の差を決定し得る。
[0057] GPU12でのユニットが1つまたは複数のGPRにアクセスした回数は、フレームをレンダリングするために使用されたクロックサイクルの数の良好な近似値であり得る。フレームのレンダリング中のGPU12のクロックレートと、フレームをレンダリングするために使用されたクロックサイクルの数とに基づいて、CPU6は、フレームのレンダリング中にGPU12がビジー状態であった時間量を決定し得る。例えば、フレームをレンダリングするために使用されたクロックサイクルの数に、GPU12のクロックレートの期間を乗算したものは、GPU12がフレームのレンダリング中ビジー状態であった時間量(例えば、フレームをレンダリングするためのGPU12のビジーレベル)を示す。
[0058] 別の例として、GPU12は、任意のGPUサブブロック(例えば、GPU12内のユニット)がビジー状態である限り、GPU12のクロックサイクルを用いて、カウンタをインクリメントする回路を含み得る。カウンタの値は、フレームをレンダリングするために使用されたクロックサイクルの数を示す。
[0059] 上記は、CPU6がGPU12のビジーレベルを決定する例となる2つの方法である。本開示において説明されている技法は、GPU12のビジーレベルを決定するためのこの特定の例に限定されるものではない。GPU12のビジーレベルを決定する複数の異なる方法があり得、CPU6は、GPU12のビジーレベルを決定する異なる方法のうちの1つまたは複数を用い得る。
[0060] CPU6は、GPU12のビジーレベル率を決定するために、GPU12が現在のフレームをレンダリングするのにビジー状態であった時間量を、時間間隔における時間量で除算し得る。いくつかの例では、CPU6は、GPU12のビジーレベル率を決定するために、GPU12が現在のフレームをレンダリングするためにビジー状態であった時間量を、前のN個の時間間隔についての平均時間量で除算し得る。いずれの例でも、ビジーレベル率は、現在のフレームのビジーレベルに基づいており、他の任意のフレームのビジーレベルには基づいていない(例えば、GPU12が現在のフレームだけをレンダリングするのにどのくらいビジー状態であったか)。
[0061] CPU6は次いで、GPU12のクロックレートを増加させるべきか減少させるべきかを決定し得る。例えば、ビジーレベル率が第1のしきい値よりも大きい場合、CPU6は、GPU12のクロックレートを増加させ得、ビジー率が第2のしきい値よりも少ない場合、CPU6はGPU12のクロックレートを減少させ得る。第1のしきい値および第2のしきい値は、異なるしきい値または同じしきい値であり得る。いくつかの例では、CPU6がGPU12のクロックレートをどのくらい増加または減少させるべきかをそれから決定することができる複数のしきい値があり得る。
[0062] いくつかの例では、CPU6またはCPU6との組合せではなくむしろGPU12は、GPU12が現在のフレームのレンダリングを完了したときと、GPU12が現在のフレームの直前にある、前のフレームのレンダリングを完了したときとの間の時間間隔を決定し得る。例えば、GPU12のコントローラは、前のN個の時間間隔レンダリングするためにGPU12がビジー状態であった平均時間量を用いてフレームのレンダリング中にGPU12がどのくらいビジー状態であったかを決定するために、上述された例となるカウンタから読み取り得る。GPU12のコントローラは次いで、CPU6に関連して説明された上記例と同様のクロックレートを増加または減少させ得る。
[0063] フレームの終わりからフレームの終わり(end-of-frame to end-of-frame)(例えば、GPU12が現在のフレームのレンダリングを完了したときと、GPU12が現在のフレームの直前にある、前のフレームのレンダリングを完了したときとの間の時間間隔)に基づいてビジーレベルを決定することによって、CPU6および/またはGPU12は、GPU12のクロックレートを比較的迅速かつ比較的正確に決定し得る。いくつかの技法では、CPU6および/またはGPU12がフレームの終わりからフレームの終わりに基づいてビジーレベルまたはビジーレベル率を決定する時間間隔を決定するのではなくむしろ、CPU6は、GPU12がアイドル状態であるインスタンスに基づいて時間間隔を決定し得る。
[0064] しかしながら、GPU12がいつアイドル状態であるかに基づいて、または現在の時間間隔に基づいて、ビジーレベルまたはビジーレベル率を決定することは、正確なビジーレベルまたはビジーレベル率を決定するために複数のビジーレベルまたはビジーレベル率を平均化することを必要とし得る。CPU6がGPU12のクロックレートを決定することができるので、平均値としてビジーレベルまたはビジーレベル率を決定することは、GPU12が複数のフレームをレンダリングするのをCPU6が待機することを必要とする。GPU12が複数のフレームをレンダリングするのを待機することは、ビジーレベルまたはビジーレベル率を決定するために長い遅延をもたらし、GPU12のクロックレート調整を遅延させ、これは、ジャンキー挙動につながり得る。
[0065] 例えば、GPU12は、GPU12がしきい値量の時間の間いずれのグラフィックスデータも出力しない場合、アイドル状態であるとみなされる。いくつかの例では、しきい値量の時間の間いずれのグラフィックスデータも出力されていないことを決定するために、CPU6は、GPU12がピクセル値を記憶する記憶ロケーションへのGPU12によるアクセスをモニタする。これに応答して、CPU6は、ビジーレベルおよびビジーレベル率を決定するために、上述されたカウンタから読み取る。例えば、CPU6は、GPU12がアイドル状態であった前回から、GPU12がアイドル状態である現在のインスタンスまで(例えば、アイドル状態からアイドル状態までの時間(idle-to-idle time))のカウンタの差を決定する。
[0066] しかしながら、GPU12がアイドル状態になるとき、およびGPU12がアイドル状態になるときとGPU12がアイドル状態になるときとの間に処理されるフレームの数が比較的無作為であり得るので、GPU12がアイドル状態になるときのインスタンスに頼ることは全状況で有益であるわけではないこともある。例えば、何度も、1つのフレームが別のフレームのすぐあとに続いており、これは、GPU12のアイドル状態からアイドル状態までの時間ごとに(between idle-to-idle time of GPU 12)比較的大きいギャップが存在することを意味する。GPU12のアイドル状態からアイドル状態までの時間の合間に1つのフレームのみがレンダリングされる場合、アイドル状態からアイドル状態までの時間は比較的短いこともある。これは、フレームの各々の作業負荷が同じである場合でも、ビジーレベル率を変動させることをもたらす。変動を釣り合わせるために、CPU6は、アイドル状態からアイドル状態までの複数の時間間隔にわたるビジーレベル率を平均化し得、これは、GPU12のクロックレートが設定されるときを遅延させる。また、アイドル状態がある前に長い遅延がある場合(例えば、合間にアイドル時間がなく複数のフレームがレンダリングされるので)、CPU6は、GPU12についてのクロックレートを決定するのが遅延し得る。
[0067] さらに、いくつかのケースでは、フレームの処理の中にアイドル時間があり得る。例えば、CPU6がフレームをレンダリングするためのコマンドをGPU12にサブミットし得る手法は、CPU6が、フレームをレンダリングするための複数のコマンドをGPUにサブミットし、次いで、その間CPU6がいずれの追加のコマンドもサブミットしない一部分があり、次いでその一部分の後に、CPU6がフレームをレンダリングするための残りのコマンドをGPUにサブミットする、というシナリオを含み得る。このケースでは、コマンドのサブミッションの合間のこの一部分の間、GPU12はアイドル状態であり得る。GPU12がフレームのレンダリングの一部分の間アイドル状態である1つだけのインスタンスよりも多くのアイドル時間があり得る。GPU12がフレームをレンダリングする途中のときに起きるこのアイドル時間は、クロックレートを決定するようにCPU6をトリガし得るが、これは、GPU12が依然としてフレームをレンダリングしているので不十分な情報に基づき得る。
[0068] クロックレートを決定することの遅延は、GPU12が実行する必要があるコマンドの量の変化にGPU12が迅速に反応していないことを意味する。例えば、GPU12のクロックレートが作業負荷の増加に応答して上昇(ramp up)しない場合、フレームが場合によってはドロップされることにより、ディスプレイ18上に表示されるユーザインターフェースにジャンクがあり得る。GPU12のクロックレートが作業負荷の減少に応答して下降(ramp down)しない場合、GPU12は電力を浪費し得る。いくつかのケースでは、作業負荷に低減があった後にGPU12のクロックレートを落とすのに200〜800msの遅延があり得、その間GPU12によって消費される電力は、そうあるべき電力よりも不必要に多くなる。
[0069] 本開示において説明されている技法を用いると、CPU6は、クロックレートを決定するために単一のフレームのレンダリングに関する情報に頼り得、これは、CPU6が、ビジーレベルまたはビジーレベル率の複数の測定を必要とせずにGPU12のクロックレートを決定することを可能にする。また、CPU6がビジーレベルまたはビジーレベル率をいつ決定するべきかをトリガするためにフレームの終わりを使用するので、アイドル時間のない連続した(back-to-back)フレームがある場合でも、またはフレームのレンダリングの最中にアイドル時間がある場合でも、ビジーレベルまたはビジーレベル率の決定にほとんどまたは全く影響ないこともある。いくつかの例では、CPU6がGPU12のクロックレートを決定するのではなくむしろ、GPU12は、それ自体のクロックレートを決定するために同様の技法をインプリメントし得る。
[0070] GPU12がいつフレームをレンダリングし終えたかを決定するために、CPU6は、GPU12がフレームをレンダリングし終えた(例えば、フレームの最後のピクセルのピクセル値を出力した)ことを決定するためにCPU6が使用する情報を、GPU12から受信し得る。1つの例として、OpenGL APIの一部として、フレームのレンダリングの終局に、GPU12は、次のフレームをレンダリングするためのシステムメモリ10におけるメモリ空間について要求し得る。メモリ空間を要求するために、GPU12はメモリ空間についての要求をCPU6に出力し得、CPU6は、このメモリ要求の受信を、GPU12がフレームのレンダリングを完了したことを決定するために使用し得る。例えば、GPU12は、メモリ空間についての要求を出力するためにgl.SwapBuffer APIを実行する。一例として、gl.SwapBufferは、あるバッファを書込みから読取りに、別のバッファを読取りから書込みに変更し得るが、メモリ空間について要求するための他の方法が可能である。CPU6は、要求の受信を、GPU12がフレームのレンダリングを完了したことを決定するために使用する。
[0071] 別の例として、GPU12のソフトウェアツールキットは、開発元がフレームのレンダリングの完了時にコールするようにGPU12をプログラミングするユーザモードドライバ(UMD:user mode driver)を含み得、UMDの実行は、GPU12にフレームの終わりマーカ(end-of-frame marker)を出力させる。CPU6は、フレームの終わりマーカを、GPU12がフレームのレンダリングを完了したことを決定するために使用する。別の例として、gl.SwapBuffer APIは直接UMDを用いて更新され得、その結果、CPU6は、gl.SwapBuffer APIに基づくフレームの終わりマーカを受信し、開発元の介入が必要ない。
[0072] GPU12がフレームのレンダリングを完了したことをCPU6が決定するための他の技法が可能であり、本開示において説明されている技法は、上記例に限定されるとみなされるべきではない。さらに、GPU12がフレームの終わりからフレームの終わりまでの時間間隔を決定する例では、GPU12のコントローラは、GPU12がいつgl.SwapBuffer APIを実行したか、またはUMDがいつ実行されるかを決定し得る。このようなケースでは、コントローラは、GPU12がフレームの終わりに達したことを決定し得る。
[0073] 本開示において説明されている技法では、プロセッサ(例えば、ホストプロセッサとも称されるCPU6、GPU12、またはその2つの組合せ)は、GPU12が第1のフレームのレンダリングを完了した第1の時間インスタンスを決定し、GPU12が第1のフレームの直前にある第2のフレームのレンダリングを完了した第2の時間インスタンスを決定し得る。第1の時間インスタンスは、GPU12が現在のフレームの最後のピクセルのピクセル値を決定したインスタンス、またはGPU12が現在のフレームの最後のピクセルのピクセル値を出力したインスタンスである。第2の時間インスタンスは、GPU12が前のフレームの最後のピクセルのピクセル値を決定したインスタンス、またはGPU12が現在のフレームの最後のピクセルのピクセル値を出力したインスタンスである。
[0074] いくつかのケースでは、GPU12は、現在のフレームのレンダリング中の少なくとも一部分の間アイドル状態であり得る。例えば、GPU12が第1のフレームのレンダリングを開始した時間から、GPU12は連続的にフレームをレンダリングしないこともあり、しばらくの間アイドル状態であり得る。その一部分の間アイドル状態であった後、GPU12は、第1のフレームのレンダリングを継続し得、次いで、第1のフレームのレンダリングがいつ完了したかをCPU6に示すか、または第1のフレームのレンダリングがいつ完了したかを(例えば、コントローラを介して)決定する。
[0075] いくつかのケースでは、前のフレームと現在のフレームとの合間にいずれのアイドル時間もないこともある。例えば、CPU6は、GPU12に、第2の前のフレームをレンダリングするように命令し、次いですぐに、GPU12に、第1の現在のフレームをレンダリングするように命令し得る。この例では、GPU12は、第2のフレームのレンダリングと第1のフレームのレンダリングとの間にGPU12のアイドル時間がないように、第2のフレームのレンダリングの完了直後に第1のフレームのレンダリングを始める。
[0076] CPU6は、次のフレームをレンダリングするためのメモリについての要求を受信することに基づいて第1の時間インスタンスおよび第2の時間インスタンスを決定し得る。同様に、GPU12は、次のフレームをレンダリングするためのメモリについての要求がいつ送信されたかに基づいて第1の時間インスタンスおよび第2の時間インスタンスを決定し得る。このように、プロセッサは、GPU12がアイドル状態になるより前に、および前のフレームまたは現在のフレームのレンダリングの完了の本質的に直後に、第1の時間インスタンスおよび第2の時間インスタンスを決定し得る。例えば、プロセッサは、GPU12が第2の(前の)フレームまたは第1の(現在の)フレームをレンダリングし終えたときから、5ms、2ms未満、またはさらには可能性として1ms未満で(例えば、GPU12がアイドル状態であることをCPU6が決定するのにかかる時間よりも少ない時間で)、GPU12が第2のフレームまたは第1のフレームをレンダリングし終えたことを決定し得る。
[0077] プロセッサ(例えば、CPU6および/またはGPU12)は、第1の時間インスタンスおよび第2の時間インスタンス(例えば、第1の時間インスタンスについての時間と第2の時間インスタンスの時間との間の差)に基づいて時間間隔を決定し得る。プロセッサは、時間間隔中に現在のフレームをレンダリングするためのGPU12のビジーレベル(例えば、時間間隔中にフレームをレンダリングするための作業負荷を処理するための時間量)を決定し得る。
[0078] 決定されたビジーレベルに基づいて、プロセッサは、GPU12のクロックレートを決定し得る。例えば、プロセッサは、決定されたビジーレベルおよび決定された時間間隔に基づいてビジーレベル率を決定し得る(例えば、時間間隔中に作業負荷を処理するための時間量を時間間隔の時間量で除算する)。プロセッサは、ビジーレベル率をしきい値と比較し、比較に基づいてクロックレートを決定し得る。
[0079] 別の例として、プロセッサは、平均時間間隔を決定するために、時間間隔と1つまたは複数の前の時間間隔とを平均化し得る。この例では、1つまたは複数の前の時間間隔の各々は、それぞれの前のフレームのレンダリングの完了間の時間間隔を示す。例えば、プロセッサは、N個の時間間隔について、現在のフレームのレンダリングと前のフレームのレンダリングとの間の時間間隔、前のフレームのレンダリングと前のフレームの直前のフレームのレンダリングとの間の時間間隔、および同様に続くものを平均化し得る。このような平均化は、ウィンドウ化された移動平均(windowed running average)とみなされ得る。
[0080] プロセッサは、決定されたビジーレベルおよび平均時間間隔に基づいてビジーレベル率を決定し、ビジーレベル率をしきい値と比較し得る。上記と同様に、プロセッサは、比較に基づいてクロックレートを決定し得る。
[0081] プロセッサは、決定されたビジーレベルに基づいてGPU12のクロックレートを決定し得る。いくつかの例では、プロセッサは、他のフレームは含めず第1のフレームのみをレンダリングする(rendering the first frame and no other frame)ための決定されたビジーレベルに基づいてGPU12のクロックレートを決定し得る。このように、プロセッサは、GPU12が複数のフレームをレンダリングした後ではなくむしろ単一のフレームに基づいてクロックレートを決定するように構成され、これは、GPU12が、ほとんど遅延なくその動作周波数を上昇または下降させることを可能にし、その結果、GPU12は、その最低周波数レベルで動作しながら依然として適時にコマンドの実行を完了する。
[0082] プロセッサは、GPU12のクロックレートを、決定されたクロックレートに設定し得る。例えば、プロセッサがCPU6である例では、CPU6は、GPU12に、GPU12のクロックレートを、決定されたクロックレートに設定するように命令し得る。プロセッサがGPU12である例では、GPU12のコントローラは、GPU12に、GPU12のクロックレートを設定するように命令し得る。GPU12は次いで、決定されたクロックレートで動作し得る。プロセッサは、後続のフレームをレンダリングするためのクロックレートを設定する現在のフレームに基づいてGPU12のクロックレートを決定するが、クロックレートを決定するために1つのみのフレームを使用することによって、プロセッサは、クロックレートが正しくなかった場合にクロックレートをすぐに更新し得、これは、プロセッサが、GPU12が次のフレームのレンダリングを完了した直後にクロックレートを更新し得るからである。
[0083] 図2は、より詳細に図1に例示されているデバイスのコンポーネントを例示するブロック図である。図2に例示されているように、GPU12は、コントローラ30、発振器34、カウンタレジスタ35、シェーダコア(shader core)36、および固定機能パイプライン(fixed-function pipeline)38を含む。シェーダコア36および固定機能パイプライン38は共に、グラフィックスまたは非グラフィックス関連機能を実行するために使用される実行パイプラインを形成し得る。1つのシェーダコア36のみが例示されているが、いくつかの例では、GPU12は、シェーダコア36と同様の1つまたは複数のシェーダコアを含み得る。
[0084] GPU12が実行することになるコマンドは、GPU12のコントローラ30によって決定されたように、シェーダコア36および固定機能パイプライン38によって実行される。コントローラ30は、GPU12上のハードウェアとして、またはGPU12のハードウェア上で実行されるソフトウェアあるいはファームウェアとしてインプリメントされ得る。コントローラ30は、GPU12がクロックレートを決定しているケースにおいて例となる技法を行うための上述されたコントローラの例である。
[0085] コントローラ30は、システムメモリ10のコマンドバッファ40から、または直接CPU6から、フレームをレンダリングするために実行されることになるコマンドを受信(例えば、GPU12によってこれから実行されるべきとCPU6が決定したサブミットされたコマンドを受信)し得る。コントローラ30はまた、システムメモリ10のデータバッファ42から、または直接CPU6から、コマンドのためのオペランドデータを取り出し得る。例えば、コマンドバッファ40は、AとBを加算するためのコマンドを記憶し得る。コントローラ30は、このコマンドをコマンドバッファ40から取り出し、AとBの値をデータバッファ42から取り出す。コントローラ30は、どのコマンドがシェーダコア36によって実行されることになるかと(例えば、ソフトウェア命令はシェーダコア36上で実行される)、どのコマンドが固定機能パイプライン38によって実行されることになるかと(例えば、固定機能パイプライン38のユニットのためのコマンド)を決定し得る。
[0086] いくつかの例では、コマンドバッファ40およびデータバッファ42の一方または両方からのコマンドおよび/またはデータは、GPU12のローカルメモリ14の一部であり得る。例えば、GPU12は命令キャッシュおよびデータキャッシュを含み得、これらは、コマンドバッファ40からのコマンドと、データバッファ42からのデータとをそれぞれ記憶する、ローカルメモリ14の一部であり得る。これらの例では、コントローラ30は、ローカルメモリ14からコマンドおよび/またはデータを取り出し得る。
[0087] シェーダコア36および固定機能パイプライン38は、互いにデータを送信および受信し得る。例えば、シェーダコア36が実行するコマンドのいくつかは、固定機能パイプライン38のユニットが実行することになるコマンドのためのオペランドである中間データを生成し得る。同様に、固定機能パイプライン38のユニットが実行するコマンドのいくつかは、シェーダコア36が実行することになるコマンドのためのオペランドである中間データを生成し得る。このように、受信されたデータは、パイプライン化方式(pipelined fashion)で固定機能パイプライン38およびシェーダコア36のユニットを通して徐々に処理される。したがって、シェーダコア36および固定機能パイプライン38は、実行パイプラインをインプリメントするものとして言及され得る。いくつかの例では、GPU12は、1つより多くのシェーダコア36を含み得、図2の例は、単に理解を助けるために提供されている。
[0088] 一般に、シェーダコア36は、実行されることになる様々なタイプのコマンドを与え、これは、ユーザが、最も考えられる手法で所望のタスクを行うようにシェーダコア36をプログラミングすることができるので、シェーダコア36がプログラム可能であり、機能的な柔軟性をユーザに提供することを意味する。しかしながら、固定機能パイプライン38の固定機能ユニットは、固定機能ユニットがタスクを行う手法の場合ハードワイヤード(hardwired)である。したがって、固定機能ユニットは、あまり機能的柔軟性を提供しないこともある。
[0089] 図2にも例示されているように、GPU12は発振器34を含む。発振器34は、シェーダコア36および/または固定機能パイプライン38のユニットがコマンドを実行する時間インスタンスを設定するクロック信号を出力する。発振器34がGPU12の内部にあると例示されているが、いくつかの例では、発振器34はGPU12の外部にあり得る。また、発振器34は、必ずしもただGPU12にクロック信号を提供する必要があるわけではなく、他のコンポーネントにも同様にクロック信号を提供し得る。
[0090] 発振器34は、方形波、正弦波、三角波、または他のタイプの周期波を生成し得る。発振器34は、生成された電波の電圧を増幅するための増幅器を含み、結果として生じる電波をGPU12のためのクロック信号として出力し得る。
[0091] いくつかの例では、発振器34によって出力されたクロック信号の立ち上がりエッジまたは立ち下がりエッジ上で、シェーダコア36および固定機能パイプライン38の各ユニットは、1つのコマンドを実行し得る。いくつかのケースでは、コマンドはサブコマンドへと分割され得、シェーダコア36および固定機能パイプライン38の各ユニットは、クロック信号の立ち上がりエッジまたは立ち下がりエッジに応答してサブコマンドを実行し得る。例えば、A+BというコマンドはAの値とBの値を取り出すサブコマンドを含み、シェーダコア36または固定機能パイプライン38は、クロック信号の立ち上がりエッジまたは立ち下がりエッジにおいてこれらのサブコマンドの各々を実行し得る。
[0092] シェーダコア36および固定機能パイプライン38のユニットがコマンドを実行するレートは、GPU12の電力消費に影響を及ぼし得る。例えば、発振器34によって出力されるクロック信号の周波数が比較的高い場合、シェーダコア36および固定機能パイプライン38のユニットがクロック信号の比較的低い周波数の場合に実行することになるコマンドの数と比較して、シェーダコア36および固定機能パイプライン38のユニットは、時間期間内により多くのコマンドを実行し得る。しかしながら、GPU12の電力消費は、シェーダコア36および固定機能パイプライン38のユニットが、(発振器34からのクロック信号のより低い周波数により)時間の期間においてより少ないコマンドを実行している事例と比較するよりも、シェーダコア36および固定機能パイプライン38のユニットが、(発振器34からのクロック信号のより高い周波数により)時間の期間においてより多くのコマンドを実行している事例ではより多くなり得る。
[0093] 上述されたように、CPU6は、GPU12の超並列処理能力によりGPU12にタスクをオフロードし得る。例えば、GPU12は、SIMD(single instruction, multiple data)構造を用いて設計され得る。SIMD構造では、シェーダコア36は複数のSIMD処理要素を含み、ここで、各SIMD処理要素は、異なるデータに対してであるが同じコマンドを実行する。
[0094] 特定のSIMD処理要素上で実行される特定のコマンドは、スレッド(thread)と称される。各SIMD処理要素は、所与のスレッドのためのデータが異なり得るので、異なるスレッドを実行すると考えられ得るが、しかしながら、処理要素上で実行されるスレッドは、他の処理要素上で実行されるコマンドと同じコマンドである。このように、SIMD構造は、GPU12が並列に(例えば、同時に)多くのタスクを行うことを可能にする。このようなSIMD構造のGPU12の場合、各SIMD処理要素は、クロック信号の立ち上がりエッジまたは立ち下がりエッジ上で1つのスレッドを実行し得る。
[0095] 混乱を避けるために、本開示は、シェーダコア36または固定機能パイプライン38のユニットによって実行されるプロセスを概して指すために、「コマンド」という用語を使用する。例えば、コマンドは、実際のコマンド、成分サブコマンド(constituent sub-commands)(例えば、メモリコールコマンド(memory call commands))、スレッド、またはGPU12が特定の機能を実行する他の方法を含む。GPU12は、シェーダコア36および固定機能パイプライン38を含むので、GPU12は、コマンドを実行するとみなされ得る。
[0096] また、上記例では、シェーダコア36または固定機能パイプライン38のユニットは、発振器34によって出力されたクロック信号の立ち上がりエッジまたは立ち下がりエッジに応答してコマンドを実行する。しかしながら、いくつかの例では、シェーダコア36または固定機能パイプライン38のユニットは、クロック信号の立ち上がりエッジ上で1つのコマンドを実行し、立ち下がりエッジ上で別の後続のコマンドを実行し得る。コマンドを「クロックする」ための他の方法があり得、本開示において説明されている技法は、上記例に限定されるものではない。
[0097] GPU12は立ち上がりエッジ、立ち下がりエッジ、または両方ごとにコマンドを実行するので、発振器34によって出力されるクロック信号の周波数(クロックレートとも称される)は、GPU12がある特定の時間内に実行することができるコマンドの量を設定する。例えば、GPU12がクロック信号の立ち上がりエッジにつき1つのコマンドを実行し、クロック信号の周波数が1MHzである場合、GPU12は1秒で100万個のコマンドを実行することができる。
[0098] 図2に例示されているように、CPU6は、点線のボックスによって例示されているアプリケーション26を実行する。実行中、アプリケーション26は、シェーダプログラム(例えば、頂点シェーダ、フラグメントシェーダ、非グラフィックスアプリケーションのためのコンピュートシェーダ(compute shaders)、および同様のもの)を取り出し実行するようにGPU12に命令するコマンドを含む、GPU12実行されることになるコマンドを生成する。さらに、アプリケーション26は、コマンドがそれに対して作用するデータ(すなわち、コマンドのためのオペランド)を生成する。CPU6は、生成されたコマンドをコマンドバッファ40に記憶し、オペランドデータをデータバッファ42に記憶する。
[0099] CPU6が、生成されたコマンドをコマンドバッファ40に記憶した後、CPU6は、GPU12による実行のためにコマンドを利用可能にする。例えば、CPU6は、記憶されたコマンドのセットのメモリアドレスと、それらのオペランドデータと、GPU12がいつコマンドのセットを実行することになるかを示す情報とをGPU12に通信する。このように、CPU6は、フレームをレンダリングするように実行するためのコマンドをGPU12にサブミットする。
[0100] 図2に例示されているように、CPU6はまた、グラフィックスドライバ28を実行し得る。いくつかの例では、グラフィックスドライバ28は、CPU6のハードウェアまたはハードウェアユニット上で実行されるソフトウェアあるいはファームウェアであり得る。グラフィックスドライバ28は、CPU6およびGPU12が互いに通信することを可能にするように構成され得る。例えば、CPU6は、グラフィックスまたは非グラフィックス処理タスクをGPU12にオフロードするとき、CPU6は、グラフィックスドライバ28を介してGPU12にそのような処理タスクをオフロードする。例えば、GPU12が実行することになるコマンドの量を示す情報をCPU6が出力するとき、グラフィックスドライバ28は、GPU12に情報を出力するCPU6のユニットであり得る。
[0101] 追加の例として、アプリケーション26は、グラフィックスデータおよびグラフィックスコマンドを生成し、CPU6は、このグラフィックスデータの処理をGPU12にオフロードし得る。この例では、CPU6は、グラフィックスデータをデータバッファ42に、グラフィックスコマンドをコマンドバッファ40に記憶し得、グラフィックスドライバ28は、グラフィックスデータおよびグラフィックスコマンドをそれぞれデータバッファ42およびコマンドバッファ40からいつ取り出すべきかと、それぞれデータバッファ42およびコマンドバッファ40からのグラフィックスデータおよびグラフィックスコマンドをどこから取り出すべきかと、コマンドのセットのうちの1つまたは複数のコマンドを実行することによってグラフィックスデータをいつ処理するべきかと、をGPU12に命令し得る。
[0102] また、アプリケーション26は、GPU12が1つまたは複数のシェーダプログラムを実行することを必要とし得る。例えば、アプリケーション26は、(例えば、図1のディスプレイ18上に)表示されることになるフレームについてのピクセル値を生成するために、シェーダコア36が頂点シェーダおよびフラグメントシェーダを実行することを必要とし得る。グラフィックスドライバ28は、シェーダプログラムをいつ実行するべきかをGPU12に命令し、データバッファ42からのグラフィックスデータをどこで取り出すべきかと、コマンドバッファ40からの、またはシステムメモリ10内の他のロケーションからのコマンドをどこで取り出すべきかと、をGPU12に命令し得る。このように、グラフィックスドライバ28は、CPU6とGPU12との間にリンクを形成し得る。
[0103] グラフィックスドライバ28は、アプリケーション処理インターフェース(API)にしたがって構成され得るが、グラフィックスドライバ28は、特定のAPIにしたがって構成されるものと限定される必要はない。デバイス2がモバイルデバイスである例では、グラフィックスドライバ28は、OpenGL ES APIにしたがって構成され得る。OpenGL ES APIは、モバイルデバイス用に特別に設計されている。デバイス2が非モバイルデバイスである例では、グラフィックスドライバ28は、OpenGL APIにしたがって構成され得る。
[0104] サブミットされたコマンドにおけるコマンドの量は、ユーザインターフェースまたはゲームアプリケーションの1つのフレームをレンダリングするのに必要なコマンドに基づき得る。ユーザインターフェースの例の場合、GPU12は、ジャンクフリーのユーザエクスペリエンスを提供するために、vsyncウィンドウ(例えば、16msごとなどの、それまでに新たなフレームが表示のために準備ができているべき時間)内に、ユーザインターフェースの1つのフレームをレンダリングするのに必要なコマンドを実行する必要があり得る。比較的大量のコンテンツが表示される必要がある場合、比較的少量のコンテンツが表示される必要がある場合よりも、コマンドの量が多くなり得る。
[0105] 設定された時間期間内にGPU12がサブミットされたコマンドを実行することができることを確実にするために、コントローラ30は、発振器34が出力するクロック信号の周波数(すなわち、クロックレート)を調整し得る。しかしながら、クロックレートが、設定された時間期間内にGPU12がサブミットされたコマンドを実行することを可能にするのに十分高くなるようにクロック信号のクロックレートを調整するために、コントローラ30は、発振器34のクロックレートを増加させるべきか、減少させるべきか、同じに保つべきかを示す情報を受信し得る。いくつかの例では、コントローラ30は、発振器34が出力するクロック信号についての特定のクロックレートを示す情報を受信し得る。
[0106] CPU6がGPU12のクロックレートを決定する本開示において説明されている技法では、周波数管理モジュール32は、発振器34が出力するクロック信号のクロックレートを決定するように構成され得る。GPU12がクロックレートを決定するいくつかの例では、コントローラ30は、GPU12上でだが、周波数管理モジュール32に関連して説明された例となる技法を行うように構成され得る。
[0107] 動的クロックおよび電圧スケーリング(DCVS:dynamic clock and voltage scaling)モジュールとも称される、周波数管理モジュール32は、CPU6上で実行されるソフトウェアであると例示されている。しかしながら、周波数管理モジュール32は、CPU6上のハードウェア、またはハードウェアとソフトウェアあるいはファームウェアの組合せであり得る。
[0108] 周波数管理モジュール32は、GPU12が第1の(現在の)フレームのレンダリングを完了した第1の時間インスタンスと、GPU12が現在のフレームの直前にある第2の(前の)フレームのレンダリングを完了した第2の時間インスタンスとを決定するように構成され得る。本開示では、現在のフレームの直前にある前のフレームは、現在のフレームより前にあり、他のいずれのフレームも前のフレームと現在のフレームとの合間にないフレームを指す。いくつかのケースでは、GPU12が前のフレームのレンダリングを完了したときから、GPU12が現在のフレームをレンダリングし始めたときまでの間に何らかのアイドル時間があり得る。しかしながら、いくつかの例では、GPU12が前のフレームのレンダリングを完了したときから、GPU12が現在のフレームをレンダリングし始めたときまでの間にそのようなアイドル時間はなくてもよい。
[0109] 例えば、グラフィックスドライバ28は、2つのフレームをレンダリングするためのコマンドを一度にサブミットし得る。この例では、コントローラ30は、2つのフレームのうちの第1のフレームをレンダリングするためのコマンドを受信し、コマンドを実行するようにシェーダコア36および固定機能パイプライン38に命令する。コマンドがグラフィックスパイプラインを通って進むので、第1のフレームをレンダリングするための最後のコマンドがGPU12のグラフィックスパイプラインにおける第1のユニットを過ぎたらすぐに、コントローラ30は、第2のフレームの実行を始める第1のコマンドを取り出す(例えば、第2のフレームをレンダリングするためのコマンドの実行を始めるように、GPU12のグラフィックスパイプラインの第1のユニットに命令する)。この例では、フレーム間のGPU12による処理に中断はない(例えば、1つのフレームのレンダリングと1つのフレームのレンダリングとの間(between the rendering of two frames)にアイドル時間はない)。いくつかのケースでは、グラフィックスドライバ28は、2つより多くのフレームについてのコマンドを一度にサブミットし得る。
[0110] いくつかのケースでは、グラフィックスドライバ28は、必ずしもフレームをレンダリングするのに必要な全コマンドを一度にGPU12にサブミットするわけではないこともあるか、または全コマンドをサブミットし得るが全コマンドをすぐに順々に実行するようにGPU12に命令しないこともある。例えば、グラフィックスドライバ28は、フレームをレンダリングするための第1のセットのコマンドをサブミットし、次いで、GPU12がアイドル状態になる間さらなるコマンドを送るのを中断し、次いで、フレームをレンダリングするための残りのコマンドをサブミットし得る。別の例として、グラフィックスドライバ28は、GPU12に全コマンドをサブミットし、次いで、GPU12に第1のセットのコマンドを実行するように命令し、次いで、GPU12がアイドル状態になる間コマンドの実行を中断するようにGPU12に命令し、次いで、残りの命令を実行するようにGPU12に命令し得る。フレームのレンダリング中にGPU12がアイドル状態になる1つより多くの持続時間があり得、GPU12がフレームのレンダリング中に1つの持続時間だけの間アイドル状態になる上記例は、例示の目的のためだけに提供されている。
[0111] 上述されたように、GPU12が現在のフレームまたは前のフレームのレンダリングを完了したインスタンスは、GPU12がそれぞれ現在のフレームまたは前のフレームの最後のピクセルのピクセル値を決定したインスタンスであるか、またはGPU12がそれぞれ現在のフレームまたは前のフレームの最後のピクセルのピクセル値を出力したインスタンスである。1つの例として、GPU12がフレーム(例えば、現在のフレームまたは前のフレーム)のレンダリングを完了したインスタンスは、シェーダコア36上のピクセルシェーダの最後の実行のインスタンスであるか、または、シェーダコア36上で実行されるピクセルシェーダがフレームの最後のピクセル値を出力したインスタンスである。
[0112] 周波数管理モジュール32が、GPU12が(例えば、フレームのレンダリングの5ms、2ms、またはさらには1ms以内に)フレームをレンダリングし終えたところであると決定する1つの方法は、システムメモリ10におけるメモリについての要求の受信に基づく。例示されていないが、GPU12は、システムメモリ10内のフレームバッファにピクセル値(例えば、グラフィックスデータ)を出力する。フレームをレンダリングした後、コントローラ30は、次のフレームのためのピクセル値をどこに記憶するべきかについてメモリロケーションをCPU6から要求するためにgl.SwapBuffer APIを実行する。コントローラ30がgl.SwapBuffer APIを実行することになる非常に高いレベルの確実性があり得、それは、これが次のフレームをレンダリングするためのメモリがGPU12に割り当てられる方法であるからである。
[0113] この例では、コントローラ30は、グラフィックスドライバ28にメモリについての要求を出力する。グラフィックスドライバ28は、オペレーティングシステム24および周波数管理モジュール32に要求を転送する。周波数管理モジュール32は、次に、GPU12がフレームのレンダリングを完了した時間インスタンスを、周波数管理モジュール32が要求を受信した時間インスタンスとして決定する。オペレーティングシステム24は、次のフレームについてのピクセル値を出力するためにGPU12にメモリを割り当てる。
[0114] 別の例として、コントローラ30は、コントローラ30に、グラフィックスドライバ28にフレームの終わりマーカを出力させるUMD(ユーザモードドライバ)を実行し得、それは次いで、周波数管理モジュール32にフレームの終わりマーカを転送する。別の例として、gl.SwapBuffer APIは、UMDを用いて更新され得るので、gl.SwapBuffer APIの通常の実行以外に追加の実行は必要ではない。
[0115] コントローラ30がGPU12のクロックレートを決定する例では、コントローラ30は、UMDまたはgl.SwapBuffer APIがいつ実行されたかを決定し得る。実行に基づいて、コントローラ30は、GPU12がフレームのレンダリングを完了したことを決定し得、実行のタイミングに基づいて、コントローラ30は、フレームの終わりからフレームの終わりまでのレンダリング間に過ぎた時間量を決定し得る。
[0116] 周波数管理モジュール32は、第1の時間インスタンスおよび第2の時間インスタンスに基づいて時間間隔を決定し得る(例えば、第1の時間インスタンス、引くことの第2の時間インスタンス)。さらに、周波数管理モジュール32は、時間間隔中に現在のフレームをレンダリングするためのGPU12のビジーレベルを決定し得る。コントローラ30は、コントローラ30がそのクロックレートを決定する例で同様の機能を実行するように構成され得る。
[0117] コントローラ30、シェーダコア36、または固定機能パイプライン38が、ローカルメモリ14内の汎用レジスタ(GPR)からデータを読み取る、またはそれにデータを記憶する度に、コントローラ30は、カウンタレジスタ35におけるカウンタを更新(例えば、インクリメント)し得る。周波数管理モジュール32および/またはコントローラ30は、前のフレームのレンダリング後にカウンタレジスタ35を読み取っていたこともあり、現在のフレームのレンダリング後にカウンタレジスタ35を読み取り得る。周波数管理モジュール32および/またはコントローラ30は、カウンタレジスタ35から読み取られた2つの値の間の差を決定し得、結果として生じる値は、GPU12が現在のフレームをレンダリングするのにかかった発振器34のクロックサイクルの数の近似値であり得る。周波数管理モジュール32および/またはコントローラ30は、GPU12がビジー状態であった時間量(例えば、GPU12のビジーレベル)を決定するために、クロックサイクルの決定された数に、発振器34が現在のフレームのレンダリング中に出力していたクロック信号のクロックレートの時間期間を乗じ得る。
[0118] 別の例として、GPU12の任意のGPUサブブロックがビジー状態である限り、コントローラ30は、カウンタレジスタ35におけるカウンタを更新(例えば、インクリメント)し得る。上記のように、周波数管理モジュール32および/またはコントローラ30は、前のフレームのレンダリング後にカウンタレジスタ35を読み取っていたこともあり、現在のフレームのレンダリング後にカウンタレジスタ35を読み取り得る。周波数管理モジュール32および/またはコントローラ30は、カウンタレジスタ35から読み取られた2つの値の間の差を決定し得、結果として生じる値は、GPU12が現在のフレームをレンダリングするのにかかった発振器34のクロックサイクルの数の近似値であり得る。また、上記のように、周波数管理モジュール32および/またはコントローラ30は、GPU12がビジー状態であった時間量(例えば、GPU12のビジーレベル)を決定するために、クロックサイクルの決定された数に、発振器34が現在のフレームのレンダリング中に出力していたクロック信号のクロックレートの時間期間を乗じ得る。GPUのビジーレベルを決定するための他の様々な方法があり得、上記は例となる2つの技法を提供している。
[0119] 周波数管理モジュール32および/またはコントローラ30は、決定されたビジーレベルに基づいて、発振器34が出力するクロック信号のクロックレートを決定し得る。CPU6がクロックレートを設定する例では、周波数管理モジュール32は次いで、発振器34が出力するクロック信号のクロックレートを、決定されたクロックレートに設定するようにGPU12のコントローラ30に命令することを、グラフィックスドライバ28に行わせ得る。GPU12がクロックレートを設定する例では、コントローラ30は、発振器34が出力するクロック信号のクロックレートを設定し得る。このように、周波数管理モジュール32および/またはコントローラ30は、他のフレームは含めず現在のフレームのみをレンダリングするための決定されたビジーレベルに基づいて、発振器34が出力するクロック信号のクロックレートを決定し得る。
[0120] 1つの例では、周波数管理モジュール32および/またはコントローラ30は、決定されたビジーレベルおよび決定された時間間隔に基づいてビジーレベル率を決定し得る(例えば、ビジーレベルを時間間隔で除算し100を乗じる)。周波数管理モジュール32および/またはコントローラ30は、ビジーレベル率をしきい値と比較し、比較に基づいて、発振器34が出力するクロック信号のクロックレートを決定し得る。
[0121] 1つの例では、周波数管理モジュール32および/またはコントローラ30は、現在のフレームをレンダリングするための時間間隔と、1つまたは複数の前のフレーム(例えば、合計5個のフレーム)をレンダリングするための時間間隔とをトラッキングし得る。周波数管理モジュール32および/またはコントローラ30は、時間間隔の平均(すなわち、平均フレーム時間(AFT:average frame time))を決定し得る。この例では、最初のフレーム時間は1つのvsync間隔(ディスプレイ18のリフレッシュレートに依存してデフォルトでは16.67ms)に設定され得る。フレーム毎秒(FPS)は、1/AFTに等しくてもよい。vsync境界の(vsync-bound)グラフィックスアプリケーションのFPSは通常、一定値であり、AFTは比較的安定している。
[0122] この例では、周波数管理モジュール32および/またはコントローラ30は、現在のフレームをレンダリングするためのビジーレベルを平均フレーム時間で除算することによってビジーレベル率を決定し得る。上記と同様に、周波数管理モジュール32および/またはコントローラ30は、ビジーレベル率をしきい値と比較し、比較に基づいて、発振器34が出力するクロック信号のクロックレートを決定し得る。また、上記と同様に、周波数管理モジュール32および/またはコントローラ30は、クロックレートを決定するために現在のフレームのみをレンダリングするためのビジーレベルを使用し得るが、この例では、複数の前のフレームの時間間隔を使用し得る。
[0123] 説明されたように、周波数管理モジュール32および/またはコントローラ30は、クロックレート決定のためのフレーム境界をトラッキングし得る。例えば、周波数管理モジュール32および/またはコントローラ30は、GPU12のビジーレベル(例えば、GPU12のフレーム負荷(frame load))と、フレームの終わりからフレームの終わりの時間間隔(例えば、前のフレームのレンダリングの完了から、現在のフレームのレンダリングの完了のフレーム時間または時間間隔)とを決定する。周波数管理モジュール32および/またはコントローラ30は、それにわたって周波数管理モジュール32および/またはコントローラ30がフレームをレンダリングするためのGPU12のビジーレベルを決定する持続時間とビジーレベル率とを決定するためのタイムスタンプとして、メモリについての要求またはフレームの終わりマーカを使用し得る。
[0124] このように、周波数管理モジュール32および/またはコントローラ30は、クロックレートを正確に決定するために5個以上のフレームを必要とし得る他の技法と比較して、1つのフレーム時間に対してクロックレート決定が行われるときまでのレイテンシを低減させ得る。クロックレートの低レイテンシおよび正確な決定は、ジャンクがより少ない、よりスムーズなUIエクスペリエンスをもたらし、同時使用ケースにおいてなど厳密なクロックレート管理が必要であるケースで特に役立ち得る。また、本技法を用いると、クロックレートは、徐々に変化する必要はなく、必要な場合は急増し得る。例えば、クロックレートが200MHzであるが、GPU12のビジーレベル率が300%である場合、周波数管理モジュール32は、発振器34が300MHz、400MHz、および500MHzのクロックレートオプションを無視して(bypassing)、クロックレートを600MHzに急増することを発振器34またはコントローラ30が行わせ得ることを引き起こすようにコントローラ30に命令し得る。
[0125] さらに、例となる技法がクロックレートを決定するためにフレームのレンダリングの完了に頼るので、GPU12がアイドル状態である、フレームのレンダリング中の1つまたは複数の部分がある場合でも、周波数管理モジュール32および/またはコントローラ30は、クロックレートフレーム中間レンダリングを決定しないこともあり、クロックレートを決定するより前にフレームがレンダリングされるまで待機し得る。また、本技法は、クロックレートを決定するためにGPU12のアイドル時間に頼らないので、本開示において説明されている技法は、クロックレートをいつ決定するべきかを決定するためにアイドル時間に頼る他の技法と比較して、フレームのレンダリングとフレームのレンダリングとの間にアイドル時間がない事例においてでさえも、正確にかつ低レイテンシでクロックレートを決定し得る。
[0126] 図3A〜図3Cは、GPU12がフレームをレンダリングするためのコマンドを受信する例を例示するタイミング図である。図3A〜図3Cは、GPU12がフレームをレンダリングするために受信するコマンドの異なるセットを例示している。図3A〜図3Cに例示されている例では、ビジーレベル率が決定されるごとのGPU12の実際のビジーレベル率が同じである(例えば、50%のビジーレベル率)が、しかしながら、決定されるビジーレベル率は変わり得る。図3A〜図3Cでは、GPU12のビジーレベル率は、GPU12のビジーレベルをGPU12の2つのアイドル状態間の時間間隔で除算したものである。
[0127] 図3A〜図3Cのx軸の数字は、CPU6がビジーレベル率を決定するインスタンスを例示している。例示されているように、GPU12がアイドル状態であるとの決定が行われる前に、GPU12がフレームのレンダリングを完了した後、いくらかの時間が過ぎている。したがって、CPU6がビジーレベル率を決定する時間はフレームのレンダリング後であり、フレームのレンダリング時またはその直後ではない。図3A〜図3Cでは、ビジーレベル率の決定が行われる前に、GPU12が最後のピクセルについてのピクセル値を出力した後、いくらかの時間が経過する。上述されたように、GPU12がアイドル状態であるときに基づいてビジーレベル率を決定することは、ビジーレベル率の正確な決定が行われることができる前に長い遅延を必要とし得る。
[0128] 例えば、図3Aは、GPU12がフレームをレンダリングし、次いでGPU12がアイドル状態である設定された時間があり、次いでGPU12が次のフレームをレンダリングする設定された量の時間があり、その後GPU12がアイドル状態である設定された時間が続く、というように続く理想的なケースを例示している。この例では、実際のビジーレベル率と測定ビジーレベル率が互いにあとを追う(track one another)(例えば、両方が50%である)。しかしながら、理想的なGPUトラフィックはまれである。
[0129] 図3Bは、GPU12がフレームをレンダリングすることになるときの間隔が、それが一定であった図3Aとは異なり、一定ではないケースを例示している。例えば、最後の2つのフレームについては、フレームのレンダリングとフレームのレンダリングとの間にGPU12のためのアイドル時間がないこともある。この例では、サンプル1(例えば、第1のフレームのすぐ後)において、CPU6は、ビジーレベル率が50%であると決定し得、それは、実際のビジーレベル率と同じである。サンプル2(例えば、第2のフレームのすぐ後)では、時間間隔はより短いが、実行されるコマンドの量が各フレームについて同じである(例えば、フレーム負荷が同じである)ので、CPU6は、ビジーレベル率が60%であると決定し得る。このケースでは、フレーム3のレンダリングとフレーム4のレンダリングとの間にアイドル時間がないので、フレーム3をレンダリングした後いずれのサンプルも得られない。サンプル3(例えば、第4のフレームのすぐ後)では、時間間隔の量がさらにより大きくなり得るので、CPU6は、ビジーレベル率が40%であると決定し得る。決定された3つのビジーレベル率の平均は50%(例えば、(50%+60%+40%)割ることの3)であるが、50%に達する前に4つのフレームが処理されている。
[0130] 図3Cは、その間にCPU6がビジーレベル率を決定し得る、フレームのレンダリング中にアイドル時間があるケースを例示している。この例では、サンプル1においてCPU6は、ビジーレベル率を50%と決定し得、サンプル2においてCPU6は、ビジーレベル率を60%と決定し得、サンプル3においてCPU6は、ビジーレベル率を30%と決定し得、サンプル4においてCPU6は、ビジーレベル率を30%と決定し得、サンプル5においてCPU6は、ビジーレベル率を80%と決定し得る。これらサンプルの平均は50%であるが、50%に達する前に5個のサンプルが処理されている。
[0131] それゆえ、図3A〜図3Cでは、一定のビジーレベルを用いても、GPU12がアイドル状態になるときにCPU6がビジーレベル率を決定する場合、CPU6が決定するビジーレベル率は変動し得る。これは、フレーム間アイドル状態の持続時間(inter-frame idle duration)が均等に分配されないため、および/またはフレームのレンダリングの一部分の間アイドル時間があり得るため、であり得る。いくつかの例では、CPU6は、変動をフィルタリングして取り除く(filter out)ために、サンプル(例えば、図3Bおよび図3Cに例示されているように3個または5個のサンプル)の大きいスライドウィンドウ(sliding window)を使用し得る。しかしながら、大きいスライドウィンドウを待機する際、GPU12の発振器34のクロック信号のクロックレートを設定するのに大きい遅延がある。
[0132] 本開示において説明されている技法では、CPU6がアイドル時間中ではなくむしろフレームのレンダリングの完了時にクロックレートを決定するので。したがって、変動が存在しないこともあり、CPU6は、複数のフレームのレンダリングではなく1つのフレームをレンダリングした後にクロックレートを決定することができ得る。また、図3A〜図3Cに例示されている例がCPU6に関連して説明されているが、例となる技法は、GPU12によっても同様に行われ得る。
[0133] 図4は、GPU12がフレームをレンダリングするためのコマンドを受信する別の例を例示するタイミング図である。図4は、本開示において説明されている技法が、発振器34が出力するクロック信号のクロックレートを決定することのレイテンシをなぜ低減するのかを例示するために使用されている。CPU6に関連して例が例示されているが、GPU12によっても同様に行われ得る。レイテンシの低減を例示するために、図4は、CPU6が現在のフレームのみをレンダリングすることに基づいてビジーレベル率を決定することに関連して説明され、CPU6がビジーレベル率を平均化することによってビジーレベル率を決定することに関連して説明される。GPU12がアイドル状態になる時間がフレームの終わりと同じであると仮定したとしても、レンダリングされることになる複数のフレームに頼り、そして平均化することは、GPU12のクロックレートが設定されることができるより前の時間量を遅延させる。アイドル時間がちょうどフレームの終わりにあるのは、どのようにプロセスが実際に作用するかではなく、例示のために、この仮定が理解しやすいように行われていることが理解されるべきである。
[0134] 図4には、6個のフレームがある。最初の5個のフレームについてのビジーレベル(例えば、フレーム負荷)は10msであり、第6のフレームについてのビジーレベルは15msである。第1のフレームのためのフレーム間隔(例えば、理解しやすさのためだけに、アイドル時間からアイドル時間までと同じであると仮定されているフレームの終わりからフレームの終わりまで)は16msであり、第2のフレームは12msであり、第3のフレームは20msであり、第4のフレームは20msであり、第5のフレームは12msであり、第6のフレームは16msである。
[0135] CPU6が現在のフレームのビジー時間率のみを使用する例の場合、CPU6は、(最初のフレーム時間が16msであると仮定して)第1のフレームについての平均時間間隔が16ms(16+16)/2)であると決定し、第1のフレームについてのビジー時間率が63%(10/16)であると決定し得る。第2のフレームについて、CPU6は、平均時間間隔が15ms((16+16+12)/3))と決定し、ビジー時間率が67%(10/15)と決定し得る。第3のフレームについて、CPU6は、平均時間間隔が16ms((16+16+12+20)/4))と決定し、ビジー時間率が63%(10/16)と決定し得る。第4のフレームについて、CPU6は、平均時間間隔が17ms((16+16+12+20+20)/5))と決定し、ビジー時間率が59%(10/17)と決定し得る。第5のフレームについて、CPU6は、平均時間間隔が16ms((16+16+12+20+20+12)/6))と決定し、ビジー時間率が63%(10/16)と決定し得る。第6のフレームについて、CPU6は、平均時間間隔が16ms((16+16+12+20+20+12+16)/7))と決定し、ビジー時間率が94%(15/16)と決定し得る。
[0136] この例で見られるように、CPU6は時間間隔の平均を決定し得るが、CPU6は、ビジー時間率を決定するために現在のフレームのみのビジーレベルを使用し得る。例えば、CPU6は、移動平均(moving average)ではなく、最新のフレーム利用率(the most current frame utilization)を使用し得る。いくつかの例では、ユーザモードドライバ(UMD)は、CPU6がフレーム境界におけるGPU12の作業負荷を決定することを可能にする、フレーム境界情報(例えば、フレームの終わり)を用いてカーネルデバイスドライバ(例えば、グラフィックスドライバ28)を助け得る。
[0137] この例では、前の5個のフレームがすべて63%というサンプルのビジー率を有していたと仮定する。また、前の5個のフレームが平均ビジー率を決定するために使用されると仮定する。CPU6がGPU12のアイドル時間を待機するケースの場合、第1のフレームについて、CPU6は、ビジーレベル率が63%(10/16)と決定し、平均ビジーレベル率が63%(例えば、(63+63+63+63+63)/5=63)と決定し得る。第2のフレームについて、CPU6は、ビジーレベル率が83%(10/12)と決定し、平均ビジーレベル率が67%(例えば、(63+63+63+63+83)/5=67)と決定し得る。第3のフレームについて、CPU6は、ビジーレベル率が50%(10/20)と決定し、平均ビジーレベル率が65%(例えば、(63+63+63+83+50)/5=64.4)と決定し得る。第4のフレームについて、CPU6は、ビジーレベル率が50%(10/20)と決定し、平均ビジーレベル率が62%(例えば、(63+63+83+50+50)/5=61.8)と決定し得る。第5のフレームについて、CPU6は、ビジーレベル率が83%(10/12)と決定し、平均ビジーレベル率が66%(例えば、(63+83+50+50+83)/5=65.8)と決定し得る。第6のフレームについて、CPU6は、ビジーレベル率が94%(15/16)と決定し、平均ビジーレベル率が72%(例えば、(83+50+50+83+94)/5=72)と決定し得る。
[0138] 図5は、GPUが時間の期間にわたって実行することになるコマンドの数を例示するグラフである。図5の例では、フレームレートは30フレーム毎秒であり、例示されているように、ビジーレベルがそれから導出されることができる、GPU12のフレーム負荷は、24,000でほぼ一定である。
[0139] 図6Aは、1つの例となる技法を利用する、図5に例示されている時間の期間にわたるビジーレベル率の決定を例示するグラフである。図6Bは、別の例となる技法を利用する、図5に例示されている時間の期間にわたるビジーレベル率の決定を例示するグラフである。図6Aの例では、CPU6および/またはGPU12は、GPU12のアイドル状態からアイドル状態までの時間に基づいて発振器34のクロック信号のクロックレートを決定し得、図6Bの例では、CPU6および/またはGPU12は、フレームの終わりからフレームの終わりまでに基づいて発振器34のクロック信号のクロックレートを決定し得る。図6Aに例示されているように、クロックレートは変動する。しかしながら、図6Bでは、クロックレートは、ある程度一定である。
[0140] 図7は、本開示において説明されている技法による、クロックレート決定の例となる方法を例示するフローチャートである。説明されたように、例となる技法は、CPU6、GPU12、またはCPU6とGPU12の組合せによって行われ得る。したがって、図7は、プロセッサに関連して説明されている。プロセッサの1つの例はCPU6であり、プロセッサの1つの例はGPU12であり、プロセッサの1つの例はCPU6とGPU12の組合せである。
[0141] 例示されているように、プロセッサ(例えば、CPU6および/またはGPU12)は、GPU12が第1のフレームのレンダリングを完了した第1の時間インスタンスを決定する(50)。第1の時間インスタンスは、GPU12が第1のフレームの最後のピクセルのピクセル値を決定したインスタンス、またはGPU12が第1のフレームの最後のピクセルのピクセル値を出力したインスタンスを備える。プロセッサは、GPU12が現在のフレームの直前にある第2のフレームのレンダリングを完了した第2の時間インスタンスを決定する(52)。第2の時間インスタンスは、GPU12が第2のフレームの最後のピクセルのピクセル値を決定したインスタンス、またはGPU12が第2のフレームの最後のピクセルのピクセル値を出力したインスタンスを備える。
[0142] いくつかのケースでは、GPU12は、第1のフレームのレンダリング中の少なくとも一部分の間アイドル状態である。また、いくつかのケースでは、GPU12は、第2のフレームのレンダリングと第1のフレームのレンダリングとの間にGPUのアイドル時間がないように、第2のフレームのレンダリングの完了直後に第1のフレームのレンダリングを始める。CPU6は、次のフレームをレンダリングするためのメモリについての要求を受信し、CPU6は、次のフレームをレンダリングするためのメモリについての要求を受信することに応答して第1の時間インスタンスを決定する。
[0143] プロセッサは、第1の時間インスタンスおよび第2の時間インスタンスに基づいて時間間隔を決定する(54)。プロセッサは、時間間隔中に第1のフレームをレンダリングするためのGPU12のビジーレベルを決定する(56)。決定されたビジーレベルに基づいて、プロセッサは、GPU12のクロックレートを設定し得る(58)。
[0144] いくつかの例では、プロセッサは、決定されたビジーレベルに基づいてGPU12のクロックレートを決定し、プロセッサは、決定されたクロックレートに基づいてGPU12のクロックレートを設定する。例えば、CPU6は、発振器34のクロックレートを設定するようにコントローラ30に命令し得る、またはコントローラ30は、発振器34のクロックレートを直接設定し得る。プロセッサは、他のフレームは含めず第1のフレームのみをレンダリングするための決定されたビジーレベルに基づいてGPU12のためのクロックレートを決定し得る。
[0145] いくつかの例では、プロセッサは、決定されたビジーレベルおよび決定された時間間隔に基づいてビジーレベル率を決定し、ビジーレベル率をしきい値と比較し、比較に基づいてクロックレートを決定し得る。いくつかの例では、プロセッサは、平均時間間隔を決定するために時間間隔および1つまたは複数の前の時間間隔を平均化し得、1つまたは複数の前の時間間隔の各々は、それぞれの前のフレームのレンダリングの完了間の時間間隔を示す。プロセッサは、決定されたビジーレベルおよび平均時間インターフェースに基づいてビジーレベル率を決定し得、ビジーレベル率をしきい値と比較し、比較に基づいてクロックレートを決定し得る。
[0146] 1つまたは複数の例では、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、またはこれらの任意の組合せにおいてインプリメントされ得る。ソフトウェアにおいてインプリメントされる場合、機能は、1つまたは複数の命令またはコードとして、コンピュータ可読媒体上に記憶され、ハードウェアベースの処理ユニットによって実行され得る。コンピュータ可読媒体は、データ記憶媒体のような有形媒体に対応する、コンピュータ可読記憶媒体を含み得る。このように、コンピュータ可読媒体は概して、非一時的である有形のコンピュータ可読記憶媒体に対応し得る。データ記憶媒体は、本開示において説明された技法のインプリメンテーションのための命令、コード、および/またはデータ構造を取り出すために、1つまたは複数のコンピュータあるいは1つまたは複数のプロセッサによってアクセスされることができる任意の利用可能な媒体であり得る。コンピュータプログラム製品は、コンピュータ可読媒体を含み得る。
[0147] 限定ではなく例として、このようなコンピュータ可読記憶媒体は、RAM、ROM、EEPROM、CD−ROMまたは他の光ディスク記憶装置、磁気ディスク記憶装置、またはその他の磁気記憶デバイス、フラッシュメモリ、あるいは、データ構造または命令の形態で所望のプログラムコードを記憶するために使用されることができ、かつコンピュータによってアクセスされることができる他の任意の媒体を備えることができる。コンピュータ可読記憶媒体およびデータ記憶媒体は、搬送波、信号、または他の一時的な媒体を含まないが、代わりとして非一時的な有形の記憶媒体を対象とすることが理解されるべきである。ディスク(disk)およびディスク(disc)は、本明細書で使用されるとき、コンパクトディスク(CD)、レーザーディスク(登録商標)、光ディスク、デジタル多用途ディスク(DVD)、フロッピー(登録商標)ディスク、およびBlu−ray(登録商標)ディスクを含み、ここで、ディスク(disk)は通常、磁気的にデータを再生するが、ディスク(disc)は、レーザーを用いて光学的にデータを再生する。上記の組合せもまた、コンピュータ可読媒体の範囲内に含まれるべきである。
[0148] 命令は、1つまたは複数のデジタルシグナルプロセッサ(DSP)、汎用マイクロプロセッサ、のような1つまたは複数のプロセッサ、特定用途集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、または、他の同等の集積回路またはディスクリート論理回路によって実行され得る。したがって、「プロセッサ」という用語は、本明細書で使用される場合、前述の構造、または本明細書において説明された技法のインプリメンテーションに好適な他の任意の構造のいずれも指し得る。さらに、いくつかの態様では、本明細書において説明された機能は、符号化および復号のために構成された専用ハードウェアモジュールおよび/またはソフトウェアモジュール内で提供され得るか、または組み合わされたコーデックに組み込まれ得る。また、本技法は、1つまたは複数の回路または論理要素において十分にインプリメントされることができる。
[0149] 本開示の技法は、ワイヤレスハンドセット、集積回路(IC)、またはICのセット(例えば、チップセット)を含む、幅広い種類のデバイスまたは装置においてインプリメントされ得る。開示された技法を行うように構成されたデバイスの機能的な態様を強調するために、様々なコンポーネント、モジュール、またはユニットが本開示において説明されているが、異なるハードウェアユニットによる実現を必ずしも必要とするわけではない。むしろ、上述されたように、様々なユニットは、好適なソフトウェアおよび/またはファームウェアとともに、コーデックハードウェアユニットに組み合わされ得るか、または、上述された1つまたは複数のプロセッサを含む、相互動作のハードウェアユニットの集合によって提供され得る。
[0150] 様々な例が説明されてきた。これらの例および他の例は、以下の特許請求の範囲内にある。
以下に、本願の出願当初の特許請求の範囲に記載された発明を付記する。
[C1]
クロックレート決定の方法であって、
プロセッサを用いて、グラフィックス処理ユニット(GPU)が第1のフレームのレンダリングを完了した第1の時間インスタンスを決定することと、
前記プロセッサを用いて、前記GPUが前記第1のフレームの直前にある第2のフレームのレンダリングを完了した第2の時間インスタンスを決定することと、
前記プロセッサを用いて、前記第1の時間インスタンスおよび前記第2の時間インスタンスに基づいて時間間隔を決定することと、
前記プロセッサを用いて、前記時間間隔中に前記第1のフレームをレンダリングするための前記GPUのビジーレベルを決定することと、
前記決定されたビジーレベルに基づいて前記GPUのクロックレートを設定することと
を備える、方法。
[C2]
前記第1の時間インスタンスは、前記GPUが前記第1のフレームの最後のピクセルのピクセル値を決定したインスタンス、または前記GPUが前記第1のフレームの前記最後のピクセルの前記ピクセル値を出力したインスタンスを備え、前記第2の時間インスタンスは、前記GPUが前記第2のフレームの最後のピクセルのピクセル値を決定したインスタンス、または前記GPUが前記第2のフレームの前記最後のピクセルの前記ピクセル値を出力したインスタンスを備える、C1に記載の方法。
[C3]
前記決定されたビジーレベルに基づいて前記GPUのクロックレートを決定すること
をさらに備え、
前記クロックレートを設定することは、前記クロックレートを前記決定されたクロックレートに設定することを備える、C1に記載の方法。
[C4]
前記GPUは、前記第1のフレームの前記レンダリング中の少なくとも一部分の間アイドル状態である、C1に記載の方法。
[C5]
前記GPUは、前記第2のフレームのレンダリングと前記第1のフレームのレンダリングとの間にGPUのアイドル時間がないように、前記第2のフレームのレンダリングの完了直後に前記第1のフレームのレンダリングを始める、C1に記載の方法。
[C6]
前記決定されたビジーレベルおよび前記決定された時間間隔に基づいて、ビジーレベル率を決定することと、
前記ビジーレベル率をしきい値と比較することと、
前記比較に基づいて前記クロックレートを決定することと
をさらに備え、
前記クロックレートを設定することは、前記決定されたクロックレートに基づいて前記GPUの前記クロックレートを設定することを備える、C1に記載の方法。
[C7]
平均時間間隔を決定するために前記時間間隔および1つまたは複数の前の時間間隔を平均化することと、前記1つまたは複数の前の時間間隔の各々は、それぞれの前のフレームのレンダリングの完了間の時間間隔を示し、
前記決定されたビジーレベルおよび前記平均時間間隔に基づいて、ビジーレベル率を決定することと、
前記ビジーレベル率をしきい値と比較することと、
前記比較に基づいて前記クロックレートを決定することと
をさらに備え、
前記クロックレートを設定することは、前記決定されたクロックレートに基づいて前記GPUの前記クロックレートを設定することを備える、C1に記載の方法。
[C8]
他のフレームは含めず前記第1のフレームのみをレンダリングするための前記決定されたビジーレベルに基づいて前記GPUの前記クロックレートを決定すること
をさらに備える、C1に記載の方法。
[C9]
次のフレームをレンダリングするためのメモリについての要求を、前記GPUから受信すること
をさらに備え、
前記第1の時間インスタンスを決定することは、前記次のフレームをレンダリングするための前記メモリについての前記要求を受信することに応答して前記第1の時間インスタンスを決定することを備える、C1に記載の方法。
[C10]
前記プロセッサはホストプロセッサを備え、前記クロックレートを設定することは、前記ホストプロセッサを用いて、前記GPUに、前記クロックレートを設定するように命令することを備える、C1に記載の方法。
[C11]
前記プロセッサは前記GPUを備える、C1に記載の方法。
[C12]
クロックレート決定のためのデバイスであって、
第1のフレームおよび第2のフレームをレンダリングするためにグラフィックス処理ユニット(GPU)によって使用されるグラフィックスデータを記憶するように構成されたメモリと、
集積回路を備えるプロセッサと
を備え、前記プロセッサは、
前記GPUが前記第1のフレームのレンダリングを完了した第1の時間インスタンスを決定することと、
前記GPUが前記第2のフレームのレンダリングを完了した第2の時間インスタンスを決定することと、
前記第1の時間インスタンスおよび前記第2の時間インスタンスに基づいて時間間隔を決定することと、
前記時間間隔中に前記第1のフレームをレンダリングするための前記GPUのビジーレベルを決定することと、
前記決定されたビジーレベルに基づいて前記GPUのクロックレートを設定することと
を行うように構成される、デバイス。
[C13]
前記第1の時間インスタンスは、前記GPUが前記第1のフレームの最後のピクセルのピクセル値を決定したインスタンス、または前記GPUが前記第1のフレームの前記最後のピクセルの前記ピクセル値を出力したインスタンスを備え、前記第2の時間インスタンスは、前記GPUが前記第2のフレームの最後のピクセルのピクセル値を決定したインスタンス、または前記GPUが前記第2のフレームの前記最後のピクセルの前記ピクセル値を出力したインスタンスを備える、C12に記載のデバイス。
[C14]
前記プロセッサは、前記決定されたビジーレベルに基づいて前記GPUのクロックレートを決定するように構成され、前記クロックレートを設定するために、前記プロセッサは、前記クロックレートを前記決定されたクロックレートに設定するように構成される、C12に記載のデバイス。
[C15]
前記GPUは、前記第1のフレームの前記レンダリング中の少なくとも一部分の間アイドル状態である、C12に記載のデバイス。
[C16]
前記GPUは、前記第2のフレームのレンダリングと前記第1のフレームのレンダリングとの間にGPUのアイドル時間がないように、前記第2のフレームのレンダリングの完了直後に前記第1のフレームのレンダリングを始める、C12に記載のデバイス。
[C17]
前記プロセッサは、
前記決定されたビジーレベルおよび前記決定された時間間隔に基づいて、ビジーレベル率を決定することと、
前記ビジーレベル率をしきい値と比較することと、
前記比較に基づいて前記クロックレートを決定することと
を行うように構成され、
前記クロックレートを設定するために、前記プロセッサは、前記決定されたクロックレートに基づいて前記クロックレートを設定するように構成される、C12に記載のデバイス。
[C18]
前記プロセッサは、
平均時間間隔を決定するために前記時間間隔および1つまたは複数の前の時間間隔を平均化することと、前記1つまたは複数の前の時間間隔の各々は、それぞれの前のフレームのレンダリングの完了間の時間間隔を示し、
前記決定されたビジーレベルおよび前記平均時間間隔に基づいて、ビジーレベル率を決定することと、
前記ビジーレベル率をしきい値と比較することと、
前記比較に基づいて前記クロックレートを決定することと
を行うように構成され、
前記クロックレートを設定するために、前記プロセッサは、前記決定されたクロックレートに基づいて前記クロックレートを設定するように構成される、C12に記載のデバイス。
[C19]
前記プロセッサは、他のフレームは含めず前記第1のフレームのみをレンダリングするための前記決定されたビジーレベルに基づいて前記GPUの前記クロックレートを決定するように構成される、C12に記載のデバイス。
[C20]
前記プロセッサは、
次のフレームをレンダリングするためのメモリについての要求を、前記GPUから受信すること
を行うように構成され、
前記第1の時間インスタンスを決定するために、前記プロセッサは、前記次のフレームをレンダリングするための前記メモリについての前記要求を受信することに応答して前記第1の時間インスタンスを決定するように構成される、C12に記載のデバイス。
[C21]
前記プロセッサはホストプロセッサを備え、前記クロックレートを設定するために、前記ホストプロセッサは、前記GPUに、前記クロックレートを設定するように命令するように構成される、C12に記載のデバイス。
[C22]
前記プロセッサは前記GPUを備える、C12に記載のデバイス。
[C23]
命令を記憶した非一時的なコンピュータ可読記憶媒体であって、前記命令は、実行されると1つまたは複数のプロセッサに、
グラフィックス処理ユニット(GPU)が第1のフレームのレンダリングを完了した第1の時間インスタンスを決定することと、
前記GPUが前記第1のフレームの直前にある第2のフレームのレンダリングを完了した第2の時間インスタンスを決定することと、
前記第1の時間インスタンスおよび前記第2の時間インスタンスに基づいて時間間隔を決定することと、
前記時間間隔中に前記第1のフレームをレンダリングするための前記GPUのビジーレベルを決定することと、
前記決定されたビジーレベルに基づいて前記GPUのクロックレートを設定することと
を行わせる、非一時的なコンピュータ可読記憶媒体。
[C24]
前記第1の時間インスタンスは、前記GPUが前記第1のフレームの最後のピクセルのピクセル値を決定したインスタンス、または前記GPUが前記第1のフレームの前記最後のピクセルの前記ピクセル値を出力したインスタンスを備え、前記第2の時間インスタンスは、前記GPUが前記第2のフレームの最後のピクセルのピクセル値を決定したインスタンス、または前記GPUが前記第2のフレームの前記最後のピクセルの前記ピクセル値を出力したインスタンスを備える、C23に記載の非一時的なコンピュータ可読記憶媒体。
[C25]
前記1つまたは複数のプロセッサに、
前記決定されたビジーレベルに基づいて前記GPUのクロックレートを決定すること
を行わせる命令をさらに備え、
前記1つまたは複数のプロセッサに前記クロックレートを設定させる前記命令は、前記1つまたは複数のプロセッサに前記クロックレートを前記決定されたクロックレートに設定させる命令を備える、C23に記載の非一時的なコンピュータ可読記憶媒体。
[C26]
前記1つまたは複数のプロセッサはホストプロセッサを備える、C23に記載の非一時的なコンピュータ可読記憶媒体。
[C27]
クロックレート決定デバイスであって、
グラフィックス処理ユニット(GPU)が第1のフレームのレンダリングを完了した第1の時間インスタンスを決定するための手段と、
前記GPUが前記第1のフレームの直前にある第2のフレームのレンダリングを完了した第2の時間インスタンスを決定するための手段と、
前記第1の時間インスタンスおよび前記第2の時間インスタンスに基づいて時間間隔を決定するための手段と、
前記時間間隔中に前記第1のフレームをレンダリングするための前記GPUのビジーレベルを決定するための手段と、
前記決定されたビジーレベルに基づいて前記GPUのクロックレートを設定するための手段と
を備える、デバイス。
[C28]
前記第1の時間インスタンスは、前記GPUが前記第1のフレームの最後のピクセルのピクセル値を決定したインスタンス、または前記GPUが前記第1のフレームの前記最後のピクセルの前記ピクセル値を出力したインスタンスを備え、前記第2の時間インスタンスは、前記GPUが前記第2のフレームの最後のピクセルのピクセル値を決定したインスタンス、または前記GPUが前記第2のフレームの前記最後のピクセルの前記ピクセル値を出力したインスタンスを備える、C27に記載のデバイス。
[C29]
前記決定されたビジーレベルに基づいて前記GPUのクロックレートを決定するための手段
をさらに備え、
前記クロックレートを設定するための前記手段は、前記クロックレートを前記決定されたクロックレートに設定するための手段を備える、C27に記載のデバイス。