説明

仮想GPU

【課題】仮想グラフィックス処理装置(VGPU)に関する技術及び構造を開示する。
【解決手段】ソフトウェアにとっては、VGPUが独立したハードウェアGPUのように映る。しかしながら、制御構造を使用することにより、及びGPUのいくつかの(ただし全てではない)ハードウェア要素を複写することにより、同じGPU上に2又はそれ以上のVGPUを実装することができる。例えば、複数のVGPUをサポートするGPU内に追加のレジスタ及び記憶スペースを加えることができる。サポートされる異なるVGPUに対応するタスク及びスレッドに、異なる実行優先度を設定することができる。異なるVGPUの仮想アドレス空間の使用を含めて、VGPUのメモリアドレス空間を管理することもできる。異なるVGPUの実行を中断及び再開することにより、より細かい粒度の実行制御及びより良いGPU効率を可能にすることができる。

【発明の詳細な説明】
【技術分野】
【0001】
本開示は、グラフィックス処理装置(GPU)に関し、より詳細には、複数のGPUコマンドの効率的な実行を可能にする構造及び技術に関する。
【背景技術】
【0002】
様々な計算タスクを実行するために、GPUを使用することができる。GPUは、例えば、画面上に表示すべき画素を計算することができ、またアニメーションレンダリング及び一般的ベクトル計算などの、その他の集中的な演算を行うこともできる。
【発明の概要】
【発明が解決しようとする課題】
【0003】
GPUは、時折、1又はそれ以上の実行ユニットが何の計算も行わない「停止時間」(ストール期間)を経験することがある。停止時間は、メモリにアクセスするときに、例えば、実行ユニットが新たなデータの到着を待っているという理由で発生することがある。従って、時には、1又はそれ以上のGPU実行ユニットがアイドル状態になることがある。
【0004】
さらに、GPUが第1のプログラムを実行中の場合、第2のプログラムに待つ必要が生じることがある。第2のプログラムは、第1のプログラムが(メモリアクセス中などに)ストールしている間にも待たざるを得ないことがある。第1のプログラムがストールしている間は、アイドル中のGPU実行ユニットを第2のプログラムが使用することが有利と思われるが、第2のプログラムに切り替えを行う間接費が極めて高いものになり得る。すなわち、第1のプログラムのストール中に第2のプログラムを実行するようにGPUを設定すると、あまりに多くの時間及び努力(すなわち、消費電力)が掛かって割に合わないことがある。従って、第1のプログラムがストールしている間、GPU実行ユニットはアイドル状態を保つことがある。
【0005】
従って、特に複数の計算タスクが行われている環境では、GPUの実行が非効率的になることがある。
【課題を解決するための手段】
【0006】
本明細書では、GPUが、特に複数の計算タスク(又はコマンド)を処理しているときに、より効率的に、及び少ない停止時間で命令を実行できるようにする構造及び技術について説明する。1つの実施形態では、単一のGPU構造内に複数の仮想GPUを実装することによってこれらの利点がもたらされる。仮想GPUは、同じGPUハードウェア(実行ユニットなど)を共有できる一方で、計算結果は仮想GPUごとに別個に記憶される。
【0007】
仮想GPUは、コストが高くなり得るコンテキスト切り替えをしのぐ利点をもたらすことができる。例えば、第1のプログラムから第2のプログラムにコンテキスト切り替えを行うと、第2のプログラムが実行される前に全ての結果及び全ての状態情報がGPUから消去される恐れがある。従って、コンテキスト切り替えは、全てのレジスタ値、プログラムカウンタ及び(メモリからの作業データなどの)その他の値を外部記憶装置にコピーするステップを含むことがある。これらのコピー作業には時間が掛かり、電力も消費する(これにより、バッテリ式のモバイル装置に特にマイナスの影響が生じることがある)。
【0008】
GPUのコンテキスト切り替えのコストは、コンテキスト切り替えをいつ行うかによって異なると考えられる。例えば、フレーム境界間又は多角形境界間のコンテキスト切り替えには、それほどコストが掛からないと考えられる。これは、外部記憶装置に転送すべき中間状態情報が少なくて済むからである。しかしながら、フレーム又は多角形の境界上でのみコンテキスト切り替えを行えば、コストはそれほど掛からないかもしれないが、粒度制御が不十分になる恐れがある。例えば、フレームが毎秒20コマで描かれている場合、GPUがフレーム境界に達して別のタスクへのコンテキスト切り替えを行うのに最大50ミリ秒(さらにはもっと長い時間)掛かる場合がある。
【0009】
仮想GPUは、完全なコンテキスト切り替えを行うコストを伴わずに異なるプログラムのための命令を実行することを可能にすることができる。1つの実施形態では、GPUハードウェアのいくつかの部分を複製し、これらの複製部分を処理するための追加の制御構造を加えることによってこれが行われる。仮想GPUは、異なるプログラムのためのGPU命令をより小さな時間「ウィンドウ」内で実行できるようにすることにより、より細かい粒度で実行の制御を行ってGPUハードウェアをより効率的に使用することもできる。例えば、第1のプログラムが使用中のGPU実行ユニットは、メモリからデータが取り出される間ストールせざるを得ない場合がある。このストール期間中、実行ユニットはアイドル状態となる。このストール期間は、あまりにも短い場合があるので、完全なコンテキスト切り替えを行うとけた違いのコストが掛かる。ところが、コストの低い仮想GPU間で切り替えを行えば、実行ユニットを遊ばせる代わりに(異なる仮想GPUのための)異なる命令を実行できるようにすることができる。従って、仮想GPUを実装すると、GPU実行ユニットの停止時間を減らすことができる。
【0010】
しかしながら、本開示及び添付の特許請求の範囲の教示は、上記の発明の概要で説明した特徴、実施形態及び/又は利点によって明確に限定されるものではない。
【図面の簡単な説明】
【0011】
【図1】集積回路の実施形態のブロック図である。
【図2】複数の仮想GPUを実装するGPUの実施形態のブロック図である。
【図3】複数の仮想GPUを実装するGPU実施形態の別のブロック図である。
【図4】複数のGPUスレッドを実行できる方法の1つの実施形態のフローチャートである。
【図5】システムの1つの実施形態のブロック図である。
【発明を実施するための形態】
【0012】
本明細書は、「1つの実施形態」又は「ある実施形態」に対する言及を含む。「1つの実施形態では」又は「ある実施形態では」という表現が現れても、必ずしも同じ実施形態を示すわけではない。特定の特徴、構造、又は特性を、本開示と矛盾しないいずれかの好適な方法で組み合わせることができる。
【0013】
以下の段落では、(添付の特許請求の範囲を含めて)本開示で目にする用語の定義及び/又は文脈を示す。
【0014】
「備える」。この用語は包括的なものである。本明細書で使用する場合、この用語は、さらなる構造又はステップを除外するものではない。「...グラフィックス処理装置(GPU)を備える装置」という記載の請求項について検討する。このような請求項は、装置が(中央処理装置、メモリコントローラ、インターフェイス回路などの)さらなる構成要素を含むことを除外するものではない。
【0015】
「ように構成される」。様々なユニット、回路、又はその他の構成要素について、1又は複数のタスクを実行する「ように構成される」という形で説明又は特許請求することがある。このような文脈では、ユニット/回路/構成要素が、動作中にこれらの1又は複数のタスクを実行する構造(回路など)を含むことを示すことによって構造を暗示するために、「ように構成される」を使用している。従って、これらのユニット/回路/構成要素は、指定のユニット/回路/構成要素が現在動作中でない(例えば、オンでない)ときでもタスクを実行するように構成されている、と言うことができる。「ように構成される」という表現を使用するユニット/回路/構成要素は、例えば、回路、動作を実施するように実行可能なプログラム命令を記憶するメモリなどのハードウェアを含む。ユニット/回路/構成要素が1又はそれ以上のタスクを実行する「ように構成される」と記載している場合、そのユニット/回路/構成要素に対して米国特許法112条第6項を行使しないことが明確に意図されている。また、「ように構成される」は、ソフトウェア及び/又はファームウェア(例えば、ソフトウェアを実行するFPGA又は汎用プロセッサ)により、未解決の(単複の)タスクを実行できる形で動作するように操作される一般的構造(例えば、一般的回路)を含むことができる。「ように構成される」は、(半導体製作施設などの)ある製造工程を、1又はそれ以上のタスクを実施又は実行するようになっているデバイス(例えば、集積回路)を製作するように適合させることを含むこともできる。
【0016】
「第1の」、「第2の」、など。本明細書で使用する場合、これらの用語は、後続する名詞のラベルとして使用され、特に明記しない限り、(空間的、時間的、論理的などの)いかなる種類の順序を意味するものでもない。例えば、「第1の」スレッド及び「第2の」スレッドは、任意の2つスレッドを示すために使用することができ、(例えば)一方のスレッドが他方のスレッドよりも前又は後に生成されたことを意味するものではない。換言すれば、「第1の」及び「第2の」は記述子である。
【0017】
「に基づいて」。
本明細書で使用する場合、この用語は、決定に影響を与える1又はそれ以上の因子を記述するために使用される。この用語は、さらなる因子が決定に影響を与えることを除外するものではない。すなわち、決定は、これらの因子にのみ基づくこともあり、或いはこれらの因子に少なくとも部分的に基づくこともある。「Bに基づいてAを決定する」という表現について検討する。Bは、Aの決定に影響を与える因子であり得るが、このような表現は、Aの決定がCに基づくものであることを除外するものではない。しかしながら、他の例では、AがBのみに基づいて決定されることもある。
【0018】
集積回路
ここで図1を参照すると、システム5の1つの実施形態のブロック図を示している。図1の実施形態では、システム5が、外部メモリ12A〜12Bに結合された集積回路(IC)10を含む。図示の実施形態では、集積回路10が中央処理装置(CPU)ブロック14を含み、このCPUブロック14は、1又はそれ以上のプロセッサ16及びレベル2(L2)キャッシュ18を含む。他の実施形態は、L2キャッシュ18を含まないこともあり、及び/又はさらなるレベルのキャッシュを含むこともできる。また、2つよりも多くのプロセッサ16を含む実施形態、及び1つのプロセッサ16のみを含む実施形態も想定される。集積回路10は、1又はそれ以上の非リアルタイム(NRT)周辺機器の組20、及び1又はそれ以上のリアルタイム(RT)周辺機器の組22をさらに含む。図示の実施形態では、CPUブロック14が、ブリッジ/ダイレクトメモリアクセス(DMA)コントローラ30に結合され、このDMAコントローラ30を、1又はそれ以上の周辺装置32及び/又は1又はそれ以上の周辺インターフェイスコントローラ34に結合することができる。様々な実施形態では、周辺装置32及び周辺インターフェイスコントローラ34の数が、ゼロからいずれかの所望の数まで様々であってよい。図1に示すシステム5は、G0 38A及びG1 38Bなどの1又はそれ以上のグラフィックスコントローラを含むグラフィックスユニット36をさらに含む。他の実施形態では、グラフィックスユニット当たりのグラフィックスコントローラの数及びグラフィックスユニットの数が異なることもある。図1に示すように、システム5は、1又はそれ以上のメモリ物理インターフェイス回路(PHY)42A〜42Bに結合されたメモリコントローラ40を含む。メモリPHY42A〜42Bは、集積回路10のピン上でメモリ12A〜12Bに通信するように構成される。メモリコントローラ40は、ポートの組44A〜44Eも含む。ポート44A〜44Bは、グラフィックスコントローラ38A〜38Bにそれぞれ結合される。ポート44Cには、CPUブロック14が結合される。ポート44D〜44Eには、NRT周辺機器20及びRT周辺機器22がそれぞれ結合される。他の実施形態では、メモリコントローラ40に含まれるポートの数が、メモリコントローラの数と同様に異なることもある。すなわち、図1に示すよりも多くの又は少ないポートが存在してもよい。他の実施形態では、メモリPHY42A〜42B及び対応するメモリ12A〜12Bの数が1つの場合もあり、又は2つより多い場合もある。
【0019】
一般に、ポートは、1又はそれ以上のソースと通信するための、メモリコントローラ40上の通信ポイントとすることができる。場合によっては、ポートを、あるソース専用にすることができる(例えば、ポート44A〜44Bを、それぞれグラフィックスコントローラ38A〜38B専用にすることができる)。別の場合には、複数のソース間でポートを共有することができる(例えば、プロセッサ16はCPUポート44Cを共有することができ、NRT周辺機器20はNRTポート44Dを共有することができ、RT周辺機器22はRTポート44Eを共有することができる)。各ポート44A〜44Eは、それぞれのエージェントと通信するためにインターフェイスに結合される。このインターフェイスは、(バス、ポイントツーポイントインターコネクトなどの)いずれの種類の通信媒体であってもよく、いずれのプロトコルを実装してもよい。メモリコントローラとソースの間の相互接続は、メッシュ、チップファブリック上のネットワーク、共有バス、ポイントツーポイント相互接続などの、他のあらゆる所望の相互接続を含むこともできる。
【0020】
プロセッサ16は、あらゆる命令セットアーキテクチャを実行することができ、その命令セットアーキテクチャで定義される命令を実行するように構成することができる。プロセッサ16は、スカラ、スーパースカラ、パイプライン、スーパーパイプライン、アウトオブオーダ、インオーダ、スペキュレーティブ、ノンスペキュレーティブなど、又はこれらの組み合わせを含むあらゆるマイクロアーキテクチャを採用することができる。プロセッサ16は回路を含むことができ、任意にマイクロコーディング技術を実装することができる。プロセッサ16は、1又はそれ以上のレベル1キャッシュを含むことができ、従ってキャッシュ18はL2キャッシュである。他の実施形態は、プロセッサ16内に複数レベルのキャッシュを含むことができ、キャッシュ18を、階層内の次に低いレベルとすることができる。キャッシュ18は、あらゆるサイズ及び(セットアソシアティブ、ダイレクトマップなどの)あらゆる構成を採用することができる。
【0021】
グラフィックスコントローラ38A〜38Bは、いずれの図形処理回路であってもよい。一般に、グラフィックスコントローラ38A〜38Bは、フレームバッファ内に表示すべきオブジェクトをレンダリングするように構成することができる。グラフィックスコントローラ38A〜38Bは、グラフィックス動作の一部又は全部、及び/又はいくつかのグラフィックス動作のハードウェア加速を行うように図形処理ソフトウェアを実行できるグラフィックスプロセッサを含むことができる。ハードウェア加速及びソフトウェア実行の量は、実施形態によって異なることがある。いくつかの実施形態では、グラフィックスユニット36及び/又はグラフィックスコントローラ38A〜38Bが、以下で説明するようなグラフィックス処理装置50の特徴の一部又は全部を含むことができる。
【0022】
NRT周辺機器20は、性能及び/又は帯域幅上の理由でメモリ12A〜12Bに単独でアクセスできるいずれかの非リアルタイム周辺機器を含むことができる。すなわち、NRT周辺機器20によるアクセスはCPUブロック14とは無関係であり、CPUブロックメモリの動作と並行して進むことができる。周辺機器32などの他の周辺機器、及び/又は周辺インターフェイスコントローラ34によって制御される周辺インターフェイスに結合された周辺機器も非リアルタイム周辺機器とすることができるが、メモリへの単独アクセスは必要ではないこともある。NRT周辺機器20の様々な実施形態は、ビデオエンコーダ及びデコーダ、スケーラ回路、画像圧縮及び/又は解凍回路などを含むことができる。
【0023】
RT周辺機器22は、メモリ待ち時間のためのリアルタイム要件を有するあらゆる周辺機器を含むことができる。例えば、RT周辺機器は、画像プロセッサ及び1又はそれ以上の表示パイプを含むことができる。表示パイプは、1又はそれ以上のフレームをフェッチし、これらのフレームを混合して表示画像を作成する回路を含むことができる。表示パイプは、1又はそれ以上のビデオパイプラインをさらに含むことができる。表示パイプの結果として、ディスプレイ画面上に表示すべき画素ストリームを生じることができる。この画素値を、ディスプレイ画面上に表示するためにディスプレイコントローラへ送信することができる。画像プロセッサは、カメラデータを受け取り、このデータを画像に処理してメモリに記憶することができる。
【0024】
ブリッジ/DMAコントローラ30は、(単複の)周辺機器32及び(単複の)周辺インターフェイスコントローラ34をメモリ空間にブリッジするための回路を含むことができる。図示の実施形態では、ブリッジ/DMAコントローラ30が、メモリ動作を、周辺機器/周辺インターフェイスコントローラからCPUブロック14を介してメモリコントローラ40にブリッジすることができる。CPUブロック14は、このブリッジされたメモリ動作と、プロセッサ16/L2キャッシュ18からのメモリ動作との間の一貫性を維持することもできる。L2キャッシュ18は、このブリッジされたメモリ動作とプロセッサ16からのメモリ動作の仲裁を行って、CPUインターフェイス上でCPUポート44Cへ送信されるようにすることもできる。ブリッジ/DMAコントローラ30は、周辺機器32及び周辺インターフェイスコントローラ34の代わりにDMA動作を提供して、メモリとの間でデータブロックを転送することもできる。より詳細には、DMAコントローラを、周辺機器32及び周辺インターフェイスコントローラ34の代わりに、メモリコントローラ40を介してメモリ12A〜12Bとの間で転送を行うように構成することができる。プロセッサ16は、DMAコントローラを、DMA動作を実行するようにプログラムすることができる。例えば、記述子を介してDMAコントローラをプログラムすることができる。この記述子は、メモリ12A〜12Bに記憶された、DMA転送(ソース及び宛先アドレス、サイズなど)を記述するデータ構造とすることができる。或いは、DMAコントローラ内のレジスタ(図示せず)を介してDMAコントローラをプログラムすることもできる。
【0025】
周辺機器32は、集積回路10上に含まれるあらゆる所望の入力/出力装置又はその他のハードウェア装置を含むことができる。例えば、周辺機器32は、イーサネット(登録商標)MAC又はワイヤレスフィディリティ(WiFi)コントローラなどの1又はそれ以上のネットワーク媒体アクセスコントローラ(MAC)などのネットワーク周辺機器を含むことができる。周辺機器32には、様々なオーディオ処理装置を含むオーディオユニットを含めることもできる。周辺機器32には、1又はそれ以上のデジタル信号プロセッサを含めることもできる。周辺機器32は、タイマ、オンチップ秘密メモリ、暗号化エンジンなど、又はこれらのいずれかの組み合わせなどの、他のあらゆる所望の機能を含むことができる。
【0026】
周辺インターフェイスコントローラ34は、あらゆる種類の周辺インターフェイスのためのあらゆるコントローラを含むことができる。例えば、周辺インターフェイスコントローラは、ユニバーサルシリアルバス(USB)コントローラ、周辺コンポーネント相互接続エクスプレスコントローラ(PCIe)、フラッシュメモリインターフェイス、汎用入力/出力(I/O)ピンなどの様々なインターフェイスコントローラを含むことができる。
【0027】
メモリ12A〜12Bは、ダイナミックランダムアクセスメモリ(DRAM)、同期DRAM(SDRAM)、ダブルデータレート(DDR、DDR2、DDR3、など)SDRAM(niDDR3などのモバイルバージョンのSDRAM及び/又はLPDDR2などの低電力バージョンのSDRAMなどを含む)、RAMBUS DRAM(RDRAM)、スタティックRAM(SRAM)などのいずれの種類のメモリであってもよい。回路基板上に1又はそれ以上のメモリ素子を結合して、シングルインラインメモリモジュール(SIMM)、デュアルインラインメモリモジュール(DIMM)などのメモリモジュールを形成することもできる。或いは、装置が、チップオンチップ構成、パッケージオンパッケージ構成、又はマルチチップモジュール構成の集積回路10を搭載することもできる。
【0028】
メモリPHY42A〜42Bは、メモリ12A〜12Bへの低水準物理インターフェイスに対応することができる。例えば、メモリPHY42A〜42Bは、同期DRAMメモリなどに正しい刻時を行うために、信号のタイミングに関与することができる。1つの実施形態では、メモリPHY42A〜42Bを、集積回路10内に設けられるクロックにロックするように構成するとともに、メモリ12が使用するクロックを生成するように構成することができる。
【0029】
なお、他の実施形態は、図1に示す構成要素の下位集合又は上位集合及び/又はその他の構成要素を含む、構成要素の他の組み合わせを含むことができる。図1には所与の構成要素の一例を示すことができるが、他の実施形態は、所与の構成要素の1又はそれ以上の例を含むことができる。同様に、この詳細な説明全体を通じて、たとえ1つの構成要素しか示していなくても、所与の構成要素の1又はそれ以上の例を含めることができ、及び/又はたとえ複数の例を示していても、1つの例しか含まない実施形態を使用することができる。
【0030】
仮想GPUを実装するグラフィックス処理装置
ここで図2を参照すると、複数の仮想GPUを実装するグラフィックス処理装置(GPU)50の1つの実施形態をブロック図で示している。図2の実施形態では、GPU50が、インターフェイスロジックユニット62、供給ユニット58、タスクマネージャ55、メモリマネージャ64、及び1又はそれ以上の実行ユニット60を含む。この実施形態では、GPU50が複数の仮想GPU52(VGPU)も含む。図示のように、各仮想GPU52は、1又はそれ以上の命令バッファ54及び1又はそれ以上の記憶場所56を含む。
【0031】
図2には、様々な構造を互いに接続された形で示している。これらの接続は、バス、ポイントツーポイント伝送線、又は当業者に周知のその他のいずれの好適な接続であってもよい。GPU50内の構造間の接続又はインターフェイスを必ずしも全て示しているわけではない。従って、様々な実施形態では、図2に示す構造の一部又は全部を、必要に応じて1又はそれ以上の好適な接続によって図2内の他の構造の一部又は全部に接続することができる。
【0032】
GPU50の様々な実施形態では、あらゆる数の仮想GPU52が存在することができる。図2の実施形態では、3つの仮想GPU52A〜52Cを含むGPU50を示している。この実施形態では、1又はそれ以上の命令バッファ54及び記憶場所56のそれぞれの組が各仮想GPUに対応する。他の実施形態では、より多い又は少ない数のVGPUが存在することができる。
【0033】
従って、異なる実施形態では(又は同じ実施形態内であっても)、VGPUを実装するために使用される回路及び構造のレイアウトが異なることがある。例えば、(単複の)命令バッファ54が、GPU50の異なる領域に位置してもよく、異なる下部構造を含んでもよい。1つの実施形態では、命令バッファ54の1つがコマンドを記憶するように構成され、命令バッファ54の別の1つがタスクを記憶するように構成され、命令バッファ54のさらに別の1つがスレッドを記憶するように構成される。命令バッファの構成及び/又は割り当ても、同様に仮想GPU間で異なることがある。従って、1つの実施形態では、第1の仮想GPUが、コマンド、タスク及びスレッドのための3つのそれぞれの命令バッファを有することができる一方で、別の仮想GPUは、異なる構成を使用することができる。(なお、一般に、「仮想GPU」という用語は、例えばGPU内の、本明細書で説明するような仮想GPUの機能の全部又は一部を実現するように構成された1又はそれ以上の構造を意味することができる。ただし、いくつかの実施形態では、「複数の仮想GPUを実装するように構成された第1の回路又はGPU、....」のように、仮想GPUが1又はそれ以上の特定の構造によって実装されると言うことができる。)
【0034】
「コマンド」(又は「GPUコマンド」)という用語は、本明細書で使用する場合、GPUが実行するための上位レベルのコマンドを意味する。(すなわち、コマンドが1又はそれ以上の対応する命令を有することができるとしても、「コマンド」という用語は、例えば単一の32ビット又は64ビットコンピュータ命令を意味するものではない。)いくつかの実施形態では、CPUの1又はそれ以上のスレッド上で実行中のソフトウェアにより、GPUに対してGPUコマンドを発行することができる。1つの実施形態では、このようなコマンドが、メモリへの1又はそれ以上のポインタを含むことができるOpenCL命令文である。例えば、GPUコマンドは、第1のメモリ位置に記憶された第1のマトリクスと、第2のメモリ位置に記憶された第2のマトリクスとのドット積を計算するようにGPUに指示するOpenCL命令文であってもよい。他の多くの種類のコマンドが可能であり、これらは、1又はそれ以上の多角形をレンダリングすることなどのグラフィカルタスクに対応することができる。異なる実施形態では、コマンドが、いずれの数のフォーマット及び/又はコンピュータ言語のものであってもよい。いくつかの実施形態では、GPUが、(OpenCL、OpenGL、OpenAL、又はその他の言語及び/又はプログラミングフレームワークなどの)複数の異なる種類又はスタイルのコマンドをサポートすることができる。いくつかの実施形態では、GPUコマンドが、GPUが接続されたCPU上で実行される特定の計算プロセス(又はスレッド)に対応することができる。
【0035】
以下でさらに説明するように、いくつかの実施形態では、GPUコマンドが、これに関連する1又はそれ以上の対応する下位レベル「タスク」を有することができる。様々な実施形態では、「タスク」を、1又はそれ以上のスレッド及び/又は1又はそれ以上の命令にさらに分類(分割)することができる。例えば、段落44〜47を参照されたい。従って、1つの実施形態では、GPUコマンドが1又はそれ以上の対応するタスクを有し、各タスクが1又はそれ以上の対応するスレッドを有し、各スレッドが1又はそれ以上の命令を含む。
【0036】
図2の実施形態では、インターフェイスロジック62が、GPUが実行するためのコマンドを受け取ることができる。このようなコマンドは、CPUから受け取ることができ、メモリへのポインタ(すなわち、データへのポインタ及び/又は実行するためのさらなる命令)を含むことができる。インターフェイスロジック62は、CPUに結果を伝えることができ、或いは計算結果の準備ができている旨をCPUに別様に示すことができる(例えば、ロジック62は、結果がメモリ内のある場所に記憶されいていつでも取り出せる旨をCPUに知らせることができる)。従って、様々な実施形態では、インターフェイスロジック62を、図1に示す(或いは計算装置又はコンピュータシステム内に別様に存在できるような)CPU、メモリコントローラ、及び/又はその他の構造と直接通信するように構成することができる。図2に示すように、インターフェイスロジック62は、1つの通信出接続部に結合されているが、他の構成も可能である(例えば、ロジック62は、CPUとの接続部及びメモリ又はメモリコントローラとの別の接続部などを有することができる)。
【0037】
いくつかの実施形態では、インターフェイスロジック62が、特定の(着信)コマンドが対応するVGPUを示す情報を受け取るようにも構成される。すなわち、ロジック62は、コマンドが属する(又は割り当てられる)VGPUを示す情報を受け取ることができる。1つの実施形態では、この情報が、VGPUの数をNとする0〜(N−1)の数値を指定するビットフィールド内に示される。1つの実施形態では、このVGPUインジケータをGPUコマンド自体の一部とすることができるのに対し、別の実施形態では、VGPUインジケータを別個に(例えば、GPUコマンド内のポインタによって示されるメモリ位置に)記憶することができる。
【0038】
様々な実施形態では、インターフェイスロジック62及び/又はVGPU52を、このVGPUインジケータに基づいてGPUコマンドを特定の命令バッファ54にルーティングするように構成することができる。従って、VGPUが8つ存在する実施形態では、特定のコマンドのビットフィールドが011の場合、このコマンドはVGPU#3の命令バッファにルーティングされ、異なるコマンドのビットフィールドが000の場合、この異なるコマンドはVGPU#0の命令バッファにルーティングされる。(なお、いくつかの実施形態では、(単複の)命令バッファ54を2又はそれ以上のVGPU間で共有することができ、換言すれば、同じ命令バッファが異なるVGPUのコマンドを保持することができる。同様に、いくつかの実施形態では、(単複の)記憶場所56を2又はそれ以上のVGPU間で共有することができる。これらの共有構造を有する実施形態では、VGPUの指示を、対応するデータ、コマンド又は命令とともに、アクセス可能な形で保持することができる。)これに基づき、各VGPU52内の1又はそれ以上の命令バッファ54を、実行すべき1又はそれ以上のコマンドを記憶するように構成することができる。様々な実施形態では、インターフェイスロジック62が、CPUから受け取ったコマンドを適当なVGPUに、及び(単複の)命令バッファ54の適当な1つに適切にルーティングするように構成される。
【0039】
図2の実施形態では、GPUコマンドをタスクマネージャ55によって処理することができる。この実施形態では、タスクマネージャ55が、(単複の)命令バッファ54の1つに記憶されたコマンドのGPUによる実行を完了させるために、このコマンドに対応する1又はそれ以上のタスクを作成するように構成される。従って、タスクは、GPUコマンドよりも下位のレベルで指定される1又はそれ以上のコンピュータ動作を表すことができる。
【0040】
例えば、1つの実施形態では、GPUコマンドが、指定した色及び立方体の縁部を定める8つの頂点の組に従って、赤色の立方体を描くように指定することができる。立方体の各面に関しては、その面の境界を計算するための異なるタスクを作成できる一方で、立方体の見える部分に陰影付け及び/又は着色するための1又はそれ以上の他のタスクを作成することができる。従って、タスクマネージャ55により、1つのGPUコマンドをあらゆる数のタスクに拡張することができる。
【0041】
1つの実施形態では、タスクマネージャが、記憶された命令を読み込むことにより、GPUコマンドを1又はそれ以上のタスクに拡張(又は分割)する(すなわち、1つの実施形態では、所与のGPUコマンドのタスクが予め指定される)。タスクマネージャ55は、異なる種類のコマンドを処理するための特定のロジック(ハードウェア、ファームウェア、ソフトウェア、又はこれらの何らかの混合)を含むことができる。例えば、タスクマネージャ55を、マトリクス乗算を指定するOpenCL命令に応答していくつかのタスクを作成する一方で、複数の多角形のシェーディングを行うべきであることを指定するOpenGL命令に応答して他の特定のタスクを作成するように構成することができる。所与のコマンドに関してタスクマネージャ55が作成及び/又は管理するタスクの数は、コマンドの種類、そのパラメータ、及び/又はコマンドに伴う特定のメモリ内容に基づいて異なることがある(例えば、タスクは、特定のコマンドの特定のデータに依存することができる)。
【0042】
いくつかの実施形態では、タスクマネージャ55が、所与のタスクを、GPU内の(単複の)実行ユニット60の1又はそれ以上が処理するための1又はそれ以上のGPU実行「スレッド」に分割するように構成される。いくつかの実施形態では、GPUスレッドが、タスクより低いレベルでも実行される。例えば、赤色の立方体の目に見える面を完全にレンダリングするには、目に見える画素ごとに色値及び輝度値を計算する必要があり得る。様々な実施形態では、1つの画素又は(4×4の画素配列などの)一群の画素の輝度値を計算するために、1つのスレッドを実行することができる。従って、タスクマネージャ55により、1つのGPUタスクをあらゆる数のスレッドに拡張することができる。タスクマネージャ55は、異なる種類のタスクのためのスレッド生成に対処する特定のロジック(ハードウェア、ファームウェア、ソフトウェア、又はこれらの何らかの混合)を含むことができる。いくつかの実施形態では、タスクとスレッドが全く同じものである(すなわち、これらの実施形態では、「タスク」の構成レベルが「スレッド」の構成レベルと同じであり、全てのタスクが1つのスレッドを含む)。1つの実施形態では、タスクマネージャが、メモリ内のある場所に記憶された命令を読み込むことにより、タスクを1又はそれ以上のスレッドに分割するように構成される(すなわち、タスクマネージャ55を、記憶された命令を取り出すことにより、実行すべき1又はそれ以上のスレッドを生成するように構成することができる)。これに基づいて、1つの実施形態では、タスクマネージャ55が、あるタスク及び/又はあるGPUコマンドに対応する1又はそれ以上のスレッド及び/又は命令を生成するように構成される。
【0043】
従って、1又はそれ以上の命令バッファ54は、対応するVGPUのためのコマンド、タスク、スレッド、又はこれらのあらゆる組み合わせを記憶することができる。従って、1つの実施形態では、インターフェイスロジック62によって特定のGPUコマンドが受け取られ、1又はそれ以上の命令バッファ54にルーティングされる。(この実施形態では、GPUコマンドを記憶するように構成された命令バッファを「コマンドバッファ」と呼ぶことができる。)次に、タスクマネージャ55は、コマンドをいくつかの対応するタスクに変換及び/又は分割させることができ、これらの各々自体を、実行すべきあらゆる数のスレッド及び/又はより低いレベルの命令にさらに分割することができる。従って、その後、全てのGPUコマンド、タスク、スレッド、及び/又は命令を、これらのコマンド、タスク、スレッド、及び/又は命令が対応するVGPUの(ビットフィールドなどの)識別情報を示す情報とともに、1又はそれ以上の命令バッファ54に記憶することができる。しかしながら、VGPUの識別情報はその他の形を取ることもでき、いくつかの実施形態では、これを構造上非明示的なものとすることができる(例えば、いくつかのビット線又は回路部分が信号を運んでおり、又は情報を記憶するために使用されているという単なる事実がVGPUの識別情報を表すことができる)。
【0044】
あらゆるコマンド、タスク及び/又はスレッドに関し、1又はそれ以上の実行ユニット60を通じて実行が進むにつれ、タスクマネージャ55によって様々な情報を保持及び/又は更新することができる。このタスクマネージャ55によって保持される情報は、プログラムカウンタ、VGPU識別子、及び特定のVGPUがアクセスを許可されている1又はそれ以上の(仮想及び/又は物理)アドレス範囲を示すアドレス空間情報を含むことができる。様々な実施形態では、明記していないその他の情報をタスクマネージャ55によって保持及び/又は更新することもできる。(アドレス空間については、以下でメモリマネージャ64にも関連してさらに説明するが、いくつかの実施形態では、もし異なるVGPUに重複したアドレス範囲が割り当てられた場合、計算ミスが生じる恐れがある。)
【0045】
1つの実施形態では、GPUが、CPUスレッド当たり1つの仮想GPUをサポートすることができる。統合メモリシステムでは、これによりCPUが計算作業をGPUにきめ細かく引き渡せるようにすることができる。このような実施形態では、仮想GPUを、公正な共有優先度で時系列に並べ、又はCPUスレッドの優先度に合わせることができる。(すなわち、1つの実施形態では、CPU上のスレッドの優先レベルによって、GPUのコマンド、タスク、スレッド及び/又は命令の優先レベルが決まる。)1つの特定の実施形態では、ユーザインターフェイス(UI)命令、「定期的」命令、及びバックグラウンド命令のための3つの仮想GPUが存在する。この実施形態では、UIの仮想GPUの優先度が「定期的」の仮想GPUに勝り、「定期的」の仮想GPUの優先度が「バックグラウンド」の仮想GPUに勝る。
【0046】
VGPUの選択及び優先順位付け
1又はそれ以上のスレッドの実行準備ができている場合、供給ユニット58は、これらのスレッドを選択して(単複の)実行ユニット60へ転送することができる。いくつかの実施形態では、スレッドを転送することが、実行ユニットに(1又はそれ以上の実行可能命令の場所を特定する)プログラムカウンタを送ることを含む。その後、実行ユニットは、命令をフェッチして実行させることができる。1つの実施形態では、実行ユニットにスレッドを転送することが、1又はそれ以上の実行可能命令自体のストリーム(例えば、オペランド及び/又はオペコードを含む一連のビット)を提供することを含む。いくつかの実施形態では、供給ユニット58が、個別にスレッドを選択して転送するように構成される。しかしながら、他の実施形態では、供給ユニット58が、タスクレベルでスレッドを選択して転送するように構成され、このような実施形態では、(スレッドの一部のみを転送するのではなく)特定のタスクの全てのスレッドが(単複の)実行ユニット60へ転送される。従って、これらの実施形態では、選択及び転送が、スレッドレベルの粒度ではなくタスクレベルの粒度で行われると言うことができる。
【0047】
供給ユニット58によるスレッドの選択は、1又はそれ以上の優先方式に従って行うことができる。図2の実施形態では、固定優先方式が採用される。この実施形態では、VGPU52Aの優先度が最も高く、VGPU52Bの優先度が次に高く、VGPU52Cの優先度が最も低い。従って、(単複の)実行ユニット60にどの(単複の)スレッドを転送すべきかを供給ユニット58が判断する際には、VGPU52Aの待機中のスレッド(又はタスク)が、VGPU52B又はVGPU52Cの待機中のスレッドに優先して実行される。この方式では、残りがなくなるまでVGPU52Aのスレッド(又はタスク)が実行され(すなわち、供給ユニットによって実行のために転送され)続け、なくなった時点で、VGPU52B又はVGPU52Cのスレッド又はタスクが(VGPU52Bに与えられた優先度で)(単複の)実行ユニット60へ転送されるようになる。
【0048】
他の優先順位付け方式も可能であり想定される。例えば、1つの方式では、GPU50内のいくつかのVGPUを、このGPUが接続するように構成されたCPUのいくつかのスレッドが使用することができる。各CPUスレッドは、(例えば、オペレーティングシステムによって設定できる)独自の優先レベルを有することができる。この方式では、CPUスレッドがVGPUの1つにGPUコマンドを送る際に、そのコマンド(及びその関連タスク、スレッド及び/又は命令)に、対応するCPUスレッドの優先レベルと同じ優先レベルを与えることができる。
【0049】
(最後に説明した方式と同じ実施形態の一部で使用できる)別の優先方式では、VGPUに、離れた数の異なる優先度のいずれか1つを割り当てることができる。一例として、4つのVGPUの各々が、優先レベル0が最も優先度が高い0〜3の可変優先レベルを有することができる。1つの変形例では、優先度のレベルが同じである2又はそれ以上のVGPUが、1又はそれ以上の公正方式に従って供給ユニット58により転送されたスレッド又はタスクを有することができる(例えば、重み付けされた又はされていないラウンドロビン仲裁を使用することができる)。いくつかの実施形態では、優先方式が、サービスレベルの保証に関与することができる(例えば、特定の優先レベルが、何らかの特定の時間枠又はいくつかのクロックサイクル内のGPUコマンド、タスク及び/又はスレッドの実行を保証することができる)。1つのこのような実施形態では、VGPUの優先度選択に、重み付けされたラウンドロビン仲裁を使用することもできる(下位レベルの優先度コマンド、タスク又はスレッドの長期にわたるストールを避けることができる)。従って、利用可能な実行ユニット60を使用できるようにする特定のVGPUの判断は様々な因子に制約され得る。
【0050】
これに基づいて、図2の実施形態では、供給ユニットが、所与のGPUコマンドの優先レベルに基づいて、この所与のGPUコマンドに対応するスレッドを1又はそれ以上の実行ユニットに転送するように構成される。(この優先レベルは、VGPUの識別情報にさらに基づくことができ、すなわちVGPUによっては、他のVGPUよりも高い、低い、又は同じ優先度を有することができるものもある)。従って、所与のGPUコマンドに対応する1又はそれ以上のスレッドを、優先度の低いGPUコマンドに対応する他のスレッドに優先して選択的に転送することができる。(しかしながら、1つの実施形態では、優先度の高いGPUコマンドに対応するスレッドを転送した後で、優先度の低いGPUコマンドの1又はそれ以上のスレッドを転送することができる。)
【0051】
1つの実施形態では、供給ユニットが、利用可能でありいつでも使用できる状態の実行ユニットの種類に基づいて、実行のためにスレッド及び/又は命令を転送するようにも構成される。例えば、特定の種類の実行ユニット上で実行できる優先度の高いスレッドが待機中でない場合、この種の(シェーディングなどの)実行ユニットに優先度の低いスレッドを転送することができる。従って、図2の実施形態では、シェーディングユニット60が空いているものの、優先度の高いVGPU52A及び52Bが、実行準備ができているシェーディングスレッドを有していない場合、代わりに優先度の最も低いVGPU52Cからのスレッドを選択することができる。従って、いくつかの実施形態では、スレッドの選択及び転送が、スレッドの種類及び/又はそのスレッドを含む命令の種類に基づく。
【0052】
実行
(単複の)実行ユニット60は、VGPUごとに命令を実行するように構成される。(単複の)実行ユニットは、当業者には公知の技術に基づいて構成することができ、様々な実施形態では、特定のVGPUのスレッド、タスク、及び/又はコマンドに対応する命令を実行するようにも構成される。いくつかの実施形態では、(単複の)実行ユニット60の1又はそれ以上がパイプライン型であり、従って異なるVGPUの命令を同時に実行することができる。いくつかの実施形態では、1又はそれ以上の(単複の)実行ユニット60がマルチスレッド型でもある。従って、このような実施形態では、個々の実行ユニットが、2又はそれ以上のスレッド(場合によっては、何百又は何千ものスレッド)の命令の同時実行をサポートすることができる。(単複の)実行ユニット60は、以下に限定されるわけではないが、シェーディングユニット、テクスチャリングユニット、タイリングユニット、頂点ユニット、ベクトル計算ユニットなどの1又はそれ以上のあらゆる組み合わせを含むことができる。
【0053】
図2の実施形態では、(単複の)実行ユニット60が、実行したスレッド及び/又は命令の結果を生成するように構成される。いくつかの実施形態では、実行したスレッド及び/又は命令の結果の全部又は一部を他の構造が生成することもできる。1つの実施形態では、(単複の)実行ユニット60が、所与の命令が実行されている(例えば、実行パイプラインを通過する)ときに、その命令がどのVGPUに属するかについてのインジケータを保持するように構成される。図2の実施形態では、GPU50が、所与の命令の結果を計算した後に、この命令が属するVGPUのインジケータに基づいて(単複の)記憶場所56の適当な位置に結果を記憶するように構成される。従って、VGPU52Aの命令(又は一連の1又はそれ以上の命令)の結果が計算されると、これらをその特定のVGPUに対応する記憶場所56へ送ることができる(VGPU52B及び52Cについても同様)。様々な実施形態では、命令の結果が、データ及び/又はメモリポインタ(すなわち、メモリ内の他のデータが存在するアドレスへのポインタ)を含むことができる。1つの実施形態では、1又はそれ以上のレジスタの組が、異なるVGPUに対応する命令のデータ値を記憶するように構成される。従って、1つの実施形態では、64個の異なるレジスタを含むアーキテクチャ設計を有するGPUは、このGPUがサポートする4つのVGPUのそれぞれ1つのレジスタセットを実現するためのレジスタを合計256個(4×64)有することができる。
【0054】
いくつかの実施形態では、スレッド及び/又は命令の実行結果が追加情報を含む。1つの実施形態では、実行結果が、特定のスレッドの全ての命令が実行された(すなわち、スレッドを実行し終えた)旨の指示を含むことができる。命令の結果は、特定のタスク又は特定のGPUコマンドのための実行が完了した旨の指示を含むこともできる。1つの実施形態では、命令の結果が、(例えば、実行すべき次の命令又はスレッドに増分できる)1又はそれ以上のプログラムカウンタ値を含むこともできる。従って、いくつかの実施形態では、各VGPUが、1又はそれ以上の対応するプログラムカウンタを有することができる。
【0055】
異なる実施形態では、VGPUの実行の中断及び再開を、異なる粒度レベルで行うことができる。すなわち、優先度の高いVGPUが(単複の)実行ユニット60を使用している間、GPUコマンド、タスク、スレッド又は命令を凍結させることができる。その後、特定のVGPUがGPU内の優先度を回復したときに、このVGPUの実行を再開するために、(例えば、記憶場所56などの)記憶された実行結果を使用することができる。
【0056】
1つの実施形態では、スレッドの最終プログラムカウンタ値(命令レベルに関するVGPU粒度)を使用することにより、次の命令においてスレッドの実行を再開することができる。1つの実施形態では、タスクの完了に必要な新たなスレッドの実行(スレッドレベルに関するVGPU粒度)を開始することにより、タスクの実行を再開することができる。このような実行の再開は、例えば、前回の実行が前のスレッドの最後で中断された後であり、次のスレッドが開始される前に行うことができる。
【0057】
GPUコマンドの実行は、次のタスクの実行(タスクレベルに関するVGPU粒度)を開始することによって再開することができる。いくつかの実施形態では、コマンドレベルでの粒度(及び優先度選択)も可能である。しかしながら、これらの粒度レベルは互いに排他的なものではなく、例えばいくつかの実施形態では、GPUコマンドの実行を、部分的に実行されたスレッドの途中で、又は部分的に実行されたタスクの途中で開始することによって再開することができる。いくつかの実施形態では、実行の再開が、特定のVGPU専用の1又はそれ以上のレジスタの組から中間結果を取り出すことを含む。
【0058】
なお、一般に「優先レベル」という用語は、VGPU、GPUコマンド、タスク、スレッド及び/又は命令の一部又は全部に適用することができる。例えば、スレッドは、ある優先レベルを有すると言うことができ、或いは、ある優先レベルは、命令又はタスクに対応する(又はこれらの「ために」ある)と言うことができる。従って、いくつかの実施形態では、スレッド内の各命令が、そのスレッドと同じ優先レベルを有すると言うことができ、あるタスクに属する各スレッドは、そのタスクと同じ優先レベルを有すると言うことができ、あるGPUコマンドに対応する各タスクは、そのGPUコマンド自体と同じ優先レベルを有すると言うことができる。1つの実施形態では、特定のVGPUに対応する全てのGPUコマンド、タスク、スレッド及び/又は命令が、全てそのVGPUの優先レベルで実行される。
【0059】
GPUメモリ管理及びリソース割り当て
図2の実施形態では、各VGPU52が、保護されたデータ及びアドレス空間を有する。この実施形態では、(単複の)実行ユニット60を使用して、異なるVGPUの異なるスレッド及び/又は命令を実行するが、GPUは、1つのVGPUの実行結果が異なるVGPUの実行結果によって上書きされないような形で動作することができる。このため、図2の実施形態では、(単複の)記憶場所56が、計算及び/又は結果を記憶するために使用するレジスタの組を含む。しかしながら、命令の結果は、レジスタ値に影響を与えるだけでなく、メモリ(ローカルなCPUメモリ、及び/又はインターフェイスロジック62を介してアクセス可能なシステムメモリ)に記憶されたデータを変化させる場合もある。
【0060】
従って、図2の実施形態では、メモリマネージャ64が、複数のVGPUのメモリアクセスを管理するように構成される。具体的には、メモリマネージャ64は、仮想アドレス空間の使用によって生じる問題に対処するように構成される。図2に示すように、各VGPUによって異なる仮想アドレス空間が使用されている。各VGPUは、例えば、512MBのサイズの(仮想)範囲内でメモリにアクセスすることができる。仮想メモリアドレス範囲は、数値的に全く同じものである(従って、異なる物理基準アドレスに基づいて異なる場合がある特定のメモリアドレス計算を行う必要がない)ので、物理メモリアドレス範囲ではなく仮想アドレス範囲を使用することにより、(いくつかの実施形態では)タスク及び/又はGPUコマンドからのスレッド及び/又は命令の生成を簡略化することができる。従って、第1のVGPUの第1の命令及び第2のVGPUの第2の命令は、仮想アドレス空間内の(ただし互いに干渉しない)正確ないくつかの場所を標的とすることができる。このような実施形態では、メモリマネージャ64が、VGPUのそれぞれからデータが読み込まれ、又はこれらにデータが書き込まれたときに、実際の物理メモリの異なる重複しない部分が使用されることを確実にするように構成される。
【0061】
従って、いくつかの実施形態では、所与のVGPUに、物理メモリの異なる部分を常に割り当てることができる。いくつかの実施形態では、この割り当てを極めて単純にすることができる。例えば、GPUの物理メモリ量が、VGPUの数にVGPU仮想アドレス空間の長さを乗算したものに等しく、又はこれを上回る場合には矛盾がないと考えられ、各VGPUに、1又はそれ以上の物理メモリ部分の排他的使用を単純に割り当てることができる。例えば、4GBのメモリを有するGPU、及び各々が512MBの仮想アドレス空間を有する8つのVGPUには矛盾がないと考えられる。しかしながら、いくつかの実施形態では、VGPUの仮想メモリ空間の総量が、GPU内の利用可能な物理メモリの量を超える場合がある。例えば、3つのVGPUの各々が2GBの仮想アドレス空間を有するが、GPUが3GBのメモリしか有していない場合、全てのVGPUに対応するだけの十分な物理メモリが存在しない可能性がある。このような実施形態では、メモリマネージャ64が、様々なVGPUの仮想アドレス空間に物理メモリを割り当てる(及びマッピングする)ように構成される。
【0062】
仮想アドレス空間への物理メモリの割り当ては、様々な方法で行うことができる。1つの実施形態では、優先度が最も高いVGPUに仮想アドレス範囲全体を物理的に割り当ることができる一方で、優先度の低いVGPUには、これらのそれぞれの仮想アドレス範囲のいくらかが割り当てられる。別の実施形態では、優先度の高いVGPUに仮想アドレス範囲のある程度大きな部分が割り当てられる一方で、優先度の低いVGPUには、それぞれの仮想アドレス範囲のそれ程大きくない部分が割り当てられる。さらに、いくつかの実施形態では、物理メモリの割り当てを、「必要に応じて」行うことができる。このような実施形態では、スレッド及び/又命令がごく最近に実行されたVGPUに、あらゆるメモリ要求に関する優先度を与えることができる。従って、利用可能なメモリがないときにアクティブなVGPUがより多くの物理メモリを必要とする場合、他のVGPUの1つの物理メモリの割り当てを解除して、アクティブなVGPUが、そのメモリを計算、結果又は実行すべき命令の記憶などに使用できるようにすることができる。いくつかの実施形態では、物理メモリの割り当て解除が、インターフェイスロジック62を介してGPUから(メインシステムメモリ又はその他の記憶装置などの)外部位置に情報をコピーすることを含むことができる。物理メモリは、VGPUが実際にそれを要求するまで割り当てることができない(例えば、あるVGPUが実行しているスレッド及び/又は命令が、1GBの仮想アドレス空間の中から24MBのメモリしか必要としない場合、物理メモリからこの1GB全体を割り当てることは無駄な可能性がある)という点で、「必要に応じた」物理メモリ割り当ても有用である。
【0063】
従って、メモリマネージャ64は、仮想メモリと物理メモリの間のマッピングを行うように構成され、(単複の)実行ユニット60と、GPUのメモリ及び/又はその他のシステムメモリとの間の透過的なインターフェイスとして機能することができる。従って、1つの実施形態では、(単複の)実行ユニット60による全てのメモリアクセスが、メモリマネージャ64が仮想アドレスから物理アドレスへの変換を行うステップを含む。1つの実施形態では、メモリマネージャ64が、所与の命令に関連する、VGPU52のうちの特定のVGPUを識別する情報に基づいて、この命令のための仮想アドレス変換を実行するように構成される。例えば、メモリマネージャ64は、VGPU IDによってインデックスを付けた1又はそれ以上のルックアップテーブルを保持することができる。いくつかの実施形態では、物理メモリがページ単位で割り当てられる。例えば、スレッド及び/又は命令が、まだ割り当てられていない(すなわち、以前に書き込まれたことがない)仮想アドレスに書き込みを行おうとしている場合、メモリマネージャは、対応するVGPUに1又はそれ以上の(物理)メモリページを割り当てる。様々な実施形態では、VGPUに割り当てることができる(共有)「一時レジスタ」の数又は割合を含むその他のGPUリソースを、メモリマネージャ64によって管理及び/又は構成することができる。(別の実施形態では、この機能を(単複の)実行ユニット60によって行うことができる)。
【0064】
ここで図3を参照すると、GPUの1つの実施形態のブロック図を示している。図3では、GPUが、記憶場所76、並びに実行ユニット94、96及び98を含む。様々な実施形態では、記憶場所76が、例えば、図2に関して説明したような(単複の)記憶場所56の特性及び/又は機能の一部又は全部を有することができる。
【0065】
(単複の)頂点実行ユニット94は、頂点処理動作を行うように構成された1又はそれ以上の実行ユニットを含む。(単複の)画素実行ユニット98は、画素処理動作を行うように構成された1又はそれ以上の実行ユニットを含む。(単複の)計算実行ユニット96は、その他の計算動作(例えば、一般的計算及び/又は配列演算)を行うように構成された1又はそれ以上の実行ユニットを含む。様々な実施形態では、実行ユニット94〜98が、(例えば、図2に関連して説明したような)(単複の)実行ユニット60の特性及び/又は機能の一部又は全部を有することができる。いくつかの実施形態では、GPU内にさらなる実行ユニット又は実行ユニットタイプが存在してもよい。図示のように、実行ユニット94〜98には、1又はそれ以上のバス、ポイントツーポイント伝送線、及び/又は相互接続を介して記憶域81〜92が接続される。
【0066】
実行ユニット94〜98の各々は、中間結果のための対応する記憶装置を有する。従って、図3では、記憶域81〜84が、画素処理動作の中間結果を記憶するように構成され、記憶域85〜88が、頂点処理動作の中間結果を記憶するように構成され、記憶域89〜92が、その他の計算動作の中間結果を記憶するように構成される。図示のように、特定の仮想GPUには特定の記憶域が対応する(例えば、記憶装置81はVGPU#0に対応し、記憶装置82はVGPU#1に対応する)。
【0067】
いくつかの実施形態では、組み合わせた実行ユニットが、頂点実行ユニット94の機能の全部又は一部、計算ユニット96の機能の全部又は一部、及び画素実行ユニット98の機能の全部又は一部を実行することができる。例えば、1つの実施形態では、共通シェーディング実行ユニットが、頂点処理、画素処理、及び計算処理の全部又は一部を実行することができる。このような実施形態では、頂点動作を支援することに専念する特定のロジック、画素動作を支援することに専念する特定のロジック、及び/又は計算動作を支援することに専念する特定のロジックが存在してもよいが、異なる種類の処理動作を実行する際に、共通実行ユニットの他の部分(実行パイプラインなど)を共有して一般的に使用することができる。
【0068】
従って、様々な実施形態では、仮想GPUが、タスク待ち行列、頂点シェーディング前の基本状態、頂点シェーディング後の基本状態、フラグメントシェーディング前の基本状態、及び深さ、ステンシル及びカラーフレームバッファの状態に対応する分散記憶装置を含む全ての非一時的(中間)状態のために与えられた記憶装置を有することができる。従って、1つの実施形態では、GPU全体を通じてこれらの状態情報のための記憶装置を、その状態を使用する箇所の近くに仮想GPUごとの一意のコピーを含めて分散できる一方で、アクティブな頂点シェーディング処理及びフラグメントシェーディング処理のための記憶装置は、仮想GPUに共通のシェーディング処理ユニットに結合される。仮想GPUに対応する中間記憶情報は、GPU内のグラフィックス実行パイプライン全体に沿った様々な場所に記憶することができる。従って、図3には、記憶装置81をVGPU#0のための中間画素処理記憶装置として示しているが、実際には、記憶スペース81は、GPUの異なる領域に位置する2又はそれ以上の物理的に分離したメモリ、キャッシュ、レジスタなどの中に存在する複数の異なる記憶域であってもよい。同様に、様々な実施形態では、記憶域81〜92のいずれか1つを、GPU内の2又はそれ以上の場所にわたって分散させることができる。
【0069】
図3の実施形態では、仮想GPU#0が、1又はそれ以上の未完了の頂点処理動作の実行を再開するために使用できる中間頂点処理結果を記憶するように構成された第1の記憶域81を有する。仮想GPU#0は、1又はそれ以上の未完了の画素処理動作の実行を再開するために使用できる中間頂点処理結果を記憶するように構成された第2の記憶域85も有する。第3の記憶域89は、その他の計算動作の実行を再開するために使用できるその他の中間計算結果を記憶するように構成することができる。仮想GPU#1、#2及び#3のそれぞれも、同様の対応する中間記憶装置を有することができる。なお、図3の実施形態では4つの仮想GPUを示しているが、本開示の他の箇所で説明したように、他の実施形態では、これよりも少ない又は多い数のGPUを使用することができる。
【0070】
様々な実施形態では、未完了の頂点処理動作、未完了の画素処理動作、及び/又は未完了の計算動作を、異なるレベルの粒度で再開することができる。1つの実施形態では、これらの種類の動作の一部又は全部をスレッドごとに再開することができる。従って、このような実施形態では、スレッドからの一時的情報が81〜92などの記憶域によって記憶されない間にスレッドを完全に実行することができる。或いは、このような実施形態では、スレッドの完了時に結果を記憶することができる。従って、スレッドレベルで実行を中断及び再開することができるが、必ずしもこのような実行が、個々のスレッドを含む2又はそれ以上の命令間で中断及び再開されるというわけではない。他の実施形態では、未完了の頂点処理動作、未完了の画素処理動作及び未完了の計算動作の一部又は全部を、タスクレベルの粒度で再開することができる。このような実施形態では、タスクが完了した後に、実行を再開するための中間情報を記憶することができるが、必ずしも実行中のタスクを含む2又はそれ以上のスレッド間での実行の中断及び再開を可能にする再開情報を記憶できるわけではない。実行の再開を可能にする中間結果の記憶に関する他のレベルの粒度(命令レベルの粒度又はGPUコマンドレベルの粒度など)も可能であり想定される。例えば、上記段落0046〜0048を参照されたい。
【0071】
1つのさらなる実施形態では、記憶域81〜92の1又はそれ以上が、GPU内のそれぞれの複数の異なる場所にわたって分散される。従って、81などの記憶域は、1又はそれ以上のメモリバッファ、レジスタ、又は(シェーディング記憶情報などの)情報を記憶するように構成されたその他の構造を含むことができる。いくつかの実施形態では、これらの記憶構造が、GPUパイプライン内の特定の実行領域に近いという理由で、GPUの異なる部分に位置することができる。81などの記憶域は、待ち行列、ランダムアクセスメモリ、又はその他の情報アクセス方式として実現される記憶装置を含むことができる。従って、様々な実施形態では、81〜92などの記憶域が、タスク待ち行列、コマンドバッファ、又はその他のGPUフロントエンド動作、頂点シェーディング前の基本状態、頂点シェーディング後の基本状態、変換前の頂点の状態、変換後の頂点の状態、フラグメントシェーディング前の基本状態、ラスタ化及び/又は補間、深さ、ステンシル、及びカラーフレームバッファの状態に対応する1又はそれ以上の記憶構造、或いは状態に基づく情報を保持することができる当業者にとって周知のその他のGPU構造を含むことができる。
【0072】
従って、様々な実施形態では、記憶域81〜92を使用することにより、異なる仮想GPUの画素及び頂点処理動作の実行を、GPUが以前の解決策よりも細かい粒度で迅速に切り替えられるようになるとともに、異なる仮想GPUのタスク、スレッド、命令などを、(例えば)より小さな時間ウィンドウ中に実行できるようにすることができる。さらに、グラフィックプロセッサ設計の当業者であれば気付くであろうが、図3の実施形態は、本開示の他の箇所で説明した他の実施形態及び特徴と互換性がある(又はこれらに照らして修正することができる)。
【0073】
ここで図4を参照すると、本開示による方法110の1つの実施形態のフローチャートを示している。以下で説明する方法110の様々な実施形態では、説明する要素及び/又はステップの1又はそれ以上を同時に実行すること、図示のものとは異なる順序で実行すること、又は完全に省くことができる。他の追加要素を望み通りに実行することもできる。さらに、いくつかの実施形態では、いくつかの方法ステップのいくつかの部分しか実行されない。いくつかの実施形態では、方法110のステップの全部又は一部をGPU50によって実行することができ、図2に関連して上述した開示に照らして理解されたい。
【0074】
ステップ120において、第1のGPUコマンドに対応する第1のスレッドの実行が、グラフィックス処理装置によって開始される。この実施形態では、第1のスレッドの実行が、第2のGPUコマンドに対応する第2のスレッドの実行開始よりも前に開始される。第1のスレッドの実行開始は、第1のGPUコマンドの第1の優先レベルが第2のGPUコマンドの第2の優先レベルよりも高いことに基づき、第1及び第2のGPUコマンドの優先レベルは、第1及び第2のGPUコマンドが対応する仮想GPUの識別情報に基づく。本開示では、「実行開始」又は「実行」という用語、及びこれらの変形は、GPUの1又はそれ以上の実行ユニットに1又はそれ以上のスレッド及び/又は命令を転送することを意味する。いくつかの実施形態では、「実行開始」又は「実行」が、いくつかの部分が以前に計算されているものの、その実行が完全に完了していないGPUコマンド、タスク、及び/又はスレッドを再開することを意味する。
【0075】
ステップ130において、第2の優先レベルよりも高い優先レベルのGPUコマンドが他に存在しない旨の指示に基づいて、第2のスレッドの実行が開始される。1つの実施形態では、この指示が、(第2のスレッドに対応するコマンドバッファを除く)他の全ての仮想GPUのコマンドバッファが空であることを含むことができる。別の実施形態では、この指示が、所与の仮想GPUの全てのスレッドが実行ユニットに転送されたわけではないことを示す情報を含む。ステップ130において、第1のGPUコマンドに対応する全てのスレッドの実行が開始されるよりも前に、第3のGPUコマンドに対応する第3のスレッドの実行が開始され、この第3のスレッドの実行開始は、第1の優先レベルよりも高い第3の優先レベルに基づき、この第3の優先レベルは、第3のGPUコマンドが対応する仮想GPUの識別情報に基づく。従って、第3のスレッドの優先レベルは、第2のスレッドよりも高い優先レベルを有することができる第1のスレッドの優先レベルよりも高い。第1、第2、及び第3のスレッドの各々は、複数の仮想GPUの異なる1つにそれぞれ対応する。
【0076】
例示的なコンピュータシステム
次に図5を参照すると、GPU50が存在できるシステム200の1つの実施形態のブロック図を示している。図示の実施形態では、システム200が、外部メモリ252に結合された集積回路10の少なくとも1つの例を含む。外部メモリ252は、図1に関連して上述したメインメモリサブシステムを形成することができる(例えば、外部メモリ252は、メモリ12A〜12Bを含むことができる)。集積回路10は、1又はそれ以上の周辺機器254及び外部メモリ252に結合される。集積回路10に供給電圧を供給するとともにメモリ252及び/又は周辺機器254に1又はそれ以上の供給電圧を供給する電力供給装置256を設けることもできる。いくつかの実施形態では、集積回路10の複数の例を含めることができる(同様に、メモリ252の複数の例を含めることもできる)。
【0077】
メモリ252は、ダイナミックランダムアクセスメモリ(DRAM)、同期DRAM(SDRAM)、ダブルデータレート(DDR、DDR2、DDR3、など)SDRAM(niDDR3などのモバイルバージョンのSDRAM及び/又はLPDDR2などの低電力バージョンのSDRAMなどを含む)、RAMBUS DRAM(RDRAM)、スタティックRAM(SRAM)などのいずれの種類のメモリであってもよい。回路基板上に1又はそれ以上のメモリ素子を結合して、シングルインラインメモリモジュール(SIMM)、デュアルインラインメモリモジュール(DIMM)などのメモリモジュールを形成することもできる。或いは、装置に、チップオンチップ構成、パッケージオンパッケージ構成、又はマルチチップモジュール構成の集積回路10を取り付けることもできる。
【0078】
周辺機器254は、システム200の種類に応じてあらゆる所望の回路を含むことができる。例えば、1つの実施形態では、システム200を(携帯情報端末(PDA)、スマートフォンなどの)モバイル装置とすることができ、周辺機器254は、WiFi、Bluetooth(登録商標)、セルラ、全地球測位システムなどの様々な種類の無線通信のための装置を含むことができる。周辺機器254は、RAM記憶装置、固体記憶装置又はディスク記憶装置を含む追加の記憶装置を含むこともできる。周辺機器254は、タッチディスプレイ画面又はマルチタッチディスプレイ画面を含むディスプレイ画面、キーボード又はその他の入力装置、マイク、スピーカ、などのユーザインターフェイス装置を含むことができる。他の実施形態では、システム200が、(デスクトップパーソナルコンピュータ、ラップトップ、ワークステーション、ネットトップなどの)いずれの種類のコンピュータシステムであってもよい。
【0079】
コンピュータ可読媒体及びハードウェア製作
上述した技術及び方法は、いずれかの好適なコンピュータ可読記憶媒体に記憶されたコンピュータ可読命令として実現することができる。本明細書で使用する場合、コンピュータ可読記憶媒体は、コンピュータ又はコンピュータシステムによって読み込まれる(非一時的有形)媒体を意味し、ハードドライブ、光学ドライブ、DVD、揮発性又は不揮発性RAM素子、ホログラフィック記憶装置、プログラマブルメモリなどの磁気、光学、及び固体記憶媒体を含む。本明細書では、「非一時的」という用語は、これをコンピュータ可読媒体に適用した場合、(搬送波などの)一時的(無形)媒体のような、米国特許法第101条の下で不適当と見なされるあらゆる主題を特許請求の範囲から除外することのみを意図したものであり、同法に別様に従うと見なされる主題を除外することを意図したものではない。
【0080】
いくつかの実施形態では、上述したようなコンピュータ可読記憶媒体を使用して、プログラムが読み込む命令を記憶し、この媒体を直接的に又は間接的に使用して、GPU50、IC10、及び/又はこれらの一部を含むハードウェアを製作することができる。例えば、命令は、ハードウェア機能の行動レベル又はレジスタ転送レベルの記述をVerilog又はVHDLなどの高水準設計言語で記述する1又はそれ以上のデータ構造の概要を示す。この記述を合成ツールによって読み込み、記述を合成してネットリストを作成することができる。ネットリストは、GPU50、IC10、及び/又はこれらの一部の機能を表す(例えば、合成ライブラリに定義された)ゲートセットを含むことができる。次に、このネットリストを配置し、ルート指定して、マスクに提供する幾何学形状を記述するデータセットを生成することができる。その後、このマスクを様々な半導体製作ステップで使用して、半導体回路又はハードウェアの実施形態に対応する回路を製造することができる。或いは、望む通りに、(合成ライブラリの有無にかかわらず)データベースをネットリスト又はデータセットとすることもできる。従って、1つの実施形態は、データ構造によって記述された回路を含む集積回路を製造する過程の一部を実行するために、コンピュータシステム上で実行可能なプログラムが使用できるデータ構造を含むコンピュータ可読記憶媒体であり、このデータ構造で記述された回路は、GPU50、IC10、及び/又はこれらの一部を含む。
【0081】
以上、特定の実施形態について説明したが、これらの実施形態は、特定の特徴に関連して1つの実施形態しか説明していないとしても、本開示の範囲を限定することを意図したものではない。本開示で示した特徴の例は、別途記載していない限り、限定的ではなく例示的であることが意図されている。本開示の恩恵を受ける当業者には明らかなように、上記の説明は、このような代替物、修正物、及び同等物も対象とすることが意図されている。また、上記の詳細な説明で示した節又は見出しを、決して本開示を限定するものとして解釈すべきではない。
【0082】
本開示の範囲は、本明細書で取り扱う課題の一部又は全部を軽減するかどうかに関わらず、本明細書で(明示的に又は非明示的に)開示したあらゆる特徴又は特徴の組み合わせ、又はこれらのあらゆる一般化を含む。従って、本出願(又はその優先権を主張する出願)の審査中に、あらゆるこのような特徴の組み合わせに対して新たな請求項が立案されることがある。具体的には、添付の特許請求の範囲に関して、従属請求項からの特徴を独立請求項の特徴と組み合わせることができ、それぞれの独立請求項からの特徴を、添付の特許請求の範囲に列挙する特定の組み合わせのみならずあらゆる適切な方法で組み合わせることができる。

【特許請求の範囲】
【請求項1】
複数の記憶場所を含むグラフィックス処理装置(GPU)を備え、
前記GPUに実装された複数の仮想GPUの各仮想GPUに関して、前記複数の記憶場所の対応する記憶場所が、中間結果を記憶するように構成された第1及び第2の記憶域を含み、
前記第1及び第2の記憶域がそれぞれ、その仮想GPUの1又はそれ以上の未完了の頂点処理動作の実行を再開するために使用可能な、その仮想GPUに対応する中間頂点処理結果、及びその仮想GPUの1又はそれ以上の未完了の画素処理動作の実行を再開するために使用可能な、その仮想GPUに対応する中間画素処理結果を記憶するように構成される、
ことを特徴とする装置。
【請求項2】
前記複数の仮想GPUの各々の前記第1及び第2の記憶域がそれぞれ、前記GPU内のそれぞれの複数の異なる場所にわたって分散される、
ことを特徴とする請求項1に記載の装置。
【請求項3】
前記GPUが、
複数のGPUコマンドを記憶するように構成されたコマンドバッファと、
1又はそれ以上の実行ユニットと、
をさらに含み、前記装置が、所与のGPUコマンドに対応する1又はそれ以上の命令を、前記所与のGPUコマンドの優先レベルに基づいて前記1又はそれ以上の実行ユニットに転送するように構成される、
ことを特徴とする請求項1に記載の装置。
【請求項4】
前記GPUに実装された前記複数の仮想GPUのそれぞれが独自の優先レベルを有し、前記複数のGPUコマンドのそれぞれが、前記GPUに実装された前記複数の仮想GPUのうちの対応する仮想GPUの前記優先レベルに基づく優先レベルを有する、
ことを特徴とする請求項3に記載の装置。
【請求項5】
前記GPUが、前記複数のGPUコマンドの1又はそれ以上に対応する命令を記憶するように構成された1又はそれ以上の命令バッファをさらに含み、該1又はそれ以上の命令バッファが、前記複数のGPUコマンドの前記1又はそれ以上に対応する前記命令の各々に関して、前記複数の仮想GPUのうちのその命令に対応する仮想GPUの識別情報を示す情報を記憶するように構成される、
ことを特徴とする請求項3に記載の装置。
【請求項6】
前記GPUが、前記1又はそれ以上の未完了の頂点処理動作をスレッド単位で再開するように構成されるとともに、前記1又はそれ以上の未完了の画素処理動作をスレッド単位で再開するように構成される、
ことを特徴とする請求項1に記載の装置。
【請求項7】
前記GPUが、該GPUに実装された前記複数の仮想GPUのそれぞれの仮想アドレス空間を物理メモリにマッピングするように構成される、
ことを特徴とする請求項1に記載の装置。
【請求項8】
グラフィックス処理装置(GPU)であって、
複数の仮想GPUを実装するように構成された1又はそれ以上の回路を備え、該回路のそれぞれが、1又はそれ以上のGPUコマンドを記憶するように構成された1又はそれ以上の対応する命令バッファと、実行結果を記憶するように構成された1又はそれ以上の対応する記憶場所とを含み、
タスクマネージャと、
供給ユニットと、
1又はそれ以上の実行ユニットと、
をさらに備え、
前記タスクマネージャが、第1の優先レベルを有する第1のGPUコマンドに対応する1又はそれ以上のスレッドを生成するように構成され、
前記供給ユニットが、所与のスレッドを、該所与のスレッドの優先レベルに応じて前記1又はそれ以上の実行ユニットに転送するように構成され、
前記優先レベルが、前記複数の仮想GPUのうちの1つの識別情報に基づく、
ことを特徴とするグラフィックス処理装置(GPU)。
【請求項9】
前記1又はそれ以上の実行ユニットが、第1の種類の第1の実行ユニットと、第2の種類の第2の実行ユニットとを含み、
前記供給ユニットが、前記所与のスレッドを実行するために使用される実行ユニットの種類を示す情報に基づいて、前記所与のスレッドを転送するように構成される、
ことを特徴とする請求項8に記載のグラフィックス処理装置。
【請求項10】
前記供給ユニットが、前記第1の実行ユニットによって実行されるのを待っている高い優先度のスレッドが存在しないという指示に基づいて、より低い優先レベルのスレッドを前記1又はそれ以上の実行ユニットのうちの第1の実行ユニットへ転送するように構成される、
ことを特徴とする請求項8に記載のグラフィックス処理装置。
【請求項11】
前記複数の仮想GPUのそれぞれに関して、前記対応する1又はそれ以上の記憶場所が、1又はそれ以上のレジスタ、及びプログラムカウンタ値を含む、
ことを特徴とする請求項8に記載のグラフィックス処理装置。
【請求項12】
前記複数の仮想GPUに対応する複数の仮想アドレス空間に物理メモリをマッピングするように構成されたメモリマネージャをさらに備える、
ことを特徴とする請求項8に記載のグラフィックス処理装置。
【請求項13】
複数の仮想GPUを実装するグラフィックス処理装置(GPU)が、第1のGPUコマンドに対応する第1のスレッドを、第2のGPUコマンドに対応する第2のスレッドを実行する前に実行するステップを含み、
前記第1のGPUコマンドが、前記複数の仮想GPUのうちの第1の仮想GPUに対応するとともに、前記複数の仮想GPUのうちの前記第1の仮想GPUの前記識別情報に基づく第1の優先レベルを有し、
前記第2のGPUコマンドが、前記複数の仮想GPUのうちの第2の仮想GPUに対応するとともに、前記複数の仮想GPUのうちの前記第2の仮想GPUの前記識別情報に基づく第2の優先レベルを有し、
前記GPUが前記第2のスレッドを実行する前に前記第1のスレッドを実行する前記ステップが、前記第1の優先レベルが前記第2の優先レベルよりも高いことに基づく、
ことを特徴とする方法。
【請求項14】
前記GPUが、前記第2の優先レベルよりも高い優先レベルを有する実行されるのを待っているGPUコマンドが他に存在しないという指示に基づいて、前記第2のスレッドを実行するステップをさらに含む、
ことを特徴とする請求項13に記載の方法。
【請求項15】
前記第1のGPUコマンドに対応する全てのスレッドの実行を完了する前に、第3のGPUコマンドに対応する第3のスレッドを実行するステップをさらに含み、前記第3のスレッドを実行するステップが、前記第1の優先レベルよりも高い第3の優先レベルに基づき、前記第3の優先レベルが、前記GPUに実装された前記複数の仮想GPUのうちの前記第3のGPUコマンドが対応する仮想GPUの識別情報に基づく、
ことを特徴とする請求項13に記載の方法。
【請求項16】
前記GPUが、前記第1及び第2の優先レベルを指定する情報を中央処理装置から受け取るステップをさらに含む、
ことを特徴とする請求項13に記載の方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate


【公開番号】特開2013−25823(P2013−25823A)
【公開日】平成25年2月4日(2013.2.4)
【国際特許分類】
【外国語出願】
【出願番号】特願2012−173370(P2012−173370)
【出願日】平成24年7月18日(2012.7.18)
【出願人】(503260918)アップル インコーポレイテッド (568)
【Fターム(参考)】