本願で説明されるように、ヘッド(head)のためのレジスタ及びテール(tail)のためのレジスタという2つのメモリ・マップドI/O(MMIO)は、各々のコマンド・リングに関し、コマンド・リングが空(又はエンプティ)であるか否かを指示するために使用される。リングが空である場合、GPUはリングのコマンドをフェッチし、そのコマンドを実行する。この構造は、何らかのリング・クリーンアップ及びリストア・プロセスの間において、GPUの何らかのアイドル期間を削減するために使用される。本願で説明される原理は、多種多様なハードウェア・ビデオ・コーデック・エンジンに適用されてよく、特に、仮想化される環境でビデオ・パフォーマンスが増進するが、実施形態はその例に限定されない。
コマンド・リングが、空になりつつあること又は空にされてしまうことから守るために、すなわち非エンプティであるために、Dom0のようなシャドー・リング・メカニズムがルート・ドメインに構築され、Dom0は各VMのリング・コマンドの追跡を続ける。そして、リング・コマンドは、GPUの実行に備えて速やかにキューに入れられる(又は待ち行列化される)。シャドー・コマンド・メカニズムは、(i)各VMのシャドー・ヘッド及びテール・ポインタと、(ii)物理GPU(physical GPU)に対する実際のMMIOヘッド及びテール・レジスタとシャドー・ヘッド及びテールとのマッピングと、を保存するジョブ・リンク・リストも維持する。
グラフィックス・ドライバがテール・レジスタをアップデートする時は常に、アイテムがジョブ・リンク・リストに追加されて良い。対応するVMにおけるグラフィックス・ドライバは、ジョブ・リンク・リストにおけるシャドー・ヘッド及びテール・レジスタと相互作用する。シャドー・リング・メカニズムは、シャドー・レジスタと、物理レジスタに対する各自のマッピングとを管理しても良い。或るVMから別のものへの切り替えの間に、スケジューラは、物理テール・レジスタを速やかに更新する。この速やかな更新は、リアル・コマンド・リングが空になることを待機せずに、コマンドをサブミットすることを許容する。と同時に、スケジューラはそれに応じてこのVMのシャドー・テール・ポインタを更新する。このように、各VMのワークロードが、例えばビデオ・トランスコーディング・ワークロードのように、GPUに対する多くのコマンドを有する場合、リングは有用なコマンドを連続的にフェッチされる。
GPUは、コマンド・リングのコマンドの実行を終了すると、コマンド・リング・レジスタを更新する。その結果、スケジューラは、GPUワークロードの進捗を追跡し且つそれに応じてジョブ・リンク・リストを更新するために、規則的に物理ヘッド・レジスタをフェッチする。ヘッドをフェッチすることはタイマを利用してスケジューリングされても良い。タイマは、VMスイッチが生じる場合に始まる。タイマが満了すると(又は、或る回数に到達すると)、ヘッド・ポインタはポーリングされる。フェッチされるヘッド・ポインタ値は、VMにおいてGPUをリセットするか否かを判定するために使用されて良い。タイマが満了する前にヘッド・ポインタが読み込まれる場合、物理コマンド・リングは満たされており且つグラフィックス・ドライバは何れにせよヘッド・レジスタを読み込まなければならなかったので、ヘッド・ポインタが移動するならば、タイマはリセットされることが可能である。物理コマンド・リングのコマンドの実行に何らかの問題が存在する場合、スケジューラは、何れのVMがその影響を及ぼしたコマンドをサブミットしたのかを確認することが可能である。この確認は、現在のヘッド・レジスタ値を利用して、それをジョブ・リストに関連付けることで実行されても良い。スケジューラは、GPUをリセットし、クリーン・アップを実行し、そして、Dom0における適切なシャドー・リングからの次のVMからの全てのコマンドをロードし直す(リロードする)ことが可能である。
図1は異なるシナリオにおけるCPU及びGPUの間のワークロードの分配を示す図である。図1において、時間は左から右に進行し、それぞれのラインは異なるエンティティの活動を表現する。システムは2つの異なるモードで動作する。第1モードはネイティブ・モード(a native mode)103である。このモードでは、ワークロードを表現する或る長さの青ラインとして示される時間にわたって、ビデオ・トランスコーディングのようなグラフィックス・ワークロード122を処理する。この特定のワークロードを処理する或る段階において、グラフィックス・ドライバによりタスクがGPU104へ移行される。GPUは、CPUから受け取ったグラフィックス・ワークロード124を処理する。ワークロードが完了すると、それはCPUへ移行され、CPUは別のワークロード126を開始する。
図示されるように、CPU及びGPUのワークロードはオーバーラップしている。これは、CPUが中間結果をGPUへ引き渡していることに対応し、また、CPUがタスクを順番に引き渡していることに対応し、それにより、或るタスクは、別のタスクが依然として処理されている最中に又は既に処理される際に、GPUへ引き渡される。同様に、CPUワークロード126は、GPUが幾らかのワークロードを未だ処理している最中に、再開する。トランスコーディングを可能な限り速やかに達成するために、CPUとGPUとの間のオーバーラップは可能な限り大きくすべきである。言い換えれば、双方のプロセッサにおけるアイドル時間は最小化されるべきである。2つのCPUワークロード122,126の間のギャップの間に、CPUは、その特定のグラフィックス・ワークロードに関連していない他のタスクを実行しても良いことに、留意を要する。GPUは、その特定のグラフィックス・ワークロードに関連していない他のタスクについてはビジーであるかもしれない。
システムは、本願では仮想化モードと言及される第2オペレーション・モード105を有する。このモードでは、複数の仮想マシン(VM)112,114,116が、共有される処理リソースを利用して異なるワークロードを処理する。各々のVMは自身のグラフィックス・ドライバを有し、そのグラフィックス・ドライバにより、VMはグラフィックス・ワークロードをGPUに割り振ることが化可能である。第1のVMであるVM1は、CPUのコア又はスレッド上で動作するワークロード132を有し、そのワークロード132は、その後、ワークロード152をGPU120へ送ることが可能な状態に至る。ワークロードは、この例ではドメイン(例えば、ドメイン0(Dom0))として示される仲介部(例えば、ハイパーバイザ又は他のメディエータ)を経由する。この特定のタイプの仲介部は、仮想化のためのアーキテクチャに整合するように構成される。この特定の仮想化システムは一例として提供されている。ここに示される特定の構成における変形例、より多くのVMs及びより多くのドメインが存在して良い。
GPUは、ワークロード152を実行し、ドメイン118により、その結果をVM1へ戻す。この例に示されるように、ドメインは、他のVMに関わる他のサービス136,142により一時的にビジーであり、従って、GPUワークロード152が完了する時点とVM1がワークロード134を再開できる時点との間に遅延が存在する。
VM1がグラフィックス・ワークロードを生成するのとほぼ同時に、VM2(114)及びVM3(116)も、各自のワークロード136,142を実行し、グラフィックス・ワークロード154,156を生成する。これらのグラフィックス・ワークロードは、実行に備えてGPUへ引き渡すために(ハンドオーバするために)、ドメインへ送られる。ドメインは、各々のグラフィックス・ワークロードについてコマンド・リングを組み立て、ワークロードをGPUへ送る。図示の例では、GPUは、各々のグラフィックス・ワークロード152,154,156を順番に実行する。ドメインはコマンドをバッファリングし、それにより、コマンドは、先行するコマンドが実行された後に実行の準備を整える。各々のグラフィックス・ワークロードが完了した後に、その結果は各自のVM112,114,116に戻され、個々のVMは各自のワークロードの残り134,138,144に関してタスクを再開する。
図示されるように、GPUは或るコンテキストから次のものへ切り替えるので、複数のVMsから1つのGPUへの作業の割り振りに起因する遅延が存在する。VMsは、コマンド・シーケンスの形式でワークロードを生成する。これらのコマンドは、ドメイン内にバッファリングされ、競合(conflicts)を引き起こすことなく、可能な限り速やかにGPUへ送られる。また、複数のタスクの同時処理によるドメインの限界によって生じる遅延も存在する。以下で説明されるように、各コンテキスト間の遅延は、シャドー・コマンド・リング・バッファを利用することで削減される。図示されるように、ビデオ・トランスコーディング・ワークロードのような重いグラフィックス処理動作にCPU及びGPUを利用することは、何らかのアイドル状態に遭遇する。仮想化モードでは、様々なVMコンテキスト同士の間のスイッチングに起因して、GPU上で更に多くのアイドル状態が存在するかもしれない。図示されるように、例えばワークロード132から136そして142へのVMコンテキストの切り替え各々は遅延を導入する。
遅延は、効果的なスケジューラを利用することで短縮され、スケジューラは、遅延無しにコンテキスト間の遷移を許容する。図2は、図1に示されるような仮想化された環境でのワークフロー処理のブロック図を示す。システムは、複数のVMs212-1,212-2,...,212-nを含む。2つのVMしか示されていないが、より多数存在していても良い。各VMは、ユーザー空間アプリケーションのようなアプリケーション230と、グラフィックス・プロセッサ226より実行されるグラフィックス・ワークロードを送受信するグラフィックス・ドライバ232とを有する。グラフィックス・プロセッサは、同じ半導体ダイの上にあっても良いし、異なるダイで同じパッケージ内にあっても良いし、同じ回路基板又はアダプタカードで異なるパッケージの同じシャーシにあっても良いし(例えば、ペリフェラル・コンポーネント・インターコネクト(PCI))、或いは、異なるシャーシにあっても良い。
VM212は、ここではドメイン・ゼロとして示されるルート・ドメイン220へ、ハイパーバイザ224を介して結合される。ルート・ドメインは、仮想GPUs(vGPU)214-1,214-2,...,214-nに結合される仮想グラフィックス・ドライバ222を含み、メディエータ216の中で各VMに対して1つのvGPUがある。vGPUsは、物理GPU226に結合されるルート・ドメインのメディエータ内にあるコマンド・スケジューラ218に結合される。物理GPUは、仮想グラフィックス・ドライバ222によりvGPUsへ、そして、ハイパーバイザ224によりコマンド・スケジューラ218からGPU226へロードされ、任意の多種多様なグラフィックス・ワークロードを実行する。これらのワークロードは、コマンド・リング240,244,248のうちの何れかを満たすことにより実行され、各々のコマンド・リングは、3つのグラフィックス・エンジン242,246,250のそれぞれに対するものである。自身のコマンド・リングをそれぞれが有する更に多くのグラフィックス・エンジンが存在しても良い。グラフィックス・エンジンにより処理されたワークロードは、仮想グラフィックス・ドライバ222ないし個々のVMグラフィックス・ドライバ232に対するvGPUs214により、個々のVM212へ返される。
各VM212のユーザー空間アプリケーション230は、特定の作業部分に対するバッファのためのコマンド・バッチ(command batches)を作成し、バッファリングされたコマンド・バッチをグラフィックス・ドライバへサブミット(又は送信)する。ドライバは、パス・スルー・ライン256により、GPUの適切なリング・バッファへ、コマンド・バッチ・バッファのポインタをサブミットする。グラフィックス・ドライバは、コマンド・バッチ・バッファに関し、ヘッド・ポインタ及びテール・ポインタを設定する。GPUのディスパッチャー(図示せず)は、ヘッド及びテール・ポインタを監視し、コマンド・リングからコマンドを引き出す。各コマンドの実行後に、ヘッド・ポインタは、コマンド・リング中の次の場所を指すように更新される。ヘッド・ポインタがテール・ポインタに等しい場合、GPUはコマンド・リングの終了に到達している。
GPUは複数のコマンド・リングを有してもよく、GPU内の各エンジンにつき1つのコマンド・リングがある。図示されるように、GPUは、レンダー・エンジン242のためのコマンド・リング240と、ディスプレイ・エンジン246のためのコマンド・リング244と、ビデオ・コーデック・エンジン250のためのコマンド・リング248とを有する。特定の実現手段に依存して、ビデオ品質エンジン、ブリッタ(blitter)エンジン、物理エンジン及びその他のエンジン等のような追加的なエンジン及び各エンジンについての複数のインスタンスが存在しても良い。コマンドのフェッチ及びヘッド・レジスタのアップデートは、「GPU MMIO」及びGTTレジスタ等のような特定の割り当てられたレジスタを利用して実行されても良い。VMs及びGPU間のアクセスは、例えばDom0におけるメディエータ224によりトラップ(又は獲得)される。これは、VMsとメディエータとの間のトラップ・ライン262,264により示されている。
シャドー・リング・メカニズムが、メディエータ220内のコマンド・スケジューラ218に組み込まれる。各々のコマンド・リング240,244,248に関し、メディエータ220は、各々のコマンド・リングについてそれぞれ別個のシャドー・リング構造260,264,268を維持する。各々のシャドー・リングは、対応するGPUエンジンそれぞれにサブミットされるコマンドのコピーを有する。言い換えれば、メディエータ216のコマンド・スケジューラ216内にある各々のシャドー・コマンド・バッファは、GPU内の実際のコマンド・バッファ・リング240,242,248のシャドー・コピー(a shadow copy)である。更に、リンク・リスト270は、ヘッド及びテール・ポインタと、各VMからの各タスクの物理レジスタに対する各自のマッピングとを保存するように、各VM212に対して生成される。上述したように、MMIO及びGTTへのアクセスはメディエータによりトラップされ、個別的なシャドー・ヘッド及びテール・ポインタ・レジスタが維持及び更新される。
シャドー・コマンド・リング・レジスタを利用して、各GPUエンジン・コマンド・リングは、コマンド・スケジューラ218からGPU226への直接的なデータ・パス・スルー・ライン254により、障害時に復元されることが可能である。コマンド・リングは、障害から復旧するために、シャドー・リングから復元されることが可能である。復旧は、ワークロードの開始時に始まっても良いし、或いは、ワークロードの開始前から始まっても良い。その結果、エンジンのコマンド・リングが空になるのを待機せずに、メディエータは、物理テール・レジスタを速やかに更新し、コマンド・スケジューラにおける仮想テール・レジスタと物理テール・レジスタとの間のマッピングを構築する。GPUが或るVMの或るエンジンでの作業を終了すると、その物理ヘッド・レジスタが更新される。メディエータは、トラッピングにより又はタイム・アウトの後に、その物理ヘッド・レジスタを受け取る。その結果、メディエータは、終了したタスクのことを知り、それらのタスクを生成したVMにそれらのタスクを関連付けることができる。そして、メディエータは、対応するタスク又はコマンド・シーケンスをジョブ・リストから除外する。
システムの動作の際、何れかの仮想マシン212(例えば、VM1又はVM2)は、MMIOテール・レジスタを増加させることにより、物理コマンド・リング240,244,248の中へコマンド・シーケンスをサブミットする。これは、パス・スルー・ライン256により直接的になされて良い。メディエータ216は、それを、VMのグラフィックス・ドライバ232から仮想GPU(vGPU)214へのトラップ・ライン262によりトラップする。メディエータは、各々のVMにvGPUを提供する。トラップされたコマンド・シーケンスは、次に、vGPUから、対応するシャドー・コマンド・リング260,264,268へ供給され、その場所で保持される。
メディエータは、トラップ・ラインを利用して、各リング及び各VMに対するジョブ・リスト270を維持する。メディエータは、vTail(仮想テール)ポインタ及びpTail(物理テール)ポインタ・レジスタを増やし、1つのアイテムをジョブ・リストの中に加え、そのアイテムにおけるpHead(物理ヘッド)ポインタは先行するアイテムのpTailポインタに等しく、vHead(仮想ヘッド)ポインタは対応するコマンド・リングのvTailポインタに等しい。コマンドは、pTailポインタ・レジスタが更新される時点でリング内に配置される。
メディエータは、グラフィックス・ドライバ222からGPUへの読み込み値(read)もトラップする。これは、トラップ・ライン264を利用して示されている。pHeadポインタ・レジスタの読み込み値がトラップされると、メディエータは、pHeadポインタの読み込み値を、保存されたジョブ・リストのvHeadポインタ・レジスタ値と比較し、pHeadが変更されているか否かを判定し、変更されている場合、対応するvHeadポインタ・レジスタが更新される。pHead及びvHeadは、通常、同じではなく、GTTのようなマップにより関連付けられる。メディエータは、ジョブ・リストを通じて処理を進め、何れのジョブ・アイテムが(pHead,pTail)ペアの範囲内に対応するかを見出す。このジョブ以前の全ての関係(All the ties)は、完了しており、実際のコマンド・バッファから除外されている。メディエータは、これらの完了したアイテムを、対応するシャドー・リング及びジョブ・リストから除外する。
図3はタイマを動作させるためのプロセス・フロー・ダイアグラムである。全体として、タイマ・プロセス304につながる中央制御プロセス302が存在する。制御プロセスにより決定されるような所定のイベントが生じると、リセット・プロセス306がトリガされる。コンテキスト・スイッチが生じ、実行が他のVMによる新たなコンテキストへ切り替わる場合に、制御プロセスは始まる(310)。これらのイベントは、VMタイマの満了により指示される(338)。そのような状況では、デッドロック・タイマ(a deadlock timer)が開始される(340)。デッドロック・タイマは、プロセスがタイム・アウトしたか否かを検査することにより、GPUタスクがデッドロックされるか否かを判定するために使用される。
デッドロック・タイマは、現在実行されているシャドー・コマンド・リングをロックする(342)。タスクが完了すると、VMタイマはリスタートされ(346)、次のシャドー・コマンド・リングがイネーブルにされる(348)。このタイマ・サイクルは、システムがVMsからの連続的なグラフィックス・ワークロードを処理する場合に、ボトム(350)からトップ(352)へ戻って反復する。
VMタイマの満了の際に(338)、制御プロセス302が開始される(310)。タイマが満了する場合、或いは、設定値に到達する場合、vHeadポインタ・レジスタがポーリングされ、メディエータのvGPUが(330)でリセットされなければならないか否かを判定する(312)。pHeadポインタ・レジスタは、vHeadポインタ・レジスタと比較される(312)。
pHeadポインタがvHeadポインタ未満でも等しくもない場合(312)、その値はvHeadポインタより大きく(320)、プロセスはストップする(322)。VMグラフィックス・ドライバは、レジスタを読み込み、それにより、pHeadがリフレッシュされ、そのVMに対するそのエンジンにおけるワークロードが完了する。プロセスはストップする(322)。次のデッドロック・タイマが、VMからの次のワークロードに関して開始されると、リスタートが為される(310)。
一方、pHeadポインタがvHeadポインタ未満又は等しい場合、カウント値がポーリングされ(314)、ターゲット・カウントと比較される。カウントがターゲット・カウントより依然として小さい場合(316)、カウンタは、pHeadカウンタのポーリングに戻る(312)。
タイマが満了する前に(316)、pHeadポインタ・レジスタが読み込まれる場合、それは、GPUにおける物理コマンド・リング・バッファは満たされていることを意味し、VMグラフィックス・ドライバはレジスタを読み込む。pHeadポインタが変更されている場合、タイマはリセットされる。これは、コマンド・バッファ・リングが動いており且つ行き詰まっていない(has not stalled)ことを示す。ヘッド・ポインタ読み込み値が、VMにより要求されるものより大きい場合、対応するコマンド・シーケンスは完了しており、タイマはキャンセルされる(318)。
タイマが満了すると、デッドロック・タイマ満了信号328がGPUをリセットするために送信される(310)。316でタイマが満了する前にpHeadレジスタが進んでいない場合、タイマ満了の判断が為される(326)。これが生じる場合、そのコマンドに問題(issue)が生じているかもしれない。そのような問題は、GPUコマンド・リング・バッファが特定のグラフィックス・エンジンに関して330でリセットされることを要する。ジョブ・リスト、vHead、vTail及びマッピング・テーブルを利用して、メディエータは実行されている現在のジョブ・アイテムを判別することが可能であり、GPUは、タイム・アウトしたタスクに対応するシャドー・コマンド・リングの部分をクリアすることにより、リセットされる(322)。メディエータは、対応するシャドー・リングからの残りのコマンドを利用して物理コマンド・リングを再充填又はロードし(334)、影響を受けるVMへリセットを通知する(336)。未完了の全てのジョブ・アイテムは、シャドー・リング・バッファ内のコマンドを利用して、実行のために、物理コマンド・リング・バッファ内に再ロードされキューに入れられる。現在のジョブ・アイテムは、システムをタイム・アウトさせてしまう問題に起因して、再ロード又は拒否されても良い。
図4は、コマンド・バッチを管理して障害から回復する実施形態によるプロセス・フロー・ダイアグラムである。402において、汎用プロセッサの仮想マシンからのコマンド・バッチが、グラフィックス・プロセッサの物理コマンド・リングにロードされる。仮想マシン環境では、コマンド・バッチは、仮想マシンのグラフィックス・ドライバにより、仮想グラフィックス・プロセッサへロードされても良い。仮想グラフィックス・プロセッサは、その後、グラフィックス・ドライバを利用して、コマンド・バッチを物理グラフィックス・プロセッサへロードする。仮想グラフィックス・プロセッサ及び関連するドライバは、全ての仮想マシンが、単独の共有される物理グラフィックス・プロセッサを利用しながら独立に動作することを許容する。コマンド・バッチは、仮想マシン上で動作するアプリケーション230により生成されるワークロードに対応する。ビデオのエンコーディング、デコーディング及びトラスコーディングが本願で議論されているが、GPUを利用して高速化されて良い多種多様のワークロードの可能性が存在する。GPUを利用すること及びGPUの利用の仕方についての判断は、ソフトウェア・アプリケーション230、ドライバ232及びオペレーティング・システムの一部分であっても良い。
404において、仮想マシンは、コマンド・バッチのサイズ(又は大きさ)に基づいて、コマンド・リングに対するグラフィックス・プロセッサの物理テール・ポインタ・レジスタを設定する。406において、コマンド・バッチ及び物理テール・ポインタは、メディエータによりトラップされる。408において、メディエータは、トラップしたコマンド・バッチ及び物理テール・ポインタを、メディエータのシャドー・コマンド・リングにコピーする。トラップ及びコピーに起因して、シャドー・コマンド・リングは、物理コマンド・リングに含まれる全てのコマンドを含む。これは、物理コマンド・リングが、エラーの発生時に復元されることを許容する。
410において、メディエータは、トラップした物理テール・ポインタに基づいて、メディエータにおける仮想テール・ポインタを設定する。メディエータは、ヘッド・ポインタ及びジョブ・リストも設定する。これは、各々のコマンド・バッチが、別々に識別されることを許容する。ジョブ・リスト中の或るジョブにエラーが存在する場合、物理コマンド・リングは、識別されたジョブ無しに、シャドー・コマンド・リングから復元されることが可能である。
412において、グラフィックス・プロセッサは物理コマンド・リングを実行する。これは、一度に一つのコマンド・バッチで実行される連続的なプロセスである。実行の際に、コマンド・バッチ・バッファのヘッド・ポインタがコマンド・リングに挿入される。グラフィックス・プロセッサは、ヘッド及びテール・ポインタを監視し、ヘッド・ポインタがテール・ポインタに等しい場合、コマンド・リングからコマンドをフェッチする。フェッチされたコマンドは、グラフィックス・プロセッサにより実行される。ヘッド・ポインタは、フェッチされたコマンドの実行に応答して、グラフィックス・プロセッサにより更新される。ヘッド・ポインタがテール・ポインタに等しくなるまで、コマンドのフェッチ、コマンドの実行及びヘッド・ポインタの更新が反復される。
414において、メディエータは、グラフィックス・プロセッサにより、物理コマンド・リング内の各コマンド・バッチの実行を監視する。これは、例えば、物理ヘッド・ポインタを、メディエータにより設定された仮想ヘッド・ポインタと比較することにより、実行されても良い。グラフィックス・プロセッサが物理ヘッド・ポインタを変更する度に、メディエータは仮想ヘッド・ポインタを変更することが可能である。物理ヘッド・ポインタが変更される場合、メディエータは、実行が続いているものと判断する。物理ヘッド・ポインタがテール・ポインタに合致する場合、メディエータは、実行が首尾良く完了したものと判断する。コンテキストが新たなコマンド・バッチに切り替わる場合、物理ヘッド及びテール・ポインタは変更され、メディエータは、新たなコンテキストが監視されることを許容できるように、対応する仮想レジスタを更新することが可能である。
416において、メディエータは、コマンド・バッチの実行にエラーが生じたか否かを判定する。エラーが生じていない場合、その実行は現在のコマンド・バッチに関して継続し、プロセスは402に戻り、それにより、コマンド・バッチが物理及びシャドー・コマンド・リングにロードされる。
エラーは多種多様な任意の方法で判定されて良い。1つの方法は、グラフィックス・プロセッサがハンギング状態(hanging)又は行き詰まった状態(stalled)であるか否かを判別することである。これはデッドロック・タイマを利用して実行されても良い。特定のコマンド・バッチに対するデッドロック・タイマは、グラフィックス・プロセッサがコマンド・バッチの実行を開始する場合に設定されても良い。実行の開始は様々な方法で判断されて良い。1つの方法は、何れかの仮想マシンのコマンド・バッチを、計時されているものに対応するコマンド・バッチへのコンテキストの切り替えを確認することである。コマンド・バッチの実行が、デッドロック・タイマが満了する前に完了していない場合、エラーであると判断される。
タイマが満了すると、ヘッド及びテール・ポインタは、実行が完了したか否かを判定するために使用される。一般的な監視のためにポインタが使用されても良い。ある実現手段では、グラフィックス・プロセッサが、物理ヘッド・ポインタ値をリセット又は変更した場合、その実行は継続し、タイマがリセットされても良い。
エラーが存在する場合、418において、物理コマンド・リングはクリアされ、420において、グラフィックス・プロセッサの物理コマンド・リングは、シャドー・コマンド・リングを利用して再ロードされる。シャドー・コマンド・リングが複数の仮想マシンからの複数のコマンド・バッチを含む場合、物理コマンド・リングは、エラーを引き起こしたコマンド・バッチ無しに、再ロードされても良い。
シャドー・コマンド・リングが複数の仮想マシンからの複数のコマンド・バッチを含む場合、エラーを引き起こしたコマンド・バッチは、物理ヘッド及びテール・ポインタを利用して発見されることが可能である。メディエータは、物理ヘッド及びテール・ポインタと、メディエータにより設定した仮想ヘッド・ポインタとを比較することにより、実行を監視する。現在実行中のコマンド・バッチは、物理ヘッド・ポインタと物理テール・ポインタとの間のコマンド範囲を利用することにより、発見されても良い。物理コマンド・リングが再ロードされる場合、発見されたコマンド・バッチ無しに再ロードされることが可能である。
物理コマンド・リング及びシャドー・コマンド・リングは、複数のコマンド・リングの各々について反復されても良く、その各々のコマンド・リングは、レンダー・エンジン、ディスプレイ・エンジン及びビデオ・コーデック・エンジン等のようなグラフィックス・プロセッサの異なるタスクに対するものである。しかしながら、各々のエンジンに対するコマンド・リングは、複数の仮想マシンによりコマンド・バッチを共有しても良い。
図5を参照すると、グラフィックス・コア503が大規模なコンピュータ・システム500の一部分として示されている。コンピュータ・システムは、ダイレクト・メディア・インターフェース(DMI)により、入力/出力コントローラ・ハブ(an input/output controller hub:ICH)に結合されるCPU503を有する。CPUは、グラフィックス・コア501に結合される汎用コンピュータ509に関する1つ以上のコアを有し、コアはラスト・レベル・キャッシュ(a Last Level Cache:LLC)511を共有する。CPUは、メモリ・インターフェース515、ディスプレイ・インターフェース517及びPCIeインターフェース519等のようなシステム・エージェント513を含む。図示の例では、PCIeインターフェースは、PCIエクスプレス・グラフィックスのためのものであり、ディスプレイ(図示せず)に結合されることが可能なグラフィックス・アダプタ521に結合されることが可能である。グラフィックス・アダプタは、グラフィックス処理ユニット及び各自のメモリ522を含み、バッファ、レジスタ及び他のコンポーネントを含み、これらの要素については上述したとおりである。第2の又は代替的なディスプレイ523は、システム・エージェントのディスプレイ・モジュールに結合されることが可能である。このディスプレイはグラフィックス・コア501により駆動される。メモリ・インターフェース515はシステム・メモリ525に結合される。このメモリは、グラフィックス・コア501により使用され、1つ以上のリング・バッファ、バッチバッファ及びその他のレジスタを含み、これらの要素については上述したとおりである。
入力/出力コントローラ・ハブ505は、大容量ストレージ531、外部ペリフェラル・デバイス533及びユーザー入力/出力デバイス535(例えば、キーボード及びマウス)に対するコネクションを含む。入力/出力コントローラ・ハブは、ディスプレイ・インターフェース537及び他の追加的なインターフェースを含んでも良い。ディスプレイ・インターフェース537は、ビデオ処理サブシステム539内にある。サブシステムは、選択的に、ディスプレイ・リンク541を介してCPUのグラフィックス・コアに結合されても良い。
広範囲に及ぶ追加的及び代替的なデバイスが図5に示されるコンピュータ・システム500に結合されて良い。代替的に、実施形態は、図示したものとは異なるアーキテクチャ及びシステムに適合させられても良い。追加的なコンポーネントが図示のユニットに組み込まれても良いし、より多い又はより少ないハードウェア・コンポーネントが、上記の機能を提供するために使用されても良い。上記の機能のうちの1つ以上が、システム全体の中から省略されても良い。
グラフィックス・コア501は、汎用処理コア509及び他のコンポーネントを含むCPUと統合されるように描かれているが、グラフィックス・コアは、LLC511及び汎用コアに対する通信インターフェースを有する別個のコンポーネントとして構成されても良い。代替的に、グラフィックス・コア及びそれに関連するコンポーネントは、同一又は異なるパッケージに包含される別のダイにおいて構成されても良い。メモリ525、ICH505及びシステム・エージェント513のような他のコンポーネントは、同一又は異なるパッケージにおける同一又は異なるダイに構成されても良い。
広範囲に及ぶ追加的及び代替的なデバイスが図5に示されるコンピュータ・システムに結合されても良い。代替的に、実施形態は図示されているものとは異なるアーキテクチャ及びシステムに適合させられていても良い。追加的なコンポーネントが図示のユニットに組み込まれても良いし、より多い又はより少ないハードウェア・コンポーネントが、上記の機能を提供するために使用されても良い。上記の機能のうちの1つ以上が、システム全体の中から省略されても良い。
上記の具体例より少ない又は多い要素を備えたシステムが、所定の実現手段には好ましいかもしれないことが認められるべきである。すなわち、例示のシステム及び回路の構成は、価格的な制約、パフォーマンス条件、技術革新又はその他の周辺事情などのような様々な要因に依存して、実現手段毎に異なって良い。
1つ以上のマイクロチップ又はマザーボードを利用して相互接続される集積回路、有線接続されたロジック、メモリ・デバイスにより保存されマイクロプロセッサにより実行されるソフトウェア、ファームウェア、特定用途向け集積回路(ASIC)、及び/又は、フィールド・プログラマブル・ゲート・アレイ(FPGA)等のうちの何れか又は組み合わせとして、実施形態は実現されても良い。「ロジック」という用語は、例えば、ソフトウェア、ハードウェア、及び/又は、ソフトウェア及びハードウェアの組み合わせを包含して良い。
実施形態は、様々な物理的なスタイル又は形状因子で実現されて良い。実施形態では、例えば、小さな形状因子のデバイスは、無線通信能力を有するモバイル・コンピューティング・デバイスとして実現されても良い。モバイル・コンピューティング・デバイスは、例えば、処理システム及びモバイル電源又はサプライ(例えば、1つ以上のバッテリ等)を有する任意のデバイスを指す。
コンピューティング・デバイスの具体例は、サーバー・アレイ、ネットワーク化されたサーバー、ワークステーション、パーソナル・コンピュータ(PC)、ラップトップ・コンピュータ、ウルトラ・ラップトップ・コンピュータ、タブレット、タッチパッド、ポータブル・コンピュータ、携帯コンピュータ、パームトップ・コンピュータ、パーソナル・ディジタル・アシスタント(PDA)、セルラー電話機、セルラー電話機/PDAの組み合わせ、テレビジョン、スマート・デバイス(例えば、スマート・フォン、スマート・タブレット又はスマート・テレビジョン)、モバイル・インターネット・デバイス(MID)、メッセージング・デバイス、データ通信デバイス、及び、ウェラブル・システムを含むもの等を含んで良い。
「一実施形態」、「実施形態」、「実施例」、「様々な実施形態」等の言い回しは、そのように記述される実施形態が、特定の特徴、構造又は形態を含むが、必ずしも全ての実施形態がその特定の特徴、構造又は形態を含むとは限らないことを示す。更に、或る実施形態は、他の実施形態に関して説明される特徴の全部又は一部を含んでも良いし、全く含まなくても良い。
本説明及び特許請求の範囲において、派生語とともに「結合される(coupled)」という用語が使用されるかもしれない。「結合される」は、2つ以上の要素が互いに協働又は相互作用するが、要素は、それらの間に介在する物理的又は電気的なコンポーネントを有するかもしれないし或いは有しないかもしれない、ということを示すために使用される。
特許請求の範囲で使用される場合、別意の言及がない限り、一般的な要素を記述するために「第1」、「第2」、「第3」等の序数の形容詞を使用することは、単に、同様な要素のうちの異なるものが言及されていることを示すに過ぎず、そのように記述される要素が、時間的な、空間的な又はランキング的な所与の順序、或いは、他の何らかの形式による所与の順序になっていなければならないことを意味するようには意図されていない。
図面及び上記の記述は実施形態の具体例を与えている。説明される要素のうちの何れか又は複数個が単独の機能要素に統合されても良いことを、当業者は認めるであろう。代替的に、所定の要素は複数の機能要素に分割されても良い。或る実施形態の要素が他の実施形態に加えられても良い。例えば、本願で説明されるプロセスの順序は変更されても良く、説明された形式に限定されない。更に、フロー・ダイアグラムのうちの動作は、図示の順序で実現されることは必須ではなく;必ずしも全ての動作が実行される必要はない。また、他の動作に依存しない動作は、他の動作と並列的に実行されても良い。実施形態の範囲は、これら具体的な例によっては限定されない。明細書中に具体的に与えられているか否かによらず、構造、寸法及び材料の利用等における相違のような様々な変形例が可能である。実施形態の範囲は、少なくとも添付の特許請求の範囲によって与えられるものと同程度に広い。
以下の具体例は更なる実施系形態に関連する。具体例における詳細事項は1つ以上の他の実施形態の何らかの箇所で使用されて良い。一実施形態における方法は、汎用プロセッサの仮想マシンから、グラフィックス・プロセッサの物理コマンド・リングへ、コマンド・バッチをロードするステップ;前記コマンド・バッチのサイズに基づいて、前記コマンド・リングについて、前記グラフィックス・プロセッサの物理テール・ポインタ・レジスタを設定するステップ;前記コマンド・バッチ及び前記物理テール・ポインタをメディエータにおいてトラップするステップ;トラップされたコマンド・バッチ及び前記物理テール・ポインタを、前記メディエータのシャドー・コマンド・リングにコピーするステップ;トラップされた物理テール・ポインタに基づいて、前記メディエータにおいて仮想テール・ポインタを設定するステップ;前記グラフィックス・プロセッサにより前記物理コマンド・リングを実行するステップ;前記物理コマンド・リングの実行を監視するステップ;及び、前記コマンド・バッチの実行中にエラーが確認された場合、前記物理コマンド・リングをクリアし、前記シャドー・コマンド・リングを利用して前記グラフィックス・プロセッサの前記物理コマンド・リングを再ロードするステップ;を含む。
更なる実施形態においては、デッドロック・タイマに基づいてエラーが判定される。
更なる実施形態においては、前記デッドロック・タイマは前記コマンド・バッチの実行開始時に設定され、前記デッドロック・タイマが満了する前に、前記コマンド・バッチの実行が完了していない場合、エラーであると判断される。
更なる実施形態においては、前記グラフィックス・プロセッサが、第2仮想マシンによる第2コマンド・バッチの処理から、第1仮想マシンのコマンド・バッチの処理へ切り替えた場合に、デッドロック・タイマが開始される。
更なる実施形態においては、デッドロック・タイマが満了した場合に、ヘッド・ポインタ・カウンタをポーリングすることにより、エラーが判断される。
更なる実施形態は、前記デッドロック・タイマが満了する前に、前記グラフィックス・プロセッサが前記ヘッド・ポインタを読み込んだ場合、前記デッドロック・タイマをリセットすることを含む。
更なる実施形態は、前記ヘッド・ポインタが前記物理テール・ポインタより大きい場合、前記デッドロック・タイマをキャンセルすることを含む。
更なる実施形態においては、前記シャドー・コマンド・リングが、複数の仮想マシンからの複数のコマンド・バッチを含み、前記物理コマンド・リングを再ロードすることは、実行中の現在のコマンド・バッチに対応する第1コマンド・バッチ無しに、前記物理コマンドを再ロードすることを含む。
更なる実施形態は、前記グラフィックス・プロセッサにより設定される物理ヘッド・ポインタ・レジスタを監視するステップを含み、前記グラフィックス・プロセッサが前記ヘッド・ポインタを変更したか否かを確認することにより、エラーが確認される。
更なる実施形態においては、前記シャドー・コマンド・リングは複数の仮想マシンからの複数のコマンド・バッチを含み、前記監視するステップは、前記メディエータにより設定された仮想ヘッド・ポインタとの比較により、前記物理ヘッド・ポインタが変更されたか否かを確認することを含み、前記物理コマンド・リングを再ロードすることは、前記物理ヘッド・ポインタ及び前記物理テール・ポインタ間のコマンド範囲を利用してコマンド・バッチを発見し、発見したコマンド・バッチ無しに前記物理コマンド・リングを再ロードすることを含む。
更なる実施形態は、前記グラフィックス・プロセッサが前記コマンド・バッチの実行の際にヘッド・ポインタを設定し、前記メディエータが前記物理ヘッド・ポインタに基づいて仮想ヘッド・ポインタを設定するステップを含む。
更なる実施形態は、前記仮想テール・ポインタを増加させ、前記コマンド・バッチを、先行するコマンド・バッチの物理テール・ポインタに等しい物理ヘッド・ポインタを有するジョブ・リストに加えるステップを含む。
更なる実施形態においては、テール・レジスタを設定することが、対応するマップド・メモリ入力/出力テール・レジスタを増加させることを含む。
更なる実施形態においては、前記物理コマンド・リングを実行するステップが:コマンド・バッチ・バッファのヘッド・ポインタをコマンド・リングへサブミットするステップ;前記ヘッド及びテール・ポインタを監視し、前記ヘッド・ポインタが前記テール・ポインタに等しくない場合、前記グラフィックス・プロセッサにおいて、前記コマンド・リングからコマンドをフェッチするステップ;フェッチしたコマンドを、前記グラフィックス・プロセッサにより実行するステップ;前記フェッチしたコマンドの実行に応じて、前記グラフィックス・プロセッサにより前記ヘッド・ポインタを更新するステップ;及び、前記ヘッド・ポインタが前記テール・ポインタに等しくなるまで、前記コマンドのフェッチ、前記コマンドの実行及び前記ヘッド・ポインタの更新を反復するステップ;を有する。
更なる実施形態においては、コマンド・バッチ・バッファを生成することが、特定の作業部分に対するユーザー空間アプリケーションにより実行される。
更なる実施形態においては、コマンド・バッチをロードすることが、コマンド・バッチ・バッファを、前記仮想マシンのグラフィックス・ドライバにサブミットすることを含む。
更なる実施形態においては、前記トラップすることが、マップド・メモリ入力/出力レジスタへのアクセスと、前記仮想マシンのグラフィックス・ドライバによる前記グラフィックス・プロセッサのグラフィックス・トランスレーション・テーブルへのアクセスとをトラップすることを含む。
更なる実施形態においては、コマンド・バッチをロードすることが、コマンド・バッチを複数のコマンド・リングのうちの何れかへロードすることを含み、各コマンド・リングは、レンダー・エンジン、ディスプレイ・エンジン及びビデオ・コーデック・エンジンのようなグラフィックス・プロセッサの異なるタスクに対するものである。
更なる実施形態においては、前記シャドー・コマンド・リングは前記メディエータに配置されている。
更なる実施形態においては、前記メディエータは、前記物理テール・レジスタを更新し、かつ、対応するコマンド・バッチの実行が完了する前に、前記仮想テール・レジスタ及び前記物理テール・レジスタ間のマッピングを構築する。
実施形態は、コンピュータにより実行される場合に、コンピュータにオペレーションを実行させる命令を有するコンピュータ読み取り可能な媒体に関連し、そのオペレーションは、汎用プロセッサの仮想マシンから、グラフィックス・プロセッサの物理コマンド・リングへ、コマンド・バッチをロードするステップ;前記コマンド・バッチのサイズに基づいて、前記コマンド・リングについて、前記グラフィックス・プロセッサの物理テール・ポインタ・レジスタを設定するステップ;前記コマンド・バッチ及び前記物理テール・ポインタをメディエータにおいてトラップするステップ;トラップされたコマンド・バッチ及び前記物理テール・ポインタを、前記メディエータのシャドー・コマンド・リングにコピーするステップ;トラップされた物理テール・ポインタに基づいて、前記メディエータにおいて仮想テール・ポインタを設定するステップ;前記グラフィックス・プロセッサにより前記物理コマンド・リングを実行するステップ;前記物理コマンド・リングの実行を監視するステップ;及び、前記コマンド・バッチの実行中にエラーが確認された場合、前記物理コマンド・リングをクリアし、前記シャドー・コマンド・リングを利用して前記グラフィックス・プロセッサの前記物理コマンド・リングを再ロードするステップ;を有する。
更なる実施形態においては、前記コマンド・バッチの実行開始時に設定されるデッドロック・タイマに基づいてエラーが判断され、前記デッドロック・タイマが満了する前に、前記コマンド・バッチの実行が完了していない場合、エラーであると判断される。
更なる実施形態においては、デッドロック・タイマが満了した場合に、ヘッド・ポインタ・カウンタをポーリングすることにより、エラーが判断され、前記オペレーションは、前記デッドロック・タイマが満了する前に、前記グラフィックス・プロセッサが前記ヘッド・ポインタを読み込んだ場合、前記デッドロック・タイマをリセットするステップを含む。
更なる実施形態においては、前記シャドー・コマンド・リングが、複数の仮想マシンからの複数のコマンド・バッチを含み、前記物理コマンド・リングを再ロードすることは、実行中の現在のコマンド・バッチに対応する第1コマンド・バッチ無しに、前記物理コマンドを再ロードすることを含む。
実施形態に関連する装置は、メモリを有し、複数の仮想マシンと前記仮想マシンのためのメディエータとをサポートする汎用プロセッサ;及び、物理コマンド・リングを有するグラフィックス・プロセッサ;を有する装置であって、前記汎用プロセッサの仮想マシンは、前記グラフィックス・プロセッサの物理コマンド・リングへ、コマンド・バッチをロードし、前記コマンド・バッチのサイズに基づいて、前記コマンド・リングについて、前記グラフィックス・プロセッサの物理テール・ポインタ・レジスタを設定し;前記メディエータは、前記コマンド・バッチ及び前記物理テール・ポインタをトラップし、トラップされたコマンド・バッチ及び前記物理テール・ポインタを、前記メディエータのシャドー・コマンド・リングにコピーし、トラップされた物理テール・ポインタに基づいて、前記メディエータにおいて仮想テール・ポインタを設定し;前記グラフィックス・プロセッサは、前記物理コマンド・リングの実行を監視することにより、前記物理コマンド・リングを実行し;及び、前記メディエータは、前記コマンド・バッチの実行中にエラーが確認された場合、前記物理コマンド・リングをクリアし、前記シャドー・コマンド・リングを利用して前記グラフィックス・プロセッサの前記物理コマンド・リングを再ロードする。
更なる実施形態においては、前記メディエータは、前記グラフィックス・プロセッサにより設定される物理ヘッド・ポインタ・レジスタを監視し、前記グラフィックス・プロセッサが前記ヘッド・ポインタを変更したか否かを確認することにより、エラーが確認される。
更なる実施形態においては、前記シャドー・コマンド・リングは複数の仮想マシンからの複数のコマンド・バッチを含み、前記メディエータは、前記メディエータにより設定された仮想ヘッド・ポインタとの比較により、前記物理ヘッド・ポインタが変更されたか否かを確認することにより監視し、前記メディエータは、前記物理ヘッド・ポインタ及び前記物理テール・ポインタ間のコマンド範囲を利用してコマンド・バッチを発見し、発見したコマンド・バッチ無しに前記物理コマンド・リングを再ロードすることにより、前記物理コマンド・リングを再ロードする。