(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2024-04-02
(54)【発明の名称】リソース使用量を監視するためのアプリケーション・プログラミング・インターフェース
(51)【国際特許分類】
G06F 11/34 20060101AFI20240326BHJP
G06F 11/30 20060101ALI20240326BHJP
【FI】
G06F11/34 133
G06F11/30 140N
G06F11/30 155
G06F11/34 109
G06F11/34 104
【審査請求】有
【予備審査請求】未請求
(21)【出願番号】P 2022526084
(86)(22)【出願日】2022-04-14
(85)【翻訳文提出日】2022-07-13
(86)【国際出願番号】 US2022024828
(87)【国際公開番号】W WO2022221538
(87)【国際公開日】2022-10-20
(32)【優先日】2021-04-14
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2022-04-13
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2022-04-13
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2022-04-13
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
(71)【出願人】
【識別番号】501450960
【氏名又は名称】エヌビディア コーポレーション
(74)【代理人】
【識別番号】110000855
【氏名又は名称】弁理士法人浅村特許事務所
(72)【発明者】
【氏名】フォンテーヌ、デイヴィッド アンソニー
(72)【発明者】
【氏名】バッチャン、ジョン
(72)【発明者】
【氏名】ウェン、ケ
(72)【発明者】
【氏名】シュウ、ヤン
【テーマコード(参考)】
5B042
【Fターム(参考)】
5B042GC11
(57)【要約】
コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するための、装置、システム、及び技法。少なくとも1つの実施例では、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造が、たとえば、CUDA又は他の並列コンピューティング・プラットフォーム・コードに基づいて生成される。
【特許請求の範囲】
【請求項1】
コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するために、アプリケーション・プログラミング・インターフェース(API)を実施する1つ又は複数の回路
を備える、プロセッサ。
【請求項2】
前記1つ又は複数のデータ構造が、少なくとも、前記コンピュータ・プログラムに関連する参照の数を示す、請求項1に記載のプロセッサ。
【請求項3】
前記情報が、少なくとも、メモリの領域を含む、請求項1に記載のプロセッサ。
【請求項4】
前記1つ又は複数の回路が、前記1つ又は複数のデータ構造に対応するロケーションを示すパラメータ値に少なくとも部分的に基づいて前記APIを実施する、請求項1に記載のプロセッサ。
【請求項5】
前記1つ又は複数の回路が、さらに、前記コンピュータ・プログラムによる前記情報の前記使用に少なくとも部分的に基づいて1つ又は複数の関数を実行する、請求項1に記載のプロセッサ。
【請求項6】
前記コンピュータ・プログラムが、1つ又は複数のグラフィックス処理ユニット(GPU)によって実行可能である、請求項1に記載のプロセッサ。
【請求項7】
コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するために、アプリケーション・プログラミング・インターフェース(API)を実施する1つ又は複数のプロセッサを有する1つ又は複数のコンピュータ
を備える、システム。
【請求項8】
前記1つ又は複数のプロセッサが、さらに、
少なくとも前記APIを示すコードを取得し、
少なくとも、前記コードを実行することによって、前記APIを実施する、
請求項7に記載のシステム。
【請求項9】
前記1つ又は複数のデータ構造が、前記情報に関連する1つ又は複数の参照のカウントを符号化する、請求項7に記載のシステム。
【請求項10】
前記1つ又は複数のデータ構造が、1つ又は複数のデストラクタ関数を示す、請求項7に記載のシステム。
【請求項11】
前記コンピュータ・プログラムが、少なくとも、1つ又は複数の並列処理ユニット(PPU)によって実行可能である、請求項7に記載のシステム。
【請求項12】
前記情報が、少なくとも、前記コンピュータ・プログラムへの入力データを含む、請求項7に記載のシステム。
【請求項13】
1つ又は複数のプロセッサによって実施される場合に、前記1つ又は複数のプロセッサに、少なくとも、
コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するために、アプリケーション・プログラミング・インターフェース(API)を実施させる
命令のセットを記憶している、機械可読媒体。
【請求項14】
前記命令のセットが、前記1つ又は複数のプロセッサによって実施される場合に、前記1つ又は複数のプロセッサに、参照の数を示すパラメータ値に少なくとも部分的に基づいて前記APIを実施させる命令をさらに含む、請求項13に記載の機械可読媒体。
【請求項15】
前記情報の前記使用が、前記コンピュータ・プログラムによって使用される1つ又は複数の参照によって示される、請求項13に記載の機械可読媒体。
【請求項16】
前記命令のセットが、前記1つ又は複数のプロセッサによって実施される場合に、前記1つ又は複数のプロセッサに、前記コンピュータ・プログラムによる前記情報の前記使用に基づいて前記1つ又は複数のデータ構造を修正させる命令をさらに含む、請求項13に記載の機械可読媒体。
【請求項17】
前記命令のセットが、前記1つ又は複数のプロセッサによって実施される場合に、前記1つ又は複数のプロセッサに、前記1つ又は複数のデータ構造を1つ又は複数のグラフ・データ構造に関連付けさせる命令をさらに含む、請求項13に記載の機械可読媒体。
【請求項18】
前記コンピュータ・プログラムが、1つ又は複数の汎用グラフィックス処理ユニット(GPGPU)によって実行可能である、請求項13に記載の機械可読媒体。
【請求項19】
コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するために、アプリケーション・プログラミング・インターフェース(API)を実施するステップ
を含む、方法。
【請求項20】
前記1つ又は複数のデータ構造によって示される参照の数に少なくとも部分的に基づいて1つ又は複数の関数を実行するステップをさらに含む、請求項19に記載の方法。
【請求項21】
1つ又は複数の関数を示す1つ又は複数のパラメータ値に少なくとも部分的に基づいて前記APIを実施するステップをさらに含む、請求項19に記載の方法。
【請求項22】
前記APIがランタイムAPIである、請求項19に記載の方法。
【請求項23】
前記コンピュータ・プログラムが、1つ又は複数の中央処理ユニット(CPU)によって実行可能である、請求項19に記載の方法。
【請求項24】
前記APIを実施した結果として1つ又は複数のステータス指示を取得するステップをさらに含む、請求項19に記載の方法。
【発明の詳細な説明】
【技術分野】
【0001】
本出願は、各々の内容全体が参照により本明細書に組み込まれる、2021年4月14日に出願された、「REFERENCE COUNTED DESTRUCTORS」と題する米国仮出願第63/174,999号(代理人整理番号第0112912-270PR0)、2022年4月13日に出願された、「APPLICATION PROGRAMMING INTERFACE TO MONITOR RESOURCE USAGE」と題する米国特許出願第17/720,231号(代理人整理番号第0112912-270US0)、2022年4月13日に出願された、「APPLICATION PROGRAMMING INTERFACE TO INDICATE INCREASED RESOURCE USAGE」と題する米国特許出願第17/720,234号(代理人整理番号第0112912-505US0)、及び2022年4月13日に出願された、「APPLICATION PROGRAMMING INTERFACE TO INDICATE REDUCED RESOURCE USAGE」と題する米国特許出願第17/720,236号(代理人整理番号第0112912-506US0)の利益を主張する。
【0002】
少なくとも1つの実施例は、コンピュータ・プログラム・リソース使用量を監視するために使用される処理リソースに関する。たとえば、少なくとも1つの実施例は、本明細書で説明される様々な新規の技法を実装する、コンピュータ・プログラム・リソース使用量を監視するために使用されるプロセッサ又はコンピューティング・システムに関する。
【背景技術】
【0003】
コンピュータ・プログラムのリソース使用量を監視することは、リソースが様々な異なる動作において使用され得るので、困難であり得る。したがって、コンピュータ・プログラムのリソース使用量を監視するための技法が、CUDA又は他の並列コンピューティング・プラットフォーム・コードを使用して改善され得る。
【図面の簡単な説明】
【0004】
【
図1】少なくとも1つの実施例による、グラフを使用するプログラムの一実例を示す図である。
【
図2】少なくとも1つの実施例による、本明細書で説明される技法の一実例を示す図である。
【
図3】少なくとも1つの実施例による、ユーザ・オブジェクト作成APIコール(User Object Create API call)の図である。
【
図4】少なくとも1つの実施例による、ユーザ・オブジェクト保持APIコール(User Object Retain API call)の図である。
【
図5】少なくとも1つの実施例による、ユーザ・オブジェクト・リリースAPIコール(User Object Release API call)の図である。
【
図6】少なくとも1つの実施例による、コンピュータ・プログラムによる情報の使用を監視するために使用されるべきデータ構造を生成するプロセスの一実例を示す図である。
【
図7】少なくとも1つの実施例による、コンピュータ・プログラムによる情報の使用量が増加されることを引き起こすプロセスの一実例を示す図である。
【
図8】少なくとも1つの実施例による、コンピュータ・プログラムによる情報の使用量が低減されることを引き起こすプロセスの一実例を示す図である。
【
図9】少なくとも1つの実施例による、例示的なデータ・センタを示す図である。
【
図10】少なくとも1つの実施例による、処理システムを示す図である。
【
図11】少なくとも1つの実施例による、コンピュータ・システムを示す図である。
【
図12】少なくとも1つの実施例による、システムを示す図である。
【
図13】少なくとも1つの実施例による、例示的な集積回路を示す図である。
【
図14】少なくとも1つの実施例による、コンピューティング・システムを示す図である。
【
図15】少なくとも1つの実施例による、APUを示す図である。
【
図16】少なくとも1つの実施例による、CPUを示す図である。
【
図17】少なくとも1つの実施例による、例示的なアクセラレータ統合スライス(accelerator integration slice)を示す図である。
【
図18A】少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す図である。
【
図18B】少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す図である。
【
図19A】少なくとも1つの実施例による、グラフィックス・コアを示す図である。
【
図19B】少なくとも1つの実施例による、GPGPUを示す図である。
【
図20A】少なくとも1つの実施例による、並列プロセッサを示す図である。
【
図20B】少なくとも1つの実施例による、処理クラスタを示す図である。
【
図20C】少なくとも1つの実施例による、グラフィックス・マルチプロセッサを示す図である。
【
図21】少なくとも1つの実施例による、グラフィックス・プロセッサを示す図である。
【
図22】少なくとも1つの実施例による、プロセッサを示す図である。
【
図23】少なくとも1つの実施例による、プロセッサを示す図である。
【
図24】少なくとも1つの実施例による、グラフィックス・プロセッサ・コアを示す図である。
【
図25】少なくとも1つの実施例による、PPUを示す図である。
【
図26】少なくとも1つの実施例による、GPCを示す図である。
【
図27】少なくとも1つの実施例による、ストリーミング・マルチプロセッサを示す図である。
【
図28】少なくとも1つの実施例による、プログラミング・プラットフォームのソフトウェア・スタックを示す図である。
【
図29】少なくとも1つの実施例による、
図28のソフトウェア・スタックのCUDA実装形態を示す図である。
【
図30】少なくとも1つの実施例による、
図28のソフトウェア・スタックのROCm実装形態を示す図である。
【
図31】少なくとも1つの実施例による、
図28のソフトウェア・スタックのOpenCL実装形態を示す図である。
【
図32】少なくとも1つの実施例による、プログラミング・プラットフォームによってサポートされるソフトウェアを示す図である。
【
図33】少なくとも1つの実施例による、
図28~
図31のプログラミング・プラットフォーム上で実行するためのコードをコンパイルすることを示す図である。
【
図34】少なくとも1つの実施例による、
図28~
図31のプログラミング・プラットフォーム上で実行するためのコードをコンパイルすることをより詳細に示す図である。
【
図35】少なくとも1つの実施例による、ソース・コードをコンパイルするより前にソース・コードをトランスレートすることを示す図である。
【
図36A】少なくとも1つの実施例による、異なるタイプの処理ユニットを使用してCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。
【
図36B】少なくとも1つの実施例による、CPU及びCUDA対応GPUを使用して、
図36AのCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。
【
図36C】少なくとも1つの実施例による、CPU及びCUDA非対応(non-CUDA-enabled)GPUを使用して、
図36AのCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。
【
図37】少なくとも1つの実施例による、
図36CのCUDAからHIPへのトランスレーション・ツール(CUDA-to-HIP translation tool)によってトランスレートされた例示的なカーネルを示す図である。
【
図38】少なくとも1つの実施例による、
図36CのCUDA非対応GPUをより詳細に示す図である。
【
図39】少なくとも1つの実施例による、例示的なCUDAグリッドのスレッドが
図38の異なるコンピュート・ユニットにどのようにマッピングされるかを示す図である。
【
図40】少なくとも1つの実施例による、既存のCUDAコードをData Parallel C++コードにどのようにマイグレートするかを示す図である。
【発明を実施するための形態】
【0005】
少なくとも1つの実施例では、1つ又は複数のプログラミング・モデルが、様々な動作を実施するためにグラフを利用する。少なくとも1つの実施例では、前記1つ又は複数のプログラミング・モデルは、コンピュート・ユニファイド・デバイス・アーキテクチャ(CUDA:Compute Unified Device Architecture)・モデル、ポータビリティのための異種コンピュート・インターフェース(HIP:Heterogeneous compute Interface for Portability)・モデル、oneAPIモデル、様々なハードウェア・アクセラレータ・プログラミング・モデル、及び/又はそれらの変形形態などのモデルを含む。少なくとも1つの実施例では、グラフは、中央処理ユニット(CPU:central processing unit)、グラフィックス処理ユニット(GPU:graphics processing unit)、汎用GPU(GPGPU:general-purpose GPU)、並列処理ユニット(PPU:parallel processing unit)、及び/又はそれらの変形形態など、1つ又は複数の処理ユニット上で実施される一連の動作である。少なくとも1つの実施例では、前記グラフは、依存性によって接続された、カーネル起動など、一連の動作を定義する、グラフ・データ構造、グラフ・コード、及び/又はそれらの変形形態とも呼ばれる、データ・オブジェクトである。少なくとも1つの実施例では、前記グラフの依存性が、前記グラフの実行とは別々に定義される。少なくとも1つの実施例では、前記グラフは、1回定義され、1回又は複数回起動され得る。
【0006】
少なくとも1つの実施例では、動作は、前記グラフ中のノードに対応する。少なくとも1つの実施例では、動作間の依存性は、前記グラフのエッジを形成する。少なくとも1つの実施例では、依存性は、動作の実行シーケンスを制約する。少なくとも1つの実施例では、動作は、それが依存するノードが完了する(たとえば、ノードによって示された動作が実行/実施される)と、任意の時間にスケジュールされ得る。少なくとも1つの実施例では、ノードによって示された動作は、カーネル、CPU関数コール、メモリ管理/操作動作、イベントを待つこと、イベントを記録すること、外部セマフォをシグナリングすること、外部セマフォを待つことなどの動作、並びに他のグラフ(たとえば、子グラフ)を含むことができる。少なくとも1つの実施例では、グラフは、様々なプログラミング・モデル・アプリケーション・プログラミング・インターフェース(API:application programming interface)関数を通して作成される。少なくとも1つの実施例では、前記グラフの動作は、様々なプログラミング・モデルAPI関数を通して実行される。
【0007】
少なくとも1つの実施例では、グラフは、ストリーム・キャプチャと呼ばれることがある、1つ又は複数の動作を通して作成される。少なくとも1つの実施例では、1つ又は複数の動作が定義され、ストリーム・キャプチャが、前記グラフ中の前記1つ又は複数の動作をキャプチャするために利用される。少なくとも1つの実施例では、たとえば、APIコールが、ストリームとも呼ばれる、一連の動作の開始を示し、異なるAPIコールが、前記一連の動作の終了を示し、前記一連の動作は、次いで、前記グラフとしてインスタンス化される。少なくとも1つの実施例では、前記一連の動作の開始を示すAPI関数は、ストリーム開始キャプチャ(Stream Begin Capture)API関数と呼ばれることがある。少なくとも1つの実施例では、前記一連の動作の終了を示すAPI関数は、ストリーム終了キャプチャ(Stream End Capture)API関数と呼ばれることがある。少なくとも1つの実施例では、本明細書で説明されるものなどのAPI関数は、前記API関数の1つ又は複数の機能性に関係することも関係しないこともある、任意の好適な専門用語を使用して任意の好適な様式で示され得ることに留意されたい。
【0008】
少なくとも1つの実施例では、様々なオブジェクトが、前記グラフ及び/又は他の好適なコンピュータ・プログラムによって示される様々な動作において利用される。少なくとも1つの実施例では、前記グラフ及び/又は他の好適なコンピュータ・プログラムは、オブジェクトとも呼ばれる、様々なユーザ指定されたデータ及び/又はユーザ管理されたリソースを利用する動作を定義することができる。少なくとも1つの実施例では、オブジェクトは、カーネル引数、ホスト機能引数、作業領域バッファ、及び/又はそれらの変形形態を含む。少なくとも1つの実施例では、前記オブジェクトは、前記グラフ及び/又は他の好適なコンピュータ・プログラムの1つ又は複数の動作の実行全体にわたって利用される、任意の好適なコンピューティング・リソース、情報、及び/又はデータを含む。少なくとも1つの実施例では、前記オブジェクトは、前記オブジェクトを作成するためにコールされる関数のタイプを指す、コンストラクタを通して作成される。少なくとも1つの実施例では、前記オブジェクトは、前記オブジェクトを破棄するためにコールされる関数のタイプである、デストラクタとも呼ばれる、デストラクタ関数を通して破棄される。少なくとも1つの実施例では、前記デストラクタ関数は、少なくとも、前記オブジェクトに対応するメモリを割振り解除すること、及び/或いは、前記オブジェクトを消去するか又はさもなければ破棄する任意の好適なプロセスによって、前記オブジェクトを破棄する。少なくとも1つの実施例では、コンストラクタ及び/又はデストラクタは、ユーザ、様々なソフトウェア・ライブラリ、及び/又はそれらの変形形態によって定義され得る。
【0009】
少なくとも1つの実施例では、グラフは、プログラムの様々な動作において利用される。
図1は、少なくとも1つの実施例による、グラフを使用するプログラムの実例100を示す。少なくとも1つの実施例では、実例100は、前記プログラムが備える、グラフに関連する様々なグラフ・データ構造動作を含む。少なくとも1つの実施例では、前記動作は、グラフを作成すること、グラフをクローニングすること、グラフを実行ファイル(たとえば、
図1中のAexec)にインスタンス化すること、グラフを起動すること、グラフの実行(たとえば、
図1中のAsync実行)、グラフを破棄すること、実行可能グラフを破棄すること、及び/又は
図1に図示されていない様々な他の動作を含む。少なくとも1つの実施例では、例示的な実例として、前記プログラムの一部として、前記グラフは作成され、前記グラフは実行可能グラフとしてインスタンス化され、前記グラフは消去され、前記実行可能グラフは起動され、前記実行可能グラフは実行され、前記実行可能グラフは消去される。少なくとも1つの実施例では、前記グラフの1つ又は複数の動作によって利用される前記オブジェクトは、プログラムの前記グラフの各使用が完了するまで、残存しなければならない。少なくとも1つの実施例では、本明細書で説明される技法は、前記グラフの1つ又は複数の動作によって利用される前記オブジェクトがいつリリース(release)されるか又はさもなければ(たとえば、デストラクタを介して)破棄され得るかを決定するためのやり方を提供する。
【0010】
少なくとも1つの実施例では、CUDA、HIP、oneAPI、及び/又はそれらの変形形態など、1つ又は複数のプログラミング・モデルのシステムなど、1つ又は複数のシステムが、本明細書で説明される様々な動作及び/又は技法を実施する。少なくとも1つの実施例では、前記システムは、いったいいつ、新しいグラフ・ハンドルがグラフの使用のために作成されるかを決定する。少なくとも1つの実施例では、例示的な実例として、前記グラフ・ハンドルは、前記グラフが作成され、前記グラフが実行可能グラフとしてインスタンス化され、前記実行可能グラフが起動され、及び/又は様々な他のグラフ動作のとき、作成される。少なくとも1つの実施例では、例示的な実例として、前記グラフ・ハンドルは、前記グラフが破棄され、前記実行可能グラフが実行され、前記実行可能グラフが破棄され、及び/又は様々な他のグラフ動作のとき、消去される。少なくとも1つの実施例では、前記システムは、グラフ・ハンドルの作成及び消去を追跡するために、参照カウンタとも呼ばれる、カウンタを利用し、前記カウンタは、前記グラフ・ハンドルが(たとえば、前記グラフ・ハンドルの作成を生じるAPIコールを介して)作成されたとき、1だけ増分され、前記グラフ・ハンドルが(たとえば、前記グラフ・ハンドルの消去を生じるAPIコールを介して)破棄されるか又はさもなければ消去されたとき、1だけ減分される。少なくとも1つの実施例では、前記参照カウンタが0の値に達したとき、前記システムは、前記グラフによって利用される前記オブジェクトがリリースされる(たとえば、前記オブジェクトのために割り振られたメモリがリリースされ得る)か又はさもなければ(たとえば、デストラクタを介して)破棄され得ると決定する。
【0011】
少なくとも1つの実施例では、前記システムは、前記カウンタを通して、前記オブジェクト又は他の好適なコンピューティング・リソースのコンピュータ・プログラムの使用を追跡するアビリティ(ability)を提供する。少なくとも1つの実施例では、前記オブジェクトの前記コンピュータ・プログラムの使用は、前記オブジェクトへの前記コンピュータ・プログラムに関連する参照を通して追跡される。少なくとも1つの実施例では、前記システムは、前記オブジェクトへの参照を追跡するために、参照カウンタとも呼ばれる、前記カウンタを利用するアビリティを提供し、前記カウンタは、前記オブジェクトへの新しい参照の場合、1だけ増分され、前記オブジェクトへの参照がもはや使用されないとき、1だけ減分される。少なくとも1つの実施例では、前記参照カウンタが0の値に達したとき、前記システムは、前記コンピュータ・プログラムによって利用される前記オブジェクトがリリースされる(たとえば、前記オブジェクトのために割り振られたメモリがリリースされ得る)か又はさもなければ(たとえば、デストラクタを介して)破棄され得ると決定する。
【0012】
少なくとも1つの実施例では、本明細書で説明される技法は、メモリをリークすることなしに、前記グラフ中のホスト・ノードに、動的にサイズ決定されたデータを提供するための、NVIDIA集合通信ライブラリ(NCCL:NVIDIA Collective Communications Library)などの様々なソフトウェア・ライブラリ、様々な集合通信ライブラリ、及び/又は任意の好適なソフトウェア・ライブラリのために使用される。
図2は、少なくとも1つの実施例による、NCCLに関するストリーム・キャプチャに関して使用される、本明細書で説明される技法の実例200を示す。少なくとも1つの実施例では、本明細書で説明される技法は、1つ又は複数のストリーム・キャプチャ・プロセス、又は任意の好適なプロセスを使用して作成されたグラフを用いて利用される。少なくとも1つの実施例では、
図2の「202」を参照すると、セットアップ・コードが、APIコールにおいて行われる(たとえば、エンキューops、起動ヘルパー・スレッド)。少なくとも1つの実施例では、
図2の「204(キャプチャが検出されたとき)」を参照すると、本明細書で説明される技法は、NCCL動作(たとえば、NCCL APIコール)を用いたグラフの再起動をサポートするために、APIコールにおいて通常行われるであろうセットアップ・コードが、それがあらゆるグラフ起動に対して実行することになるように、キャプチャが検出されたときにホスト・ノードに移動されることを可能にする。少なくとも1つの実施例では、本明細書で説明される技法は、前記グラフにワークプレイス存続期間を関連付けるために利用される。少なくとも1つの実施例では、本明細書で説明される技法は、前記グラフ又は他の好適なコンピュータ・プログラム中で使用可能なダイナミック・オブジェクトの存続期間の管理を可能にする。少なくとも1つの実施例では、本明細書で説明される技法は、自明コピー可能オブジェクトをサポートする。少なくとも1つの実施例では、本明細書で説明される技法は、ダイナミック・ユーザ・オブジェクトを参照するグラフ及び/又は他の好適なコンピュータ・プログラムのための動作をサポートし、前記動作は、インスタンス化動作、クローン動作、子グラフ挿入動作、非同期破棄動作、新しいソース・グラフからの実行可能グラフ更新動作、及び/又は様々な他のグラフ動作を含む。
【0013】
少なくとも1つの実施例では、本明細書で説明される技法は、ユーザ提供された破棄コード及び/又はコピー・コードを必要とするオブジェクトなど、非自明コピー可能オブジェクトを参照するグラフ及び/又は他の好適なコンピュータ・プログラムをサポートする。少なくとも1つの実施例では、本明細書で説明される技法は、ユーザ提供された破棄コードがサポートされる場合、ユーザがユーザ・オブジェクトの破棄を同期させることを可能にする。少なくとも1つの実施例では、本明細書で説明される技法は、オブジェクトの破棄が、様々なアーキテクチャ固有のAPIコール(たとえば、CUDA APIコール)を伴うことを可能にする。少なくとも1つの実施例では、本明細書で説明される技法は、1つ又は複数のソフトウェア・ライブラリ及び/又は元のタスク記述コードを使用するノード更新を可能にする。
【0014】
少なくとも1つの実施例では、本明細書で説明される技法は、オブジェクト作成及び消去のためのコンストラクタ及びデストラクタを利用する。少なくとも1つの実施例では、本明細書で説明される技法は、コールバックを利用する。少なくとも1つの実施例では、コールバックは、コールバック関数を実行(たとえば、コールバック)することができる他のコードに、引数として渡される関数を指す。少なくとも1つの実施例では、コールバックは、コンストラクタ及び/又はデストラクタのコードなどのコードを含む。少なくとも1つの実施例では、本明細書で説明される技法は、ユーザ供給されたデストラクタ・コードを利用する。少なくとも1つの実施例では、本明細書で説明される技法は、様々なC++オブジェクト(たとえば、デストラクタ・コード及び/又はコンストラクタ・コード)を受け付けるC++ラッパーを利用し、本明細書で説明される1つ又は複数の技法を用いて使用するために、それらをコンバートする。少なくとも1つの実施例では、本明細書で説明される技法は、ユーザ・オブジェクト参照が、グラフ、個々のノード、他のオブジェクト、及び/又はそれらの変形形態によって利用されるか又はさもなければ所有されることを可能にする。
【0015】
少なくとも1つの実施例では、(たとえば、前記オブジェクトをリリースするか又はさもなければ消去するための)デストラクタ実行は、任意の好適な様式で実施される。少なくとも1つの実施例では、同期参照は、CPUからのアクションによって管理された参照を指す。少なくとも1つの実施例では、オブジェクトは、前記オブジェクトを利用する任意のグラフ実行を切り抜けなければならない。少なくとも1つの実施例では、グラフ実行は、前記グラフが起動コールにおいて同期参照として保たれた任意のユーザ・オブジェクトへのアクセスを有する。少なくとも1つの実施例では、本明細書で説明される技法は、すべてのグラフ実行が任意の適切なユーザ・オブジェクトへのアクセスを有するように、グラフ動作を追跡する。少なくとも1つの実施例では、本明細書で説明される技法は、No CUDA順序付けとして示された順序付けを利用し、前記オブジェクト(たとえば、1つ又は複数のグラフによって利用されるオブジェクト)へのすべての同期参照がリリースされ、前記オブジェクトへのアクセスをもつすべてのグラフ実行が完了されると、プログラミング・モデルの1つ又は複数のシステムが、前記デストラクタの実行をスケジュールする。少なくとも1つの実施例では、前記システムは、他のデストラクタ又は前にエンキューされたタスクの後ろでブロックすることができる。少なくとも1つの実施例では、本明細書で説明される技法は、完全順序付け方式を利用し、Oによって示されるユーザ・オブジェクト、及びSによって示されるステートメントを仮定すれば、Oのすべての同期リリースが基本因果律順序(base causality order)でSに先行し、Oへのアクセスをもつすべてのグラフ実行が基本因果律順序でSに先行し、プログラミング・モデルの1つ又は複数のシステムは、Oの破棄が基本因果律順序でSに先行することを保証する。少なくとも1つの実施例では、本明細書で説明される技法は、完全順序付けと同様である、CPU順序付け限定方式(CPU ordering only scheme)を利用し、前記完全順序付け定義が、CPUスレッドによって実行されるステートメントSのみに適用される。
【0016】
少なくとも1つの実施例では、前記グラフによって所有されるか又はさもなければ利用される参照は、任意のコピー(たとえば、クローン、インスタンス化)によって保持される。少なくとも1つの実施例では、実行可能グラフが非同期的に破棄される(たとえば、それが起動されるが、同期されない)ときのイベントにおいて、1つ又は複数のシステムは、ユーザ・オブジェクトが前記グラフの実行を切り抜けることを保証する。少なくとも1つの実施例では、前記起動が同期された後に、残りの参照がリリースされ、前記デストラクタが非同期的に実行することになる。少なくとも1つの実施例では、子グラフ・ノード中のグラフによって所有される参照は、前記子グラフに関連する。少なくとも1つの実施例では、子グラフが更新されるか又は消去される場合、前記参照はそれに応じて変化する。少なくとも1つの実施例では、実行可能グラフ又は子グラフが(たとえば、cudaGraphExecUpdate又はcudaGraphExecChildGraphNodeSetParamsなどの1つ又は複数のAPI関数、或いは任意の好適なAPI関数を通して)更新された場合、新しいソース・グラフ中の前記参照が、クローニングされ、ターゲット・グラフ中の前記参照を置き換える。少なくとも1つの実施例では、前の起動(たとえば、実行のためのグラフ起動)が同期されない場合、リリースされることになる参照は、前記起動が実行し終えるまで保たれる。少なくとも1つの実施例では、ユーザ・オブジェクトへの最後の参照がリリースされたとき、1つ又は複数のシステムは、前記ユーザ・オブジェクトの破棄関数(たとえば、デストラクタ)をコールすることになる。
【0017】
少なくとも1つの実施例では、前記オブジェクトへの参照は、1つ又は複数のコンピュータ・プログラム及び/又はグラフの1つ又は複数の動作における前記オブジェクトへのポインタ、又は前記オブジェクトの他の使用を指す。少なくとも1つの実施例では、1つ又は複数のシステムは、前記グラフの個々のノードへの参照をアタッチする。少なくとも1つの実施例では、1つ又は複数のシステムは、特定のオブジェクトによって所有される参照を照会する。少なくとも1つの実施例では、1つ又は複数のシステムは、前記グラフが破棄されたとき、(たとえば、1つ又は複数のデストラクタを介して)最後の実行の後に起こるべきオブジェクト・クリーンアップをスケジュールする。
【0018】
少なくとも1つの実施例では、本明細書で説明される技法は、ユーザが、コールバック(たとえば、デストラクタ)を登録することを可能にし、コールバックは、様々な条件が満たされた(たとえば、カウンタの値が0に達した)後にコールされるために、内部参照計数機構(たとえば、カウンタ)を使用する。少なくとも1つの実施例では、コールバックは、前記グラフに登録され得、前記グラフ・ハンドル及び任意のクローンが破棄され、任意の非同期実行が完了されるまでコールされないことになる。少なくとも1つの実施例では、コールバックは、(たとえば、デストラクタを介した)オブジェクトの破棄のために使用される。少なくとも1つの実施例では、本明細書で説明される技法は、オブジェクト存続期間管理のために必要なグラフ・ハンドルに対する動作を追跡するための機構を提供する。少なくとも1つの実施例では、本明細書で説明される技法は、(たとえば、カウンタを介して示される)参照カウントが0に達するまで、コールバックの実行を延期する。
【0019】
少なくとも1つの実施例では、本明細書で説明される技法は、ユーザが、ハンドル(たとえば、CUDAハンドル)にデストラクタ・コールバックの実行を待機させることを可能にする。少なくとも1つの実施例では、本明細書で説明される技法は、参照が、グラフ、グラフのノード、依存性、及び/又はそれらの変形形態など、様々な場所において、アタッチ及び/又は操作されることを可能にする。少なくとも1つの実施例では、本明細書で説明される技法は、ストリームに適用可能であり、参照は、様々な非同期ワークロード(たとえば、ストリームワークロード)にアタッチされ得る。少なくとも1つの実施例では、本明細書で説明される技法は、デストラクタ・コールバックが、1つ又は複数のドライバ(たとえば、CUDAドライバ)に再帰的にコールすることを可能にする。
【0020】
図3~
図5は、少なくとも1つの実施例による、API関数のグラフィック表現を示す。少なくとも1つの実施例では、
図3~
図5に示されているAPI関数は、本明細書で説明されるもの(たとえば、
図1~
図2及び
図6~
図8に関して説明される技法)など、1つ又は複数の技法の一部として利用される。少なくとも1つの実施例では、
図3~
図5に示されているAPI関数は、1つ又は複数のCPU、GPU、GPGPU、PPU、及び/又はそれらの変形形態など、任意の好適なプロセッサ及び/又はプロセッサの組合せによって、並びに、並列でなど、任意の好適な順序及び/又は様式で、実施される。少なくとも1つの実施例では、
図3~
図5の各々は、APIコール及び応答中に含まれ得る情報の特定の集合を示すが、変形形態が本開示の範囲内にあり、APIコールは、より少数の又はより多くの情報構成要素を有することができ、これは、任意の好適な様式で示され得る。少なくとも1つの実施例では、同じAPI関数を使用して行われるすべてのAPIコールが同じ情報構成要素を含むとは限らない。少なくとも1つの実施例では、1つのパラメータについての重要な情報のタイプ及び/又は存在が、例示的な実例として、別のパラメータの値に依存することができる。少なくとも1つの実施例では、応答の構成要素についての重要な情報のタイプ及び/又は存在が、別のパラメータ、及び/又は前記応答をトリガしたAPIコールのパラメータの値に依存する。
【0021】
少なくとも1つの実施例では、本明細書で説明されるものなど、APIは、ドライバAPI又はランタイムAPIである。少なくとも1つの実施例では、ドライバAPIは、プログラミング・モデルに関して言及され得る、低レベルAPIである(たとえば、CUDAドライバAPI)。少なくとも1つの実施例では、ドライバAPIは、1つ又は複数のデバイスと直接対話する。少なくとも1つの実施例では、ランタイムAPIは、プログラミング・モデルに関して言及され得る、高レベルAPIである(たとえば、CUDAランタイムAPI)。少なくとも1つの実施例では、ランタイムAPIは、ドライバAPIを利用して動作する。ドライバAPI及びランタイムAPIに関するさらなる情報は、
図29の説明において見つけられ得る。
【0022】
少なくとも1つの実施例では、APIコールは、前記APIコールに対応する少なくともAPI関数を示すコードの実行の一部として行われる。少なくとも1つの実施例では、例示的な実例として、1つ又は複数のシステムは、CUDA、HIP、oneAPI、及び/又はそれらの変形形態など、1つ又は複数のプログラミング・モデルに関するコードの実行の一部として、APIコールを行い、応答を取得する。
【0023】
図3は、少なくとも1つの実施例による、ユーザ・オブジェクト作成APIコールの
図300を示す。前記ユーザ・オブジェクト作成APIコールに関するさらなる情報は、
図6の説明において見つけられ得る。少なくとも1つの実施例では、前記ユーザ・オブジェクト作成APIは、プログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)に関し得る、cudaUserObjectCreate、UserObjectCreate、及び/又は任意の好適な記法として示される。少なくとも1つの実施例では、前記ユーザ・オブジェクト作成APIは、1つ又は複数のプログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)の1つ又は複数のシステムが、デストラクタ及び参照カウントを示すデータ構造を指すユーザ・オブジェクトを作成することを引き起こす。少なくとも1つの実施例では、前記ユーザ・オブジェクトは、指定されたデストラクタ・コールバック及び初期参照カウントを示す。少なくとも1つの実施例では、前記ユーザ・オブジェクトは、コンピュータ・プログラムの動作において利用される、前記オブジェクト、メモリの領域、データ・オブジェクト、データ構造、及び/又は任意の好適なコンピューティング・リソースなど、コンピューティング・リソースに対応する。少なくとも1つの実施例では、前記ユーザ・オブジェクトは、前記コンピューティング・リソースへの参照を追跡するために利用され、前記参照カウントが0に達すると、前記デストラクタは、前記コンピューティング・リソースを破棄するか又はさもなければ消去するために呼び出される。
【0024】
少なくとも1つの実施例では、前記ユーザ・オブジェクト作成APIコールについてのパラメータは、「object_out」、「ptr」、「破棄」、「initialRefcount」、「フラグ」を含み、前記ユーザ・オブジェクトの態様をさらに定義する他のパラメータを含むことができる。少なくとも1つの実施例では、パラメータ「object_out」は、前記ユーザ・オブジェクトにハンドルを返すためのロケーションを示す。少なくとも1つの実施例では、パラメータ「ptr」は、破棄関数(たとえば、デストラクタ)に渡すためのポインタを示す。少なくとも1つの実施例では、パラメータ「破棄」は、前記1つ又は複数のコンピューティング・リソースがもはや使用中でないとき、1つ又は複数のコンピューティング・リソースを解放するためのコールバックを示す。少なくとも1つの実施例では、パラメータ「initialRefcount」は、前記オブジェクトを作成するための初期参照カウントの値を示し、初期参照はコーリング・スレッドによって所有される。少なくとも1つの実施例では、パラメータ「フラグ」は、1つ又は複数のフラグを示し、それらは、関数又はプロセス(たとえば、API関数)の1つ又は複数の特性を決定する、前記関数又はプロセスのための信号である値を参照する。少なくとも1つの実施例では、前記ユーザ・オブジェクト作成APIのためのフラグは、前記破棄コールバックがAPIによって待機され得ないことを示す、「UserObjectNoDestructorSync」として示されるフラグを含む。
【0025】
少なくとも1つの実施例では、1つ又は複数のシステムは、少なくとも、少なくとも1つ又は複数の関数(たとえば、デストラクタ)と、参照カウントとも呼ばれる参照のカウントを示す値とを符号化するか又はさもなければ示す前記ユーザ・オブジェクトを生成することによって、前記ユーザ・オブジェクト作成APIを実施する。少なくとも1つの実施例では、前記ユーザ・オブジェクト作成APIコールに対する応答は、ステータスを含む。少なくとも1つの実施例では、前記ユーザ・オブジェクトの作成を示す前記ユーザ・オブジェクト作成APIコールに続いて、前記ユーザ・オブジェクトが作成され、前記ユーザ・オブジェクトに対するハンドルが、パラメータ「object_out」によって指定されたロケーションにおいて返される。少なくとも1つの実施例では、前記ステータスは、前記ユーザ・オブジェクト作成APIコールのステータス指示を示すために、前記ユーザ・オブジェクト作成APIコールに応答して返される。少なくとも1つの実施例では、前記ステータス指示は、前記ユーザ・オブジェクト作成APIの1つ又は複数の動作が成功したのか失敗したのか、又は他のエラーが生じたかどうかを示す。
【0026】
図4は、少なくとも1つの実施例による、ユーザ・オブジェクト保持APIコールの
図400を示す。前記ユーザ・オブジェクト保持APIコールに関するさらなる情報は、
図7の説明において見つけられ得る。少なくとも1つの実施例では、前記ユーザ・オブジェクト保持APIは、プログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)に関し得る、cudaUserObjectRetain、UserObjectRetain、及び/又は任意の好適な記法として示される。少なくとも1つの実施例では、前記ユーザ・オブジェクト保持APIは、1つ又は複数のプログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)の1つ又は複数のシステムが、少なくとも、前記ユーザ・オブジェクトの前記参照カウントを、指定された値だけ増分することによって、前記ユーザ・オブジェクトへの参照を保持することを引き起こす。少なくとも1つの実施例では、1つ又は複数のシステムは、1つ又は複数のコンピューティング・プログラムによる、コンピューティング・リソース、又は任意の好適な情報への参照の数、及び/又はそれらの使用を追跡するために、前記ユーザ・オブジェクト保持APIを利用する。
【0027】
少なくとも1つの実施例では、前記ユーザ・オブジェクト保持APIコールについてのパラメータは、「オブジェクト」、「カウント」を含み、前記ユーザ・オブジェクトの態様をさらに定義する他のパラメータを含むことができる。少なくとも1つの実施例では、パラメータ「オブジェクト」は前記ユーザ・オブジェクトを示す。少なくとも1つの実施例では、パラメータ「カウント」は、保持すべき参照の数を示す。少なくとも1つの実施例では、1つ又は複数のシステムは、少なくとも、前記ユーザ・オブジェクトに関連する参照のカウントを(たとえば、保持すべき参照の前記示された数だけ)増加させるか又はさもなければ増分することによって、前記ユーザ・オブジェクト保持APIを実施する。少なくとも1つの実施例では、前記ユーザ・オブジェクト保持APIコールに対する応答は、ステータスを含む。少なくとも1つの実施例では、前記ユーザ・オブジェクト保持APIコールに続いて、パラメータ「オブジェクト」によって示された前記ユーザ・オブジェクトの前記参照カウントは、パラメータ「カウント」によって指定された値だけ増分される。少なくとも1つの実施例では、前記ステータスは、前記ユーザ・オブジェクト保持APIコールのステータス指示を示すために、前記ユーザ・オブジェクト保持APIコールに応答して返される。少なくとも1つの実施例では、前記ステータス指示は、前記ユーザ・オブジェクト保持APIの1つ又は複数の動作が成功したのか失敗したのか、又は他のエラーが生じたかどうかを示す。
【0028】
少なくとも1つの実施例では、グラフ保持ユーザ・オブジェクトAPIが、前記ユーザ・オブジェクト保持APIの1つ又は複数のプロセスを実施する。少なくとも1つの実施例では、前記ユーザ・オブジェクト保持APIは、前記グラフ保持ユーザ・オブジェクトAPIの1つ又は複数のプロセスを実施するために利用され得る。少なくとも1つの実施例では、前記グラフ保持ユーザ・オブジェクトAPIは、前記グラフから前記ユーザ・オブジェクトへの参照を保持し、及び/又は前記ユーザ・オブジェクトを1つ又は複数のグラフに関連付けるために利用され、前記グラフ保持ユーザ・オブジェクトAPIコールについての前記パラメータは、前記参照を関連付けるための前記グラフを示す「グラフ」と、前記参照を保持するための前記ユーザ・オブジェクトを示す「オブジェクト」と、前記グラフに追加すべき参照の数を示す「カウント」と、前記コーリング・スレッドからの参照を転送する「GraphUserObjectMove」フラグなどの様々なフラグを示す「フラグ」とを含む(たとえば、前記ユーザ・オブジェクトと前記グラフとの関連付けを示す)。
【0029】
図5は、少なくとも1つの実施例による、ユーザ・オブジェクト・リリースAPIコールの
図500を示す。前記ユーザ・オブジェクト・リリースAPIコールに関するさらなる情報は、
図8の説明において見つけられ得る。少なくとも1つの実施例では、前記ユーザ・オブジェクト・リリースAPIは、プログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)に関し得る、cudaUserObjectRelease、UserObjectRelease、及び/又は任意の好適な記法として示される。少なくとも1つの実施例では、前記ユーザ・オブジェクト・リリースAPIは、1つ又は複数のプログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)の1つ又は複数のシステムが、少なくとも、前記ユーザ・オブジェクトの前記参照カウントを、指定された値だけ減分することによって、前記ユーザ・オブジェクトへの参照をリリースすることを引き起こす。少なくとも1つの実施例では、1つ又は複数のシステムは、1つ又は複数のコンピューティング・プログラムによる、コンピューティング・リソース、又は任意の好適な情報への参照の数、及び/又はそれらの使用を追跡するために、前記ユーザ・オブジェクト・リリースAPIを利用する。
【0030】
少なくとも1つの実施例では、前記ユーザ・オブジェクト・リリースAPIコールについてのパラメータは、「オブジェクト」、「カウント」を含み、前記ユーザ・オブジェクトの態様をさらに定義する他のパラメータを含むことができる。少なくとも1つの実施例では、パラメータ「オブジェクト」は前記ユーザ・オブジェクトを示す。少なくとも1つの実施例では、パラメータ「カウント」は、リリースすべき参照の数を示す。少なくとも1つの実施例では、1つ又は複数のシステムは、少なくとも、前記ユーザ・オブジェクトに関連する参照のカウントを(たとえば、リリースすべき参照の前記示された数だけ)減少させるか又はさもなければ減分することによって、前記ユーザ・オブジェクト・リリースAPIを実施する。少なくとも1つの実施例では、前記ユーザ・オブジェクト・リリースAPIコールに対する応答は、ステータスを含む。少なくとも1つの実施例では、前記ユーザ・オブジェクト・リリースAPIコールに続いて、パラメータ「オブジェクト」によって示された前記ユーザ・オブジェクトの前記参照カウントは、パラメータ「カウント」によって指定された値だけ減分される。少なくとも1つの実施例では、前記ステータスは、前記ユーザ・オブジェクト・リリースAPIコールのステータス指示を示すために、前記ユーザ・オブジェクト・リリースAPIコールに応答して返される。少なくとも1つの実施例では、前記ステータス指示は、前記ユーザ・オブジェクト・リリースAPIの1つ又は複数の動作が成功したのか失敗したのか、又は他のエラーが生じたかどうかを示す。
【0031】
少なくとも1つの実施例では、グラフ・リリース・ユーザ・オブジェクトAPIが、前記ユーザ・オブジェクト・リリースAPIの1つ又は複数のプロセスを実施する。少なくとも1つの実施例では、前記ユーザ・オブジェクト・リリースAPIは、前記グラフ・リリース・ユーザ・オブジェクトAPIの1つ又は複数のプロセスを実施するために利用され得る。少なくとも1つの実施例では、前記グラフ・リリース・ユーザ・オブジェクトAPIは、前記グラフからの前記ユーザ・オブジェクト参照をリリースするために利用され、前記グラフ・リリース・ユーザ・オブジェクトAPIコールについての前記パラメータは、前記参照をリリースすることになる前記グラフを示す「グラフ」と、前記参照をリリースするための前記ユーザ・オブジェクトを示す「オブジェクト」と、リリースすべき参照の数を示す「カウント」とを含む。
【0032】
図6は、少なくとも1つの実施例による、コンピュータ・プログラムによる情報の使用を監視するために使用されるべきデータ構造を生成するプロセス600の一実例を示す。少なくとも1つの実施例では、プロセス600(或いは本明細書で説明される任意の他のプロセス、或いはそれらの変形形態及び/又は組合せ)の一部又は全部は、コンピュータ実行可能命令で構成された1つ又は複数のコンピュータ・システムの制御下で実施され、1つ又は複数のプロセッサ上で、ハードウェアによって、ソフトウェアによって、又はそれらの組合せによって集合的に実行するコード(たとえば、コンピュータ実行可能命令、1つ又は複数のコンピュータ・プログラム、又は1つ又は複数のアプリケーション)として実装される。少なくとも1つの実施例では、コードは、1つ又は複数のプロセッサによって実行可能な複数のコンピュータ可読命令を備えるコンピュータ・プログラムの形態で、コンピュータ可読記憶媒体に記憶される。少なくとも1つの実施例では、コンピュータ可読記憶媒体は非一時的コンピュータ可読媒体である。少なくとも1つの実施例では、プロセス600を実施するために使用可能な少なくともいくつかのコンピュータ可読命令は、一時的信号(たとえば、伝搬する一時的な電気又は電磁送信)のみを使用して記憶されない。少なくとも1つの実施例では、非一時的コンピュータ可読媒体は、必ずしも、一時的信号のトランシーバ内に非一時的データ・ストレージ回路要素(たとえば、バッファ、キャッシュ、及びキュー)を含むとは限らない。
【0033】
少なくとも1つの実施例では、プロセス600は、本開示で説明されるものなど、1つ又は複数のシステムによって実施される。少なくとも1つの実施例では、プロセス600は、1つ又は複数のプログラミング・モデルのシステムによって実施される。少なくとも1つの実施例では、プロセス600の1つ又は複数のプロセスは、連続、並列、及び/又はそれらの変形形態を含む、任意の好適な順序で、並びにCPU、GPU、PPU、及び/又はそれらの変形形態など、任意の好適な処理ユニットを使用して、実施される。
【0034】
少なくとも1つの実施例では、プロセス600の少なくとも一部を実施する前記システムは、602において、少なくとも、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するために少なくともAPIを示すコードを取得するための、実行可能コードを含む。少なくとも1つの実施例では、前記APIは、
図3に関して説明されたものなど、ユーザ・オブジェクト作成APIである。少なくとも1つの実施例では、前記1つ又は複数のデータ構造は、前記ユーザ・オブジェクトを含む。少なくとも1つの実施例では、前記情報は、前記オブジェクト、入力データ、データ・オブジェクト、データ構造、メモリの領域、及び/又はそれらの変形形態など、前記コンピュータ・プログラムによって利用される任意の好適なコンピューティング・リソースを含む。少なくとも1つの実施例では、前記APIは、
図3に関して説明されたものなど、パラメータ値を含む。少なくとも1つの実施例では、前記APIは、前記1つ又は複数のデータ構造に対応するロケーション(たとえば、前記1つ又は複数のデータ構造に対応するハンドルについてのロケーション)、参照の数、1つ又は複数の関数(たとえば、デストラクタ)、及び/又はそれらの変形形態を示す、パラメータ値を含む。
【0035】
少なくとも1つの実施例では、本明細書で説明されるものなど、前記コンピュータ・プログラムは、1つ又は複数のCPU、GPU、PPU、GPGPU、及び/又はそれらの変形形態など、任意の好適な処理ユニットによって実行可能な任意の好適なプログラムである。少なくとも1つの実施例では、本明細書で説明されるものなど、前記コンピュータ・プログラムは、1つ又は複数のグラフ・データ構造、グラフ・コード、及び/又はそれらの変形形態に対応する。少なくとも1つの実施例では、前記コードは、任意の好適なプログラミング言語を使用して、並びにCUDA、HIP、oneAPI、及び/又はそれらの変形形態など、任意の好適なプログラミング・モデルに関して、書き込まれる。
【0036】
少なくとも1つの実施例では、プロセス600の少なくとも一部を実施する前記システムは、604において、少なくとも、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するための、実行可能コードを含む。少なくとも1つの実施例では、前記システムは、前記APIを示す前記コードの実行の一部として前記APIを実施する。少なくとも1つの実施例では、前記システムは、少なくとも、前記1つ又は複数の関数(たとえば、デストラクタ)と、参照カウントとも呼ばれる、前記コンピュータ・プログラムに関連する参照のカウントを示す値とを符号化するか又はさもなければ示す前記1つ又は複数のデータ構造を生成する。少なくとも1つの実施例では、前記システムは、少なくとも、前記コンピュータ・プログラムによって利用される前記情報への参照の数を監視することによって、前記コンピュータ・プログラムによる前記情報の前記使用を監視する。少なくとも1つの実施例では、前記システムは、1つ又は複数のグラフ・データ構造による情報の使用を監視するために、前記1つ又は複数のデータ構造を前記1つ又は複数のグラフ・データ構造に関連付ける。少なくとも1つの実施例では、前記システムは、前記値が0に達したとき、前記1つ又は複数の関数の実行を引き起こす。
【0037】
図7は、少なくとも1つの実施例による、コンピュータ・プログラムによる情報の使用量が増加されることを引き起こすプロセス700の一実例を示す。少なくとも1つの実施例では、プロセス700(或いは本明細書で説明される任意の他のプロセス、或いはそれらの変形形態及び/又は組合せ)の一部又は全部は、コンピュータ実行可能命令で構成された1つ又は複数のコンピュータ・システムの制御下で実施され、1つ又は複数のプロセッサ上で、ハードウェアによって、ソフトウェアによって、又はそれらの組合せによって集合的に実行するコード(たとえば、コンピュータ実行可能命令、1つ又は複数のコンピュータ・プログラム、又は1つ又は複数のアプリケーション)として実装される。少なくとも1つの実施例では、コードは、1つ又は複数のプロセッサによって実行可能な複数のコンピュータ可読命令を備えるコンピュータ・プログラムの形態で、コンピュータ可読記憶媒体に記憶される。少なくとも1つの実施例では、コンピュータ可読記憶媒体は非一時的コンピュータ可読媒体である。少なくとも1つの実施例では、プロセス700を実施するために使用可能な少なくともいくつかのコンピュータ可読命令は、一時的信号(たとえば、伝搬する一時的な電気又は電磁送信)のみを使用して記憶されない。少なくとも1つの実施例では、非一時的コンピュータ可読媒体は、必ずしも、一時的信号のトランシーバ内に非一時的データ・ストレージ回路要素(たとえば、バッファ、キャッシュ、及びキュー)を含むとは限らない。
【0038】
少なくとも1つの実施例では、プロセス700は、本開示で説明されるものなど、1つ又は複数のシステムによって実施される。少なくとも1つの実施例では、プロセス700は、1つ又は複数のプログラミング・モデルのシステムによって実施される。少なくとも1つの実施例では、プロセス700の1つ又は複数のプロセスは、連続、並列、及び/又はそれらの変形形態を含む、任意の好適な順序で、並びにCPU、GPU、PPU、及び/又はそれらの変形形態など、任意の好適な処理ユニットを使用して、実施される。
【0039】
少なくとも1つの実施例では、プロセス700の少なくとも一部を実施する前記システムは、702において、少なくとも、コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすために少なくともAPIを示すコードを取得するための、実行可能コードを含む。少なくとも1つの実施例では、前記APIは、
図4に関して説明されたものなど、ユーザ・オブジェクト保持API又はグラフ保持ユーザ・オブジェクトAPIである。少なくとも1つの実施例では、前記APIは、
図4に関して説明されたものなど、パラメータ値を含む。少なくとも1つの実施例では、前記APIは、前記1つ又は複数のデータ構造、保持すべき参照の数、及び/又はそれらの変形形態を示す、パラメータ値を含む。少なくとも1つの実施例では、前記APIは、1つ又は複数のグラフ・データ構造及び/又は1つ又は複数のフラグを示す、パラメータ値を含む。
【0040】
少なくとも1つの実施例では、前記コンピュータ・プログラムは、1つ又は複数のCPU、GPU、PPU、GPGPU、及び/又はそれらの変形形態など、任意の好適な処理ユニットによって実行可能な任意の好適なプログラムである。少なくとも1つの実施例では、前記コンピュータ・プログラムは、前記1つ又は複数のグラフ・データ構造に関連し、前記システムは、前記1つ又は複数のグラフ・データ構造による情報の使用を追跡するために、少なくとも、前記1つ又は複数のデータ構造を前記1つ又は複数のグラフ・データ構造に関連付けることによって、前記APIを実施する。少なくとも1つの実施例では、前記コードは、任意の好適なプログラミング言語を使用して、並びにCUDA、HIP、oneAPI、及び/又はそれらの変形形態など、任意の好適なプログラミング・モデルに関して、書き込まれる。
【0041】
少なくとも1つの実施例では、プロセス700の少なくとも一部を実施する前記システムは、704において、少なくとも、コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するための、実行可能コードを含む。少なくとも1つの実施例では、前記システムは、前記APIを示す前記コードの実行の一部として前記APIを実施する。少なくとも1つの実施例では、前記システムは、少なくとも、前記コンピュータ・プログラムに関連する参照のカウントを示す、前記1つ又は複数のデータ構造(たとえば、ユーザ・オブジェクト)の値を、前記APIの前記パラメータ値によって示された保持すべき参照の前記数だけ増加させるか又はさもなければ増分することによって、前記APIを実施する。少なくとも1つの実施例では、前記システムは、少なくとも、前記コンピュータ・プログラムによる情報の増加された使用量(たとえば、前記オブジェクトなどのコンピューティング・リソースへのより多くの参照)を示すために前記APIを実施することによって、前記コンピュータ・プログラムによる前記情報の使用量が、前記情報の使用を監視するために使用される前記1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こす。
【0042】
図8は、少なくとも1つの実施例による、コンピュータ・プログラムによる情報の使用量が低減されることを引き起こすプロセス800の一実例を示す。少なくとも1つの実施例では、プロセス800(或いは本明細書で説明される任意の他のプロセス、或いはそれらの変形形態及び/又は組合せ)の一部又は全部は、コンピュータ実行可能命令で構成された1つ又は複数のコンピュータ・システムの制御下で実施され、1つ又は複数のプロセッサ上で、ハードウェアによって、ソフトウェアによって、又はそれらの組合せによって集合的に実行するコード(たとえば、コンピュータ実行可能命令、1つ又は複数のコンピュータ・プログラム、又は1つ又は複数のアプリケーション)として実装される。少なくとも1つの実施例では、コードは、1つ又は複数のプロセッサによって実行可能な複数のコンピュータ可読命令を備えるコンピュータ・プログラムの形態で、コンピュータ可読記憶媒体に記憶される。少なくとも1つの実施例では、コンピュータ可読記憶媒体は非一時的コンピュータ可読媒体である。少なくとも1つの実施例では、プロセス800を実施するために使用可能な少なくともいくつかのコンピュータ可読命令は、一時的信号(たとえば、伝搬する一時的な電気又は電磁送信)のみを使用して記憶されない。少なくとも1つの実施例では、非一時的コンピュータ可読媒体は、必ずしも、一時的信号のトランシーバ内に非一時的データ・ストレージ回路要素(たとえば、バッファ、キャッシュ、及びキュー)を含むとは限らない。
【0043】
少なくとも1つの実施例では、プロセス800は、本開示で説明されるものなど、1つ又は複数のシステムによって実施される。少なくとも1つの実施例では、プロセス800は、1つ又は複数のプログラミング・モデルのシステムによって実施される。少なくとも1つの実施例では、プロセス800の1つ又は複数のプロセスは、連続、並列、及び/又はそれらの変形形態を含む、任意の好適な順序で、並びにCPU、GPU、PPU、及び/又はそれらの変形形態など、任意の好適な処理ユニットを使用して、実施される。
【0044】
少なくとも1つの実施例では、プロセス800の少なくとも一部を実施する前記システムは、802において、少なくとも、コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすために少なくともAPIを示すコードを取得するための、実行可能コードを含む。少なくとも1つの実施例では、前記APIは、
図5に関して説明されたものなど、ユーザ・オブジェクト・リリースAPI又はグラフ・リリース・ユーザ・オブジェクトAPIである。少なくとも1つの実施例では、前記APIは、
図5に関して説明されたものなど、パラメータ値を含む。少なくとも1つの実施例では、前記APIは、前記1つ又は複数のデータ構造、リリースすべき参照の数、及び/又はそれらの変形形態を示す、パラメータ値を含む。少なくとも1つの実施例では、前記APIは、1つ又は複数のグラフ・データ構造を示すパラメータ値を含む。
【0045】
少なくとも1つの実施例では、前記コンピュータ・プログラムは、1つ又は複数のCPU、GPU、PPU、GPGPU、及び/又はそれらの変形形態など、任意の好適な処理ユニットによって実行可能な任意の好適なプログラムである。少なくとも1つの実施例では、前記コンピュータ・プログラムは、前記1つ又は複数のグラフ・データ構造に関連する。少なくとも1つの実施例では、前記コードは、任意の好適なプログラミング言語を使用して、並びにCUDA、HIP、oneAPI、及び/又はそれらの変形形態など、任意の好適なプログラミング・モデルに関して、書き込まれる。
【0046】
少なくとも1つの実施例では、プロセス800の少なくとも一部を実施する前記システムは、804において、少なくとも、コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するための、実行可能コードを含む。少なくとも1つの実施例では、前記システムは、前記APIを示す前記コードの実行の一部として前記APIを実施する。少なくとも1つの実施例では、前記システムは、少なくとも、前記コンピュータ・プログラムに関連する参照のカウントを示す、前記1つ又は複数のデータ構造(たとえば、ユーザ・オブジェクト)の値を、前記APIの前記パラメータ値によって示されたリリースすべき参照の前記数だけ低減するか又はさもなければ減分することによって、前記APIを実施する。少なくとも1つの実施例では、前記システムは、少なくとも、前記コンピュータ・プログラムによる情報の使用量の低減(たとえば、コンピューティング・リソースへのより少ない参照)を示すために前記APIを実施することによって、前記コンピュータ・プログラムによる前記情報の使用量が、前記情報の使用を監視するために使用される前記1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こす。少なくとも1つの実施例では、前記システムは、参照の前記カウントを示す前記値が0に達すると、前記コンピュータ・プログラムによって使用される前記情報(たとえば、前記オブジェクトなどのコンピューティング・リソース)を破棄するか又はさもなければ消去するために、1つ又は複数の関数(たとえば、デストラクタ)を呼び出す。
【0047】
先行する及び以下の説明では、少なくとも1つの実施例のより完全な理解を提供するために、多数の具体的な詳細が記載される。ただし、発明概念はこれらの具体的な詳細のうちの1つ又は複数なしに実施され得ることが当業者には明らかであろう。
【0048】
データ・センタ
図9は、少なくとも1つの実施例による、例示的なデータ・センタ900を示す。少なくとも1つの実施例では、データ・センタ900は、限定はしないが、データ・センタ・インフラストラクチャ層910と、フレームワーク層920と、ソフトウェア層930と、アプリケーション層940とを含む。
【0049】
少なくとも1つの実施例では、
図9に示されているように、データ・センタ・インフラストラクチャ層910は、リソース・オーケストレータ912と、グループ化されたコンピューティング・リソース914と、ノード・コンピューティング・リソース(「ノードC.R.」:node computing resource)916(1)~916(N)とを含み得、ここで、「N」は、任意のすべての正の整数を表す。少なくとも1つの実施例では、ノードC.R.916(1)~916(N)は、限定はしないが、任意の数の中央処理ユニット(「CPU」)又は(アクセラレータ、フィールド・プログラマブル・ゲート・アレイ(「FPGA」:field programmable gate array)、ネットワーク・デバイス中のデータ処理ユニット(「DPU」:data processing unit)、グラフィックス・プロセッサなどを含む)他のプロセッサ、メモリ・デバイス(たとえば、動的読取り専用メモリ)、ストレージ・デバイス(たとえば、ソリッド・ステート又はディスク・ドライブ)、ネットワーク入力/出力(「NW I/O」:network input/output)デバイス、ネットワーク・スイッチ、仮想機械(「VM」:virtual machine)、電力モジュール、及び冷却モジュールなどを含み得る。少なくとも1つの実施例では、ノードC.R.916(1)~916(N)の中からの1つ又は複数のノードC.R.は、上述のコンピューティング・リソースのうちの1つ又は複数を有するサーバであり得る。
【0050】
少なくとも1つの実施例では、グループ化されたコンピューティング・リソース914は、1つ又は複数のラック(図示せず)内に格納されたノードC.R.の別個のグループ化、又は様々な地理的ロケーション(同じく図示せず)においてデータ・センタ中に格納された多くのラックを含み得る。グループ化されたコンピューティング・リソース914内のノードC.R.の別個のグループ化は、1つ又は複数のワークロードをサポートするように構成されるか又は割り振られ得る、グループ化されたコンピュート・リソース、ネットワーク・リソース、メモリ・リソース、又はストレージ・リソースを含み得る。少なくとも1つの実施例では、CPU又はプロセッサを含むいくつかのノードC.R.は、1つ又は複数のワークロードをサポートするためのコンピュート・リソースを提供するために1つ又は複数のラック内でグループ化され得る。少なくとも1つの実施例では、1つ又は複数のラックはまた、任意の数の電力モジュール、冷却モジュール、及びネットワーク・スイッチを、任意の組合せで含み得る。
【0051】
少なくとも1つの実施例では、リソース・オーケストレータ912は、1つ又は複数のノードC.R.916(1)~916(N)及び/又はグループ化されたコンピューティング・リソース914を構成するか、又はさもなければ、制御し得る。少なくとも1つの実施例では、リソース・オーケストレータ912は、データ・センタ900のためのソフトウェア設計インフラストラクチャ(「SDI」:software design infrastructure)管理エンティティを含み得る。少なくとも1つの実施例では、リソース・オーケストレータ912は、ハードウェア、ソフトウェア又はそれらの何らかの組合せを含み得る。
【0052】
少なくとも1つの実施例では、
図9に示されているように、フレームワーク層920は、限定はしないが、ジョブ・スケジューラ932と、構成マネージャ934と、リソース・マネージャ936と、分散型ファイル・システム938とを含む。少なくとも1つの実施例では、フレームワーク層920は、ソフトウェア層930のソフトウェア952、及び/又はアプリケーション層940の1つ又は複数のアプリケーション942をサポートするためのフレームワークを含み得る。少なくとも1つの実施例では、ソフトウェア952又は(1つ又は複数の)アプリケーション942は、それぞれ、アマゾン・ウェブ・サービス、Google Cloud、及びMicrosoft Azureによって提供されるものなど、ウェブ・ベースのサービス・ソフトウェア又はアプリケーションを含み得る。少なくとも1つの実施例では、フレームワーク層920は、限定はしないが、大規模データ処理(たとえば、「ビック・データ」)のために分散型ファイル・システム938を利用し得るApache Spark(商標)(以下「Spark」)など、無料でオープンソースのソフトウェア・ウェブ・アプリケーション・フレームワークのタイプであり得る。少なくとも1つの実施例では、ジョブ・スケジューラ932は、データ・センタ900の様々な層によってサポートされるワークロードのスケジューリングを容易にするために、Sparkドライバを含み得る。少なくとも1つの実施例では、構成マネージャ934は、ソフトウェア層930、並びに大規模データ処理をサポートするためのSpark及び分散型ファイル・システム938を含むフレームワーク層920など、異なる層を構成することが可能であり得る。少なくとも1つの実施例では、リソース・マネージャ936は、分散型ファイル・システム938及びジョブ・スケジューラ932をサポートするようにマッピングされたか又は割り振られた、クラスタ化された又はグループ化されたコンピューティング・リソースを管理することが可能であり得る。少なくとも1つの実施例では、クラスタ化された又はグループ化されたコンピューティング・リソースは、データ・センタ・インフラストラクチャ層910において、グループ化されたコンピューティング・リソース914を含み得る。少なくとも1つの実施例では、リソース・マネージャ936は、リソース・オーケストレータ912と協調して、これらのマッピングされた又は割り振られたコンピューティング・リソースを管理し得る。
【0053】
少なくとも1つの実施例では、ソフトウェア層930中に含まれるソフトウェア952は、ノードC.R.916(1)~916(N)、グループ化されたコンピューティング・リソース914、及び/又はフレームワーク層920の分散型ファイル・システム938の少なくとも部分によって使用されるソフトウェアを含み得る。1つ又は複数のタイプのソフトウェアは、限定はしないが、インターネット・ウェブ・ページ検索ソフトウェアと、電子メール・ウイルス・スキャン・ソフトウェアと、データベース・ソフトウェアと、ストリーミング・ビデオ・コンテンツ・ソフトウェアとを含み得る。
【0054】
少なくとも1つの実施例では、アプリケーション層940中に含まれる(1つ又は複数の)アプリケーション942は、ノードC.R.916(1)~916(N)、グループ化されたコンピューティング・リソース914、及び/又はフレームワーク層920の分散型ファイル・システム938の少なくとも部分によって使用される1つ又は複数のタイプのアプリケーションを含み得る。少なくとも1つ又は複数のタイプのアプリケーションでは、限定はしないが、CUDAアプリケーションを含み得る。
【0055】
少なくとも1つの実施例では、構成マネージャ934、リソース・マネージャ936、及びリソース・オーケストレータ912のいずれかが、任意の技術的に実現可能な様式で獲得された任意の量及びタイプのデータに基づいて、任意の数及びタイプの自己修正アクションを実装し得る。少なくとも1つの実施例では、自己修正アクションは、データ・センタ900のデータ・センタ・オペレータを、不良の恐れのある構成を判定し、十分に利用されていない及び/又は性能の低いデータ・センタの部分を場合によっては回避することから解放し得る。
【0056】
少なくとも1つの実施例では、
図9に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図9に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図9に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図9に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0057】
コンピュータ・ベースのシステム
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的なコンピュータ・ベースのシステムを記載する。
【0058】
図10は、少なくとも1つの実施例による、処理システム1000を示す。少なくとも1つの実施例では、処理システム1000は、1つ又は複数のプロセッサ1002と1つ又は複数のグラフィックス・プロセッサ1008とを含み、単一プロセッサ・デスクトップ・システム、マルチプロセッサ・ワークステーション・システム、或いは多数のプロセッサ1002又はプロセッサ・コア1007を有するサーバ・システムであり得る。少なくとも1つの実施例では、処理システム1000は、モバイル・デバイス、ハンドヘルド・デバイス、又は組み込みデバイスにおいて使用するためのシステム・オン・チップ(「SoC」:system-on-a-chip)集積回路内に組み込まれた処理プラットフォームである。
【0059】
少なくとも1つの実施例では、処理システム1000は、サーバ・ベースのゲーミング・プラットフォーム、ゲーム・コンソール、メディア・コンソール、モバイル・ゲーミング・コンソール、ハンドヘルド・ゲーム・コンソール、又はオンライン・ゲーム・コンソールを含むことができるか、或いはそれらの内部に組み込まれ得る。少なくとも1つの実施例では、処理システム1000は、モバイル・フォン、スマート・フォン、タブレット・コンピューティング・デバイス又はモバイル・インターネット・デバイスである。少なくとも1つの実施例では、処理システム1000はまた、スマート・ウォッチ・ウェアラブル・デバイス、スマート・アイウェア・デバイス、拡張現実デバイス、又は仮想現実デバイスなどのウェアラブル・デバイスを含むことができるか、それらと結合することができるか、又はそれらの内部に組み込まれ得る。少なくとも1つの実施例では、処理システム1000は、1つ又は複数のプロセッサ1002と、1つ又は複数のグラフィックス・プロセッサ1008によって生成されるグラフィカル・インターフェースとを有するテレビ又はセット・トップ・ボックス・デバイスである。
【0060】
少なくとも1つの実施例では、1つ又は複数のプロセッサ1002は、各々、実行されたときにシステム及びユーザ・ソフトウェアのための動作を実施する命令を処理するための1つ又は複数のプロセッサ・コア1007を含む。少なくとも1つの実施例では、1つ又は複数のプロセッサ・コア1007の各々は、特定の命令セット1009を処理するように構成される。少なくとも1つの実施例では、命令セット1009は、複合命令セット・コンピューティング(「CISC」:Complex Instruction Set Computing)、縮小命令セット・コンピューティング(「RISC」:Reduced Instruction Set Computing)、又は超長命令語(「VLIW」:Very Long Instruction Word)を介したコンピューティングを容易にし得る。少なくとも1つの実施例では、プロセッサ・コア1007は、各々、異なる命令セット1009を処理し得、命令セット1009は、他の命令セットのエミュレーションを容易にするための命令を含み得る。少なくとも1つの実施例では、プロセッサ・コア1007はまた、デジタル信号プロセッサ(「DSP」:digital signal processor)などの他の処理デバイスを含み得る。
【0061】
少なくとも1つの実施例では、プロセッサ1002はキャッシュ・メモリ(「キャッシュ」)1004を含む。少なくとも1つの実施例では、プロセッサ1002は、単一の内部キャッシュ又は複数のレベルの内部キャッシュを有することができる。少なくとも1つの実施例では、キャッシュ・メモリは、プロセッサ1002の様々な構成要素の間で共有される。少なくとも1つの実施例では、プロセッサ1002はまた、外部キャッシュ(たとえば、レベル3(「L3」)キャッシュ又はラスト・レベル・キャッシュ(「LLC」:Last Level Cache))(図示せず)を使用し、外部キャッシュは、知られているキャッシュ・コヒーレンシ技法を使用してプロセッサ・コア1007の間で共有され得る。少なくとも1つの実施例では、追加として、レジスタ・ファイル1006がプロセッサ1002中に含まれ、レジスタ・ファイル1006は、異なるタイプのデータを記憶するための異なるタイプのレジスタ(たとえば、整数レジスタ、浮動小数点レジスタ、ステータス・レジスタ、及び命令ポインタ・レジスタ)を含み得る。少なくとも1つの実施例では、レジスタ・ファイル1006は、汎用レジスタ又は他のレジスタを含み得る。
【0062】
少なくとも1つの実施例では、1つ又は複数のプロセッサ1002は、アドレス、データ、又は制御信号などの通信信号を、プロセッサ1002と処理システム1000中の他の構成要素との間で送信するために、1つ又は複数のインターフェース・バス1010と結合される。少なくとも1つの実施例では、1つの実施例におけるインターフェース・バス1010は、ダイレクト・メディア・インターフェース(「DMI」:Direct Media Interface)バスのバージョンなどのプロセッサ・バスであり得る。少なくとも1つの実施例では、インターフェース・バス1010は、DMIバスに限定されず、1つ又は複数の周辺構成要素相互接続バス(たとえば、「PCI」:Peripheral Component Interconnect、PCI Express(「PCIe」))、メモリ・バス、又は他のタイプのインターフェース・バスを含み得る。少なくとも1つの実施例では、(1つ又は複数の)プロセッサ1002は、統合されたメモリ・コントローラ1016と、プラットフォーム・コントローラ・ハブ1030とを含む。少なくとも1つの実施例では、メモリ・コントローラ1016は、メモリ・デバイスと処理システム1000の他の構成要素との間の通信を容易にし、プラットフォーム・コントローラ・ハブ(「PCH」:platform controller hub)1030は、ローカル入力/出力(「I/O」:Input/Output)バスを介してI/Oデバイスへの接続を提供する。
【0063】
少なくとも1つの実施例では、メモリ・デバイス1020は、ダイナミック・ランダム・アクセス・メモリ(「DRAM」:dynamic random access memory)デバイス、スタティック・ランダム・アクセス・メモリ(「SRAM」:static random access memory)デバイス、フラッシュ・メモリ・デバイス、相変化メモリ・デバイス、又はプロセッサ・メモリとして働くのに好適な性能を有する何らかの他のメモリ・デバイスであり得る。少なくとも1つの実施例では、メモリ・デバイス1020は、1つ又は複数のプロセッサ1002がアプリケーション又はプロセスを実行するときの使用のためのデータ1022及び命令1021を記憶するために、処理システム1000のためのシステム・メモリとして動作することができる。少なくとも1つの実施例では、メモリ・コントローラ1016はまた、随意の外部グラフィックス・プロセッサ1012と結合し、外部グラフィックス・プロセッサ1012は、グラフィックス動作及びメディア動作を実施するために、プロセッサ1002中の1つ又は複数のグラフィックス・プロセッサ1008と通信し得る。少なくとも1つの実施例では、ディスプレイ・デバイス1011は、(1つ又は複数の)プロセッサ1002に接続することができる。少なくとも1つの実施例では、ディスプレイ・デバイス1011は、モバイル電子デバイス又はラップトップ・デバイスの場合のような内部ディスプレイ・デバイス、或いは、ディスプレイ・インターフェース(たとえば、DisplayPortなど)を介して取り付けられた外部ディスプレイ・デバイスのうちの1つ又は複数を含むことができる。少なくとも1つの実施例では、ディスプレイ・デバイス1011は、仮想現実(「VR」:virtual reality)アプリケーション又は拡張現実(「AR」:augmented reality)アプリケーションにおいて使用するための立体ディスプレイ・デバイスなどの頭部装着型ディスプレイ(「HMD」:head mounted display)を含むことができる。
【0064】
少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ1030は、周辺機器が高速I/Oバスを介してメモリ・デバイス1020及びプロセッサ1002に接続することを可能にする。少なくとも1つの実施例では、I/O周辺機器は、限定はしないが、オーディオ・コントローラ1046と、ネットワーク・コントローラ1034と、ファームウェア・インターフェース1028と、ワイヤレス・トランシーバ1026と、タッチ・センサ1025と、データ・ストレージ・デバイス1024(たとえば、ハード・ディスク・ドライブ、フラッシュ・メモリなど)とを含む。少なくとも1つの実施例では、データ・ストレージ・デバイス1024は、ストレージ・インターフェース(たとえば、SATA)を介して、或いはPCI又はPCIeなどの周辺バスを介して、接続することができる。少なくとも1つの実施例では、タッチ・センサ1025は、タッチ・スクリーン・センサ、圧力センサ、又は指紋センサを含むことができる。少なくとも1つの実施例では、ワイヤレス・トランシーバ1026は、Wi-Fiトランシーバ、Bluetoothトランシーバ、或いは3G、4G、又はロング・ターム・エボリューション(「LTE」:Long Term Evolution)トランシーバなどのモバイル・ネットワーク・トランシーバであり得る。少なくとも1つの実施例では、ファームウェア・インターフェース1028は、システム・ファームウェアとの通信を可能にし、たとえば、ユニファイド・エクステンシブル・ファームウェア・インターフェース(「UEFI」:unified extensible firmware interface)であり得る。少なくとも1つの実施例では、ネットワーク・コントローラ1034は、ワイヤード・ネットワークへのネットワーク接続を可能にすることができる。少なくとも1つの実施例では、高性能ネットワーク・コントローラ(図示せず)は、インターフェース・バス1010と結合する。少なくとも1つの実施例では、オーディオ・コントローラ1046は、マルチチャネル高精細度オーディオ・コントローラである。少なくとも1つの実施例では、処理システム1000は、レガシー(たとえば、パーソナル・システム2(「PS/2」:Personal System 2))デバイスを処理システム1000に結合するための随意のレガシーI/Oコントローラ1040を含む。少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ1030は、キーボードとマウス1043との組合せ、カメラ1044、又は他のUSB入力デバイスなど、1つ又は複数のユニバーサル・シリアル・バス(「USB」:Universal Serial Bus)コントローラ1042接続入力デバイスにも接続することができる。
【0065】
少なくとも1つの実施例では、メモリ・コントローラ1016及びプラットフォーム・コントローラ・ハブ1030のインスタンスが、外部グラフィックス・プロセッサ1012などの慎重な外部グラフィックス・プロセッサに組み込まれ得る。少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ1030及び/又はメモリ・コントローラ1016は、1つ又は複数のプロセッサ1002の外部にあり得る。たとえば、少なくとも1つの実施例では、処理システム1000は、外部のメモリ・コントローラ1016とプラットフォーム・コントローラ・ハブ1030とを含むことができ、それらは、(1つ又は複数の)プロセッサ1002と通信しているシステム・チップセット内のメモリ・コントローラ・ハブ及び周辺コントローラ・ハブとして構成され得る。
【0066】
少なくとも1つの実施例では、
図10に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図10に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図10に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図10に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0067】
図11は、少なくとも1つの実施例による、コンピュータ・システム1100を示す。少なくとも1つの実施例では、コンピュータ・システム1100は、相互接続されたデバイス及び構成要素をもつシステム、SOC、又は何らかの組合せであり得る。少なくとも1つの実施例では、コンピュータ・システム1100は、命令を実行するための実行ユニットを含み得るプロセッサ1102とともに形成される。少なくとも1つの実施例では、コンピュータ・システム1100は、限定はしないが、データを処理するためのアルゴリズムを実施するための論理を含む実行ユニットを採用するための、プロセッサ1102などの構成要素を含み得る。少なくとも1つの実施例では、コンピュータ・システム1100は、カリフォルニア州サンタクララのIntel Corporationから入手可能なPENTIUM(登録商標)プロセッサ・ファミリー、Xeon(商標)、Itanium(登録商標)、XScale(商標)及び/又はStrongARM(商標)、Intel(登録商標)Core(商標)、又はIntel(登録商標)Nervana(商標)マイクロプロセッサなどのプロセッサを含み得るが、(他のマイクロプロセッサ、エンジニアリング・ワークステーション、セット・トップ・ボックスなどを有するPCを含む)他のシステムも使用され得る。少なくとも1つの実施例では、コンピュータ・システム1100は、ワシントン州レドモンドのMicrosoft Corporationから入手可能なWINDOWSオペレーティング・システムのあるバージョンを実行し得るが、他のオペレーティング・システム(たとえば、UNIX(登録商標)及びLinux(登録商標))、組み込みソフトウェア、及び/又はグラフィカル・ユーザ・インターフェースも使用され得る。
【0068】
少なくとも1つの実施例では、コンピュータ・システム1100は、ハンドヘルド・デバイス及び組み込みアプリケーションなど、他のデバイスにおいて使用され得る。ハンドヘルド・デバイスのいくつかの実例は、セルラー・フォン、インターネット・プロトコル・デバイス、デジタル・カメラ、パーソナル・デジタル・アシスタント(「PDA」:personal digital assistant)、及びハンドヘルドPCを含む。少なくとも1つの実施例では、組み込みアプリケーションは、マイクロコントローラ、デジタル信号プロセッサ(DSP)、SoC、ネットワーク・コンピュータ(「NetPC」:network computer)、セット・トップ・ボックス、ネットワーク・ハブ、ワイド・エリア・ネットワーク(「WAN」:wide area network)スイッチ、又は1つ又は複数の命令を実施し得る任意の他のシステムを含み得る。
【0069】
少なくとも1つの実施例では、コンピュータ・システム1100は、限定はしないが、プロセッサ1102を含み得、プロセッサ1102は、限定はしないが、コンピュート・ユニファイド・デバイス・アーキテクチャ(「CUDA」)(CUDA(登録商標)は、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される)プログラムを実行するように構成され得る、1つ又は複数の実行ユニット1108を含み得る。少なくとも1つの実施例では、CUDAプログラムは、CUDAプログラミング言語で書かれたソフトウェア・アプリケーションの少なくとも一部分である。少なくとも1つの実施例では、コンピュータ・システム1100は、シングル・プロセッサ・デスクトップ又はサーバ・システムである。少なくとも1つの実施例では、コンピュータ・システム1100は、マルチプロセッサ・システムであり得る。少なくとも1つの実施例では、プロセッサ1102は、限定はしないが、CISCマイクロプロセッサ、RISCマイクロプロセッサ、VLIWマイクロプロセッサ、命令セットの組合せを実装するプロセッサ、又は、たとえばデジタル信号プロセッサなど、任意の他のプロセッサ・デバイスを含み得る。少なくとも1つの実施例では、プロセッサ1102は、プロセッサ・バス1110に結合され得、プロセッサ・バス1110は、プロセッサ1102とコンピュータ・システム1100中の他の構成要素との間でデータ信号を送信し得る。
【0070】
少なくとも1つの実施例では、プロセッサ1102は、限定はしないが、レベル1(「L1」)の内部キャッシュ・メモリ(「キャッシュ」)1104を含み得る。少なくとも1つの実施例では、プロセッサ1102は、単一の内部キャッシュ又は複数のレベルの内部キャッシュを有し得る。少なくとも1つの実施例では、キャッシュ・メモリは、プロセッサ1102の外部に存在し得る。少なくとも1つの実施例では、プロセッサ1102は、内部キャッシュと外部キャッシュの両方の組合せをも含み得る。少なくとも1つの実施例では、レジスタ・ファイル1106は、限定はしないが、整数レジスタ、浮動小数点レジスタ、ステータス・レジスタ、及び命令ポインタ・レジスタを含む様々なレジスタに、異なるタイプのデータを記憶し得る。
【0071】
少なくとも1つの実施例では、限定はしないが、整数演算及び浮動小数点演算を実施するための論理を含む実行ユニット1108も、プロセッサ1102中に存在し得る。プロセッサ1102は、いくつかのマクロ命令のためのマイクロコードを記憶するマイクロコード(「uコード」)読取り専用メモリ(「ROM」:read only memory)をも含み得る。少なくとも1つの実施例では、実行ユニット1108は、パック命令セット1109に対処するための論理を含み得る。少なくとも1つの実施例では、パック命令セット1109を、命令を実行するための関連する回路要素とともに汎用プロセッサ1102の命令セットに含めることによって、多くのマルチメディア・アプリケーションによって使用される演算が、汎用プロセッサ1102中のパック・データを使用して実施され得る。少なくとも1つの実施例では、多くのマルチメディア・アプリケーションが、パック・データの演算を実施するためにプロセッサのデータ・バスの全幅を使用することによって加速され、より効率的に実行され得、これは、一度に1つのデータ要素ずつ1つ又は複数の演算を実施するために、プロセッサのデータ・バスにわたってより小さい単位のデータを転送する必要をなくし得る。
【0072】
少なくとも1つの実施例では、実行ユニット1108はまた、マイクロコントローラ、組み込みプロセッサ、グラフィックス・デバイス、DSP、及び他のタイプの論理回路において使用され得る。少なくとも1つの実施例では、コンピュータ・システム1100は、限定はしないが、メモリ1120を含み得る。少なくとも1つの実施例では、メモリ1120は、DRAMデバイス、SRAMデバイス、フラッシュ・メモリ・デバイス、又は他のメモリ・デバイスとして実装され得る。メモリ1120は、プロセッサ1102によって実行され得るデータ信号によって表される(1つ又は複数の)命令1119及び/又はデータ1121を記憶し得る。
【0073】
少なくとも1つの実施例では、システム論理チップが、プロセッサ・バス1110及びメモリ1120に結合され得る。少なくとも1つの実施例では、システム論理チップは、限定はしないが、メモリ・コントローラ・ハブ(「MCH」:memory controller hub)1116を含み得、プロセッサ1102は、プロセッサ・バス1110を介してMCH1116と通信し得る。少なくとも1つの実施例では、MCH1116は、命令及びデータ・ストレージのための、並びにグラフィックス・コマンド、データ及びテクスチャのストレージのための、高帯域幅メモリ経路1118をメモリ1120に提供し得る。少なくとも1つの実施例では、MCH1116は、プロセッサ1102と、メモリ1120と、コンピュータ・システム1100中の他の構成要素との間でデータ信号をダイレクトし、プロセッサ・バス1110と、メモリ1120と、システムI/O1122との間でデータ信号をブリッジし得る。少なくとも1つの実施例では、システム論理チップは、グラフィックス・コントローラに結合するためのグラフィックス・ポートを提供し得る。少なくとも1つの実施例では、MCH1116は、高帯域幅メモリ経路1118を通してメモリ1120に結合され得、グラフィックス/ビデオ・カード1112は、アクセラレーテッド・グラフィックス・ポート(「AGP」:Accelerated Graphics Port)相互接続1114を介してMCH1116に結合され得る。
【0074】
少なくとも1つの実施例では、コンピュータ・システム1100は、MCH1116をI/Oコントローラ・ハブ(「ICH」:I/O controller hub)1130に結合するためのプロプライエタリ・ハブ・インターフェース・バスである、システムI/O1122を使用し得る。少なくとも1つの実施例では、ICH1130は、ローカルI/Oバスを介していくつかのI/Oデバイスに直接接続を提供し得る。少なくとも1つの実施例では、ローカルI/Oバスは、限定はしないが、周辺機器をメモリ1120、チップセット、及びプロセッサ1102に接続するための高速I/Oバスを含み得る。実例は、限定はしないが、オーディオ・コントローラ1129と、ファームウェア・ハブ(「フラッシュBIOS」)1128と、ワイヤレス・トランシーバ1126と、データ・ストレージ1124と、ユーザ入力インターフェース1125及びキーボード・インターフェースを含んでいるレガシーI/Oコントローラ1123と、USBなどのシリアル拡張ポート1127と、ネットワーク・コントローラ1134とを含み得る。データ・ストレージ1124は、ハード・ディスク・ドライブ、フロッピー・ディスク・ドライブ、CD-ROMデバイス、フラッシュ・メモリ・デバイス、又は他の大容量ストレージ・デバイスを備え得る。
【0075】
少なくとも1つの実施例では、
図11は、相互接続されたハードウェア・デバイス又は「チップ」を含むシステムを示す。少なくとも1つの実施例では、
図11は、例示的なSoCを示し得る。少なくとも1つの実施例では、
図11に示されているデバイスは、プロプライエタリ相互接続、標準相互接続(たとえば、PCIe)、又はそれらの何らかの組合せで相互接続され得る。少なくとも1つの実施例では、システム1100の1つ又は複数の構成要素は、コンピュート・エクスプレス・リンク(「CXL」:compute express link)相互接続を使用して相互接続される。
【0076】
少なくとも1つの実施例では、
図11に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図11に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図11に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図11に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0077】
図12は、少なくとも1つの実施例による、システム1200を示す。少なくとも1つの実施例では、システム1200は、プロセッサ1210を利用する電子デバイスである。少なくとも1つの実施例では、システム1200は、たとえば、限定はしないが、ノートブック、タワー・サーバ、ラック・サーバ、ブレード・サーバ、1つ又は複数の構内サービス・プロバイダ又はクラウド・サービス・プロバイダに通信可能に結合されたエッジ・デバイス、ラップトップ、デスクトップ、タブレット、モバイル・デバイス、電話、組み込みコンピュータ、或いは任意の他の好適な電子デバイスであり得る。
【0078】
少なくとも1つの実施例では、システム1200は、限定はしないが、任意の好適な数又は種類の構成要素、周辺機器、モジュール、又はデバイスに通信可能に結合されたプロセッサ1210を含み得る。少なくとも1つの実施例では、プロセッサ1210は、I
2Cバス、システム管理バス(「SMBus」:System Management Bus)、ロー・ピン・カウント(「LPC」:Low Pin Count)バス、シリアル周辺インターフェース(「SPI」:Serial Peripheral Interface)、高精細度オーディオ(「HDA」:High Definition Audio)バス、シリアル・アドバンス・テクノロジー・アタッチメント(「SATA」:Serial Advance Technology Attachment)バス、USB(バージョン1、2、3)、又はユニバーサル非同期受信機/送信機(「UART」:Universal Asynchronous Receiver/Transmitter)バスなど、バス又はインターフェースを使用して結合される。少なくとも1つの実施例では、
図12は、相互接続されたハードウェア・デバイス又は「チップ」を含むシステムを示す。少なくとも1つの実施例では、
図12は、例示的なSoCを示し得る。少なくとも1つの実施例では、
図12に示されているデバイスは、プロプライエタリ相互接続、標準相互接続(たとえば、PCIe)又はそれらの何らかの組合せで相互接続され得る。少なくとも1つの実施例では、
図12の1つ又は複数の構成要素は、CXL相互接続を使用して相互接続される。
【0079】
少なくとも1つの実施例では、
図12は、ディスプレイ1224、タッチ・スクリーン1225、タッチ・パッド1230、ニア・フィールド通信ユニット(「NFC」:Near Field Communication)1245、センサ・ハブ1240、熱センサ1246、エクスプレス・チップセット(「EC」:Express Chipset)1235、トラステッド・プラットフォーム・モジュール(「TPM」:Trusted Platform Module)1238、BIOS/ファームウェア/フラッシュ・メモリ(「BIOS、FWフラッシュ」:BIOS/firmware/flash memory)1222、DSP1260、ソリッド・ステート・ディスク(「SSD」:Solid State Disk)又はハード・ディスク・ドライブ(「HDD」:Hard Disk Drive)1220、ワイヤレス・ローカル・エリア・ネットワーク・ユニット(「WLAN」:wireless local area network)1250、Bluetoothユニット1252、ワイヤレス・ワイド・エリア・ネットワーク・ユニット(「WWAN」:Wireless Wide Area Network)1256、全地球測位システム(「GPS」:Global Positioning System)1255、USB3.0カメラなどのカメラ(「USB3.0カメラ」)1254、或いは、たとえばLPDDR3規格において実装された低電力ダブル・データ・レート(「LPDDR」:Low Power Double Data Rate)メモリ・ユニット(「LPDDR3」)1215を含み得る。これらの構成要素は、各々、任意の好適な様式で実装され得る。
【0080】
少なくとも1つの実施例では、上記で説明された構成要素を通して、他の構成要素がプロセッサ1210に通信可能に結合され得る。少なくとも1つの実施例では、加速度計1241と、周囲光センサ(「ALS」:Ambient Light Sensor)1242と、コンパス1243と、ジャイロスコープ1244とが、センサ・ハブ1240に通信可能に結合され得る。少なくとも1つの実施例では、熱センサ1239と、ファン1237と、キーボード1236と、タッチ・パッド1230とが、EC1235に通信可能に結合され得る。少なくとも1つの実施例では、スピーカー1263と、ヘッドフォン1264と、マイクロフォン(「mic」)1265とが、オーディオ・ユニット(「オーディオ・コーデック及びクラスdアンプ」)1262に通信可能に結合され得、オーディオ・ユニット1262は、DSP1260に通信可能に結合され得る。少なくとも1つの実施例では、オーディオ・ユニット1262は、たとえば、限定はしないが、オーディオ・コーダ/デコーダ(「コーデック」)及びクラスD増幅器を含み得る。少なくとも1つの実施例では、SIMカード(「SIM」)1257は、WWANユニット1256に通信可能に結合され得る。少なくとも1つの実施例では、WLANユニット1250及びBluetoothユニット1252などの構成要素、並びにWWANユニット1256は、次世代フォーム・ファクタ(「NGFF」:Next Generation Form Factor)において実装され得る。
【0081】
少なくとも1つの実施例では、
図12に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図12に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図12に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図12に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0082】
図13は、少なくとも1つの実施例による、例示的な集積回路1300を示す。少なくとも1つの実施例では、例示的な集積回路1300は、1つ又は複数のIPコアを使用して作製され得るSoCである。少なくとも1つの実施例では、集積回路1300は、1つ又は複数のアプリケーション・プロセッサ1305(たとえば、CPU、DPU)、少なくとも1つのグラフィックス・プロセッサ1310を含み、追加として、画像プロセッサ1315及び/又はビデオ・プロセッサ1320を含み得、それらのいずれも、モジュール式IPコアであり得る。少なくとも1つの実施例では、集積回路1300は、USBコントローラ1325、UARTコントローラ1330、SPI/SDIOコントローラ1335、及びI
2S/I
2Cコントローラ1340を含む周辺機器又はバス論理を含む。少なくとも1つの実施例では、集積回路1300は、高精細度マルチメディア・インターフェース(「HDMI(登録商標)」:high-definition multimedia interface)コントローラ1350及びモバイル・インダストリ・プロセッサ・インターフェース(「MIPI」:mobile industry processor interface)ディスプレイ・インターフェース1355のうちの1つ又は複数に結合されたディスプレイ・デバイス1345を含むことができる。少なくとも1つの実施例では、フラッシュ・メモリとフラッシュ・メモリ・コントローラとを含むフラッシュ・メモリ・サブシステム1360によって、ストレージが提供され得る。少なくとも1つの実施例では、SDRAM又はSRAMメモリ・デバイスへのアクセスのために、メモリ・コントローラ1365を介してメモリ・インターフェースが提供され得る。少なくとも1つの実施例では、いくつかの集積回路は、追加として、組み込みセキュリティ・エンジン1370を含む。
【0083】
少なくとも1つの実施例では、
図13に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図13に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図13に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図13に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0084】
図14は、少なくとも1つの実施例による、コンピューティング・システム1400を示す。少なくとも1つの実施例では、コンピューティング・システム1400は、メモリ・ハブ1405を含み得る相互接続経路を介して通信する1つ又は複数のプロセッサ1402とシステム・メモリ1404とを有する処理サブシステム1401を含む。少なくとも1つの実施例では、メモリ・ハブ1405は、チップセット構成要素内の別個の構成要素であり得るか、又は1つ又は複数のプロセッサ1402内に組み込まれ得る。少なくとも1つの実施例では、メモリ・ハブ1405は、通信リンク1406を介してI/Oサブシステム1411と結合する。少なくとも1つの実施例では、I/Oサブシステム1411は、コンピューティング・システム1400が1つ又は複数の入力デバイス1408からの入力を受信することを可能にすることができるI/Oハブ1407を含む。少なくとも1つの実施例では、I/Oハブ1407は、1つ又は複数のプロセッサ1402中に含まれ得るディスプレイ・コントローラが、1つ又は複数のディスプレイ・デバイス1410Aに出力を提供することを可能にすることができる。少なくとも1つの実施例では、I/Oハブ1407と結合された1つ又は複数のディスプレイ・デバイス1410Aは、ローカルの、内部の、又は組み込まれたディスプレイ・デバイスを含むことができる。
【0085】
少なくとも1つの実施例では、処理サブシステム1401は、バス又は他の通信リンク1413を介してメモリ・ハブ1405に結合された1つ又は複数の並列プロセッサ1412を含む。少なくとも1つの実施例では、通信リンク1413は、限定はしないがPCIeなど、任意の数の規格ベースの通信リンク技術又はプロトコルのうちの1つであり得るか、或いはベンダー固有の通信インターフェース又は通信ファブリックであり得る。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1412は、メニー・インテグレーテッド・コア・プロセッサなど、多数の処理コア及び/又は処理クラスタを含むことができる、算出に集中した並列又はベクトル処理システムを形成する。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1412は、グラフィックス処理サブシステムを形成し、グラフィックス処理サブシステムは、I/Oハブ1407を介して結合された1つ又は複数のディスプレイ・デバイス1410Aのうちの1つにピクセルを出力することができる。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1412はまた、ディスプレイ・コントローラと、1つ又は複数のディスプレイ・デバイス1410Bへの直接接続を可能にするためのディスプレイ・インターフェース(図示せず)とを含むことができる。
【0086】
少なくとも1つの実施例では、システム・ストレージ・ユニット1414は、I/Oハブ1407に接続して、コンピューティング・システム1400のためのストレージ機構を提供することができる。少なくとも1つの実施例では、I/Oハブ1407と、プラットフォームに組み込まれ得るネットワーク・アダプタ1418及び/又はワイヤレス・ネットワーク・アダプタ1419などの他の構成要素、並びに1つ又は複数のアドイン・デバイス1420を介して追加され得る様々な他のデバイスとの間の接続を可能にするためのインターフェース機構を提供するために、I/Oスイッチ1416が使用され得る。少なくとも1つの実施例では、ネットワーク・アダプタ1418は、イーサネット・アダプタ又は別のワイヤード・ネットワーク・アダプタであり得る。少なくとも1つの実施例では、ワイヤレス・ネットワーク・アダプタ1419は、Wi-Fi、Bluetooth、NFC、又は1つ又は複数のワイヤレス無線を含む他のネットワーク・デバイスのうちの1つ又は複数を含むことができる。
【0087】
少なくとも1つの実施例では、コンピューティング・システム1400は、USB又は他のポート接続、光学ストレージ・ドライブ、ビデオ・キャプチャ・デバイスなどを含む、I/Oハブ1407にも接続され得る、明示的に示されていない他の構成要素を含むことができる。少なくとも1つの実施例では、
図14中の様々な構成要素を相互接続する通信経路が、PCIベースのプロトコル(たとえば、PCIe)などの任意の好適なプロトコル、或いはNVLink高速相互接続などの他のバス又はポイントツーポイント通信インターフェース及び/又は(1つ又は複数の)プロトコル、或いは相互接続プロトコルを使用して、実装され得る。
【0088】
少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1412は、たとえばビデオ出力回路要素を含むグラフィックス及びビデオ処理のために最適化された回路要素を組み込み、グラフィックス処理ユニット(「GPU」)を構成する。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1412は、汎用処理のために最適化された回路要素を組み込む。少なくとも実施例では、コンピューティング・システム1400の構成要素は、単一の集積回路上の1つ又は複数の他のシステム要素と統合され得る。たとえば、少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1412、メモリ・ハブ1405、(1つ又は複数の)プロセッサ1402、及びI/Oハブ1407は、SoC集積回路に組み込まれ得る。少なくとも1つの実施例では、コンピューティング・システム1400の構成要素は、システム・イン・パッケージ(「SIP」:system in package)構成を形成するために、単一のパッケージに組み込まれ得る。少なくとも1つの実施例では、コンピューティング・システム1400の構成要素の少なくとも一部分は、マルチチップ・モジュール(「MCM」:multi-chip module)に組み込まれ得、マルチチップ・モジュールは、他のマルチチップ・モジュールと相互接続されてモジュール式コンピューティング・システムにすることができる。少なくとも1つの実施例では、I/Oサブシステム1411及びディスプレイ・デバイス1410Bは、コンピューティング・システム1400から省略される。
【0089】
少なくとも1つの実施例では、
図14に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図14に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図14に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図14に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0090】
処理システム
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的な処理システムを記載する。
【0091】
図15は、少なくとも1つの実施例による、加速処理ユニット(「APU」:accelerated processing unit)1500を示す。少なくとも1つの実施例では、APU1500は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、APU1500は、CUDAプログラムなど、アプリケーション・プログラムを実行するように構成され得る。少なくとも1つの実施例では、APU1500は、限定はしないが、コア複合体1510と、グラフィックス複合体1540と、ファブリック1560と、I/Oインターフェース1570と、メモリ・コントローラ1580と、ディスプレイ・コントローラ1592と、マルチメディア・エンジン1594とを含む。少なくとも1つの実施例では、APU1500は、限定はしないが、任意の数のコア複合体1510と、任意の数のグラフィックス複合体1550と、任意の数のディスプレイ・コントローラ1592と、任意の数のマルチメディア・エンジン1594とを、任意の組合せで含み得る。説明目的のために、同様のオブジェクトの複数のインスタンスは、オブジェクトを識別する参照番号と、必要な場合にインスタンスを識別する括弧付きの番号とともに、本明細書で示される。
【0092】
少なくとも1つの実施例では、コア複合体1510はCPUであり、グラフィックス複合体1540はGPUであり、APU1500は、限定はしないが、単一のチップ上に1510及び1540を組み込む処理ユニットである。少なくとも1つの実施例では、いくつかのタスクは、コア複合体1510に割り当てられ得、他のタスクは、グラフィックス複合体1540に割り当てられ得る。少なくとも1つの実施例では、コア複合体1510は、オペレーティング・システムなど、APU1500に関連するメイン制御ソフトウェアを実行するように構成される。少なくとも1つの実施例では、コア複合体1510は、APU1500のマスタ・プロセッサであり、他のプロセッサの動作を制御し、協調させる。少なくとも1つの実施例では、コア複合体1510は、グラフィックス複合体1540の動作を制御するコマンドを発行する。少なくとも1つの実施例では、コア複合体1510は、CUDAソース・コードから導出されたホスト実行可能コードを実行するように構成され得、グラフィックス複合体1540は、CUDAソース・コードから導出されたデバイス実行可能コードを実行するように構成され得る。
【0093】
少なくとも1つの実施例では、コア複合体1510は、限定はしないが、コア1520(1)~1520(4)と、L3キャッシュ1530とを含む。少なくとも1つの実施例では、コア複合体1510は、限定はしないが、任意の数のコア1520と、任意の数及びタイプのキャッシュとを、任意の組合せで含み得る。少なくとも1つの実施例では、コア1520は、特定の命令セット・アーキテクチャ(「ISA」:instruction set architecture)の命令を実行するように構成される。少なくとも1つの実施例では、各コア1520はCPUコアである。
【0094】
少なくとも1つの実施例では、各コア1520は、限定はしないが、フェッチ/復号ユニット1522と、整数実行エンジン1524と、浮動小数点実行エンジン1526と、L2キャッシュ1528とを含む。少なくとも1つの実施例では、フェッチ/復号ユニット1522は、命令をフェッチし、そのような命令を復号し、マイクロ・オペレーションを生成し、整数実行エンジン1524と浮動小数点実行エンジン1526とに別個のマイクロ命令をディスパッチする。少なくとも1つの実施例では、フェッチ/復号ユニット1522は、同時に、あるマイクロ命令を整数実行エンジン1524にディスパッチし、別のマイクロ命令を浮動小数点実行エンジン1526にディスパッチすることができる。少なくとも1つの実施例では、整数実行エンジン1524は、限定はしないが、整数及びメモリ演算を実行する。少なくとも1つの実施例では、浮動小数点エンジン1526は、限定はしないが、浮動小数点及びベクトル演算を実行する。少なくとも1つの実施例では、フェッチ復号ユニット1522は、整数実行エンジン1524と浮動小数点実行エンジン1526の両方を置き換える単一の実行エンジンに、マイクロ命令をディスパッチする。
【0095】
少なくとも1つの実施例では、iがコア1520の特定のインスタンスを表す整数である、各コア1520(i)は、コア1520(i)中に含まれるL2キャッシュ1528(i)にアクセスし得る。少なくとも1つの実施例では、jがコア複合体1510の特定のインスタンスを表す整数である、コア複合体1510(j)中に含まれる各コア1520は、コア複合体1510(j)中に含まれるL3キャッシュ1530(j)を介して、コア複合体1510(j)中に含まれる他のコア1520に接続される。少なくとも1つの実施例では、jがコア複合体1510の特定のインスタンスを表す整数である、コア複合体1510(j)中に含まれるコア1520は、コア複合体1510(j)中に含まれるL3キャッシュ1530(j)のすべてにアクセスすることができる。少なくとも1つの実施例では、L3キャッシュ1530は、限定はしないが、任意の数のスライスを含み得る。
【0096】
少なくとも1つの実施例では、グラフィックス複合体1540は、高度並列様式でコンピュート動作を実施するように構成され得る。少なくとも1つの実施例では、グラフィックス複合体1540は、描画コマンド、ピクセル動作、幾何学的算出、及びディスプレイに画像をレンダリングすることに関連する他の動作など、グラフィックス・パイプライン動作を実行するように構成される。少なくとも1つの実施例では、グラフィックス複合体1540は、グラフィックに関係しない動作を実行するように構成される。少なくとも1つの実施例では、グラフィックス複合体1540は、グラフィックに関係する動作とグラフィックに関係しない動作の両方を実行するように構成される。
【0097】
少なくとも1つの実施例では、グラフィックス複合体1540は、限定はしないが、任意の数のコンピュート・ユニット1550と、L2キャッシュ1542とを含む。少なくとも1つの実施例では、コンピュート・ユニット1550は、L2キャッシュ1542を共有する。少なくとも1つの実施例では、L2キャッシュ1542は区分けされる。少なくとも1つの実施例では、グラフィックス複合体1540は、限定はしないが、任意の数のコンピュート・ユニット1550と、(ゼロを含む)任意の数及びタイプのキャッシュとを含む。少なくとも1つの実施例では、グラフィックス複合体1540は、限定はしないが、任意の量の専用グラフィックス・ハードウェアを含む。
【0098】
少なくとも1つの実施例では、各コンピュート・ユニット1550は、限定はしないが、任意の数のSIMDユニット1552と、共有メモリ1554とを含む。少なくとも1つの実施例では、各SIMDユニット1552は、SIMDアーキテクチャを実装し、動作を並列に実施するように構成される。少なくとも1つの実施例では、各コンピュート・ユニット1550は、任意の数のスレッド・ブロックを実行し得るが、各スレッド・ブロックは、単一のコンピュート・ユニット1550上で実行する。少なくとも1つの実施例では、スレッド・ブロックは、限定はしないが、任意の数の実行のスレッドを含む。少なくとも1つの実施例では、ワークグループは、スレッド・ブロックである。少なくとも1つの実施例では、各SIMDユニット1552は、異なるワープを実行する。少なくとも1つの実施例では、ワープは、スレッドのグループ(たとえば、16個のスレッド)であり、ここで、ワープ中の各スレッドは、単一のスレッド・ブロックに属し、命令の単一のセットに基づいて、データの異なるセットを処理するように構成される。少なくとも1つの実施例では、ワープ中の1つ又は複数のスレッドを無効にするために、プレディケーションが使用され得る。少なくとも1つの実施例では、レーンはスレッドである。少なくとも1つの実施例では、ワーク・アイテムはスレッドである。少なくとも1つの実施例では、ウェーブフロントはワープである。少なくとも1つの実施例では、スレッド・ブロック中の異なるウェーブフロントは、互いに同期し、共有メモリ1554を介して通信し得る。
【0099】
少なくとも1つの実施例では、ファブリック1560は、コア複合体1510、グラフィックス複合体1540、I/Oインターフェース1570、メモリ・コントローラ1580、ディスプレイ・コントローラ1592、及びマルチメディア・エンジン1594にわたるデータ及び制御送信を容易にするシステム相互接続である。少なくとも1つの実施例では、APU1500は、限定はしないが、ファブリック1560に加えて又はそれの代わりに、任意の量及びタイプのシステム相互接続を含み得、それは、APU1500の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする。少なくとも1つの実施例では、I/Oインターフェース1570は、任意の数及びタイプのI/Oインターフェース(たとえば、PCI、PCI-Extended(「PCI-X」)、PCIe、ギガビット・イーサネット(「GBE」:gigabit Ethernet)、USBなど)を表す。少なくとも1つの実施例では、様々なタイプの周辺デバイスがI/Oインターフェース1570に結合される。少なくとも1つの実施例では、I/Oインターフェース1570に結合される周辺デバイスは、限定はしないが、キーボード、マウス、プリンタ、スキャナ、ジョイスティック又は他のタイプのゲーム・コントローラ、メディア記録デバイス、外部ストレージ・デバイス、ネットワーク・インターフェース・カードなどを含み得る。
【0100】
少なくとも1つの実施例では、ディスプレイ・コントローラAMD92は、液晶ディスプレイ(「LCD」:liquid crystal display)デバイスなど、1つ又は複数のディスプレイ・デバイス上に画像を表示する。少なくとも1つの実施例では、マルチメディア・エンジン1594は、限定はしないが、ビデオ・デコーダ、ビデオ・エンコーダ、画像信号プロセッサなど、マルチメディアに関係する任意の量及びタイプの回路要素を含む。少なくとも1つの実施例では、メモリ・コントローラ1580は、APU1500と統一システム・メモリ1590との間のデータ転送を容易にする。少なくとも1つの実施例では、コア複合体1510とグラフィックス複合体1540とは、統一システム・メモリ1590を共有する。
【0101】
少なくとも1つの実施例では、APU1500は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ1580及びメモリ・デバイス(たとえば、共有メモリ1554)を含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、APU1500は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ1628、L3キャッシュ1530、及びL2キャッシュ1542)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、コア1520、コア複合体1510、SIMDユニット1552、コンピュート・ユニット1550、及びグラフィックス複合体1540)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
【0102】
少なくとも1つの実施例では、
図15に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図15に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図15に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図15に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0103】
図16は、少なくとも1つの実施例による、CPU1600を示す。少なくとも1つの実施例では、CPU1600は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、CPU1600は、アプリケーション・プログラムを実行するように構成され得る。少なくとも1つの実施例では、CPU1600は、オペレーティング・システムなど、メイン制御ソフトウェアを実行するように構成される。少なくとも1つの実施例では、CPU1600は、外部GPU(図示せず)の動作を制御するコマンドを発行する。少なくとも1つの実施例では、CPU1600は、CUDAソース・コードから導出されたホスト実行可能コードを実行するように構成され得、外部GPUは、そのようなCUDAソース・コードから導出されたデバイス実行可能コードを実行するように構成され得る。少なくとも1つの実施例では、CPU1600は、限定はしないが、任意の数のコア複合体1610と、ファブリック1660と、I/Oインターフェース1670と、メモリ・コントローラ1680とを含む。
【0104】
少なくとも1つの実施例では、コア複合体1610は、限定はしないが、コア1620(1)~1620(4)と、L3キャッシュ1630とを含む。少なくとも1つの実施例では、コア複合体1610は、限定はしないが、任意の数のコア1620と、任意の数及びタイプのキャッシュとを、任意の組合せで含み得る。少なくとも1つの実施例では、コア1620は、特定のISAの命令を実行するように構成される。少なくとも1つの実施例では、各コア1620はCPUコアである。
【0105】
少なくとも1つの実施例では、各コア1620は、限定はしないが、フェッチ/復号ユニット1622と、整数実行エンジン1624と、浮動小数点実行エンジン1626と、L2キャッシュ1628とを含む。少なくとも1つの実施例では、フェッチ/復号ユニット1622は、命令をフェッチし、そのような命令を復号し、マイクロ・オペレーションを生成し、整数実行エンジン1624と浮動小数点実行エンジン1626とに別個のマイクロ命令をディスパッチする。少なくとも1つの実施例では、フェッチ/復号ユニット1622は、同時に、あるマイクロ命令を整数実行エンジン1624にディスパッチし、別のマイクロ命令を浮動小数点実行エンジン1626にディスパッチすることができる。少なくとも1つの実施例では、整数実行エンジン1624は、限定はしないが、整数及びメモリ演算を実行する。少なくとも1つの実施例では、浮動小数点エンジン1626は、限定はしないが、浮動小数点及びベクトル演算を実行する。少なくとも1つの実施例では、フェッチ復号ユニット1622は、整数実行エンジン1624と浮動小数点実行エンジン1626の両方を置き換える単一の実行エンジンに、マイクロ命令をディスパッチする。
【0106】
少なくとも1つの実施例では、iがコア1620の特定のインスタンスを表す整数である、各コア1620(i)は、コア1620(i)中に含まれるL2キャッシュ1628(i)にアクセスし得る。少なくとも1つの実施例では、jがコア複合体1610の特定のインスタンスを表す整数である、コア複合体1610(j)中に含まれる各コア1620は、コア複合体1610(j)中に含まれるL3キャッシュ1630(j)を介して、コア複合体1610(j)中の他のコア1620に接続される。少なくとも1つの実施例では、jがコア複合体1610の特定のインスタンスを表す整数である、コア複合体1610(j)中に含まれるコア1620は、コア複合体1610(j)中に含まれるL3キャッシュ1630(j)のすべてにアクセスすることができる。少なくとも1つの実施例では、L3キャッシュ1630は、限定はしないが、任意の数のスライスを含み得る。
【0107】
少なくとも1つの実施例では、ファブリック1660は、コア複合体1610(1)~1610(N)(ここで、Nは0よりも大きい整数である)、I/Oインターフェース1670、及びメモリ・コントローラ1680にわたるデータ及び制御送信を容易にするシステム相互接続である。少なくとも1つの実施例では、CPU1600は、限定はしないが、ファブリック1660に加えて又はそれの代わりに、任意の量及びタイプのシステム相互接続を含み得、それは、CPU1600の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする。少なくとも1つの実施例では、I/Oインターフェース1670は、任意の数及びタイプのI/Oインターフェース(たとえば、PCI、PCI-X、PCIe、GBE、USBなど)を表す。少なくとも1つの実施例では、様々なタイプの周辺デバイスが、I/Oインターフェース1670に結合される。少なくとも1つの実施例では、I/Oインターフェース1670に結合される周辺デバイスは、限定はしないが、ディスプレイ、キーボード、マウス、プリンタ、スキャナ、ジョイスティック又は他のタイプのゲーム・コントローラ、メディア記録デバイス、外部ストレージ・デバイス、ネットワーク・インターフェース・カードなどを含み得る。
【0108】
少なくとも1つの実施例では、メモリ・コントローラ1680は、CPU1600とシステム・メモリ1690との間のデータ転送を容易にする。少なくとも1つの実施例では、コア複合体1610とグラフィックス複合体1640とは、システム・メモリ1690を共有する。少なくとも1つの実施例では、CPU1600は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ1680及びメモリ・デバイスを含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、CPU1600は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ1628及びL3キャッシュ1630)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、コア1620及びコア複合体1610)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
【0109】
少なくとも1つの実施例では、
図16に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図16に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図16に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図16に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0110】
図17は、少なくとも1つの実施例による、例示的なアクセラレータ統合スライス1790を示す。本明細書で使用される「スライス」は、アクセラレータ統合回路の処理リソースの指定部分を備える。少なくとも1つの実施例では、アクセラレータ統合回路は、グラフィックス加速モジュール中に含まれる複数のグラフィックス処理エンジンの代わりに、キャッシュ管理、メモリ・アクセス、コンテキスト管理、及び割込み管理サービスを提供する。グラフィックス処理エンジンは、各々、別個のGPUを備え得る。代替的に、グラフィックス処理エンジンは、GPU内に、グラフィックス実行ユニット、メディア処理エンジン(たとえば、ビデオ・エンコーダ/デコーダ)、サンプラ、及びblitエンジンなど、異なるタイプのグラフィックス処理エンジンを備え得る。少なくとも1つの実施例では、グラフィックス加速モジュールは、複数のグラフィックス処理エンジンをもつGPUであり得る。少なくとも1つの実施例では、グラフィックス処理エンジンは、共通のパッケージ、ライン・カード、又はチップ上に組み込まれた個々のGPUであり得る。
【0111】
システム・メモリ1714内のアプリケーション実効アドレス空間1782は、プロセス要素1783を記憶する。一実施例では、プロセス要素1783は、プロセッサ1707上で実行されるアプリケーション1780からのGPU呼出し1781に応答して、記憶される。プロセス要素1783は、対応するアプリケーション1780のプロセス状態を含んでいる。プロセス要素1783に含まれているワーク記述子(「WD」:work descriptor)1784は、アプリケーションによって要求される単一のジョブであり得るか、又はジョブのキューに対するポインタを含んでいることがある。少なくとも1つの実施例では、WD1784は、アプリケーション実効アドレス空間1782におけるジョブ要求キューに対するポインタである。
【0112】
グラフィックス加速モジュール1746及び/又は個々のグラフィックス処理エンジンは、システム中のプロセスのすべて又はサブセットによって共有され得る。少なくとも1つの実施例では、プロセス状態を設定し、WD1784をグラフィックス加速モジュール1746に送出して、仮想化環境中でジョブを開始するためのインフラストラクチャが、含められ得る。
【0113】
少なくとも1つの実施例では、専用プロセス・プログラミング・モデルは、実装固有である。このモデルでは、単一のプロセスが、グラフィックス加速モジュール1746又は個々のグラフィックス処理エンジンを所有する。グラフィックス加速モジュール1746が単一のプロセスによって所有されるので、ハイパーバイザは、所有パーティションについてアクセラレータ統合回路を初期化し、グラフィックス加速モジュール1746が割り当てられたとき、オペレーティング・システムは、所有プロセスについてアクセラレータ統合回路を初期化する。
【0114】
動作時、アクセラレータ統合スライス1790中のWDフェッチ・ユニット1791は、グラフィックス加速モジュール1746の1つ又は複数のグラフィックス処理エンジンによって行われるべきであるワークの指示を含む、次のWD1784をフェッチする。示されているように、WD1784からのデータは、レジスタ1745に記憶され、メモリ管理ユニット(「MMU」:memory management unit)1739、割込み管理回路1747、及び/又はコンテキスト管理回路1748によって使用され得る。たとえば、MMU1739の一実施例は、OS仮想アドレス空間1785内のセグメント/ページ・テーブル1786にアクセスするためのセグメント/ページ・ウォーク回路要素を含む。割込み管理回路1747は、グラフィックス加速モジュール1746から受信された割込みイベント(「INT」:interrupt)1792を処理し得る。グラフィックス動作を実施するとき、グラフィックス処理エンジンによって生成された実効アドレス1793は、MMU1739によって実アドレスにトランスレートされる。
【0115】
一実施例では、レジスタ1745の同じセットが、各グラフィックス処理エンジン、及び/又はグラフィックス加速モジュール1746について複製され、ハイパーバイザ又はオペレーティング・システムによって初期化され得る。これらの複製されたレジスタの各々は、アクセラレータ統合スライス1790中に含められ得る。ハイパーバイザによって初期化され得る例示的なレジスタが、表1に示されている。
【表1】
【0116】
オペレーティング・システムによって初期化され得る例示的なレジスタが、表2に示されている。
【表2】
【0117】
一実施例では、各WD1784は、特定のグラフィックス加速モジュール1746及び/又は特定のグラフィックス処理エンジンに固有である。WD1784は、ワークを行うためにグラフィックス処理エンジンによって必要とされるすべての情報を含んでいるか、又は、WD1784は、完了されるべきワークのコマンド・キューをアプリケーションが設定したメモリ・ロケーションに対するポインタであり得る。
【0118】
少なくとも1つの実施例では、
図17に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図17に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図17に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図17に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0119】
図18A~
図18Bは、少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す。少なくとも1つの実施例では、例示的なグラフィックス・プロセッサのうちのいずれかは、1つ又は複数のIPコアを使用して作製され得る。示されているものに加えて、少なくとも1つの実施例では、追加のグラフィックス・プロセッサ/コア、周辺インターフェース・コントローラ、又は汎用プロセッサ・コアを含む他の論理及び回路が含まれ得る。少なくとも1つの実施例では、例示的なグラフィックス・プロセッサは、SoC内での使用のためのものである。
【0120】
図18Aは、少なくとも1つの実施例による、1つ又は複数のIPコアを使用して作製され得るSoC集積回路の例示的なグラフィックス・プロセッサ1810を示す。
図18Bは、少なくとも1つの実施例による、1つ又は複数のIPコアを使用して作製され得るSoC集積回路の追加の例示的なグラフィックス・プロセッサ1840を示す。少なくとも1つの実施例では、
図18Aのグラフィックス・プロセッサ1810は、低電力グラフィックス・プロセッサ・コアである。少なくとも1つの実施例では、
図18Bのグラフィックス・プロセッサ1840は、より高性能のグラフィックス・プロセッサ・コアである。少なくとも1つの実施例では、グラフィックス・プロセッサ1810、1840の各々は、
図13のグラフィックス・プロセッサ1310の変形態であり得る。
【0121】
少なくとも1つの実施例では、グラフィックス・プロセッサ1810は、頂点プロセッサ1805と、1つ又は複数のフラグメント・プロセッサ1815A~1815N(たとえば、1815A、1815B、1815C、1815D~1815N-1、及び1815N)とを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1810は、別個の論理を介して異なるシェーダ・プログラムを実行することができ、それにより、頂点プロセッサ1805は、頂点シェーダ・プログラムのための動作を実行するように最適化され、1つ又は複数のフラグメント・プロセッサ1815A~1815Nは、フラグメント又はピクセル・シェーダ・プログラムのためのフラグメント(たとえば、ピクセル)シェーディング動作を実行する。少なくとも1つの実施例では、頂点プロセッサ1805は、3Dグラフィックス・パイプラインの頂点処理段階を実施し、プリミティブ及び頂点データを生成する。少なくとも1つの実施例では、(1つ又は複数の)フラグメント・プロセッサ1815A~1815Nは、頂点プロセッサ1805によって生成されたプリミティブ及び頂点データを使用して、ディスプレイ・デバイス上に表示されるフレーム・バッファを作り出す。少なくとも1つの実施例では、(1つ又は複数の)フラグメント・プロセッサ1815A~1815Nは、OpenGL APIにおいて提供されるようなフラグメント・シェーダ・プログラムを実行するように最適化され、OpenGL APIは、Direct 3D APIにおいて提供されるようなピクセル・シェーダ・プログラムと同様の動作を実施するために使用され得る。
【0122】
少なくとも1つの実施例では、グラフィックス・プロセッサ1810は、追加として、1つ又は複数のMMU1820A~1820Bと、(1つ又は複数の)キャッシュ1825A~1825Bと、(1つ又は複数の)回路相互接続1830A~1830Bとを含む。少なくとも1つの実施例では、1つ又は複数のMMU1820A~1820Bは、頂点プロセッサ1805及び/又は(1つ又は複数の)フラグメント・プロセッサ1815A~1815Nを含む、グラフィックス・プロセッサ1810のための仮想-物理アドレス・マッピングを提供し、それらは、1つ又は複数のキャッシュ1825A~1825Bに記憶された頂点又は画像/テクスチャ・データに加えて、メモリに記憶された頂点又は画像/テクスチャ・データを参照し得る。少なくとも1つの実施例では、1つ又は複数のMMU1820A~1820Bは、
図13の1つ又は複数のアプリケーション・プロセッサ1305、画像プロセッサ1315、及び/又はビデオ・プロセッサ1320に関連する1つ又は複数のMMUを含む、システム内の他のMMUと同期され得、それにより、各プロセッサ1305~1320は、共有又は統一仮想メモリ・システムに参加することができる。少なくとも1つの実施例では、1つ又は複数の回路相互接続1830A~1830Bは、グラフィックス・プロセッサ1810が、SoCの内部バスを介して又は直接接続を介してのいずれかで、SoC内の他のIPコアとインターフェースすることを可能にする。
【0123】
少なくとも1つの実施例では、グラフィックス・プロセッサ1840は、
図18Aのグラフィックス・プロセッサ1810の1つ又は複数のMMU1820A~1820Bと、キャッシュ1825A~1825Bと、回路相互接続1830A~1830Bとを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1840は、1つ又は複数のシェーダ・コア1855A~1855N(たとえば、1855A、1855B、1855C、1855D、1855E、1855F~1855N-1、及び1855N)を含み、1つ又は複数のシェーダ・コア1855A~1855Nは、単一のコア、又はタイプ、又はコアが、頂点シェーダ、フラグメント・シェーダ、及び/又はコンピュート・シェーダを実装するためのシェーダ・プログラム・コードを含むすべてのタイプのプログラマブル・シェーダ・コードを実行することができる統一シェーダ・コア・アーキテクチャを提供する。少なくとも1つの実施例では、シェーダ・コアの数は変動することができる。少なくとも1つの実施例では、グラフィックス・プロセッサ1840は、1つ又は複数のシェーダ・コア1855A~1855Nに実行スレッドをディスパッチするためのスレッド・ディスパッチャとして作用するコア間タスク・マネージャ1845と、たとえばシーン内のローカル空間コヒーレンスを利用するため、又は内部キャッシュの使用を最適化するために、シーンについてのレンダリング動作が画像空間において下位区分される、タイル・ベースのレンダリングのためのタイリング動作を加速するためのタイリング・ユニット1858とを含む。
【0124】
少なくとも1つの実施例では、
図18A~
図18Bに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図18A~
図18Bに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図18A~
図18Bに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図18A~
図18Bに図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0125】
図19Aは、少なくとも1つの実施例による、グラフィックス・コア1900を示す。少なくとも1つの実施例では、グラフィックス・コア1900は、
図13のグラフィックス・プロセッサ1310内に含まれ得る。少なくとも1つの実施例では、グラフィックス・コア1900は、
図18Bの場合のような統一シェーダ・コア1855A~1855Nであり得る。少なくとも1つの実施例では、グラフィックス・コア1900は、共有命令キャッシュ1902と、テクスチャ・ユニット1918と、キャッシュ/共有メモリ1920とを含み、それらは、グラフィックス・コア1900内の実行リソースに共通である。少なくとも1つの実施例では、グラフィックス・コア1900は、複数のスライス1901A~1901N、又は各コアについてのパーティションを含むことができ、グラフィックス・プロセッサは、グラフィックス・コア1900の複数のインスタンスを含むことができる。スライス1901A~1901Nは、ローカル命令キャッシュ1904A~1904Nと、スレッド・スケジューラ1906A~1906Nと、スレッド・ディスパッチャ1908A~1908Nと、レジスタのセット1910A~1910Nとを含むサポート論理を含むことができる。少なくとも1つの実施例では、スライス1901A~1901Nは、追加機能ユニット(「AFU」:additional function unit)1912A~1912N、浮動小数点ユニット(「FPU」:floating-point unit)1914A~1914N、整数算術論理ユニット(「ALU」:integer arithmetic logic unit)1916~1916N、アドレス算出ユニット(「ACU」:address computational unit)1913A~1913N、倍精度浮動小数点ユニット(「DPFPU」:double-precision floating-point unit)1915A~1915N、及び行列処理ユニット(「MPU」:matrix processing unit)1917A~1917Nのセットを含むことができる。
【0126】
少なくとも1つの実施例では、FPU1914A~1914Nは、単精度(32ビット)及び半精度(16ビット)の浮動小数点演算を実施することができ、DPFPU1915A~1915Nは、倍精度(64ビット)の浮動小数点演算を実施する。少なくとも1つの実施例では、ALU1916A~1916Nは、8ビット、16ビット、及び32ビットの精度で可変精度整数演算を実施することができ、混合精度演算のために構成され得る。少なくとも1つの実施例では、MPU1917A~1917Nも、半精度浮動小数点演算と8ビット整数演算とを含む、混合精度行列演算のために構成され得る。少なくとも1つの実施例では、MPU1917~1917Nは、加速汎用行列-行列乗算(「GEMM」:general matrix to matrix multiplication)のサポートを可能にすることを含む、CUDAプログラムを加速するための様々な行列演算を実施することができる。少なくとも1つの実施例では、AFU1912A~1912Nは、三角関数演算(たとえば、サイン、コサインなど)を含む、浮動小数点ユニット又は整数ユニットによってサポートされていない追加の論理演算を実施することができる。
【0127】
図19Bは、少なくとも1つの実施例による、汎用グラフィックス処理ユニット(「GPGPU」:general-purpose graphics processing unit)1930を示す。少なくとも1つの実施例では、GPGPU1930は、高度並列であり、マルチチップ・モジュール上での導入に好適である。少なくとも1つの実施例では、GPGPU1930は、高度並列コンピュート動作がGPUのアレイによって実施されることを可能にするように構成され得る。少なくとも1つの実施例では、GPGPU1930は、CUDAプログラムのための実行時間を改善するためにマルチGPUクラスタを作成するために、GPGPU1930の他のインスタンスに直接リンクされ得る。少なくとも1つの実施例では、GPGPU1930は、ホスト・プロセッサとの接続を可能にするためのホスト・インターフェース1932を含む。少なくとも1つの実施例では、ホスト・インターフェース1932は、PCIeインターフェースである。少なくとも1つの実施例では、ホスト・インターフェース1932は、ベンダー固有の通信インターフェース又は通信ファブリックであり得る。少なくとも1つの実施例では、GPGPU1930は、ホスト・プロセッサからコマンドを受信し、グローバル・スケジューラ1934を使用して、それらのコマンドに関連する実行スレッドを、コンピュート・クラスタ1936A~1936Hのセットに分散させる。少なくとも1つの実施例では、コンピュート・クラスタ1936A~1936Hは、キャッシュ・メモリ1938を共有する。少なくとも1つの実施例では、キャッシュ・メモリ1938は、コンピュート・クラスタ1936A~1936H内のキャッシュ・メモリのためのより高レベルのキャッシュとして働くことができる。
【0128】
少なくとも1つの実施例では、GPGPU1930は、メモリ・コントローラ1942A~1942Bのセットを介してコンピュート・クラスタ1936A~1936Hと結合されたメモリ1944A~1944Bを含む。少なくとも1つの実施例では、メモリ1944A~1944Bは、DRAM、又は、グラフィックス・ダブル・データ・レート(「GDDR」:graphics double data rate)メモリを含む同期グラフィックス・ランダム・アクセス・メモリ(「SGRAM」:synchronous graphics random access memory)などのグラフィックス・ランダム・アクセス・メモリを含む、様々なタイプのメモリ・デバイスを含むことができる。
【0129】
少なくとも1つの実施例では、コンピュート・クラスタ1936A~1936Hは、各々、
図19Aのグラフィックス・コア1900などのグラフィックス・コアのセットを含み、グラフィックス・コアのセットは、CUDAプログラムに関連する算出に適したものを含む、様々な精度で算出動作を実施することができる複数のタイプの整数及び浮動小数点論理ユニットを含むことができる。たとえば、少なくとも1つの実施例では、コンピュート・クラスタ1936A~1936Hの各々における浮動小数点ユニットの少なくともサブセットは、16ビット又は32ビットの浮動小数点演算を実施するように構成され得、浮動小数点ユニットの異なるサブセットは、64ビットの浮動小数点演算を実施するように構成され得る。
【0130】
少なくとも1つの実施例では、GPGPU1930の複数のインスタンスは、コンピュート・クラスタとして動作するように構成され得る。コンピュート・クラスタ1936A~1936Hは、同期及びデータ交換のための任意の技術的に実現可能な通信技法を実装し得る。少なくとも1つの実施例では、GPGPU1930の複数のインスタンスは、ホスト・インターフェース1932を介して通信する。少なくとも1つの実施例では、GPGPU1930は、I/Oハブ1939を含み、I/Oハブ1939は、GPGPU1930を、GPGPU1930の他のインスタンスへの直接接続を可能にするGPUリンク1940と結合する。少なくとも1つの実施例では、GPUリンク1940は、GPGPU1930の複数のインスタンス間での通信及び同期を可能にする専用GPU-GPUブリッジに結合される。少なくとも1つの実施例では、GPUリンク1940は、他のGPGPU1930又は並列プロセッサにデータを送信及び受信するために高速相互接続と結合される。少なくとも1つの実施例では、GPGPU1930の複数のインスタンスは、別個のデータ処理システムに位置し、ホスト・インターフェース1932を介してアクセス可能であるネットワーク・デバイスを介して通信する。少なくとも1つの実施例では、GPUリンク1940は、ホスト・インターフェース1932に加えて、又はその代替として、ホスト・プロセッサへの接続を可能にするように構成され得る。少なくとも1つの実施例では、GPGPU1930は、CUDAプログラムを実行するように構成され得る。
【0131】
少なくとも1つの実施例では、
図19A~
図19Bに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図19A~
図19Bに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図19A~
図19Bに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図19A~
図19Bに図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0132】
図20Aは、少なくとも1つの実施例による、並列プロセッサ2000を示す。少なくとも1つの実施例では、並列プロセッサ2000の様々な構成要素は、プログラマブル・プロセッサ、特定用途向け集積回路(「ASIC」:application specific integrated circuit)、又はFPGAなど、1つ又は複数の集積回路デバイスを使用して実装され得る。
【0133】
少なくとも1つの実施例では、並列プロセッサ2000は並列処理ユニット2002を含む。少なくとも1つの実施例では、並列処理ユニット2002は、並列処理ユニット2002の他のインスタンスを含む、他のデバイスとの通信を可能にするI/Oユニット2004を含む。少なくとも1つの実施例では、I/Oユニット2004は、他のデバイスに直接接続され得る。少なくとも1つの実施例では、I/Oユニット2004は、メモリ・ハブ2005など、ハブ又はスイッチ・インターフェースの使用を介して他のデバイスと接続する。少なくとも1つの実施例では、メモリ・ハブ2005とI/Oユニット2004との間の接続は、通信リンクを形成する。少なくとも1つの実施例では、I/Oユニット2004は、ホスト・インターフェース2006及びメモリ・クロスバー2016と接続し、ホスト・インターフェース2006は、処理動作を実施することを対象とするコマンドを受信し、メモリ・クロスバー2016は、メモリ動作を実施することを対象とするコマンドを受信する。
【0134】
少なくとも1つの実施例では、ホスト・インターフェース2006が、I/Oユニット2004を介してコマンド・バッファを受信したとき、ホスト・インターフェース2006は、それらのコマンドを実施するためのワーク動作をフロント・エンド2008に向けることができる。少なくとも1つの実施例では、フロント・エンド2008はスケジューラ2010と結合し、スケジューラ2010は、コマンド又は他のワーク・アイテムを処理アレイ2012に分散させるように構成される。少なくとも1つの実施例では、スケジューラ2010は、処理アレイ2012にタスクが分散される前に、処理アレイ2012が適切に構成され、有効な状態にあることを確実にする。少なくとも1つの実施例では、スケジューラ2010は、マイクロコントローラ上で実行しているファームウェア論理を介して実装される。少なくとも1つの実施例では、マイクロコントローラ実装スケジューラ2010は、複雑なスケジューリング及びワーク分散動作を、粗い粒度及び細かい粒度において実施するように構成可能であり、処理アレイ2012上で実行しているスレッドの迅速なプリエンプション及びコンテキスト切替えを可能にする。少なくとも1つの実施例では、ホスト・ソフトウェアは、処理アレイ2012上でのスケジューリングのためのワークロードを、複数のグラフィックス処理ドアベルのうちの1つを介して証明することができる。少なくとも1つの実施例では、ワークロードは、次いで、スケジューラ2010を含むマイクロコントローラ内のスケジューラ2010論理によって、処理アレイ2012にわたって自動的に分散され得る。
【0135】
少なくとも1つの実施例では、処理アレイ2012は、最高「N」個のクラスタ(たとえば、クラスタ2014A、クラスタ2014B~クラスタ2014N)を含むことができる。少なくとも1つの実施例では、処理アレイ2012の各クラスタ2014A~2014Nは、多数の同時スレッドを実行することができる。少なくとも1つの実施例では、スケジューラ2010は、様々なスケジューリング及び/又はワーク分散アルゴリズムを使用して処理アレイ2012のクラスタ2014A~2014Nにワークを割り振ることができ、それらのアルゴリズムは、プログラム又は算出の各タイプについて生じるワークロードに応じて変動し得る。少なくとも1つの実施例では、スケジューリングは、スケジューラ2010によって動的に対処され得るか、又は処理アレイ2012による実行のために構成されたプログラム論理のコンパイル中に、コンパイラ論理によって部分的に支援され得る。少なくとも1つの実施例では、処理アレイ2012の異なるクラスタ2014A~2014Nは、異なるタイプのプログラムを処理するために、又は異なるタイプの算出を実施するために割り振られ得る。
【0136】
少なくとも1つの実施例では、処理アレイ2012は、様々なタイプの並列処理動作を実施するように構成され得る。少なくとも1つの実施例では、処理アレイ2012は、汎用並列コンピュート動作を実施するように構成される。たとえば、少なくとも1つの実施例では、処理アレイ2012は、ビデオ及び/又はオーディオ・データをフィルタリングすること、物理動作を含むモデリング動作を実施すること、及びデータ変換を実施することを含む処理タスクを実行するための論理を含むことができる。
【0137】
少なくとも1つの実施例では、処理アレイ2012は、並列グラフィックス処理動作を実施するように構成される。少なくとも1つの実施例では、処理アレイ2012は、限定はしないが、テクスチャ動作を実施するためのテクスチャ・サンプリング論理、並びにテッセレーション論理及び他の頂点処理論理を含む、そのようなグラフィックス処理動作の実行をサポートするための追加の論理を含むことができる。少なくとも1つの実施例では、処理アレイ2012は、限定はしないが、頂点シェーダ、テッセレーション・シェーダ、ジオメトリ・シェーダ、及びピクセル・シェーダなど、グラフィックス処理関係シェーダ・プログラムを実行するように構成され得る。少なくとも1つの実施例では、並列処理ユニット2002は、処理のためにI/Oユニット2004を介してシステム・メモリからデータを転送することができる。少なくとも1つの実施例では、処理中に、転送されたデータは、処理中にオンチップ・メモリ(たとえば、並列プロセッサ・メモリ2022)に記憶され、次いでシステム・メモリに書き戻され得る。
【0138】
少なくとも1つの実施例では、並列処理ユニット2002がグラフィックス処理を実施するために使用されるとき、スケジューラ2010は、処理アレイ2012の複数のクラスタ2014A~2014Nへのグラフィックス処理動作の分散をより良く可能にするために、処理ワークロードをほぼ等しいサイズのタスクに分割するように構成され得る。少なくとも1つの実施例では、処理アレイ2012の部分は、異なるタイプの処理を実施するように構成され得る。たとえば、少なくとも1つの実施例では、表示のために、レンダリングされた画像を作り出すために、第1の部分は、頂点シェーディング及びトポロジ生成を実施するように構成され得、第2の部分は、テッセレーション及びジオメトリ・シェーディングを実施するように構成され得、第3の部分は、ピクセル・シェーディング又は他のスクリーン空間動作を実施するように構成され得る。少なくとも1つの実施例では、クラスタ2014A~2014Nのうちの1つ又は複数によって作り出された中間データは、中間データがさらなる処理のためにクラスタ2014A~2014N間で送信されることを可能にするために、バッファに記憶され得る。
【0139】
少なくとも1つの実施例では、処理アレイ2012は、実行されるべき処理タスクをスケジューラ2010を介して受信することができ、スケジューラ2010は、処理タスクを定義するコマンドをフロント・エンド2008から受信する。少なくとも1つの実施例では、処理タスクは、処理されるべきデータのインデックス、たとえば、表面(パッチ)データ、プリミティブ・データ、頂点データ、及び/又はピクセル・データ、並びに、データがどのように処理されるべきであるか(たとえば、どのプログラムが実行されるべきであるか)を定義する状態パラメータ及びコマンドを含むことができる。少なくとも1つの実施例では、スケジューラ2010は、タスクに対応するインデックスをフェッチするように構成され得るか、又はフロント・エンド2008からインデックスを受信し得る。少なくとも1つの実施例では、フロント・エンド2008は、入って来るコマンド・バッファ(たとえば、バッチ・バッファ、プッシュ・バッファなど)によって指定されるワークロードが始動される前に、処理アレイ2012が有効な状態に構成されることを確実にするように構成され得る。
【0140】
少なくとも1つの実施例では、並列処理ユニット2002の1つ又は複数のインスタンスの各々は、並列プロセッサ・メモリ2022と結合することができる。少なくとも1つの実施例では、並列プロセッサ・メモリ2022は、メモリ・クロスバー2016を介してアクセスされ得、メモリ・クロスバー2016は、処理アレイ2012並びにI/Oユニット2004からメモリ要求を受信することができる。少なくとも1つの実施例では、メモリ・クロスバー2016は、メモリ・インターフェース2018を介して並列プロセッサ・メモリ2022にアクセスすることができる。少なくとも1つの実施例では、メモリ・インターフェース2018は、複数のパーティション・ユニット(たとえば、パーティション・ユニット2020A、パーティション・ユニット2020B~パーティション・ユニット2020N)を含むことができ、複数のパーティション・ユニットは、各々、並列プロセッサ・メモリ2022の一部分(たとえば、メモリ・ユニット)に結合することができる。少なくとも1つの実施例では、パーティション・ユニット2020A~2020Nの数は、メモリ・ユニットの数に等しくなるように構成され、それにより、第1のパーティション・ユニット2020Aは、対応する第1のメモリ・ユニット2024Aを有し、第2のパーティション・ユニット2020Bは、対応するメモリ・ユニット2024Bを有し、第Nのパーティション・ユニット2020Nは、対応する第Nのメモリ・ユニット2024Nを有する。少なくとも1つの実施例では、パーティション・ユニット2020A~2020Nの数は、メモリ・デバイスの数に等しくないことがある。
【0141】
少なくとも1つの実施例では、メモリ・ユニット2024A~2024Nは、GDDRメモリを含むSGRAMなど、DRAM又はグラフィックス・ランダム・アクセス・メモリを含む、様々なタイプのメモリ・デバイスを含むことができる。少なくとも1つの実施例では、メモリ・ユニット2024A~2024Nは、限定はしないが高帯域幅メモリ(「HBM」:high bandwidth memory)を含む、3D積層メモリをも含み得る。少なくとも1つの実施例では、並列プロセッサ・メモリ2022の利用可能な帯域幅を効率的に使用するために、フレーム・バッファ又はテクスチャ・マップなどのレンダー・ターゲットが、メモリ・ユニット2024A~2024Nにわたって記憶されて、パーティション・ユニット2020A~2020Nが、各レンダー・ターゲットの部分を並列に書き込むことを可能にし得る。少なくとも1つの実施例では、ローカル・キャッシュ・メモリと併せてシステム・メモリを利用する統一メモリ設計に有利なように、並列プロセッサ・メモリ2022のローカル・インスタンスが除外され得る。
【0142】
少なくとも1つの実施例では、処理アレイ2012のクラスタ2014A~2014Nのうちのいずれか1つは、並列プロセッサ・メモリ2022内のメモリ・ユニット2024A~2024Nのいずれかに書き込まれることになるデータを処理することができる。少なくとも1つの実施例では、メモリ・クロスバー2016は、各クラスタ2014A~2014Nの出力を、出力に対して追加の処理動作を実施することができる任意のパーティション・ユニット2020A~2020Nに転送するか、又は別のクラスタ2014A~2014Nに転送するように構成され得る。少なくとも1つの実施例では、各クラスタ2014A~2014Nは、様々な外部メモリ・デバイスから読み取るか、又はそれに書き込むために、メモリ・クロスバー2016を通してメモリ・インターフェース2018と通信することができる。少なくとも1つの実施例では、メモリ・クロスバー2016は、I/Oユニット2004と通信するためのメモリ・インターフェース2018への接続、並びに、並列プロセッサ・メモリ2022のローカル・インスタンスへの接続を有し、これは、異なるクラスタ2014A~2014N内の処理ユニットが、システム・メモリ、又は並列処理ユニット2002にローカルでない他のメモリと通信することを可能にする。少なくとも1つの実施例では、メモリ・クロスバー2016は、クラスタ2014A~2014Nとパーティション・ユニット2020A~2020Nとの間でトラフィック・ストリームを分離するために、仮想チャネルを使用することができる。
【0143】
少なくとも1つの実施例では、並列処理ユニット2002の複数のインスタンスは、単一のアドイン・カード上で提供され得るか、又は複数のアドイン・カードが相互接続され得る。少なくとも1つの実施例では、並列処理ユニット2002の異なるインスタンスは、異なるインスタンスが異なる数の処理コア、異なる量のローカル並列プロセッサ・メモリ、及び/又は他の構成の差を有する場合でも、相互動作するように構成され得る。たとえば、少なくとも1つの実施例では、並列処理ユニット2002のいくつかのインスタンスは、他のインスタンスに対してより高い精度の浮動小数点ユニットを含むことができる。少なくとも1つの実施例では、並列処理ユニット2002又は並列プロセッサ2000の1つ又は複数のインスタンスを組み込んだシステムは、限定はしないが、デスクトップ、ラップトップ、又はハンドヘルド・パーソナル・コンピュータ、サーバ、ワークステーション、ゲーム・コンソール、及び/又は組み込みシステムを含む、様々な構成及びフォーム・ファクタにおいて実装され得る。
【0144】
図20Bは、少なくとも1つの実施例による、処理クラスタ2094を示す。少なくとも1つの実施例では、処理クラスタ2094は、並列処理ユニット内に含まれる。少なくとも1つの実施例では、処理クラスタ2094は、
図20の処理クラスタ2014A~2014Nのうちの1つである。少なくとも1つの実施例では、処理クラスタ2094は、多くのスレッドを並列で実行するように構成され得、「スレッド」という用語は、入力データの特定のセットに対して実行している特定のプログラムのインスタンスを指す。少なくとも1つの実施例では、複数の独立した命令ユニットを提供することなしに多数のスレッドの並列実行をサポートするために、単一命令複数データ(「SIMD」:single instruction,multiple data)命令発行技法が使用される。少なくとも1つの実施例では、各処理クラスタ2094内の処理エンジンのセットに命令を発行するように構成された共通の命令ユニットを使用して、全体的に同期された多数のスレッドの並列実行をサポートするために、単一命令複数スレッド(「SIMT」:single instruction,multiple thread)技法が使用される。
【0145】
少なくとも1つの実施例では、処理クラスタ2094の動作は、SIMT並列プロセッサに処理タスクを分散させるパイプライン・マネージャ2032を介して制御され得る。少なくとも1つの実施例では、パイプライン・マネージャ2032は、
図20のスケジューラ2010から命令を受信し、グラフィックス・マルチプロセッサ2034及び/又はテクスチャ・ユニット2036を介してそれらの命令の実行を管理する。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2034は、SIMT並列プロセッサの例示的なインスタンスである。しかしながら、少なくとも1つの実施例では、異なるアーキテクチャの様々なタイプのSIMT並列プロセッサが、処理クラスタ2094内に含められ得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2034の1つ又は複数のインスタンスは、処理クラスタ2094内に含められ得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2034はデータを処理することができ、処理されたデータを、他のシェーダ・ユニットを含む複数の可能な宛先のうちの1つに分散させるために、データ・クロスバー2040が使用され得る。少なくとも1つの実施例では、パイプライン・マネージャ2032は、データ・クロスバー2040を介して分散されることになる処理されたデータのための宛先を指定することによって、処理されたデータの分散を容易にすることができる。
【0146】
少なくとも1つの実施例では、処理クラスタ2094内の各グラフィックス・マルチプロセッサ2034は、関数実行論理(たとえば、算術論理ユニット、ロード/ストア・ユニット(「LSU」:load/store unit)など)の同一のセットを含むことができる。少なくとも1つの実施例では、関数実行論理は、前の命令が完了する前に新しい命令が発行され得るパイプライン様式で構成され得る。少なくとも1つの実施例では、関数実行論理は、整数及び浮動小数点算術、比較演算、ブール演算、ビット・シフト、及び様々な代数関数の算出を含む様々な演算をサポートする。少なくとも1つの実施例では、異なる演算を実施するために同じ関数ユニット・ハードウェアが活用され得、関数ユニットの任意の組合せが存在し得る。
【0147】
少なくとも1つの実施例では、処理クラスタ2094に送信される命令がスレッドを構成する。少なくとも1つの実施例では、並列処理エンジンのセットにわたって実行しているスレッドのセットが、スレッド・グループである。少なくとも1つの実施例では、スレッド・グループは、異なる入力データに対してプログラムを実行する。少なくとも1つの実施例では、スレッド・グループ内の各スレッドは、グラフィックス・マルチプロセッサ2034内の異なる処理エンジンに割り当てられ得る。少なくとも1つの実施例では、スレッド・グループは、グラフィックス・マルチプロセッサ2034内の処理エンジンの数よりも少ないスレッドを含み得る。少なくとも1つの実施例では、スレッド・グループが処理エンジンの数よりも少ないスレッドを含むとき、処理エンジンのうちの1つ又は複数は、そのスレッド・グループが処理されているサイクル中にアイドルであり得る。少なくとも1つの実施例では、スレッド・グループはまた、グラフィックス・マルチプロセッサ2034内の処理エンジンの数よりも多いスレッドを含み得る。少なくとも1つの実施例では、スレッド・グループがグラフィックス・マルチプロセッサ2034内の処理エンジンの数よりも多くのスレッドを含むとき、連続するクロック・サイクルにわたって処理が実施され得る。少なくとも1つの実施例では、複数のスレッド・グループが、グラフィックス・マルチプロセッサ2034上で同時に実行され得る。
【0148】
少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2034は、ロード動作及びストア動作を実施するための内部キャッシュ・メモリを含む。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2034は、内部キャッシュをやめ、処理クラスタ2094内のキャッシュ・メモリ(たとえば、L1キャッシュ2048)を使用することができる。少なくとも1つの実施例では、各グラフィックス・マルチプロセッサ2034は、パーティション・ユニット(たとえば、
図20Aのパーティション・ユニット2020A~2020N)内のレベル2(「L2」)キャッシュへのアクセスをも有し、それらのL2キャッシュは、すべての処理クラスタ2094の間で共有され、スレッド間でデータを転送するために使用され得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2034はまた、オフチップ・グローバル・メモリにアクセスし得、オフチップ・グローバル・メモリは、ローカル並列プロセッサ・メモリ及び/又はシステム・メモリのうちの1つ又は複数を含むことができる。少なくとも1つの実施例では、並列処理ユニット2002の外部の任意のメモリが、グローバル・メモリとして使用され得る。少なくとも1つの実施例では、処理クラスタ2094は、グラフィックス・マルチプロセッサ2034の複数のインスタンスを含み、グラフィックス・マルチプロセッサ2034は、共通の命令及びデータを共有することができ、共通の命令及びデータは、L1キャッシュ2048に記憶され得る。
【0149】
少なくとも1つの実施例では、各処理クラスタ2094は、仮想アドレスを物理アドレスにマッピングするように構成されたMMU2045を含み得る。少なくとも1つの実施例では、MMU2045の1つ又は複数のインスタンスは、
図20のメモリ・インターフェース2018内に存在し得る。少なくとも1つの実施例では、MMU2045は、仮想アドレスを、タイル及び随意にキャッシュ・ライン・インデックスの物理アドレスにマッピングするために使用されるページ・テーブル・エントリ(「PTE」:page table entry)のセットを含む。少なくとも1つの実施例では、MMU2045は、アドレス・トランスレーション・ルックアサイド・バッファ(「TLB」:translation lookaside buffer)又はキャッシュを含み得、これらは、グラフィックス・マルチプロセッサ2034又はL1キャッシュ2048或いは処理クラスタ2094内に存在し得る。少なくとも1つの実施例では、物理アドレスが、表面データ・アクセス・ローカリティを分散させて、パーティション・ユニットの間での効率的な要求インターリーブを可能にするために処理される。少なくとも1つの実施例では、キャッシュ・ライン・インデックスが、キャッシュ・ラインについての要求がヒットであるのかミスであるのかを決定するために使用され得る。
【0150】
少なくとも1つの実施例では、処理クラスタ2094は、各グラフィックス・マルチプロセッサ2034が、テクスチャ・マッピング動作、たとえば、テクスチャ・サンプル位置を決定すること、テクスチャ・データを読み取ること、及びテクスチャ・データをフィルタリングすることを実施するためのテクスチャ・ユニット2036に結合されるように、構成され得る。少なくとも1つの実施例では、テクスチャ・データは、内部テクスチャL1キャッシュ(図示せず)から又はグラフィックス・マルチプロセッサ2034内のL1キャッシュから読み取られ、必要に応じて、L2キャッシュ、ローカル並列プロセッサ・メモリ、又はシステム・メモリからフェッチされる。少なくとも1つの実施例では、各グラフィックス・マルチプロセッサ2034は、処理されたタスクをデータ・クロスバー2040に出力して、処理されたタスクを、さらなる処理のために別の処理クラスタ2094に提供するか、或いは、処理されたタスクを、メモリ・クロスバー2016を介してL2キャッシュ、ローカル並列プロセッサ・メモリ、又はシステム・メモリに記憶する。少なくとも1つの実施例では、プレ・ラスタ演算ユニット(「プレROP」:pre-raster operation)2042は、グラフィックス・マルチプロセッサ2034からデータを受信し、データをROPユニットにダイレクトするように構成され、ROPユニットは、本明細書で説明されるようなパーティション・ユニット(たとえば、
図20のパーティション・ユニット2020A~2020N)とともに位置し得る。少なくとも1つの実施例では、プレROP2042は、色ブレンディングのための最適化を実施し、ピクセル色データを組織化し、アドレス・トランスレーションを実施することができる。
【0151】
図20Cは、少なくとも1つの実施例による、グラフィックス・マルチプロセッサ2096を示す。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2096は、
図20Bのグラフィックス・マルチプロセッサ2034である。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2096は、処理クラスタ2094のパイプライン・マネージャ2032と結合する。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2096は、限定はしないが、命令キャッシュ2052と、命令ユニット2054と、アドレス・マッピング・ユニット2056と、レジスタ・ファイル2058と、1つ又は複数のGPGPUコア2062と、1つ又は複数のLSU2066とを含む実行パイプラインを有する。GPGPUコア2062及びLSU2066は、メモリ及びキャッシュ相互接続2068を介してキャッシュ・メモリ2072及び共有メモリ2070と結合される。
【0152】
少なくとも1つの実施例では、命令キャッシュ2052は、実行すべき命令のストリームをパイプライン・マネージャ2032から受信する。少なくとも1つの実施例では、命令は、命令キャッシュ2052においてキャッシュされ、命令ユニット2054による実行のためにディスパッチされる。少なくとも1つの実施例では、命令ユニット2054は、命令をスレッド・グループ(たとえば、ワープ)としてディスパッチすることができ、スレッド・グループの各スレッドは、GPGPUコア2062内の異なる実行ユニットに割り当てられる。少なくとも1つの実施例では、命令は、統一アドレス空間内のアドレスを指定することによって、ローカル、共有、又はグローバルのアドレス空間のいずれかにアクセスすることができる。少なくとも1つの実施例では、アドレス・マッピング・ユニット2056は、統一アドレス空間中のアドレスを、LSU2066によってアクセスされ得る個別メモリ・アドレスにトランスレートするために使用され得る。
【0153】
少なくとも1つの実施例では、レジスタ・ファイル2058は、グラフィックス・マルチプロセッサ2096の機能ユニットにレジスタのセットを提供する。少なくとも1つの実施例では、レジスタ・ファイル2058は、グラフィックス・マルチプロセッサ2096の機能ユニット(たとえば、GPGPUコア2062、LSU2066)のデータ経路に接続された、オペランドのための一時的ストレージを提供する。少なくとも1つの実施例では、レジスタ・ファイル2058は、各機能ユニットがレジスタ・ファイル2058の専用部分を割り振られるように、機能ユニットの各々の間で分割される。少なくとも1つの実施例では、レジスタ・ファイル2058は、グラフィックス・マルチプロセッサ2096によって実行されている異なるスレッド・グループ間で分割される。
【0154】
少なくとも1つの実施例では、GPGPUコア2062は、各々、グラフィックス・マルチプロセッサ2096の命令を実行するために使用されるFPU及び/又は整数ALUを含むことができる。GPGPUコア2062は、同様のアーキテクチャであることも異なるアーキテクチャであることもある。少なくとも1つの実施例では、GPGPUコア2062の第1の部分は、単精度FPU及び整数ALUを含み、GPGPUコア2062の第2の部分は、倍精度FPUを含む。少なくとも1つの実施例では、FPUは、浮動小数点算術のためのIEEE754-2008規格を実装することができるか、又は、可変精度の浮動小数点算術を有効にすることができる。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2096は、追加として、矩形コピー動作又はピクセル・ブレンディング動作などの特定の機能を実施するための1つ又は複数の固定機能ユニット又は特別機能ユニットを含むことができる。少なくとも1つの実施例では、GPGPUコア2062のうちの1つ又は複数は、固定又は特別機能論理をも含むことができる。
【0155】
少なくとも1つの実施例では、GPGPUコア2062は、データの複数のセットに対して単一の命令を実施することが可能なSIMD論理を含む。少なくとも1つの実施例では、GPGPUコア2062は、SIMD4、SIMD8、及びSIMD16命令を物理的に実行し、SIMD1、SIMD2、及びSIMD32命令を論理的に実行することができる。少なくとも1つの実施例では、GPGPUコア2062のためのSIMD命令は、シェーダ・コンパイラによるコンパイル時に生成されるか、或いは、単一プログラム複数データ(「SPMD」:single program multiple data)又はSIMTアーキテクチャのために書かれ、コンパイルされたプログラムを実行しているときに自動的に生成され得る。少なくとも1つの実施例では、SIMT実行モデルのために構成されたプログラムの複数のスレッドは、単一のSIMD命令を介して実行され得る。たとえば、少なくとも1つの実施例では、同じ又は同様の動作を実施する8つのSIMTスレッドが、単一のSIMD8論理ユニットを介して並列に実行され得る。
【0156】
少なくとも1つの実施例では、メモリ及びキャッシュ相互接続2068は、グラフィックス・マルチプロセッサ2096の各機能ユニットをレジスタ・ファイル2058及び共有メモリ2070に接続する相互接続ネットワークである。少なくとも1つの実施例では、メモリ及びキャッシュ相互接続2068は、LSU2066が、共有メモリ2070とレジスタ・ファイル2058との間でロード動作及びストア動作を実装することを可能にするクロスバー相互接続である。少なくとも1つの実施例では、レジスタ・ファイル2058は、GPGPUコア2062と同じ周波数において動作することができ、したがって、GPGPUコア2062とレジスタ・ファイル2058との間のデータ転送は、非常に低いレイテンシである。少なくとも1つの実施例では、共有メモリ2070は、グラフィックス・マルチプロセッサ2096内の機能ユニット上で実行するスレッド間の通信を可能にするために使用され得る。少なくとも1つの実施例では、キャッシュ・メモリ2072は、たとえば、機能ユニットとテクスチャ・ユニット2036との間で通信されるテクスチャ・データをキャッシュするために、データ・キャッシュとして使用され得る。少なくとも1つの実施例では、共有メモリ2070は、キャッシュされる管理されるプログラムとしても使用され得る。少なくとも1つの実施例では、GPGPUコア2062上で実行しているスレッドは、キャッシュ・メモリ2072内に記憶される自動的にキャッシュされるデータに加えて、データを共有メモリ内にプログラム的に記憶することができる。
【0157】
少なくとも1つの実施例では、本明細書で説明されるような並列プロセッサ又はGPGPUは、グラフィックス動作、機械学習動作、パターン分析動作、及び様々な汎用GPU(GPGPU)機能を加速するために、ホスト/プロセッサ・コアに通信可能に結合される。少なくとも1つの実施例では、GPUは、バス又は他の相互接続(たとえば、PCIe又はNVLinkなどの高速相互接続)を介してホスト・プロセッサ/コアに通信可能に結合され得る。少なくとも1つの実施例では、GPUは、コアとして同じパッケージ又はチップに集積され、パッケージ又はチップの内部にあるプロセッサ・バス/相互接続を介してコアに通信可能に結合され得る。少なくとも1つの実施例では、GPUが接続される様式にかかわらず、プロセッサ・コアは、WD中に含まれているコマンド/命令のシーケンスの形態で、ワークをGPUに割り振り得る。少なくとも1つの実施例では、GPUは、次いで、これらのコマンド/命令を効率的に処理するための専用回路要素/論理を使用する。
【0158】
少なくとも1つの実施例では、
図20A~
図20Cに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図20A~
図20Cに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図20A~
図20Cに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図20A~
図20Cに図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0159】
図21は、少なくとも1つの実施例による、グラフィックス・プロセッサ2100を示す。少なくとも1つの実施例では、グラフィックス・プロセッサ2100は、リング相互接続2102と、パイプライン・フロント・エンド2104と、メディア・エンジン2137と、グラフィックス・コア2180A~2180Nとを含む。少なくとも1つの実施例では、リング相互接続2102は、グラフィックス・プロセッサ2100を、他のグラフィックス・プロセッサ又は1つ又は複数の汎用プロセッサ・コアを含む他の処理ユニットに結合する。少なくとも1つの実施例では、グラフィックス・プロセッサ2100は、マルチコア処理システム内に組み込まれた多くのプロセッサのうちの1つである。
【0160】
少なくとも1つの実施例では、グラフィックス・プロセッサ2100は、リング相互接続2102を介してコマンドのバッチを受信する。少なくとも1つの実施例では、入って来るコマンドは、パイプライン・フロント・エンド2104中のコマンド・ストリーマ2103によって解釈される。少なくとも1つの実施例では、グラフィックス・プロセッサ2100は、(1つ又は複数の)グラフィックス・コア2180A~2180Nを介して3Dジオメトリ処理及びメディア処理を実施するためのスケーラブル実行論理を含む。少なくとも1つの実施例では、3Dジオメトリ処理コマンドについて、コマンド・ストリーマ2103は、コマンドをジオメトリ・パイプライン2136に供給する。少なくとも1つの実施例では、少なくともいくつかのメディア処理コマンドについて、コマンド・ストリーマ2103は、コマンドをビデオ・フロント・エンド2134に供給し、ビデオ・フロント・エンド2134はメディア・エンジン2137と結合する。少なくとも1つの実施例では、メディア・エンジン2137は、ビデオ及び画像後処理のためのビデオ品質エンジン(「VQE」:Video Quality Engine)2130と、ハードウェア加速メディア・データ・エンコード及びデコードを提供するためのマルチ・フォーマット・エンコード/デコード(「MFX」:multi-format encode/decode)エンジン2133とを含む。少なくとも1つの実施例では、ジオメトリ・パイプライン2136及びメディア・エンジン2137は、各々、少なくとも1つのグラフィックス・コア2180Aによって提供されるスレッド実行リソースのための実行スレッドを生成する。
【0161】
少なくとも1つの実施例では、グラフィックス・プロセッサ2100は、各々が(コア・サブ・スライスと呼ばれることもある)複数のサブ・コア2150A~550N、2160A~2160Nを有する、(コア・スライスと呼ばれることもある)モジュール式グラフィックス・コア2180A~2180Nを特徴とするスケーラブル・スレッド実行リソースを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2100は、任意の数のグラフィックス・コア2180A~2180Nを有することができる。少なくとも1つの実施例では、グラフィックス・プロセッサ2100は、少なくとも第1のサブ・コア2150A及び第2のサブ・コア2160Aを有するグラフィックス・コア2180Aを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2100は、単一のサブ・コア(たとえば、サブ・コア2150A)をもつ低電力プロセッサである。少なくとも1つの実施例では、グラフィックス・プロセッサ2100は、各々が第1のサブ・コア2150A~2150Nのセットと第2のサブ・コア2160A~2160Nのセットとを含む、複数のグラフィックス・コア2180A~2180Nを含む。少なくとも1つの実施例では、第1のサブ・コア2150A~2150N中の各サブ・コアは、少なくとも、実行ユニット(「EU」:execution unit)2152A~2152N及びメディア/テクスチャ・サンプラ2154A~2154Nの第1のセットを含む。少なくとも1つの実施例では、第2のサブ・コア2160A~2160N中の各サブ・コアは、少なくとも、実行ユニット2162A~2162N及びサンプラ2164A~2164Nの第2のセットを含む。少なくとも1つの実施例では、各サブ・コア2150A~2150N、2160A~2160Nは、共有リソース2170A~2170Nのセットを共有する。少なくとも1つの実施例では、共有リソース2170は、共有キャッシュ・メモリ及びピクセル動作論理を含む。
【0162】
少なくとも1つの実施例では、
図21に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図21に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図21に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図21に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0163】
図22は、少なくとも1つの実施例による、プロセッサ2200を示す。少なくとも1つの実施例では、プロセッサ2200は、限定はしないが、命令を実施するための論理回路を含み得る。少なくとも1つの実施例では、プロセッサ2200は、x86命令、AMR命令、ASICのための特別命令などを含む命令を実施し得る。少なくとも1つの実施例では、プロセッサ2210は、カリフォルニア州サンタクララのIntel Corporationからの、MMX(商標)技術で可能にされたマイクロプロセッサ中の64ビット幅MMXレジスタなど、パック・データを記憶するためのレジスタを含み得る。少なくとも1つの実施例では、整数形式と浮動小数点形式の両方で利用可能なMMXレジスタは、SIMD及びストリーミングSIMD拡張(「SSE」:streaming SIMD extension)命令を伴うパック・データ要素で動作し得る。少なくとも1つの実施例では、SSE2、SSE3、SSE4、AVX、又はそれ以上(総称して「SSEx」と呼ばれる)技術に関係する128ビット幅XMMレジスタは、そのようなパック・データ・オペランドを保持し得る。少なくとも1つの実施例では、プロセッサ2210は、CUDAプログラムを加速するための命令を実施し得る。
【0164】
少なくとも1つの実施例では、プロセッサ2200は、実行されるべき命令をフェッチし、プロセッサ・パイプラインにおいて後で使用されるべき命令を準備するためのイン・オーダー・フロント・エンド(「フロント・エンド」)2201を含む。少なくとも1つの実施例では、フロント・エンド2201は、いくつかのユニットを含み得る。少なくとも1つの実施例では、命令プリフェッチャ2226が、メモリから命令をフェッチし、命令を命令デコーダ2228にフィードし、命令デコーダ2228が命令を復号又は解釈する。たとえば、少なくとも1つの実施例では、命令デコーダ2228は、受信された命令を、実行のために「マイクロ命令」又は「マイクロ・オペレーション」と呼ばれる(「マイクロ・オプ」又は「uop」とも呼ばれる)1つ又は複数のオペレーションに復号する。少なくとも1つの実施例では、命令デコーダ2228は、命令を、動作を実施するためにマイクロアーキテクチャによって使用され得るオプコード及び対応するデータ並びに制御フィールドに構文解析する。少なくとも1つの実施例では、トレース・キャッシュ2230は、復号されたuopを、実行のためにuopキュー2234においてプログラム順のシーケンス又はトレースにアセンブルし得る。少なくとも1つの実施例では、トレース・キャッシュ2230が複雑な命令に遭遇したとき、マイクロコードROM2232が、動作を完了するために必要なuopを提供する。
【0165】
少なくとも1つの実施例では、単一のマイクロ・オプにコンバートされ得る命令もあれば、全動作を完了するためにいくつかのマイクロ・オプを必要とする命令もある。少なくとも1つの実施例では、命令を完了するために5つ以上のマイクロ・オプが必要とされる場合、命令デコーダ2228は、マイクロコードROM2232にアクセスして命令を実施し得る。少なくとも1つの実施例では、命令は、命令デコーダ2228における処理のために少数のマイクロ・オプに復号され得る。少なくとも1つの実施例では、命令は、動作を達成するためにいくつかのマイクロ・オプが必要とされる場合、マイクロコードROM2232内に記憶され得る。少なくとも1つの実施例では、トレース・キャッシュ2230は、マイクロコードROM2232からの1つ又は複数の命令を完了するために、エントリ・ポイント・プログラマブル論理アレイ(「PLA」:programmable logic array)を参照して、マイクロコード・シーケンスを読み取るための正しいマイクロ命令ポインタを決定する。少なくとも1つの実施例では、マイクロコードROM2232が命令のためにマイクロ・オプのシーケンシングを終えた後、機械のフロント・エンド2201は、トレース・キャッシュ2230からマイクロ・オプをフェッチすることを再開し得る。
【0166】
少なくとも1つの実施例では、アウト・オブ・オーダー実行エンジン(「アウト・オブ・オーダー・エンジン」)2203は、実行のために命令を準備し得る。少なくとも1つの実施例では、アウト・オブ・オーダー実行論理は、命令がパイプラインを下り、実行のためにスケジューリングされるときの性能を最適化するために、命令のフローを滑らかにし、それを並べ替えるためのいくつかのバッファを有する。アウト・オブ・オーダー実行エンジン2203は、限定はしないが、アロケータ/レジスタ・リネーマ2240と、メモリuopキュー2242と、整数/浮動小数点uopキュー2244と、メモリ・スケジューラ2246と、高速スケジューラ2202と、低速/汎用浮動小数点スケジューラ(「低速/汎用FP(floating point)スケジューラ」)2204と、単純浮動小数点スケジューラ(「単純FPスケジューラ」)2206とを含む。少なくとも1つの実施例では、高速スケジューラ2202、低速/汎用浮動小数点スケジューラ2204、及び単純浮動小数点スケジューラ2206は、総称して本明細書では「uopスケジューラ2202、2204、2206」とも呼ばれる。アロケータ/レジスタ・リネーマ2240は、実行するために各uopが必要とする機械バッファ及びリソースを割り振る。少なくとも1つの実施例では、アロケータ/レジスタ・リネーマ2240は、レジスタ・ファイルへのエントリ時に論理レジスタをリネームする。少なくとも1つの実施例では、アロケータ/レジスタ・リネーマ2240はまた、メモリ・スケジューラ2246及びuopスケジューラ2202、2204、2206の前の、2つのuopキュー、すなわちメモリ動作のためのメモリuopキュー2242及び非メモリ動作のための整数/浮動小数点uopキュー2244のうちの1つにおいて、各uopのためのエントリを割り振る。少なくとも1つの実施例では、uopスケジューラ2202、2204、2206は、uopがいつ実行する準備ができるかを、それらの従属入力レジスタ・オペランド・ソースが準備されていることと、それらの動作を完了するためにuopが必要とする実行リソースの利用可能性とに基づいて、決定する。少なくとも1つの実施例では、少なくとも1つの実施例の高速スケジューラ2202は、メイン・クロック・サイクルの半分ごとにスケジューリングし得、低速/汎用浮動小数点スケジューラ2204及び単純浮動小数点スケジューラ2206は、メイン・プロセッサ・クロック・サイクル当たりに1回スケジューリングし得る。少なくとも1つの実施例では、uopスケジューラ2202、2204、2206は、実行のためにuopをスケジューリングするためにディスパッチ・ポートを調停する。
【0167】
少なくとも1つの実施例では、実行ブロック2211は、限定はしないが、整数レジスタ・ファイル/バイパス・ネットワーク2208と、浮動小数点レジスタ・ファイル/バイパス・ネットワーク(「FPレジスタ・ファイル/バイパス・ネットワーク」)2210と、アドレス生成ユニット(「AGU」:address generation unit)2212及び2214と、高速ALU2216及び2218と、低速ALU2220と、浮動小数点ALU(「FP」)2222と、浮動小数点移動ユニット(「FP移動」)2224とを含む。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2208及び浮動小数点レジスタ・ファイル/バイパス・ネットワーク2210は、本明細書では「レジスタ・ファイル2208、2210」とも呼ばれる。少なくとも1つの実施例では、AGU2212及び2214、高速ALU2216及び2218、低速ALU2220、浮動小数点ALU2222、及び浮動小数点移動ユニット2224は、本明細書では「実行ユニット2212、2214、2216、2218、2220、2222、及び2224」とも呼ばれる。少なくとも1つの実施例では、実行ブロックは、限定はしないが、(ゼロを含む)任意の数及びタイプのレジスタ・ファイル、バイパス・ネットワーク、アドレス生成ユニット、及び実行ユニットを、任意の組合せで含み得る。
【0168】
少なくとも1つの実施例では、レジスタ・ファイル2208、2210は、uopスケジューラ2202、2204、2206と、実行ユニット2212、2214、2216、2218、2220、2222、及び2224との間に配置され得る。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2208は、整数演算を実施する。少なくとも1つの実施例では、浮動小数点レジスタ・ファイル/バイパス・ネットワーク2210は、浮動小数点演算を実施する。少なくとも1つの実施例では、レジスタ・ファイル2208、2210の各々は、限定はしないが、バイパス・ネットワークを含み得、バイパス・ネットワークは、レジスタ・ファイルにまだ書き込まれていない完了したばかりの結果を、新しい従属uopにバイパス又はフォワーディングし得る。少なくとも1つの実施例では、レジスタ・ファイル2208、2210は、互いにデータを通信し得る。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2208は、限定はしないが、2つの別個のレジスタ・ファイル、すなわち低次32ビットのデータのための1つのレジスタ・ファイル及び高次32ビットのデータのための第2のレジスタ・ファイルを含み得る。少なくとも1つの実施例では、浮動小数点命令は、通常、64~128ビット幅のオペランドを有するので、浮動小数点レジスタ・ファイル/バイパス・ネットワーク2210は、限定はしないが、128ビット幅のエントリを含み得る。
【0169】
少なくとも1つの実施例では、実行ユニット2212、2214、2216、2218、2220、2222、2224は、命令を実行し得る。少なくとも1つの実施例では、レジスタ・ファイル2208、2210は、マイクロ命令が実行する必要がある整数及び浮動小数点データ・オペランド値を記憶する。少なくとも1つの実施例では、プロセッサ2200は、限定はしないが、任意の数及び組合せの実行ユニット2212、2214、2216、2218、2220、2222、2224を含み得る。少なくとも1つの実施例では、浮動小数点ALU2222及び浮動小数点移動ユニット2224は、浮動小数点、MMX、SIMD、AVX及びSSE、又は他の演算を実行し得る。少なくとも1つの実施例では、浮動小数点ALU2222は、限定はしないが、除算、平方根、及び剰余マイクロ・オプを実行するための64ビットずつの浮動小数点デバイダを含み得る。少なくとも1つの実施例では、浮動小数点値を伴う命令は、浮動小数点ハードウェアで対処され得る。少なくとも1つの実施例では、ALU演算は、高速ALU2216、2218に渡され得る。少なくとも1つの実施例では、高速ALU2216、2218は、クロック・サイクルの半分の実効レイテンシを伴う高速演算を実行し得る。少なくとも1つの実施例では、低速ALU2220は、限定はしないが、乗数、シフト、フラグ論理、及びブランチ処理などの長レイテンシ・タイプの演算のための整数実行ハードウェアを含み得るので、ほとんどの複雑な整数演算は低速ALU2220に進む。少なくとも1つの実施例では、メモリ・ロード/ストア動作は、AGU2212、2214によって実行され得る。少なくとも1つの実施例では、高速ALU2216、高速ALU2218、及び低速ALU2220は、64ビット・データ・オペランドで整数演算を実施し得る。少なくとも1つの実施例では、高速ALU2216、高速ALU2218、及び低速ALU2220は、16、32、128、256などを含む様々なデータ・ビット・サイズをサポートするために実装され得る。少なくとも1つの実施例では、浮動小数点ALU2222及び浮動小数点移動ユニット2224は、様々なビット幅を有する様々なオペランドをサポートするために実装され得る。少なくとも1つの実施例では、浮動小数点ALU2222及び浮動小数点移動ユニット2224は、SIMD及びマルチメディア命令と併せた128ビット幅のパック・データ・オペランドで動作し得る。
【0170】
少なくとも1つの実施例では、uopスケジューラ2202、2204、2206は、親ロードが実行し終える前に従属演算をディスパッチする。少なくとも1つの実施例では、uopは、プロセッサ2200において投機的にスケジューリング及び実行され得るので、プロセッサ2200は、メモリ・ミスに対処するための論理をも含み得る。少なくとも1つの実施例では、データ・キャッシュにおいてデータ・ロードがミスした場合、一時的に不正確なデータをもつスケジューラを通り過ぎたパイプラインにおいて、進行中の従属演算があり得る。少なくとも1つの実施例では、リプレイ機構が、不正確なデータを使用する命令を追跡及び再実行する。少なくとも1つの実施例では、従属演算は、リプレイされる必要があり得、独立した演算は、完了することを可能にされ得る。少なくとも1つの実施例では、プロセッサの少なくとも1つの実施例のスケジューラ及びリプレイ機構はまた、テキスト・ストリング比較演算のための命令シーケンスを捕捉するように設計され得る。
【0171】
少なくとも1つの実施例では、「レジスタ」という用語は、オペランドを識別するための命令の一部として使用され得るオンボード・プロセッサ・ストレージ・ロケーションを指し得る。少なくとも1つの実施例では、レジスタは、(プログラマの視点から見て)プロセッサの外部から使用可能であり得るものであり得る。少なくとも1つの実施例では、レジスタは、特定のタイプの回路に限定されないことがある。むしろ、少なくとも1つの実施例では、レジスタは、データを記憶し、データを提供し、本明細書で説明される機能を実施し得る。少なくとも1つの実施例では、本明細書で説明されるレジスタは、専用物理レジスタ、レジスタ・リネーミングを使用して動的に割り振られる物理レジスタ、専用物理レジスタと動的に割り振られる物理レジスタとの組合せなど、任意の数の異なる技法を使用して、プロセッサ内の回路要素によって実装され得る。少なくとも1つの実施例では、整数レジスタは、32ビット整数データを記憶する。少なくとも1つの実施例のレジスタ・ファイルは、パック・データのための8つのマルチメディアSIMDレジスタをも含んでいる。
【0172】
少なくとも1つの実施例では、
図22に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図22に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図22に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図22に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0173】
図23は、少なくとも1つの実施例による、プロセッサ2300を示す。少なくとも1つの実施例では、プロセッサ2300は、限定はしないが、1つ又は複数のプロセッサ・コア(「コア」)2302A~2302Nと、統合されたメモリ・コントローラ2314と、統合されたグラフィックス・プロセッサ2308とを含む。少なくとも1つの実施例では、プロセッサ2300は、破線ボックスによって表される追加プロセッサ・コア2302Nまでの追加コアを含むことができる。少なくとも1つの実施例では、プロセッサ・コア2302A~2302Nの各々は、1つ又は複数の内部キャッシュ・ユニット2304A~2304Nを含む。少なくとも1つの実施例では、各プロセッサ・コアはまた、1つ又は複数の共有キャッシュ・ユニット2306へのアクセスを有する。
【0174】
少なくとも1つの実施例では、内部キャッシュ・ユニット2304A~2304Nと共有キャッシュ・ユニット2306とは、プロセッサ2300内のキャッシュ・メモリ階層を表す。少なくとも1つの実施例では、キャッシュ・メモリ・ユニット2304A~2304Nは、各プロセッサ・コア内の命令及びデータ・キャッシュの少なくとも1つのレベル、及びL2、L3、レベル4(「L4」)などの共有中間レベル・キャッシュの1つ又は複数のレベル、又はキャッシュの他のレベルを含み得、ここで、外部メモリの前の最高レベルのキャッシュは、LLCとして分類される。少なくとも1つの実施例では、キャッシュ・コヒーレンシ論理は、様々なキャッシュ・ユニット2306及び2304A~2304N間でコヒーレンシを維持する。
【0175】
少なくとも1つの実施例では、プロセッサ2300は、1つ又は複数のバス・コントローラ・ユニット2316とシステム・エージェント・コア2310とのセットをも含み得る。少なくとも1つの実施例では、1つ又は複数のバス・コントローラ・ユニット2316は、1つ又は複数のPCI又はPCIエクスプレス・バスなどの周辺バスのセットを管理する。少なくとも1つの実施例では、システム・エージェント・コア2310は、様々なプロセッサ構成要素のための管理機能性を提供する。少なくとも1つの実施例では、システム・エージェント・コア2310は、様々な外部メモリ・デバイス(図示せず)へのアクセスを管理するための1つ又は複数の統合されたメモリ・コントローラ2314を含む。
【0176】
少なくとも1つの実施例では、プロセッサ・コア2302A~2302Nのうちの1つ又は複数は、同時マルチスレッディングのサポートを含む。少なくとも1つの実施例では、システム・エージェント・コア2310は、マルチスレッド処理中にプロセッサ・コア2302A~2302Nを協調させ、動作させるための構成要素を含む。少なくとも1つの実施例では、システム・エージェント・コア2310は、追加として、電力制御ユニット(「PCU」:power control unit)を含み得、PCUは、プロセッサ・コア2302A~2302N及びグラフィックス・プロセッサ2308の1つ又は複数の電力状態を調節するための論理及び構成要素を含む。
【0177】
少なくとも1つの実施例では、プロセッサ2300は、追加として、グラフィックス処理動作を実行するためのグラフィックス・プロセッサ2308を含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2308は、共有キャッシュ・ユニット2306、及び1つ又は複数の統合されたメモリ・コントローラ2314を含むシステム・エージェント・コア2310と結合する。少なくとも1つの実施例では、システム・エージェント・コア2310は、1つ又は複数の結合されたディスプレイへのグラフィックス・プロセッサ出力を駆動するためのディスプレイ・コントローラ2311をも含む。少なくとも1つの実施例では、ディスプレイ・コントローラ2311はまた、少なくとも1つの相互接続を介してグラフィックス・プロセッサ2308と結合された別個のモジュールであり得るか、又はグラフィックス・プロセッサ2308内に組み込まれ得る。
【0178】
少なくとも1つの実施例では、プロセッサ2300の内部構成要素を結合するために、リング・ベースの相互接続ユニット2312が使用される。少なくとも1つの実施例では、ポイントツーポイント相互接続、切替え相互接続、又は他の技法などの代替相互接続ユニットが使用され得る。少なくとも1つの実施例では、グラフィックス・プロセッサ2308は、I/Oリンク2313を介してリング相互接続2312と結合する。
【0179】
少なくとも1つの実施例では、I/Oリンク2313は、様々なプロセッサ構成要素と、eDRAMモジュールなどの高性能組み込みメモリ・モジュール2318との間の通信を容易にするオン・パッケージI/O相互接続を含む、複数の種類のI/O相互接続のうちの少なくとも1つを表す。少なくとも1つの実施例では、プロセッサ・コア2302A~2302Nの各々と、グラフィックス・プロセッサ2308とは、共有LLCとして組み込みメモリ・モジュール2318を使用する。
【0180】
少なくとも1つの実施例では、プロセッサ・コア2302A~2302Nは、共通の命令セット・アーキテクチャを実行する同種のコアである。少なくとも1つの実施例では、プロセッサ・コア2302A~2302Nは、ISAという観点から異種であり、ここで、プロセッサ・コア2302A~2302Nのうちの1つ又は複数は、共通の命令セットを実行し、プロセッサ・コア2302A~23-02Nのうちの1つ又は複数の他のコアは、共通の命令セットのサブセット、又は異なる命令セットを実行する。少なくとも1つの実施例では、プロセッサ・コア2302A~2302Nは、マイクロアーキテクチャという観点から異種であり、ここで、電力消費量が比較的高い1つ又は複数のコアは、電力消費量がより低い1つ又は複数のコアと結合する。少なくとも1つの実施例では、プロセッサ2300は、1つ又は複数のチップ上に、又はSoC集積回路として実装され得る。
【0181】
少なくとも1つの実施例では、
図23に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図23に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図23に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図23に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0182】
図24は、説明される少なくとも1つの実施例による、グラフィックス・プロセッサ・コア2400を示す。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2400は、グラフィックス・コア・アレイ内に含まれる。少なくとも1つの実施例では、コア・スライスと呼ばれることもあるグラフィックス・プロセッサ・コア2400は、モジュール式グラフィックス・プロセッサ内の1つ又は複数のグラフィックス・コアであり得る。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2400は、1つのグラフィックス・コア・スライスの例示であり、本明細書で説明されるグラフィックス・プロセッサは、ターゲット電力及び性能エンベロープに基づいて、複数のグラフィックス・コア・スライスを含み得る。少なくとも1つの実施例では、各グラフィックス・コア2400は、汎用及び固定機能論理のモジュール式ブロックを含む、サブ・スライスとも呼ばれる複数のサブ・コア2401A~2401Fと結合された固定機能ブロック2430を含むことができる。
【0183】
少なくとも1つの実施例では、固定機能ブロック2430は、たとえば、より低い性能及び/又はより低い電力のグラフィックス・プロセッサ実装形態において、グラフィックス・プロセッサ2400中のすべてのサブ・コアによって共有され得るジオメトリ/固定機能パイプライン2436を含む。少なくとも1つの実施例では、ジオメトリ/固定機能パイプライン2436は、3D固定機能パイプラインと、ビデオ・フロント・エンド・ユニットと、スレッド・スポーナ(spawner)及びスレッド・ディスパッチャと、統一リターン・バッファを管理する統一リターン・バッファ・マネージャとを含む。
【0184】
少なくとも1つの実施例では、固定機能ブロック2430はまた、グラフィックスSoCインターフェース2437と、グラフィックス・マイクロコントローラ2438と、メディア・パイプライン2439とを含む。グラフィックスSoCインターフェース2437は、グラフィックス・コア2400と、SoC集積回路内の他のプロセッサ・コアとの間のインターフェースを提供する。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2438は、スレッド・ディスパッチと、スケジューリングと、プリエンプションとを含む、グラフィックス・プロセッサ2400の様々な機能を管理するように構成可能であるプログラマブル・サブ・プロセッサである。少なくとも1つの実施例では、メディア・パイプライン2439は、画像及びビデオ・データを含むマルチメディア・データの復号、符号化、前処理、及び/又は後処理を容易にするための論理を含む。少なくとも1つの実施例では、メディア・パイプライン2439は、サブ・コア2401~2401F内のコンピュート論理又はサンプリング論理への要求を介して、メディア動作を実装する。
【0185】
少なくとも1つの実施例では、SoCインターフェース2437は、グラフィックス・コア2400が汎用アプリケーション・プロセッサ・コア(たとえば、CPU)及び/又はSoC内の他の構成要素と通信することを可能にし、SoC内の他の構成要素は、共有LLCメモリ、システムRAM、及び/或いは組み込みオンチップ又はオン・パッケージDRAMなどのメモリ階層要素を含む。少なくとも1つの実施例では、SoCインターフェース2437はまた、カメラ撮像パイプラインなど、SoC内の固定機能デバイスとの通信を可能にすることができ、グラフィックス・コア2400とSoC内のCPUとの間で共有され得るグローバル・メモリ・アトミックの使用を可能にし、及び/又はそれを実装する。少なくとも1つの実施例では、SoCインターフェース2437はまた、グラフィックス・コア2400のための電力管理制御を実装し、グラフィック・コア2400のクロック・ドメインとSoC内の他のクロック・ドメインとの間のインターフェースを可能にすることができる。少なくとも1つの実施例では、SoCインターフェース2437は、グラフィックス・プロセッサ内の1つ又は複数のグラフィックス・コアの各々にコマンド及び命令を提供するように構成されたコマンド・ストリーマ及びグローバル・スレッド・ディスパッチャからのコマンド・バッファの受信を可能にする。少なくとも1つの実施例では、コマンド及び命令は、メディア動作が実施されるべきであるときにメディア・パイプライン2439にディスパッチされ得るか、又は、グラフィックス処理動作が実施されるべきであるときにジオメトリ及び固定機能パイプライン(たとえば、ジオメトリ及び固定機能パイプライン2436、ジオメトリ及び固定機能パイプライン2414)にディスパッチされ得る。
【0186】
少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2438は、グラフィックス・コア2400のための様々なスケジューリング及び管理タスクを実施するように構成され得る。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2438は、サブ・コア2401A~2401F内の実行ユニット(EU)アレイ2402A~2402F、2404A~2404F内の様々なグラフィックス並列エンジンに対して、グラフィックスを実施し、及び/又はワークロード・スケジューリングを算出することができる。少なくとも1つの実施例では、グラフィックス・コア2400を含むSoCのCPUコア上で実行しているホスト・ソフトウェアは、複数のグラフィック・プロセッサ・ドアベルのうちの1つにワークロードをサブミットすることができ、このドアベルが、適切なグラフィックス・エンジンに対するスケジューリング動作を呼び出す。少なくとも1つの実施例では、スケジューリング動作は、どのワークロードを次に稼働すべきかを決定することと、ワークロードをコマンド・ストリーマにサブミットすることと、エンジン上で稼働している既存のワークロードをプリエンプトすることと、ワークロードの進行を監視することと、ワークロードが完了したときにホスト・ソフトウェアに通知することとを含む。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2438はまた、グラフィックス・コア2400のための低電力又はアイドル状態を促進して、オペレーティング・システム及び/又はシステム上のグラフィックス・ドライバ・ソフトウェアとは無関係に、低電力状態移行にわたってグラフィックス・コア2400内のレジスタを保存及び復元するアビリティをグラフィックス・コア2400に提供することができる。
【0187】
少なくとも1つの実施例では、グラフィックス・コア2400は、示されているサブ・コア2401A~2401Fよりも多い又はそれよりも少ない、N個までのモジュール式サブ・コアを有し得る。N個のサブ・コアの各セットについて、少なくとも1つの実施例では、グラフィックス・コア2400はまた、共有機能論理2410、共有及び/又はキャッシュ・メモリ2412、ジオメトリ/固定機能パイプライン2414、並びに様々なグラフィックスを加速し、処理動作を算出するための追加の固定機能論理2416を含むことができる。少なくとも1つの実施例では、共有機能論理2410は、グラフィックス・コア2400内の各N個のサブ・コアによって共有され得る論理ユニット(たとえば、サンプラ、数理、及び/又はスレッド間通信論理)を含むことができる。共有及び/又はキャッシュ・メモリ2412は、グラフィックス・コア2400内のN個のサブ・コア2401A~2401FのためのLLCであり得、また、複数のサブ・コアによってアクセス可能である共有メモリとして働き得る。少なくとも1つの実施例では、ジオメトリ/固定機能パイプライン2414は、固定機能ブロック2430内のジオメトリ/固定機能パイプライン2436の代わりに含まれ得、同じ又は同様の論理ユニットを含むことができる。
【0188】
少なくとも1つの実施例では、グラフィックス・コア2400は、グラフィックス・コア2400による使用のための様々な固定機能加速論理を含むことができる追加の固定機能論理2416を含む。少なくとも1つの実施例では、追加の固定機能論理2416は、位置限定シェーディング(position only shading)において使用するための追加のジオメトリ・パイプラインを含む。位置限定シェーディングでは、少なくとも2つのジオメトリ・パイプラインが存在するが、ジオメトリ/固定機能パイプライン2416、2436内の完全ジオメトリ・パイプライン、並びに選別パイプライン(cull pipeline)においてであり、選別パイプラインは、追加の固定機能論理2416内に含まれ得る追加のジオメトリ・パイプラインである。少なくとも1つの実施例では、選別パイプラインは、完全ジオメトリ・パイプラインの縮小版である。少なくとも1つの実施例では、完全パイプライン及び選別パイプラインは、アプリケーションの異なるインスタンスを実行することができ、各インスタンスは別個のコンテキストを有する。少なくとも1つの実施例では、位置限定シェーディングは、切り捨てられた三角形の長い選別ランを隠すことができ、これは、いくつかのインスタンスにおいてシェーディングがより早く完了することを可能にする。たとえば、少なくとも1つの実施例では、選別パイプラインは、ピクセルの、フレーム・バッファへのラスタ化及びレンダリングを実施することなしに、頂点の位置属性をフェッチし、シェーディングするので、追加の固定機能論理2416内の選別パイプライン論理は、メイン・アプリケーションと並列で位置シェーダを実行することができ、全体的に完全パイプラインよりも速く臨界結果(critical result)を生成する。少なくとも1つの実施例では、選別パイプラインは、生成された臨界結果を使用して、すべての三角形について、それらの三角形が選別されているかどうかにかかわらず、可視性情報を算出することができる。少なくとも1つの実施例では、(このインスタンスではリプレイ・パイプラインと呼ばれることがある)完全パイプラインは、可視性情報を消費して、選別された三角形を飛ばして可視三角形のみをシェーディングすることができ、可視三角形は、最終的にラスタ化フェーズに渡される。
【0189】
少なくとも1つの実施例では、追加の固定機能論理2416はまた、CUDAプログラムを加速するために、固定機能行列乗算論理など、汎用処理加速論理を含むことができる。
【0190】
少なくとも1つの実施例では、各グラフィックス・サブ・コア2401A~2401Fは、実行リソースのセットを含み、実行リソースのセットは、グラフィックス・パイプライン、メディア・パイプライン、又はシェーダ・プログラムによる要求に応答して、グラフィックス動作、メディア動作、及びコンピュート動作を実施するために使用され得る。少なくとも1つの実施例では、グラフィックス・サブ・コア2401A~2401Fは、複数のEUアレイ2402A~2402F、2404A~2404Fと、スレッド・ディスパッチ及びスレッド間通信(「TD/IC」:thread dispatch and inter-thread communication)論理2403A~2403Fと、3D(たとえば、テクスチャ)サンプラ2405A~2405Fと、メディア・サンプラ2406A~2406Fと、シェーダ・プロセッサ2407A~2407Fと、共有ローカル・メモリ(「SLM」:shared local memory)2408A~2408Fとを含む。EUアレイ2402A~2402F、2404A~2404Fは、各々、複数の実行ユニットを含み、複数の実行ユニットは、グラフィックス、メディア、又はコンピュート・シェーダ・プログラムを含むグラフィックス動作、メディア動作、又はコンピュート動作のサービスにおいて浮動小数点及び整数/固定小数点論理演算を実施することが可能なGPGPUである。少なくとも1つの実施例では、TD/IC論理2403A~2403Fは、サブ・コア内の実行ユニットのためのローカル・スレッド・ディスパッチ及びスレッド制御動作を実施し、サブ・コアの実行ユニット上で実行しているスレッド間の通信を容易にする。少なくとも1つの実施例では、3Dサンプラ2405A~2405Fは、テクスチャ又は他の3Dグラフィックス関係データをメモリに読み取ることができる。少なくとも1つの実施例では、3Dサンプラは、所与のテクスチャに関連する、構成されたサンプル状態及びテクスチャ・フォーマットに基づいて、テクスチャ・データを異なるやり方で読み取ることができる。少なくとも1つの実施例では、メディア・サンプラ2406A~2406Fは、メディア・データに関連するタイプ及びフォーマットに基づいて、同様の読取り動作を実施することができる。少なくとも1つの実施例では、各グラフィックス・サブ・コア2401A~2401Fは、代替的に統一3D及びメディア・サンプラを含むことができる。少なくとも1つの実施例では、サブ・コア2401A~2401Fの各々内の実行ユニット上で実行しているスレッドは、スレッド・グループ内で実行しているスレッドがオンチップ・メモリの共通のプールを使用して実行することを可能にするために、各サブ・コア内の共有ローカル・メモリ2408A~2408Fを利用することができる。
【0191】
少なくとも1つの実施例では、
図24に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図24に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図24に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図24に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0192】
図25は、少なくとも1つの実施例による、並列処理ユニット(「PPU」)2500を示す。少なくとも1つの実施例では、PPU2500は、PPU2500によって実行された場合、PPU2500に、本明細書で説明されるプロセス及び技法のいくつか又はすべてを実施させる機械可読コードで構成される。少なくとも1つの実施例では、PPU2500はマルチスレッド・プロセッサであり、マルチスレッド・プロセッサは、1つ又は複数の集積回路デバイス上で実装され、(機械可読命令又は単に命令とも呼ばれる)コンピュータ可読命令を複数のスレッド上で並列に処理するように設計されたレイテンシ隠蔽技法としてマルチスレッディングを利用する。少なくとも1つの実施例では、スレッドは、実行のスレッドを指し、PPU2500によって実行されるように構成された命令のセットのインスタンス化である。少なくとも1つの実施例では、PPU2500は、LCDデバイスなどのディスプレイ・デバイス上での表示のための2次元(「2D」)画像データを生成するために3次元(「3D」)グラフィックス・データを処理するためのグラフィックス・レンダリング・パイプラインを実装するように構成されたGPUである。少なくとも1つの実施例では、PPU2500は、線形代数演算及び機械学習演算などの算出を実施するために利用される。
図25は、単に例示を目的とした例示的な並列プロセッサを示し、少なくとも1つの実施例において実装され得るプロセッサ・アーキテクチャの非限定的な実例として解釈されるべきである。
【0193】
少なくとも1つの実施例では、1つ又は複数のPPU2500は、高性能コンピューティング(「HPC」:High Performance Computing)、データ・センタ、及び機械学習アプリケーションを加速するように構成される。少なくとも1つの実施例では、1つ又は複数のPPU2500は、CUDAプログラムを加速するように構成される。少なくとも1つの実施例では、PPU2500は、限定はしないが、I/Oユニット2506と、フロント・エンド・ユニット2510と、スケジューラ・ユニット2512と、ワーク分散ユニット2514と、ハブ2516と、クロスバー(「Xバー」:crossbar)2520と、1つ又は複数の汎用処理クラスタ(「GPC」:general processing cluster)2518と、1つ又は複数のパーティション・ユニット(「メモリ・パーティション・ユニット」)2522とを含む。少なくとも1つの実施例では、PPU2500は、1つ又は複数の高速GPU相互接続(「GPU相互接続」)2508を介してホスト・プロセッサ又は他のPPU2500に接続される。少なくとも1つの実施例では、PPU2500は、システム・バス又は相互接続2502を介してホスト・プロセッサ又は他の周辺デバイスに接続される。少なくとも1つの実施例では、PPU2500は、1つ又は複数のメモリ・デバイス(「メモリ」)2504を備えるローカル・メモリに接続される。少なくとも1つの実施例では、メモリ・デバイス2504は、限定はしないが、1つ又は複数のダイナミック・ランダム・アクセス・メモリ(DRAM)デバイスを含む。少なくとも1つの実施例では、1つ又は複数のDRAMデバイスは、複数のDRAMダイが各デバイス内で積層された高帯域幅メモリ(「HBM」)サブシステムとして構成され、及び/又は構成可能である。
【0194】
少なくとも1つの実施例では、高速GPU相互接続2508は、ワイヤ・ベースのマルチ・レーン通信リンクを指し得、ワイヤ・ベースのマルチ・レーン通信リンクは、1つ又は複数のCPUと組み合わせられた1つ又は複数のPPU2500をスケーリングし、含めるために、システムによって使用され、PPU2500とCPUとの間のキャッシュ・コヒーレンス、及びCPUマスタリングをサポートする。少なくとも1つの実施例では、データ及び/又はコマンドは、高速GPU相互接続2508によって、ハブ2516を通して、1つ又は複数のコピー・エンジン、ビデオ・エンコーダ、ビデオ・デコーダ、電力管理ユニット、及び
図25に明示的に示されていないこともある他の構成要素など、PPU2500の他のユニットに/から送信される。
【0195】
少なくとも1つの実施例では、I/Oユニット2506は、システム・バス2502を介して(
図25に示されていない)ホスト・プロセッサから通信(たとえば、コマンド、データ)を送受信するように構成される。少なくとも1つの実施例では、I/Oユニット2506は、システム・バス2502を介して直接、又は、メモリ・ブリッジなどの1つ又は複数の中間デバイスを通して、ホスト・プロセッサと通信する。少なくとも1つの実施例では、I/Oユニット2506は、システム・バス2502を介してPPU2500のうちの1つ又は複数などの1つ又は複数の他のプロセッサと通信し得る。少なくとも1つの実施例では、I/Oユニット2506は、PCIeインターフェースを、PCIeバスを介した通信のために実装する。少なくとも1つの実施例では、I/Oユニット2506は、外部デバイスと通信するためのインターフェースを実装する。
【0196】
少なくとも1つの実施例では、I/Oユニット2506は、システム・バス2502を介して受信されたパケットを復号する。少なくとも1つの実施例では、少なくともいくつかのパケットは、PPU2500に様々な動作を実施させるように構成されたコマンドを表す。少なくとも1つの実施例では、I/Oユニット2506は、復号されたコマンドを、コマンドによって指定されるPPU2500の様々な他のユニットに送信する。少なくとも1つの実施例では、コマンドは、フロント・エンド・ユニット2510に送信され、及び/或いは、ハブ2516、又は(
図25に明示的に示されていない)1つ又は複数のコピー・エンジン、ビデオ・エンコーダ、ビデオ・デコーダ、電力管理ユニットなど、PPU2500の他のユニットに送信される。少なくとも1つの実施例では、I/Oユニット2506はPPU2500の様々な論理ユニット間で及びそれらの間で通信をルーティングするように構成される。
【0197】
少なくとも1つの実施例では、ホスト・プロセッサによって実行されるプログラムは、処理のためにワークロードをPPU2500に提供するバッファにおいて、コマンド・ストリームを符号化する。少なくとも1つの実施例では、ワークロードは、命令と、それらの命令によって処理されるべきデータとを含む。少なくとも1つの実施例では、バッファは、ホスト・プロセッサとPPU2500の両方によってアクセス(たとえば、読取り/書込み)可能であるメモリ中の領域であり、ホスト・インターフェース・ユニットは、I/Oユニット2506によってシステム・バス2502を介して送信されるメモリ要求を介して、システム・バス2502に接続されたシステム・メモリ中のバッファにアクセスするように構成され得る。少なくとも1つの実施例では、ホスト・プロセッサは、バッファにコマンド・ストリームを書き込み、次いでコマンド・ストリームの開始に対するポインタをPPU2500に送信し、それにより、フロント・エンド・ユニット2510は、1つ又は複数のコマンド・ストリームに対するポインタを受信し、1つ又は複数のコマンド・ストリームを管理して、コマンド・ストリームからコマンドを読み取り、コマンドをPPU2500の様々なユニットにフォワーディングする。
【0198】
少なくとも1つの実施例では、フロント・エンド・ユニット2510は、1つ又は複数のコマンド・ストリームによって定義されるタスクを処理するように様々なGPC2518を構成するスケジューラ・ユニット2512に結合される。少なくとも1つの実施例では、スケジューラ・ユニット2512は、スケジューラ・ユニット2512によって管理される様々なタスクに関係する状態情報を追跡するように構成され、状態情報は、GPC2518のうちのどれにタスクが割り当てられるか、タスクがアクティブであるのか非アクティブであるのか、タスクに関連する優先レベルなどを示し得る。少なくとも1つの実施例では、スケジューラ・ユニット2512は、GPC2518のうちの1つ又は複数上での複数のタスクの実行を管理する。
【0199】
少なくとも1つの実施例では、スケジューラ・ユニット2512は、GPC2518上での実行のためのタスクをディスパッチするように構成されたワーク分散ユニット2514に結合される。少なくとも1つの実施例では、ワーク分散ユニット2514は、スケジューラ・ユニット2512から受信された、スケジューリングされたタスクの数を追跡し、ワーク分散ユニット2514は、GPC2518の各々について、ペンディング・タスク・プール及びアクティブ・タスク・プールを管理する。少なくとも1つの実施例では、ペンディング・タスク・プールは、特定のGPC2518によって処理されるように割り当てられたタスクを含んでいるいくつかのスロット(たとえば、32個のスロット)を備え、アクティブ・タスク・プールは、GPC2518によってアクティブに処理されているタスクのためのいくつかのスロット(たとえば、4つのスロット)を備え得、それにより、GPC2518のうちの1つがタスクの実行を完了したとき、GPC2518のためのアクティブ・タスク・プールからそのタスクが排除され、ペンディング・タスク・プールからの他のタスクのうちの1つが選択され、GPC2518上での実行のためにスケジューリングされる。少なくとも1つの実施例では、データ依存性が解決されるのを待っている間など、アクティブ・タスクがGPC2518上でアイドルである場合、アクティブ・タスクがGPC2518から排除され、ペンディング・タスク・プールに戻され、その間に、ペンディング・タスク・プール中の別のタスクが選択され、GPC2518上での実行のためにスケジューリングされる。
【0200】
少なくとも1つの実施例では、ワーク分散ユニット2514は、Xバー2520を介して1つ又は複数のGPC2518と通信する。少なくとも1つの実施例では、Xバー2520は、PPU2500の多くのユニットをPPU2500の他のユニットに結合する相互接続ネットワークであり、ワーク分散ユニット2514を特定のGPC2518に結合するように構成され得る。少なくとも1つの実施例では、PPU2500の1つ又は複数の他のユニットも、ハブ2516を介してXバー2520に接続され得る。
【0201】
少なくとも1つの実施例では、タスクはスケジューラ・ユニット2512によって管理され、ワーク分散ユニット2514によってGPC2518のうちの1つにディスパッチされる。GPC2518は、タスクを処理し、結果を生成するように構成される。少なくとも1つの実施例では、結果は、GPC2518内の他のタスクによって消費されるか、Xバー2520を介して異なるGPC2518にルーティングされるか、又はメモリ2504に記憶され得る。少なくとも1つの実施例では、結果は、パーティション・ユニット2522を介してメモリ2504に書き込まれ得、パーティション・ユニット2522は、メモリ2504への/からのデータの読取り及び書込みを行うためのメモリ・インターフェースを実装する。少なくとも1つの実施例では、結果は、高速GPU相互接続2508を介して別のPPU2504又はCPUに送信され得る。少なくとも1つの実施例では、PPU2500は、限定はしないが、PPU2500に結合された別個の個別メモリ・デバイス2504の数に等しいU個のパーティション・ユニット2522を含む。
【0202】
少なくとも1つの実施例では、ホスト・プロセッサはドライバ・カーネルを実行し、ドライバ・カーネルは、ホスト・プロセッサ上で実行している1つ又は複数のアプリケーションがPPU2500上での実行のために動作をスケジューリングすることを可能にするアプリケーション・プログラミング・インターフェース(「API」)を実装する。少なくとも1つの実施例では、複数のコンピュート・アプリケーションが、PPU2500によって同時に実行され、PPU2500は、複数のコンピュート・アプリケーションに対して、隔離、サービス品質(「QoS」:quality of service)、及び独立したアドレス空間を提供する。少なくとも1つの実施例では、アプリケーションは、PPU2500による実行のための1つ又は複数のタスクをドライバ・カーネルに生成させる(たとえば、APIコールの形態の)命令を生成し、ドライバ・カーネルは、PPU2500によって処理されている1つ又は複数のストリームにタスクを出力する。少なくとも1つの実施例では、各タスクは、ワープと呼ばれることがある関係スレッドの1つ又は複数のグループを備える。少なくとも1つの実施例では、ワープは、並列に実行され得る複数の関係スレッド(たとえば、32個のスレッド)を備える。少なくとも1つの実施例では、連動スレッドは、タスクを実施するための命令を含み、共有メモリを通してデータを交換する、複数のスレッドを指すことができる。
【0203】
少なくとも1つの実施例では、
図25に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図25に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図25に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図25に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0204】
図26は、少なくとも1つの実施例による、GPC2600を示す。少なくとも1つの実施例では、GPC2600は、
図25のGPC2518である。少なくとも1つの実施例では、各GPC2600は、限定はしないが、タスクを処理するためのいくつかのハードウェア・ユニットを含み、各GPC2600は、限定はしないが、パイプライン・マネージャ2602、プレ・ラスタ演算ユニット(「PROP」)2604、ラスタ・エンジン2608、ワーク分散クロスバー(「WDX」:work distribution crossbar)2616、MMU2618、1つ又は複数のデータ処理クラスタ(「DPC」:Data Processing Cluster)2606、及びパーツの任意の好適な組合せを含む。
【0205】
少なくとも1つの実施例では、GPC2600の動作は、パイプライン・マネージャ2602によって制御される。少なくとも1つの実施例では、パイプライン・マネージャ2602は、GPC2600に割り振られたタスクを処理するための1つ又は複数のDPC2606の構成を管理する。少なくとも1つの実施例では、パイプライン・マネージャ2602は、グラフィックス・レンダリング・パイプラインの少なくとも一部分を実装するように、1つ又は複数のDPC2606のうちの少なくとも1つを構成する。少なくとも1つの実施例では、DPC2606は、プログラマブル・ストリーミング・マルチプロセッサ(「SM」:streaming multiprocessor)2614上で頂点シェーダ・プログラムを実行するように構成される。少なくとも1つの実施例では、パイプライン・マネージャ2602は、ワーク分散ユニットから受信されたパケットを、GPC2600内の適切な論理ユニットにルーティングするように構成され、少なくとも1つの実施例では、いくつかのパケットは、PROP2604中の固定機能ハードウェア・ユニット及び/又はラスタ・エンジン2608にルーティングされ得、他のパケットは、プリミティブ・エンジン2612又はSM2614による処理のためにDPC2606にルーティングされ得る。少なくとも1つの実施例では、パイプライン・マネージャ2602は、コンピューティング・パイプラインを実装するように、DPC2606のうちの少なくとも1つを構成する。少なくとも1つの実施例では、パイプライン・マネージャ2602は、CUDAプログラムの少なくとも一部分を実行するように、DPC2606のうちの少なくとも1つを構成する。
【0206】
少なくとも1つの実施例では、PROPユニット2604は、ラスタ・エンジン2608及びDPC2606によって生成されたデータを、
図25と併せて上記でより詳細に説明されたメモリ・パーティション・ユニット2522など、パーティション・ユニット中のラスタ演算(「ROP」:Raster Operation)ユニットにルーティングするように構成される。少なくとも1つの実施例では、PROPユニット2604は、色ブレンディングのための最適化を実施すること、ピクセル・データを組織化すること、アドレス・トランスレーションを実施することなどを行うように構成される。少なくとも1つの実施例では、ラスタ・エンジン2608は、限定はしないが、様々なラスタ演算を実施するように構成されたいくつかの固定機能ハードウェア・ユニットを含み、少なくとも1つの実施例では、ラスタ・エンジン2608は、限定はしないが、セットアップ・エンジン、粗いラスタ・エンジン、選別エンジン、クリッピング・エンジン、細かいラスタ・エンジン、タイル合体エンジン、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、セットアップ・エンジンは、変換された頂点を受信し、頂点によって定義された幾何学的プリミティブに関連する平面方程式を生成し、平面方程式は、プリミティブについてのカバレージ情報(たとえば、タイルのためのx、yカバレージ・マスク)を生成するために粗いラスタ・エンジンに送信され、粗いラスタ・エンジンの出力は選別エンジンに送信され、zテストに落ちたプリミティブに関連するフラグメントが選別され、クリッピング・エンジンに送信され、視錐台の外側にあるフラグメントがクリップされる。少なくとも1つの実施例では、クリッピング及び選別を通過したフラグメントは、セットアップ・エンジンによって生成された平面方程式に基づいてピクセル・フラグメントについての属性を生成するために、細かいラスタ・エンジンに渡される。少なくとも1つの実施例では、ラスタ・エンジン2608の出力は、DPC2606内に実装されたフラグメント・シェーダによってなど、任意の好適なエンティティによって処理されるべきフラグメントを含む。
【0207】
少なくとも1つの実施例では、GPC2600中に含まれる各DPC2606は、限定はしないが、Mパイプ・コントローラ(「MPC」:M-Pipe Controller)2610、プリミティブ・エンジン2612、1つ又は複数のSM2614、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、MPC2610は、DPC2606の動作を制御して、パイプライン・マネージャ2602から受信されたパケットを、DPC2606中の適切なユニットにルーティングする。少なくとも1つの実施例では、頂点に関連するパケットは、頂点に関連する頂点属性をメモリからフェッチするように構成されたプリミティブ・エンジン2612にルーティングされ、対照的に、シェーダ・プログラムに関連するパケットは、SM2614に送信され得る。
【0208】
少なくとも1つの実施例では、SM2614は、限定はしないが、いくつかのスレッドによって表されたタスクを処理するように構成されたプログラマブル・ストリーミング・プロセッサを含む。少なくとも1つの実施例では、SM2614はマルチスレッド化され、スレッドの特定のグループからの複数のスレッド(たとえば、32個のスレッド)を同時に実行するように構成され、SIMDアーキテクチャを実装し、スレッドのグループ(たとえば、ワープ)中の各スレッドは、命令の同じセットに基づいてデータの異なるセットを処理するように構成される。少なくとも1つの実施例では、スレッドのグループ中のすべてのスレッドが同じ命令を実行する。少なくとも1つの実施例では、SM2614は、SIMTアーキテクチャを実装し、スレッドのグループ中の各スレッドは、命令の同じセットに基づいて、データの異なるセットを処理するように構成されるが、スレッドのグループ中の個々のスレッドは、実行中に発散することを可能にされる。少なくとも1つの実施例では、プログラム・カウンタ、コール・スタック、及び実行状態が、各ワープについて維持されて、ワープ内のスレッドが発散するときのワープ間の同時処理及びワープ内の直列実行を可能にする。別の実施例では、プログラム・カウンタ、コール・スタック、及び実行状態が、各個々のスレッドについて維持されて、すべてのスレッド間、ワープ内及びワープ間での等しい同時処理を可能にする。少なくとも1つの実施例では、実行状態が、各個々のスレッドについて維持され、同じ命令を実行しているスレッドが、より良い効率性のために収束され、並列に実行され得る。SM2614の少なくとも1つの実施例は、
図27と併せてさらに詳細に説明される。
【0209】
少なくとも1つの実施例では、MMU2618は、GPC2600とメモリ・パーティション・ユニット(たとえば、
図25のパーティション・ユニット2522)との間のインターフェースを提供し、MMU2618は、仮想アドレスから物理アドレスへのトランスレーションと、メモリ保護と、メモリ要求の調停とを提供する。少なくとも1つの実施例では、MMU2618は、仮想アドレスからメモリ中の物理アドレスへのトランスレーションを実施するための1つ又は複数のトランスレーション・ルックアサイド・バッファ(TLB)を提供する。
【0210】
少なくとも1つの実施例では、
図26に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図26に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図26に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図26に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0211】
図27は、少なくとも1つの実施例による、ストリーミング・マルチプロセッサ(「SM」)2700を示す。少なくとも1つの実施例では、SM2700は、
図26のSM2614である。少なくとも1つの実施例では、SM2700は、限定はしないが、命令キャッシュ2702、1つ又は複数のスケジューラ・ユニット2704、レジスタ・ファイル2708、1つ又は複数の処理コア(「コア」)2710、1つ又は複数の特殊機能ユニット(「SFU」:special function unit)2712、1つ又は複数のLSU2714、相互接続ネットワーク2716、共有メモリ/L1キャッシュ2718、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、ワーク分散ユニットは、並列処理ユニット(PPU)のGPC上での実行のためにタスクをディスパッチし、各タスクは、GPC内の特定のデータ処理クラスタ(DPC)に割り振られ、タスクがシェーダ・プログラムに関連する場合、タスクはSM2700のうちの1つに割り振られる。少なくとも1つの実施例では、スケジューラ・ユニット2704は、ワーク分散ユニットからタスクを受信し、SM2700に割り当てられた1つ又は複数のスレッド・ブロックについて命令スケジューリングを管理する。少なくとも1つの実施例では、スケジューラ・ユニット2704は、並列スレッドのワープとしての実行のためにスレッド・ブロックをスケジューリングし、各スレッド・ブロックは、少なくとも1つのワープを割り振られる。少なくとも1つの実施例では、各ワープは、スレッドを実行する。少なくとも1つの実施例では、スケジューラ・ユニット2704は、複数の異なるスレッド・ブロックを管理して、異なるスレッド・ブロックにワープを割り振り、次いで、複数の異なる連動グループからの命令を、各クロック・サイクル中に様々な機能ユニット(たとえば、処理コア2710、SFU2712、及びLSU2714)にディスパッチする。
【0212】
少なくとも1つの実施例では、「連動グループ」は、通信するスレッドのグループを組織化するためのプログラミング・モデルを指し得、プログラミング・モデルは、スレッドが通信している粒度を開発者が表現することを可能にして、より豊富でより効率的な並列分解の表現を可能にする。少なくとも1つの実施例では、連動起動APIは、並列アルゴリズムの実行のためにスレッド・ブロックの間の同期をサポートする。少なくとも1つの実施例では、従来のプログラミング・モデルのAPIは、連動スレッドを同期するための単一の簡単な構築物、すなわちスレッド・ブロックのすべてのスレッドにわたるバリア(たとえば、syncthreads()関数)を提供する。しかしながら、少なくとも1つの実施例では、プログラマは、スレッド・ブロックよりも小さい粒度においてスレッドのグループを定義し、定義されたグループ内で同期して、集合的なグループ全般にわたる機能インターフェースの形態で、より高い性能、設計のフレキシビリティ、及びソフトウェア再使用を可能にし得る。少なくとも1つの実施例では、連動グループは、プログラマが、サブ・ブロック粒度及びマルチ・ブロック粒度において、スレッドのグループを明示的に定義し、連動グループ中のスレッドに対する同期などの集合的な動作を実施することを可能にする。少なくとも1つの実施例では、サブ・ブロック粒度は、単一スレッドと同じくらい小さい。少なくとも1つの実施例では、プログラミング・モデルは、ソフトウェア境界にわたるクリーンな合成をサポートし、それにより、ライブラリ及びユーティリティ関数が、収束に関して仮定する必要なしにそれらのローカル・コンテキスト内で安全に同期することができる。少なくとも1つの実施例では、連動グループ・プリミティブは、限定はしないが、プロデューサ-コンシューマ並列性、日和見並列性(opportunistic parallelism)、及びスレッド・ブロックのグリッド全体にわたるグローバルな同期を含む、新しいパターンの連動並列性を可能にする。
【0213】
少なくとも1つの実施例では、ディスパッチ・ユニット2706は、機能ユニットのうちの1つ又は複数に命令を送信するように構成され、スケジューラ・ユニット2704は、限定はしないが、同じワープからの2つの異なる命令が各クロック・サイクル中にディスパッチされることを可能にする2つのディスパッチ・ユニット2706を含む。少なくとも1つの実施例では、各スケジューラ・ユニット2704は、単一のディスパッチ・ユニット2706又は追加のディスパッチ・ユニット2706を含む。
【0214】
少なくとも1つの実施例では、各SM2700は、少なくとも1つの実施例では、限定はしないが、SM2700の機能ユニットにレジスタのセットを提供するレジスタ・ファイル2708を含む。少なくとも1つの実施例では、レジスタ・ファイル2708は、各機能ユニットがレジスタ・ファイル2708の専用部分を割り振られるように、機能ユニットの各々の間で分割される。少なくとも1つの実施例では、レジスタ・ファイル2708は、SM2700によって実行されている異なるワープ間で分割され、レジスタ・ファイル2708は、機能ユニットのデータ経路に接続されたオペランドのための一時的ストレージを提供する。少なくとも1つの実施例では、各SM2700は、限定はしないが、複数のL個の処理コア2710を含む。少なくとも1つの実施例では、SM2700は、限定はしないが、多数の(たとえば、128個以上の)個別の処理コア2710を含む。少なくとも1つの実施例では、各処理コア2710は、限定はしないが、完全にパイプライン化された、単精度の、倍精度の、及び/又は混合精度の処理ユニットを含み、これは、限定はしないが、浮動小数点算術論理ユニット及び整数算術論理ユニットを含む。少なくとも1つの実施例では、浮動小数点算術論理ユニットは、浮動小数点算術のためのIEEE754-2008規格を実装する。少なくとも1つの実施例では、処理コア2710は、限定はしないが、64個の単精度(32ビット)浮動小数点コアと、64個の整数コアと、32個の倍精度(64ビット)浮動小数点コアと、8つのテンソル・コアとを含む。
【0215】
少なくとも1つの実施例では、テンソル・コアは、行列演算を実施するように構成される。少なくとも1つの実施例では、1つ又は複数のテンソル・コアは、処理コア2710中に含まれる。少なくとも1つの実施例では、テンソル・コアは、ニューラル・ネットワーク訓練及び推論のための畳み込み演算など、深層学習行列算術を実施するように構成される。少なくとも1つの実施例では、各テンソル・コアは、4×4の行列で動作し、行列の積和演算(matrix multiply and accumulate operation)D=A×B+Cを実施し、ここで、A、B、C、及びDは4×4の行列である。
【0216】
少なくとも1つの実施例では、行列乗算入力A及びBは、16ビットの浮動小数点行列であり、和の行列C及びDは、16ビットの浮動小数点又は32ビットの浮動小数点行列である。少なくとも1つの実施例では、テンソル・コアは、32ビットの浮動小数点の和をもつ16ビットの浮動小数点入力データで動作する。少なくとも1つの実施例では、16ビットの浮動小数点乗算は、64個の演算を使用し、結果的に完全精度の積をもたらし、次いで、完全精度の積が、4×4×4の行列乗算についての他の中間積との32ビット浮動小数点加算を使用して加算される。少なくとも1つの実施例では、これらの小さい要素から築かれる、はるかに大きい2次元又はさらに高次元の行列演算を実施するために、テンソル・コアが使用される。少なくとも1つの実施例では、CUDA-C++APIなどのAPIは、CUDA-C++プログラムからテンソル・コアを効率的に使用するために、特殊な行列ロード演算、行列積和演算、及び行列ストア演算を公開している。少なくとも1つの実施例では、CUDAレベルにおいて、ワープ・レベル・インターフェースは、ワープの32個のスレッドすべてに及ぶ16×16サイズの行列を仮定する。
【0217】
少なくとも1つの実施例では、各SM2700は、限定はしないが、特殊関数(たとえば、属性評価、逆数平方根など)を実施するM個のSFU2712を含む。少なくとも1つの実施例では、SFU2712は、限定はしないが、階層ツリー・データ構造をトラバースするように構成されたツリー・トラバーサル・ユニットを含む。少なくとも1つの実施例では、SFU2712は、限定はしないが、テクスチャ・マップ・フィルタリング動作を実施するように構成されたテクスチャ・ユニットを含む。少なくとも1つの実施例では、テクスチャ・ユニットは、メモリ及びサンプル・テクスチャ・マップからテクスチャ・マップ(たとえば、テクセルの2Dアレイ)をロードして、SM2700によって実行されるシェーダ・プログラムにおける使用のためのサンプリングされたテクスチャ値を作り出すように構成される。少なくとも1つの実施例では、テクスチャ・マップは、共有メモリ/L1キャッシュ2718に記憶される。少なくとも1つの実施例では、テクスチャ・ユニットは、ミップ・マップ(たとえば、詳細のレベルが異なるテクスチャ・マップ)を使用したフィルタリング動作などのテクスチャ動作を実装する。少なくとも1つの実施例では、各SM2700は、限定はしないが、2つのテクスチャ・ユニットを含む。
【0218】
少なくとも1つの実施例では、各SM2700は、限定はしないが、共有メモリ/L1キャッシュ2718とレジスタ・ファイル2708との間でロード及びストア動作を実装するN個のLSU2714を含む。少なくとも1つの実施例では、各SM2700は、限定はしないが、相互接続ネットワーク2716を含み、相互接続ネットワーク2716は、機能ユニットの各々をレジスタ・ファイル2708に接続し、LSU2714をレジスタ・ファイル2708及び共有メモリ/L1キャッシュ2718に接続する。少なくとも1つの実施例では、相互接続ネットワーク2716はクロスバーであり、クロスバーは、機能ユニットのうちのいずれかをレジスタ・ファイル2708中のレジスタのうちのいずれかに接続し、LSU2714をレジスタ・ファイル2708と共有メモリ/L1キャッシュ2718中のメモリ・ロケーションとに接続するように構成され得る。
【0219】
少なくとも1つの実施例では、共有メモリ/L1キャッシュ2718は、SM2700とプリミティブ・エンジンとの間及びSM2700中のスレッド間でのデータ・ストレージ及び通信を可能にするオンチップ・メモリのアレイである。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2718は、限定はしないが、128KBのストレージ容量を備え、SM2700からパーティション・ユニットへの経路中にある。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2718は、読取り及び書込みをキャッシュするために使用される。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2718、L2キャッシュ、及びメモリのうちの1つ又は複数は、補助ストアである。
【0220】
少なくとも1つの実施例では、データ・キャッシュと共有メモリ機能性とを単一のメモリ・ブロックに組み合わせることは、両方のタイプのメモリ・アクセスについて改善された性能を提供する。少なくとも1つの実施例では、容量は、共有メモリが容量の半分を使用するように構成され、テクスチャ及びロード/ストア動作が残りの容量を使用することができる場合など、共有メモリを使用しないプログラムによってキャッシュとして使用されるか、又は使用可能である。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2718内の統合は、共有メモリ/L1キャッシュ2718が、データをストリーミングするための高スループット管として機能しながら、同時に高帯域幅及び低レイテンシのアクセスを、頻繁に再使用されるデータに提供することを可能にする。少なくとも1つの実施例では、汎用並列算出のために構成されたとき、グラフィックス処理と比較してより簡単な構成が使用され得る。少なくとも1つの実施例では、固定機能GPUがバイパスされて、はるかに簡単なプログラミング・モデルを作成する。少なくとも1つの実施例では及び汎用並列算出構成では、ワーク分散ユニットは、スレッドのブロックをDPCに直接割り当て、分散させる。少なくとも1つの実施例では、ブロック中のスレッドは、各スレッドが一意の結果を生成することを確実にするように、計算において一意のスレッドIDを使用して、同じプログラムを実行し、SM2700を使用してプログラムを実行し、計算を実施し、共有メモリ/L1キャッシュ2718を使用してスレッド間で通信し、LSU2714を使用して、共有メモリ/L1キャッシュ2718及びメモリ・パーティション・ユニットを通してグローバル・メモリを読み取り、書き込む。少なくとも1つの実施例では、汎用並列算出のために構成されたとき、SM2700は、DPC上で新しいワークを起動するためにスケジューラ・ユニット2704が使用することができるコマンドを書き込む。
【0221】
少なくとも1つの実施例では、PPUは、デスクトップ・コンピュータ、ラップトップ・コンピュータ、タブレット・コンピュータ、サーバ、スーパーコンピュータ、スマート・フォン(たとえば、ワイヤレス・ハンドヘルド・デバイス)、PDA、デジタル・カメラ、車両、頭部装着型ディスプレイ、ハンドヘルド電子デバイスなどに含まれるか、又はそれらに結合される。少なくとも1つの実施例では、PPUは、単一の半導体基板上で具体化される。少なくとも1つの実施例では、PPUは、追加のPPU、メモリ、RISC CPU、MMU、デジタル-アナログ変換器(「DAC」:digital-to-analog converter)などの1つ又は複数の他のデバイスとともにSoC中に含まれる。
【0222】
少なくとも1つの実施例では、PPUは、1つ又は複数のメモリ・デバイスを含むグラフィックス・カード上に含まれ得る。少なくとも1つの実施例では、グラフィックス・カードは、デスクトップ・コンピュータのマザーボード上のPCIeスロットとインターフェースするように構成され得る。少なくとも1つの実施例では、PPUは、マザーボードのチップセット中に含まれる統合されたGPU(「iGPU」:integrated GPU)であり得る。
【0223】
少なくとも1つの実施例では、
図27に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図27に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図27に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図27に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0224】
汎用コンピューティングのためのソフトウェア構築物
以下の図は、限定はしないが、少なくとも1つの実施例を実装するための例示的なソフトウェア構築物を記載する。
【0225】
図28は、少なくとも1つの実施例による、プログラミング・プラットフォームのソフトウェア・スタックを示す。少なくとも1つの実施例では、プログラミング・プラットフォームは、算出タスクを加速するために、コンピューティング・システム上のハードウェアを活用するためのプラットフォームである。少なくとも1つの実施例では、プログラミング・プラットフォームは、ライブラリ、コンパイラ指令、及び/又はプログラミング言語への拡張を通して、ソフトウェア開発者にとってアクセス可能であり得る。少なくとも1つの実施例では、プログラミング・プラットフォームは、限定はしないが、CUDA、Radeonオープン・コンピュート・プラットフォーム(「ROCm」:Radeon Open Compute Platform)、OpenCL(OpenCL(商標)はクロノス・グループ(Khronos group)によって開発される)、SYCL、又はIntel One APIであり得る。
【0226】
少なくとも1つの実施例では、プログラミング・プラットフォームのソフトウェア・スタック2800は、アプリケーション2801のための実行環境を提供する。少なくとも1つの実施例では、アプリケーション2801は、ソフトウェア・スタック2800上で起動されることが可能な任意のコンピュータ・ソフトウェアを含み得る。少なくとも1つの実施例では、アプリケーション2801は、限定はしないが、人工知能(「AI」:artificial intelligence)/機械学習(「ML」:machine learning)アプリケーション、高性能コンピューティング(「HPC」)アプリケーション、仮想デスクトップ・インフラストラクチャ(「VDI」:virtual desktop infrastructure)、又はデータ・センタ・ワークロードを含み得る。
【0227】
少なくとも1つの実施例では、アプリケーション2801及びソフトウェア・スタック2800は、ハードウェア2807上で稼働する。少なくとも1つの実施例では、ハードウェア2807は、1つ又は複数のGPU、CPU、FPGA、AIエンジン、及び/又はプログラミング・プラットフォームをサポートする他のタイプのコンピュート・デバイスを含み得る。CUDAの場合など、少なくとも1つの実施例では、ソフトウェア・スタック2800は、ベンダー固有であり、(1つ又は複数の)特定のベンダーからのデバイスのみと互換性があり得る。OpenCLの場合など、少なくとも1つの実施例では、ソフトウェア・スタック2800は、異なるベンダーからのデバイスで使用され得る。少なくとも1つの実施例では、ハードウェア2807は、アプリケーション・プログラミング・インターフェース(「API」)コールを介して算出タスクを実施するためにアクセスされ得るもう1つのデバイスに接続されたホストを含む。少なくとも1つの実施例では、限定はしないが、CPU(ただし、コンピュート・デバイスをも含み得る)及びそのメモリを含み得る、ハードウェア2807内のホストとは対照的に、ハードウェア2807内のデバイスは、限定はしないが、GPU、FPGA、AIエンジン、又は他のコンピュート・デバイス(ただし、CPUをも含み得る)及びそのメモリを含み得る。
【0228】
少なくとも1つの実施例では、プログラミング・プラットフォームのソフトウェア・スタック2800は、限定はしないが、いくつかのライブラリ2803と、ランタイム2805と、デバイス・カーネル・ドライバ2806とを含む。少なくとも1つの実施例では、ライブラリ2803の各々は、コンピュータ・プログラムによって使用され、ソフトウェア開発中に活用され得る、データ及びプログラミング・コードを含み得る。少なくとも1つの実施例では、ライブラリ2803は、限定はしないが、事前に書かれたコード及びサブルーチン、クラス、値、タイプ仕様、構成データ、ドキュメンテーション、ヘルプ・データ、並びに/又はメッセージ・テンプレートを含み得る。少なくとも1つの実施例では、ライブラリ2803は、1つ又は複数のタイプのデバイス上での実行のために最適化される機能を含む。少なくとも1つの実施例では、ライブラリ2803は、限定はしないが、デバイス上で数学、深層学習、及び/又は他のタイプの動作を実施するための機能を含み得る。少なくとも1つの実施例では、ライブラリ2803は、ライブラリ2803において実装される機能を公開する、1つ又は複数のAPIを含み得る、対応するAPI2802に関連する。
【0229】
少なくとも1つの実施例では、アプリケーション2801は、
図33~
図35と併せて以下でより詳細に説明されるように、実行可能コードにコンパイルされるソース・コードとして書かれる。少なくとも1つの実施例では、アプリケーション2801の実行可能コードは、少なくとも部分的に、ソフトウェア・スタック2800によって提供される実行環境上で稼働し得る。少なくとも1つの実施例では、アプリケーション2801の実行中に、ホストとは対照的な、デバイス上で稼働する必要があるコードに達し得る。少なくとも1つの実施例では、そのような場合、デバイス上で必須のコードをロード及び起動するために、ランタイム2805がコールされ得る。少なくとも1つの実施例では、ランタイム2805は、アプリケーションS01の実行をサポートすることが可能である、任意の技術的に実現可能なランタイム・システムを含み得る。
【0230】
少なくとも1つの実施例では、ランタイム2805は、(1つ又は複数の)API2804として示されている、対応するAPIに関連する、1つ又は複数のランタイム・ライブラリとして実装される。少なくとも1つの実施例では、そのようなランタイム・ライブラリのうちの1つ又は複数は、限定はしないが、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、及び/又は同期のための機能を含み得る。少なくとも1つの実施例では、メモリ管理機能は、限定はしないが、デバイス・メモリを割り振り、割振り解除し、コピーし、並びにホスト・メモリとデバイス・メモリとの間でデータを転送するための機能を含み得る。少なくとも1つの実施例では、実行制御機能は、限定はしないが、デバイス上で機能(機能がホストからコール可能なグローバル機能であるとき、「カーネル」と呼ばれることがある)を起動し、デバイス上で実行されるべき所与の機能のためのランタイム・ライブラリによって維持されるバッファ中に属性値をセットするための機能を含み得る。
【0231】
少なくとも1つの実施例では、ランタイム・ライブラリ及び対応する(1つ又は複数の)API2804は、任意の技術的に実現可能な様式で実装され得る。少なくとも1つの実施例では、ある(又は任意の数の)APIは、デバイスのきめ細かい制御のための機能の低レベルのセットを公開し得るが、別の(又は任意の数の)APIは、そのような機能のより高いレベルのセットを公開し得る。少なくとも1つの実施例では、高レベル・ランタイムAPIは、低レベルAPIの上に築かれ得る。少なくとも1つの実施例では、ランタイムAPIのうちの1つ又は複数は、言語依存しないランタイムAPIの上に階層化された言語固有APIであり得る。
【0232】
少なくとも1つの実施例では、デバイス・カーネル・ドライバ2806は、基礎をなすデバイスとの通信を容易にするように構成される。少なくとも1つの実施例では、デバイス・カーネル・ドライバ2806は、(1つ又は複数の)API2804などのAPI及び/又は他のソフトウェアが依拠する、低レベル機能性を提供し得る。少なくとも1つの実施例では、デバイス・カーネル・ドライバ2806は、ランタイムにおいて中間表現(「IR」:intermediate representation)コードをバイナリ・コードにコンパイルするように構成され得る。少なくとも1つの実施例では、CUDAの場合、デバイス・カーネル・ドライバ2806は、ハードウェア固有でない並列スレッド実行(「PTX」:Parallel Thread Execution)IRコードを、(コンパイルされたバイナリ・コードのキャッシングを伴って)ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにコンパイルし得、これは、コードを「ファイナライズする」(finalizing)と呼ばれることもある。少なくとも1つの実施例では、そうすることは、ファイナライズされたコードがターゲット・デバイス上で稼働することを許し得、これは、ソース・コードが最初にPTXコードにコンパイルされたとき、存在していないことがある。代替的に、少なくとも1つの実施例では、デバイス・ソース・コードは、デバイス・カーネル・ドライバ2806がランタイムにおいてIRコードをコンパイルすることを必要とすることなしに、オフラインでバイナリ・コードにコンパイルされ得る。
【0233】
少なくとも1つの実施例では、
図28に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図28に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図28に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図28に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0234】
図29は、少なくとも1つの実施例による、
図28のソフトウェア・スタック2800のCUDA実装形態を示す。少なくとも1つの実施例では、アプリケーション2901が起動され得るCUDAソフトウェア・スタック2900は、CUDAライブラリ2903と、CUDAランタイム2905と、CUDAドライバ2907と、デバイス・カーネル・ドライバ2908とを含む。少なくとも1つの実施例では、CUDAソフトウェア・スタック2900は、ハードウェア2909上で実行し、ハードウェア2909はGPUを含み得、GPUは、CUDAをサポートし、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される。
【0235】
少なくとも1つの実施例では、アプリケーション2901、CUDAランタイム2905、及びデバイス・カーネル・ドライバ2908は、それぞれ、
図28と併せて上記で説明された、アプリケーション2801、ランタイム2805、及びデバイス・カーネル・ドライバ2806と同様の機能性を実施し得る。少なくとも1つの実施例では、CUDAドライバ2907は、CUDAドライバAPI2906を実装するライブラリ(libcuda.so)を含む。少なくとも1つの実施例では、CUDAランタイム・ライブラリ(cudart)によって実装されるCUDAランタイムAPI2904と同様に、CUDAドライバAPI2906は、限定はしないが、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、同期、及び/又はグラフィックス相互運用性のための機能を公開し得る。少なくとも1つの実施例では、CUDAドライバAPI2906は、CUDAランタイムAPI2904が、暗黙的な初期化、(プロセスに類似する)コンテキスト管理、及び(動的にロードされたライブラリに類似する)モジュール管理を提供することによって、デバイス・コード管理を簡略化するという点で、CUDAランタイムAPI2904とは異なる。少なくとも1つの実施例では、高レベルCUDAランタイムAPI2904とは対照的に、CUDAドライバAPI2906は、特にコンテキスト及びモジュール・ローディングに関して、デバイスのよりきめ細かい制御を提供する低レベルAPIである。少なくとも1つの実施例では、CUDAドライバAPI2906は、CUDAランタイムAPI2904によって公開されないコンテキスト管理のための機能を公開し得る。少なくとも1つの実施例では、CUDAドライバAPI2906はまた、言語依存せず、たとえば、CUDAランタイムAPI2904に加えて、OpenCLをサポートする。さらに、少なくとも1つの実施例では、CUDAランタイム2905を含む開発ライブラリは、ユーザモードCUDAドライバ2907と(「ディスプレイ」ドライバと呼ばれることもある)カーネルモード・デバイス・ドライバ2908とを含むドライバ構成要素とは別個のものと見なされ得る。
【0236】
少なくとも1つの実施例では、CUDAライブラリ2903は、限定はしないが、数学ライブラリ、深層学習ライブラリ、並列アルゴリズム・ライブラリ、及び/又は信号/画像/ビデオ処理ライブラリを含み得、それらをアプリケーション2901などの並列コンピューティング・アプリケーションが利用し得る。少なくとも1つの実施例では、CUDAライブラリ2903は、とりわけ、線形代数演算を実施するための基本線形代数サブプログラム(「BLAS」:Basic Linear Algebra Subprograms)の実装であるcuBLASライブラリ、高速フーリエ変換(「FFT」:fast Fourier transform)を算出するためのcuFFTライブラリ、及び乱数を生成するためのcuRANDライブラリなど、数学ライブラリを含み得る。少なくとも1つの実施例では、CUDAライブラリ2903は、とりわけ、深層ニューラル・ネットワークのためのプリミティブのcuDNNライブラリ及び高性能深層学習推論のためのTensorRTプラットフォームなど、深層学習ライブラリを含み得る。
【0237】
少なくとも1つの実施例では、
図29に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図29に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図29に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図29に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0238】
図30は、少なくとも1つの実施例による、
図28のソフトウェア・スタック2800のROCm実装形態を示す。少なくとも1つの実施例では、アプリケーション3001が起動され得るROCmソフトウェア・スタック3000は、言語ランタイム3003と、システム・ランタイム3005と、サンク(thunk)3007と、ROCmカーネル・ドライバ3008とを含む。少なくとも1つの実施例では、ROCmソフトウェア・スタック3000は、ハードウェア3009上で実行し、ハードウェア3009はGPUを含み得、GPUは、ROCmをサポートし、カリフォルニア州サンタクララのAMD Corporationによって開発される。
【0239】
少なくとも1つの実施例では、アプリケーション3001は、
図28と併せて上記で説明されたアプリケーション2801と同様の機能性を実施し得る。少なくとも1つの実施例では、さらに、言語ランタイム3003及びシステム・ランタイム3005は、
図28と併せて上記で説明されたランタイム2805と同様の機能性を実施し得る。少なくとも1つの実施例では、言語ランタイム3003とシステム・ランタイム3005とは、システム・ランタイム3005が、ROCrシステム・ランタイムAPI3004を実装し、異種システム・アーキテクチャ(「HSA」:Heterogeneous System Architecture)ランタイムAPIを利用する、言語依存しないランタイムであるという点で、異なる。少なくとも1つの実施例では、HSAランタイムAPIは、とりわけ、メモリ管理、カーネルの設計されたディスパッチを介した実行制御、エラー対処、システム及びエージェント情報、並びにランタイム初期化及び停止(shutdown)のための機能を含む、AMD GPUにアクセスし、それと対話するためのインターフェースを公開する、シン(thin)・ユーザモードAPIである。少なくとも1つの実施例では、システム・ランタイム3005とは対照的に、言語ランタイム3003は、ROCrシステム・ランタイムAPI3004の上に階層化された言語固有ランタイムAPI3002の実装である。少なくとも1つの実施例では、言語ランタイムAPIは、限定はしないが、とりわけ、ポータビリティのための異種コンピュート・インターフェース(「HIP」)言語ランタイムAPI、異種コンピュート・コンパイラ(「HCC」:Heterogeneous Compute Compiler)言語ランタイムAPI、又はOpenCL APIを含み得る。特にHIP言語は、機能的に同様のバージョンのCUDA機構をもつC++プログラミング言語の拡張であり、少なくとも1つの実施例では、HIP言語ランタイムAPIは、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、及び同期のための機能など、
図29と併せて上記で説明されたCUDAランタイムAPI2904の機能と同様である機能を含む。
【0240】
少なくとも1つの実施例では、サンク(ROCt)3007は、基礎をなすROCmドライバ3008と対話するために使用され得るインターフェース3006である。少なくとも1つの実施例では、ROCmドライバ3008は、AMDGPUドライバとHSAカーネル・ドライバ(amdkfd)との組合せである、ROCkドライバである。少なくとも1つの実施例では、AMDGPUドライバは、
図28と併せて上記で説明されたデバイス・カーネル・ドライバ2806と同様の機能性を実施する、AMDによって開発されたGPUのためのデバイス・カーネル・ドライバである。少なくとも1つの実施例では、HSAカーネル・ドライバは、異なるタイプのプロセッサがハードウェア特徴を介してより効果的にシステム・リソースを共有することを許すドライバである。
【0241】
少なくとも1つの実施例では、様々なライブラリ(図示せず)が、言語ランタイム3003より上にROCmソフトウェア・スタック3000中に含まれ、
図29と併せて上記で説明されたCUDAライブラリ2903に対する機能性の類似性を提供し得る。少なくとも1つの実施例では、様々なライブラリは、限定はしないが、とりわけ、CUDA cuBLASの機能と同様の機能を実装するhipBLASライブラリ、CUDA cuFFTと同様であるFFTを算出するためのrocFFTライブラリなど、数学、深層学習、及び/又は他のライブラリを含み得る。
【0242】
少なくとも1つの実施例では、
図30に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図30に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図30に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図30に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0243】
図31は、少なくとも1つの実施例による、
図28のソフトウェア・スタック2800のOpenCL実装形態を示す。少なくとも1つの実施例では、アプリケーション3101が起動され得るOpenCLソフトウェア・スタック3100は、OpenCLフレームワーク3110と、OpenCLランタイム3106と、ドライバ3107とを含む。少なくとも1つの実施例では、OpenCLソフトウェア・スタック3100は、ベンダー固有でないハードウェア2909上で実行する。少なくとも1つの実施例では、OpenCLは、異なるベンダーによって開発されたデバイスによってサポートされるので、そのようなベンダーからのハードウェアと相互動作するために、特定のOpenCLドライバが必要とされ得る。
【0244】
少なくとも1つの実施例では、アプリケーション3101、OpenCLランタイム3106、デバイス・カーネル・ドライバ3107、及びハードウェア3108は、それぞれ、
図28と併せて上記で説明された、アプリケーション2801、ランタイム2805、デバイス・カーネル・ドライバ2806、及びハードウェア2807と同様の機能性を実施し得る。少なくとも1つの実施例では、アプリケーション3101は、デバイス上で実行されるべきであるコードをもつOpenCLカーネル3102をさらに含む。
【0245】
少なくとも1つの実施例では、OpenCLは、ホストに接続されたデバイスをホストが制御することを可能にする「プラットフォーム」を定義する。少なくとも1つの実施例では、OpenCLフレームワークは、プラットフォームAPI3103及びランタイムAPI3105として示されている、プラットフォーム層API及びランタイムAPIを提供する。少なくとも1つの実施例では、ランタイムAPI3105は、デバイス上でのカーネルの実行を管理するためにコンテキストを使用する。少なくとも1つの実施例では、各識別されたデバイスは、それぞれのコンテキストに関連し得、ランタイムAPI3105は、それぞれのコンテキストを使用して、そのデバイスのために、とりわけ、コマンド・キュー、プログラム・オブジェクト、及びカーネル・オブジェクトを管理し、メモリ・オブジェクトを共有し得る。少なくとも1つの実施例では、プラットフォームAPI3103は、とりわけ、デバイスを選択及び初期化し、コマンド・キューを介してデバイスにワークをサブミットし、デバイスとの間でのデータ転送を可能にするために、デバイス・コンテキストが使用されることを許す機能を公開する。少なくとも1つの実施例では、さらに、OpenCLフレームワークは、とりわけ、数学関数とリレーショナル関数と画像処理関数とを含む、様々な組み込み関数(図示せず)を提供する。
【0246】
少なくとも1つの実施例では、コンパイラ3104も、OpenCLフレームワーク3110中に含まれる。少なくとも1つの実施例では、ソース・コードは、アプリケーションを実行するより前にオフラインでコンパイルされるか、又はアプリケーションの実行中にオンラインでコンパイルされ得る。CUDA及びROCmとは対照的に、少なくとも1つの実施例におけるOpenCLアプリケーションは、コンパイラ3104によってオンラインでコンパイルされ得、コンパイラ3104は、標準ポータブル中間表現(「SPIR-V」:Standard Portable Intermediate Representation)コードなど、ソース・コード及び/又はIRコードをバイナリ・コードにコンパイルするために使用され得る、任意の数のコンパイラを表すために含まれる。代替的に、少なくとも1つの実施例では、OpenCLアプリケーションは、そのようなアプリケーションの実行より前に、オフラインでコンパイルされ得る。
【0247】
少なくとも1つの実施例では、
図31に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図31に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図31に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図31に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0248】
図32は、少なくとも1つの実施例による、プログラミング・プラットフォームによってサポートされるソフトウェアを示す。少なくとも1つの実施例では、プログラミング・プラットフォーム3204は、アプリケーション3200が依拠し得る、様々なプログラミング・モデル3203、ミドルウェア及び/又はライブラリ3202、並びにフレームワーク3201をサポートするように構成される。少なくとも1つの実施例では、アプリケーション3200は、たとえば、MXNet、PyTorch、又はTensorFlowなど、深層学習フレームワークを使用して実装される、AI/MLアプリケーションであり得、これは、基礎をなすハードウェア上で加速コンピューティングを提供するために、cuDNN、NVIDIA集合通信ライブラリ(「NCCL」)、及び/又はNVIDAディベロッパー・データ・ローディング・ライブラリ(「DALI(登録商標)」:NVIDA Developer Data Loading Library)CUDAライブラリなど、ライブラリに依拠し得る。
【0249】
少なくとも1つの実施例では、プログラミング・プラットフォーム3204は、それぞれ、
図29、
図30、及び
図31と併せて上記で説明された、CUDA、ROCm、又はOpenCLプラットフォームのうちの1つであり得る。少なくとも1つの実施例では、プログラミング・プラットフォーム3204は、アルゴリズム及びデータ構造の表現を許す基礎をなすコンピューティング・システムの抽象化である、複数のプログラミング・モデル3203をサポートする。少なくとも1つの実施例では、プログラミング・モデル3203は、性能を改善するために、基礎をなすハードウェアの特徴を公開し得る。少なくとも1つの実施例では、プログラミング・モデル3203は、限定はしないが、CUDA、HIP、OpenCL、C++加速超並列処理(「C++AMP」:C++ Accelerated Massive Parallelism)、オープン・マルチプロセシング(「OpenMP」:Open Multi-Processing)、オープン・アクセラレータ(「OpenACC」:Open Accelerators)、及び/又はVulcanコンピュート(Vulcan Compute)を含み得る。
【0250】
少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3202は、プログラミング・モデル3204の抽象化の実装を提供する。少なくとも1つの実施例では、そのようなライブラリは、コンピュータ・プログラムによって使用され、ソフトウェア開発中に活用され得る、データ及びプログラミング・コードを含む。少なくとも1つの実施例では、そのようなミドルウェアは、プログラミング・プラットフォーム3204から利用可能なソフトウェア以外にアプリケーションにサービスを提供するソフトウェアを含む。少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3202は、限定はしないが、cuBLAS、cuFFT、cuRAND、及び他のCUDAライブラリ、又は、rocBLAS、rocFFT、rocRAND、及び他のROCmライブラリを含み得る。さらに、少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3202は、GPUのための通信ルーチンを提供するNCCL及びROCm通信集合ライブラリ(「RCCL」:ROCm Communication Collectives Library)のライブラリ、深層学習加速のためのMIOpenライブラリ、並びに/又は、線形代数、行列及びベクトル演算、幾何学的変換、数値ソルバー、及び関係するアルゴリズムのための固有(Eigen)ライブラリを含み得る。
【0251】
少なくとも1つの実施例では、アプリケーション・フレームワーク3201は、ライブラリ及び/又はミドルウェア3202に依存する。少なくとも1つの実施例では、アプリケーション・フレームワーク3201の各々は、アプリケーション・ソフトウェアの標準構造を実装するために使用されるソフトウェア・フレームワークである。少なくとも1つの実施例では、上記で説明されたAI/ML実例に戻ると、AI/MLアプリケーションは、Caffe、Caffe2、TensorFlow、Keras、PyTorch、又はMxNet深層学習フレームワークなど、フレームワークを使用して実装され得る。
【0252】
少なくとも1つの実施例では、
図32に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図32に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図32に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図32に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0253】
図33は、少なくとも1つの実施例による、
図28~
図31のプログラミング・プラットフォームのうちの1つの上で実行するためのコードをコンパイルすることを示す。少なくとも1つの実施例では、コンパイラ3301は、ホスト・コード並びにデバイス・コードの両方を含むソース・コード3300を受信する。少なくとも1つの実施例では、コンパイラ3301は、ソース・コード3300を、ホスト上での実行のためのホスト実行可能コード3302及びデバイス上での実行のためのデバイス実行可能コード3303にコンバートするように構成される。少なくとも1つの実施例では、ソース・コード3300は、アプリケーションの実行より前にオフラインでコンパイルされるか、又はアプリケーションの実行中にオンラインでコンパイルされるかのいずれかであり得る。
【0254】
少なくとも1つの実施例では、ソース・コード3300は、C++、C、Fortranなど、コンパイラ3301によってサポートされる任意のプログラミング言語のコードを含み得る。少なくとも1つの実施例では、ソース・コード3300は、ホスト・コードとデバイス・コードとの混合物を有する単一ソース・ファイル中に含まれ得、その中にデバイス・コードのロケーションが示されている。少なくとも1つの実施例では、単一ソース・ファイルは、CUDAコードを含む.cuファイル、又はHIPコードを含む.hip.cppファイルであり得る。代替的に、少なくとも1つの実施例では、ソース・コード3300は、その中でホスト・コードとデバイス・コードとが分離される単一ソース・ファイルではなく、複数のソース・コード・ファイルを含み得る。
【0255】
少なくとも1つの実施例では、コンパイラ3301は、ソース・コード3300を、ホスト上での実行のためのホスト実行可能コード3302及びデバイス上での実行のためのデバイス実行可能コード3303にコンパイルするように構成される。少なくとも1つの実施例では、コンパイラ3301は、ソース・コード3300を抽象システム・ツリー(AST:abstract system tree)に構文解析することと、最適化を実施することと、実行可能コードを生成することとを含む、動作を実施する。ソース・コード3300が単一ソース・ファイルを含む、少なくとも1つの実施例では、コンパイラ3301は、
図34に関して以下でより詳細に説明されるように、そのような単一ソース・ファイル中でデバイス・コードをホスト・コードから分離し、デバイス・コード及びホスト・コードを、それぞれ、デバイス実行可能コード3303及びホスト実行可能コード3302にコンパイルし、デバイス実行可能コード3303とホスト実行可能コード3302とを単一のファイルにおいて互いにリンクし得る。
【0256】
少なくとも1つの実施例では、ホスト実行可能コード3302及びデバイス実行可能コード3303は、バイナリ・コード及び/又はIRコードなど、任意の好適なフォーマットのものであり得る。少なくとも1つの実施例では、CUDAの場合、ホスト実行可能コード3302は、ネイティブ・オブジェクト・コードを含み得、デバイス実行可能コード3303は、PTX中間表現のコードを含み得る。少なくとも1つの実施例では、ROCmの場合、ホスト実行可能コード3302とデバイス実行可能コード3303の両方は、ターゲット・バイナリ・コードを含み得る。
【0257】
少なくとも1つの実施例では、
図33に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図33に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図33に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図33に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0258】
図34は、少なくとも1つの実施例による、
図28~
図31のプログラミング・プラットフォームのうちの1つの上で実行するためのコードをコンパイルすることのより詳細な図である。少なくとも1つの実施例では、コンパイラ3401は、ソース・コード3400を受信し、ソース・コード3400をコンパイルし、実行可能ファイル3410を出力するように構成される。少なくとも1つの実施例では、ソース・コード3400は、ホスト・コードとデバイス・コードの両方を含む、.cuファイル、.hip.cppファイル、又は別のフォーマットのファイルなど、単一ソース・ファイルである。少なくとも1つの実施例では、コンパイラ3401は、限定はしないが、.cuファイル中のCUDAコードをコンパイルするためのNVIDIA CUDAコンパイラ(「NVCC」:NVIDIA CUDA compiler)、又は.hip.cppファイル中のHIPコードをコンパイルするためのHCCコンパイラであり得る。
【0259】
少なくとも1つの実施例では、コンパイラ3401は、コンパイラ・フロント・エンド3402と、ホスト・コンパイラ3405と、デバイス・コンパイラ3406と、リンカ3409とを含む。少なくとも1つの実施例では、コンパイラ・フロント・エンド3402は、ソース・コード3400中でデバイス・コード3404をホスト・コード3403から分離するように構成される。少なくとも1つの実施例では、デバイス・コード3404は、デバイス・コンパイラ3406によってデバイス実行可能コード3408にコンパイルされ、デバイス実行可能コード3408は、説明されたように、バイナリ・コード又はIRコードを含み得る。少なくとも1つの実施例では、別個に、ホスト・コード3403は、ホスト・コンパイラ3405によってホスト実行可能コード3407にコンパイルされる。少なくとも1つの実施例では、NVCCの場合、ホスト・コンパイラ3405は、限定はしないが、ネイティブ・オブジェクト・コードを出力する汎用C/C++コンパイラであり得るが、デバイス・コンパイラ3406は、限定はしないが、LLVMコンパイラ・インフラストラクチャをフォークし、PTXコード又はバイナリ・コードを出力する、低レベル仮想機械(「LLVM」:Low Level Virtual Machine)ベースのコンパイラであり得る。少なくとも1つの実施例では、HCCの場合、ホスト・コンパイラ3405とデバイス・コンパイラ3406の両方は、限定はしないが、ターゲット・バイナリ・コードを出力するLLVMベースのコンパイラであり得る。
【0260】
少なくとも1つの実施例では、ソース・コード3400をホスト実行可能コード3407及びデバイス実行可能コード3408にコンパイルした後に、リンカ3409は、ホスト実行可能コード3407とデバイス実行可能コード3408とを実行可能ファイル3410において互いにリンクする。少なくとも1つの実施例では、ホストのためのネイティブ・オブジェクト・コードと、デバイスのためのPTX又はバイナリ・コードとは、オブジェクト・コードを記憶するために使用されるコンテナ・フォーマットである、実行可能及びリンク可能フォーマット(「ELF」:Executable and Linkable Format)ファイルにおいて互いにリンクされ得る。
【0261】
少なくとも1つの実施例では、
図34に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図34に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図34に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図34に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0262】
図35は、少なくとも1つの実施例による、ソース・コードをコンパイルするより前にソース・コードをトランスレートすることを示す。少なくとも1つの実施例では、ソース・コード3500は、トランスレーション・ツール3501を通して渡され、トランスレーション・ツール3501は、ソース・コード3500を、トランスレートされたソース・コード3502にトランスレートする。少なくとも1つの実施例では、コンパイラ3503は、
図33と併せて上記で説明されたように、ホスト実行可能コード3302及びデバイス実行可能3303へのコンパイラ3301によるソース・コード3300のコンパイルと同様であるプロセスにおいて、トランスレートされたソース・コード3502をホスト実行可能コード3504及びデバイス実行可能コード3505にコンパイルするために使用される。
【0263】
少なくとも1つの実施例では、トランスレーション・ツール3501によって実施されるトランスレーションは、稼働することが最初に意図された環境とは異なる環境における実行のためにソース3500を移植するために使用される。少なくとも1つの実施例では、トランスレーション・ツール3501は、限定はしないが、CUDAプラットフォームを対象とするCUDAコードを、ROCmプラットフォーム上でコンパイル及び実行され得るHIPコードに「hipify」するために使用される、HIPトランスレータを含み得る。少なくとも1つの実施例では、ソース・コード3500のトランスレーションは、
図36A~
図37と併せて以下でより詳細に説明されるように、ソース・コード3500を構文解析することと、あるプログラミング・モデル(たとえば、CUDA)によって提供される(1つ又は複数の)APIへのコールを、別のプログラミング・モデル(たとえば、HIP)によって提供される(1つ又は複数の)APIへの対応するコールにコンバートすることとを含み得る。少なくとも1つの実施例では、CUDAコードをhipifyすることの実例に戻ると、CUDAランタイムAPI、CUDAドライバAPI、及び/又はCUDAライブラリへのコールは、対応するHIP APIコールにコンバートされ得る。少なくとも1つの実施例では、トランスレーション・ツール3501によって実施される自動トランスレーションは、時々、不完全であり、ソース・コード3500を完全に移植するために追加の手動の労力を必要とし得る。
【0264】
少なくとも1つの実施例では、
図35に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図35に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図35に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図35に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0265】
汎用コンピューティングのためのGPUを構成すること
以下の図は、限定はしないが、少なくとも1つの実施例による、コンピュート・ソース・コードをコンパイル及び実行するための例示的なアーキテクチャを記載する。
【0266】
図36Aは、少なくとも1つの実施例による、異なるタイプの処理ユニットを使用してCUDAソース・コード3610をコンパイル及び実行するように構成されたシステム36A00を示す。少なくとも1つの実施例では、システム36A00は、限定はしないが、CUDAソース・コード3610と、CUDAコンパイラ3650と、ホスト実行可能コード3670(1)と、ホスト実行可能コード3670(2)と、CUDAデバイス実行可能コード3684と、CPU3690と、CUDA対応GPU3694と、GPU3692と、CUDAからHIPへのトランスレーション・ツール3620と、HIPソース・コード3630と、HIPコンパイラ・ドライバ3640と、HCC3660と、HCCデバイス実行可能コード3682とを含む。
【0267】
少なくとも1つの実施例では、CUDAソース・コード3610は、CUDAプログラミング言語の人間が読み取れるコードの集合である。少なくとも1つの実施例では、CUDAコードは、CUDAプログラミング言語の人間が読み取れるコードである。少なくとも1つの実施例では、CUDAプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、デバイス・コードは、コンパイルの後にデバイス上で並列に実行可能であるソース・コードである。少なくとも1つの実施例では、デバイスは、CUDA対応GPU3690、GPU36192、又は別のGPGPUなど、並列命令処理のために最適化されるプロセッサであり得る。少なくとも1つの実施例では、ホスト・コードは、コンパイルの後にホスト上で実行可能であるソース・コードである。少なくとも1つの実施例では、ホストは、CPU3690など、連続命令処理のために最適化されるプロセッサである。
【0268】
少なくとも1つの実施例では、CUDAソース・コード3610は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3612と、(ゼロを含む)任意の数のデバイス機能3614と、(ゼロを含む)任意の数のホスト機能3616と、(ゼロを含む)任意の数のホスト/デバイス機能3618とを含む。少なくとも1つの実施例では、グローバル機能3612と、デバイス機能3614と、ホスト機能3616と、ホスト/デバイス機能3618とは、CUDAソース・コード3610中で混合され得る。少なくとも1つの実施例では、グローバル機能3612の各々は、デバイス上で実行可能であり、ホストからコール可能である。少なくとも1つの実施例では、グローバル機能3612のうちの1つ又は複数は、したがって、デバイスへのエントリ・ポイントとして働き得る。少なくとも1つの実施例では、グローバル機能3612の各々はカーネルである。少なくとも1つの実施例では、及び動的並列処理として知られる技法では、グローバル機能3612のうちの1つ又は複数は、カーネルを定義し、カーネルは、デバイス上で実行可能であり、そのようなデバイスからコール可能である。少なくとも1つの実施例では、カーネルは、実行中にデバイス上のN(ここで、Nは任意の正の整数である)個の異なるスレッドによって並列にN回実行される。
【0269】
少なくとも1つの実施例では、デバイス機能3614の各々は、デバイス上で実行され、そのようなデバイスからのみコール可能である。少なくとも1つの実施例では、ホスト機能3616の各々は、ホスト上で実行され、そのようなホストからのみコール可能である。少なくとも1つの実施例では、ホスト/デバイス機能3616の各々は、ホスト上で実行可能であり、そのようなホストからのみコール可能であるホスト・バージョンの機能と、デバイス上で実行可能であり、そのようなデバイスからのみコール可能であるデバイス・バージョンの機能の両方を定義する。
【0270】
少なくとも1つの実施例では、CUDAソース・コード3610は、限定はしないが、CUDAランタイムAPI3602を介して定義される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、CUDAランタイムAPI3602は、限定はしないが、デバイス・メモリを割り振り、割振り解除し、ホスト・メモリとデバイス・メモリとの間でデータを転送し、複数のデバイスをもつシステムを管理するなどのためにホスト上で実行する、任意の数の機能を含み得る。少なくとも1つの実施例では、CUDAソース・コード3610は、任意の数の他のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、CUDA APIは、CUDAコードによる使用のために設計される任意のAPIであり得る。少なくとも1つの実施例では、CUDA APIは、限定はしないが、CUDAランタイムAPI3602、CUDAドライバAPI、任意の数のCUDAライブラリのためのAPIなどを含む。少なくとも1つの実施例では、及びCUDAランタイムAPI3602に対して、CUDAドライバAPIは、より低いレベルのAPIであるが、デバイスのよりきめ細かい制御を提供する。少なくとも1つの実施例では、CUDAライブラリの実例は、限定はしないが、cuBLAS、cuFFT、cuRAND、cuDNNなどを含む。
【0271】
少なくとも1つの実施例では、CUDAコンパイラ3650は、ホスト実行可能コード3670(1)及びCUDAデバイス実行可能コード3684を生成するために、入力CUDAコード(たとえば、CUDAソース・コード3610)をコンパイルする。少なくとも1つの実施例では、CUDAコンパイラ3650はNVCCである。少なくとも1つの実施例では、ホスト実行可能コード3670(1)は、CPU3690上で実行可能である、入力ソース・コード中に含まれるホスト・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、CPU3690は、連続命令処理のために最適化される任意のプロセッサであり得る。
【0272】
少なくとも1つの実施例では、CUDAデバイス実行可能コード3684は、CUDA対応GPU3694上で実行可能である、入力ソース・コード中に含まれるデバイス・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、CUDAデバイス実行可能コード3684は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3684は、限定はしないが、PTXコードなどのIRコードを含み、これは、デバイス・ドライバによって、特定のターゲット・デバイス(たとえば、CUDA対応GPU3694)のためのバイナリ・コードに、ランタイムにおいてさらにコンパイルされる。少なくとも1つの実施例では、CUDA対応GPU3694は、並列命令処理のために最適化され、CUDAをサポートする、任意のプロセッサであり得る。少なくとも1つの実施例では、CUDA対応GPU3694は、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される。
【0273】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610を機能的に同様のHIPソース・コード3630にトランスレートするように構成される。少なくとも1つの実施例では、HIPソース・コード3630は、HIPプログラミング言語の人間が読み取れるコードの集合である。少なくとも1つの実施例では、HIPコードは、HIPプログラミング言語の人間が読み取れるコードである。少なくとも1つの実施例では、HIPプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための、機能的に同様のバージョンのCUDA機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、HIPプログラミング言語は、CUDAプログラミング言語の機能性のサブセットを含み得る。少なくとも1つの実施例では、たとえば、HIPプログラミング言語は、限定はしないが、グローバル機能3612を定義するための(1つ又は複数の)機構を含むが、そのようなHIPプログラミング言語は、動的並列処理のサポートがないことがあり、したがって、HIPコードにおいて定義されたグローバル機能3612は、ホストからのみコール可能であり得る。
【0274】
少なくとも1つの実施例では、HIPソース・コード3630は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3612と、(ゼロを含む)任意の数のデバイス機能3614と、(ゼロを含む)任意の数のホスト機能3616と、(ゼロを含む)任意の数のホスト/デバイス機能3618とを含む。少なくとも1つの実施例では、HIPソース・コード3630は、HIPランタイムAPI3632において指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、HIPランタイムAPI3632は、限定はしないが、CUDAランタイムAPI3602中に含まれる機能のサブセットの機能的に同様のバージョンを含む。少なくとも1つの実施例では、HIPソース・コード3630は、任意の数の他のHIP APIにおいて指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、HIP APIは、HIPコード及び/又はROCmによる使用のために設計される任意のAPIであり得る。少なくとも1つの実施例では、HIP APIは、限定はしないが、HIPランタイムAPI3632、HIPドライバAPI、任意の数のHIPライブラリのためのAPI、任意の数のROCmライブラリのためのAPIなどを含む。
【0275】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3620は、CUDAコード中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、CUDAコード中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。少なくとも1つの実施例では、CUDAコールは、CUDA APIにおいて指定された機能へのコールであり、HIPコールは、HIP APIにおいて指定された機能へのコールである。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3620は、CUDAランタイムAPI3602において指定された機能への任意の数のコールを、HIPランタイムAPI3632において指定された機能への任意の数のコールにコンバートする。
【0276】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3620は、テキスト・ベースのトランスレーション・プロセスを実行するhipify-perlとして知られるツールである。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3620は、hipify-clangとして知られるツールであり、これは、hipify-perlに対して、clang(コンパイラ・フロント・エンド)を使用してCUDAコードを構文解析することと、次いで、得られたシンボルをトランスレートすることとを伴う、より複雑でよりロバストなトランスレーション・プロセスを実行する。少なくとも1つの実施例では、CUDAコードをHIPコードに適切にコンバートすることは、CUDAからHIPへのトランスレーション・ツール3620によって実施される修正に加えて、修正(たとえば、手動の編集)を必要とし得る。
【0277】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3640は、ターゲット・デバイス3646を決定し、次いで、ターゲット・デバイス3646と互換性があるコンパイラを、HIPソース・コード3630をコンパイルするように構成する、フロント・エンドである。少なくとも1つの実施例では、ターゲット・デバイス3646は、並列命令処理のために最適化されるプロセッサである。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3640は、任意の技術的に実現可能な様式でターゲット・デバイス3646を決定し得る。
【0278】
少なくとも1つの実施例では、ターゲット・デバイス3646が、CUDA(たとえば、CUDA対応GPU3694)と互換性がある場合、HIPコンパイラ・ドライバ3640は、HIP/NVCCコンパイル・コマンド3642を生成する。少なくとも1つの実施例では、及び
図36Bと併せてより詳細に説明されるように、HIP/NVCCコンパイル・コマンド3642は、限定はしないが、HIPからCUDAへのトランスレーション・ヘッダ及びCUDAランタイム・ライブラリを使用してHIPソース・コード3630をコンパイルするようにCUDAコンパイラ3650を構成する。少なくとも1つの実施例では、及びHIP/NVCCコンパイル・コマンド3642に応答して、CUDAコンパイラ3650は、ホスト実行可能コード3670(1)及びCUDAデバイス実行可能コード3684を生成する。
【0279】
少なくとも1つの実施例では、ターゲット・デバイス3646が、CUDAと互換性がない場合、HIPコンパイラ・ドライバ3640は、HIP/HCCコンパイル・コマンド3644を生成する。少なくとも1つの実施例では、及び
図36Cと併せてより詳細に説明されるように、HIP/HCCコンパイル・コマンド3644は、限定はしないが、HCCヘッダ及びHIP/HCCランタイム・ライブラリを使用してHIPソース・コード3630をコンパイルするようにHCC3660を構成する。少なくとも1つの実施例では、及びHIP/HCCコンパイル・コマンド3644に応答して、HCC3660は、ホスト実行可能コード3670(2)及びHCCデバイス実行可能コード3682を生成する。少なくとも1つの実施例では、HCCデバイス実行可能コード3682は、GPU3692上で実行可能である、HIPソース・コード3630中に含まれるデバイス・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、GPU3692は、並列命令処理のために最適化され、CUDAと互換性がなく、HCCと互換性がある、任意のプロセッサであり得る。少なくとも1つの実施例では、GPU3692は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、GPU3692は、CUDA非対応GPU3692である。
【0280】
単に説明目的のために、CPU3690及び異なるデバイス上での実行のためにCUDAソース・コード3610をコンパイルするために少なくとも1つの実施例において実装され得る3つの異なるフローが、
図36Aに図示されている。少なくとも1つの実施例では、直接的CUDAフローが、CUDAソース・コード3610をHIPソース・コード3630にトランスレートすることなしに、CPU3690及びCUDA対応GPU3694上での実行のためにCUDAソース・コード3610をコンパイルする。少なくとも1つの実施例では、間接的CUDAフローが、CUDAソース・コード3610をHIPソース・コード3630にトランスレートし、次いで、CPU3690及びCUDA対応GPU3694上での実行のためにHIPソース・コード3630をコンパイルする。少なくとも1つの実施例では、CUDA/HCCフローが、CUDAソース・コード3610をHIPソース・コード3630にトランスレートし、次いで、CPU3690及びGPU3692上での実行のためにHIPソース・コード3630をコンパイルする。
【0281】
少なくとも1つの実施例において実装され得る直接的CUDAフローは、破線及びA1~A3とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びA1とアノテーション付けされたバブルで図示されているように、CUDAコンパイラ3650は、CUDAソース・コード3610と、CUDAソース・コード3610をコンパイルするようにCUDAコンパイラ3650を構成するCUDAコンパイル・コマンド3648とを受信する。少なくとも1つの実施例では、直接的CUDAフローにおいて使用されるCUDAソース・コード3610は、C++以外のプログラミング言語(たとえば、C、Fortran、Python、Javaなど)に基づくCUDAプログラミング言語で書かれる。少なくとも1つの実施例では、及びCUDAコンパイル・コマンド3648に応答して、CUDAコンパイラ3650は、ホスト実行可能コード3670(1)及びCUDAデバイス実行可能コード3684を生成する(A2とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びA3とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3670(1)及びCUDAデバイス実行可能コード3684は、それぞれ、CPU3690及びCUDA対応GPU3694上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3684は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3684は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
【0282】
少なくとも1つの実施例において実装され得る間接的CUDAフローは、点線及びB1~B6とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びB1とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610を受信する。少なくとも1つの実施例では、及びB2とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610をHIPソース・コード3630にトランスレートする。少なくとも1つの実施例では、及びB3とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3640は、HIPソース・コード3630を受信し、ターゲット・デバイス3646がCUDA対応であると決定する。
【0283】
少なくとも1つの実施例では、及びB4とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3640は、HIP/NVCCコンパイル・コマンド3642を生成し、HIP/NVCCコンパイル・コマンド3642とHIPソース・コード3630の両方をCUDAコンパイラ3650に送信する。少なくとも1つの実施例では、及び
図36Bと併せてより詳細に説明されるように、HIP/NVCCコンパイル・コマンド3642は、限定はしないが、HIPからCUDAへのトランスレーション・ヘッダ及びCUDAランタイム・ライブラリを使用してHIPソース・コード3630をコンパイルするようにCUDAコンパイラ3650を構成する。少なくとも1つの実施例では、及びHIP/NVCCコンパイル・コマンド3642に応答して、CUDAコンパイラ3650は、ホスト実行可能コード3670(1)及びCUDAデバイス実行可能コード3684を生成する(B5とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びB6とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3670(1)及びCUDAデバイス実行可能コード3684は、それぞれ、CPU3690及びCUDA対応GPU3694上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3684は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3684は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
【0284】
少なくとも1つの実施例において実装され得るCUDA/HCCフローは、実線及びC1~C6とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びC1とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610を受信する。少なくとも1つの実施例では、及びC2とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610をHIPソース・コード3630にトランスレートする。少なくとも1つの実施例では、及びC3とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3640は、HIPソース・コード3630を受信し、ターゲット・デバイス3646がCUDA対応でないと決定する。
【0285】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3640は、HIP/HCCコンパイル・コマンド3644を生成し、HIP/HCCコンパイル・コマンド3644とHIPソース・コード3630の両方をHCC3660に送信する(C4とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及び
図36Cと併せてより詳細に説明されるように、HIP/HCCコンパイル・コマンド3644は、限定はしないが、HCCヘッダ及びHIP/HCCランタイム・ライブラリを使用してHIPソース・コード3630をコンパイルするようにHCC3660を構成する。少なくとも1つの実施例では、及びHIP/HCCコンパイル・コマンド3644に応答して、HCC3660は、ホスト実行可能コード3670(2)及びHCCデバイス実行可能コード3682を生成する(C5とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びC6とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3670(2)及びHCCデバイス実行可能コード3682は、それぞれ、CPU3690及びGPU3692上で実行され得る。
【0286】
少なくとも1つの実施例では、CUDAソース・コード3610がHIPソース・コード3630にトランスレートされた後に、HIPコンパイラ・ドライバ3640は、その後、CUDAからHIPへのトランスレーション・ツール3620を再実行することなしに、CUDA対応GPU3694又はGPU3692のいずれかのための実行可能コードを生成するために使用され得る。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610をHIPソース・コード3630にトランスレートし、HIPソース・コード3630は、次いで、メモリに記憶される。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3640は、次いで、HIPソース・コード3630に基づいてホスト実行可能コード3670(2)及びHCCデバイス実行可能コード3682を生成するようにHCC3660を構成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3640は、その後、記憶されたHIPソース・コード3630に基づいてホスト実行可能コード3670(1)及びCUDAデバイス実行可能コード3684を生成するようにCUDAコンパイラ3650を構成する。
【0287】
図36Bは、少なくとも1つの実施例による、CPU3690及びCUDA対応GPU3694を使用して、
図36AのCUDAソース・コード3610をコンパイル及び実行するように構成されたシステム3604を示す。少なくとも1つの実施例では、システム3604は、限定はしないが、CUDAソース・コード3610と、CUDAからHIPへのトランスレーション・ツール3620と、HIPソース・コード3630と、HIPコンパイラ・ドライバ3640と、CUDAコンパイラ3650と、ホスト実行可能コード3670(1)と、CUDAデバイス実行可能コード3684と、CPU3690と、CUDA対応GPU3694とを含む。
【0288】
少なくとも1つの実施例では、及び
図36Aと併せて本明細書で前に説明されたように、CUDAソース・コード3610は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3612と、(ゼロを含む)任意の数のデバイス機能3614と、(ゼロを含む)任意の数のホスト機能3616と、(ゼロを含む)任意の数のホスト/デバイス機能3618とを含む。少なくとも1つの実施例では、CUDAソース・コード3610は、限定はしないが、任意の数のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含む。
【0289】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610をHIPソース・コード3630にトランスレートする。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、CUDAソース・コード3610中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。
【0290】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3640は、ターゲット・デバイス3646がCUDA対応であると決定し、HIP/NVCCコンパイル・コマンド3642を生成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3640は、次いで、HIPソース・コード3630をコンパイルするようにHIP/NVCCコンパイル・コマンド3642を介してCUDAコンパイラ3650を構成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3640は、CUDAコンパイラ3650を構成することの一部として、HIPからCUDAへのトランスレーション・ヘッダ3652へのアクセスを提供する。少なくとも1つの実施例では、HIPからCUDAへのトランスレーション・ヘッダ3652は、任意の数のHIP APIにおいて指定された任意の数の機構(たとえば、機能)を、任意の数のCUDA APIにおいて指定された任意の数の機構にトランスレートする。少なくとも1つの実施例では、CUDAコンパイラ3650は、ホスト実行可能コード3670(1)及びCUDAデバイス実行可能コード3684を生成するために、CUDAランタイムAPI3602に対応するCUDAランタイム・ライブラリ3654と併せて、HIPからCUDAへのトランスレーション・ヘッダ3652を使用する。少なくとも1つの実施例では、ホスト実行可能コード3670(1)及びCUDAデバイス実行可能コード3684は、次いで、それぞれ、CPU3690及びCUDA対応GPU3694上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3684は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3684は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
【0291】
図36Cは、少なくとも1つの実施例による、CPU3690及びCUDA非対応GPU3692を使用して、
図36AのCUDAソース・コード3610をコンパイル及び実行するように構成されたシステム3606を示す。少なくとも1つの実施例では、システム3606は、限定はしないが、CUDAソース・コード3610と、CUDAからHIPへのトランスレーション・ツール3620と、HIPソース・コード3630と、HIPコンパイラ・ドライバ3640と、HCC3660と、ホスト実行可能コード3670(2)と、HCCデバイス実行可能コード3682と、CPU3690と、GPU3692とを含む。
【0292】
少なくとも1つの実施例では、及び
図36Aと併せて本明細書で前に説明されたように、CUDAソース・コード3610は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3612と、(ゼロを含む)任意の数のデバイス機能3614と、(ゼロを含む)任意の数のホスト機能3616と、(ゼロを含む)任意の数のホスト/デバイス機能3618とを含む。少なくとも1つの実施例では、CUDAソース・コード3610は、限定はしないが、任意の数のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含む。
【0293】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610をHIPソース・コード3630にトランスレートする。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、ソース・コード3610中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。
【0294】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3640は、その後、ターゲット・デバイス3646がCUDA対応でないと決定し、HIP/HCCコンパイル・コマンド3644を生成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3640は、次いで、HIPソース・コード3630をコンパイルするためにHIP/HCCコンパイル・コマンド3644を実行するようにHCC3660を構成する。少なくとも1つの実施例では、HIP/HCCコンパイル・コマンド3644は、限定はしないが、ホスト実行可能コード3670(2)及びHCCデバイス実行可能コード3682を生成するためにHIP/HCCランタイム・ライブラリ3658及びHCCヘッダ3656を使用するようにHCC3660を構成する。少なくとも1つの実施例では、HIP/HCCランタイム・ライブラリ3658は、HIPランタイムAPI3632に対応する。少なくとも1つの実施例では、HCCヘッダ3656は、限定はしないが、HIP及びHCCのための任意の数及びタイプの相互運用性機構を含む。少なくとも1つの実施例では、ホスト実行可能コード3670(2)及びHCCデバイス実行可能コード3682は、それぞれ、CPU3690及びGPU3692上で実行され得る。
【0295】
少なくとも1つの実施例では、
図36A~
図36Cに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図36A~
図36Cに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図36A~
図36Cに図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図36A~
図36Cに図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0296】
図37は、少なくとも1つの実施例による、
図36CのCUDAからHIPへのトランスレーション・ツール3620によってトランスレートされた例示的なカーネルを示す。少なくとも1つの実施例では、CUDAソース・コード3610は、所与のカーネルが解くように設計される全体的な問題を、スレッド・ブロックを使用して独立して解かれ得る比較的粗いサブ問題に区分けする。少なくとも1つの実施例では、各スレッド・ブロックは、限定はしないが、任意の数のスレッドを含む。少なくとも1つの実施例では、各サブ問題は、スレッド・ブロック内のスレッドによって並列に連動して解かれ得る比較的細かい部片に区分けされる。少なくとも1つの実施例では、スレッド・ブロック内のスレッドは、共有メモリを通してデータを共有することによって、及びメモリ・アクセスを協調させるために実行を同期させることによって連動することができる。
【0297】
少なくとも1つの実施例では、CUDAソース・コード3610は、所与のカーネルに関連するスレッド・ブロックを、スレッド・ブロックの1次元グリッド、2次元グリッド、又は3次元グリッドに組織化する。少なくとも1つの実施例では、各スレッド・ブロックは、限定はしないが、任意の数のスレッドを含み、グリッドは、限定はしないが、任意の数のスレッド・ブロックを含む。
【0298】
少なくとも1つの実施例では、カーネルは、「__global__」宣言指定子(declaration specifier)を使用して定義されるデバイス・コード中の関数である。少なくとも1つの実施例では、所与のカーネル・コール及び関連するストリームについてカーネルを実行するグリッドの次元は、CUDAカーネル起動シンタックス3710を使用して指定される。少なくとも1つの実施例では、CUDAカーネル起動シンタックス3710は、「KernelName<<<GridSize,BlockSize,SharedMemorySize,Stream>>>(KernelArguments);」として指定される。少なくとも1つの実施例では、実行構成シンタックスは、カーネル名(「KernelName」)とカーネル引数の括弧に入れられたリスト(「KernelArguments」)との間に挿入される「<<<...>>>」構築物である。少なくとも1つの実施例では、CUDAカーネル起動シンタックス3710は、限定はしないが、実行構成シンタックスの代わりにCUDA起動機能シンタックスを含む。
【0299】
少なくとも1つの実施例では、「GridSize」は、タイプdim3のものであり、グリッドの次元及びサイズを指定する。少なくとも1つの実施例では、タイプdim3は、限定はしないが、符号なし整数x、y、及びzを含む、CUDA定義構造である。少なくとも1つの実施例では、zが指定されない場合、zは1にデフォルト設定される。少なくとも1つの実施例では、yが指定されない場合、yは1にデフォルト設定される。少なくとも1つの実施例では、グリッド中のスレッド・ブロックの数は、GridSize.xとGridSize.yとGridSize.zとの積に等しい。少なくとも1つの実施例では、「BlockSize」は、タイプdim3のものであり、各スレッド・ブロックの次元及びサイズを指定する。少なくとも1つの実施例では、スレッド・ブロックごとのスレッドの数は、BlockSize.xとBlockSize.yとBlockSize.zとの積に等しい。少なくとも1つの実施例では、カーネルを実行する各スレッドは、組み込み変数(たとえば、「threadIdx」)を通してカーネル内でアクセス可能である一意のスレッドIDを与えられる。
【0300】
少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3710に関して、「SharedMemorySize」は、静的に割り振られたメモリに加えて、所与のカーネル・コールについてスレッド・ブロックごとに動的に割り振られる共有メモリ中のバイトの数を指定する随意の引数である。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3710に関して、SharedMemorySizeは0にデフォルト設定される。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3710に関して、「Stream」は、関連するストリームを指定する随意の引数であり、デフォルト・ストリームを指定するために0にデフォルト設定される。少なくとも1つの実施例では、ストリームは、イン・オーダーで実行する(場合によっては、異なるホスト・スレッドによって発行された)コマンドのシーケンスである。少なくとも1つの実施例では、異なるストリームは、互いに対してアウト・オブ・オーダーで、又は同時に、コマンドを実行し得る。
【0301】
少なくとも1つの実施例では、CUDAソース・コード3610は、限定はしないが、例示的なカーネル「MatAdd」のためのカーネル定義とメイン関数とを含む。少なくとも1つの実施例では、メイン関数は、ホスト上で実行し、限定はしないが、カーネルMatAddにデバイス上で実行させるカーネル・コールを含む、ホスト・コードである。少なくとも1つの実施例では、及び示されているように、カーネルMatAddは、Nが正の整数である、サイズN×Nの2つの行列AとBとを加算し、結果を行列Cに記憶する。少なくとも1つの実施例では、メイン関数は、threadsPerBlock変数を16×16として定義し、numBlocks変数をN/16×N/16として定義する。少なくとも1つの実施例では、メイン関数は、次いで、カーネル・コール「MatAdd<<<numBlocks,threadsPerBlock>>>(A,B,C);」を指定する。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3710通りに、カーネルMatAddは、寸法N/16×N/16を有する、スレッド・ブロックのグリッドを使用して実行され、ここで、各スレッド・ブロックは、16×16の寸法を有する。少なくとも1つの実施例では、各スレッド・ブロックは、256個のスレッドを含み、グリッドは、行列要素ごとに1つのスレッドを有するのに十分なブロックで作成され、そのようなグリッド中の各スレッドは、1つのペアワイズ加算を実施するためにカーネルMatAddを実行する。
【0302】
少なくとも1つの実施例では、CUDAソース・コード3610をHIPソース・コード3630にトランスレートする間、CUDAからHIPへのトランスレーション・ツール3620は、CUDAソース・コード3610中の各カーネル・コールを、CUDAカーネル起動シンタックス3710からHIPカーネル起動シンタックス3720にトランスレートし、ソース・コード3610中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。少なくとも1つの実施例では、HIPカーネル起動シンタックス3720は、「hipLaunchKernelGGL(KernelName,GridSize,BlockSize,SharedMemorySize,Stream,KernelArguments);」として指定される。少なくとも1つの実施例では、KernelName、GridSize、BlockSize、ShareMemorySize、Stream、及びKernelArgumentsの各々は、HIPカーネル起動シンタックス3720において、(本明細書で前に説明された)CUDAカーネル起動シンタックス3710の場合と同じ意味を有する。少なくとも1つの実施例では、引数SharedMemorySize及びStreamは、HIPカーネル起動シンタックス3720では必要とされ、CUDAカーネル起動シンタックス3710では随意である。
【0303】
少なくとも1つの実施例では、
図37に図示されたHIPソース・コード3630の一部分は、カーネルMatAddにデバイス上で実行させるカーネル・コールを除いて、
図37に図示されたCUDAソース・コード3610の一部分と同一である。少なくとも1つの実施例では、カーネルMatAddは、カーネルMatAddがCUDAソース・コード3610において定義される、同じ「__global__」宣言指定子を用いて、HIPソース・コード3630において定義される。少なくとも1つの実施例では、HIPソース・コード3630中のカーネル・コールは、「hipLaunchKernelGGL(MatAdd,numBlocks,threadsPerBlock,0,0,A,B,C);」であるが、CUDAソース・コード3610中の対応するカーネル・コールは、「MatAdd<<<numBlocks,threadsPerBlock>>>(A,B,C);」である。
【0304】
少なくとも1つの実施例では、
図37に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図37に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図37に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図37に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0305】
図38は、少なくとも1つの実施例による、
図36CのCUDA非対応GPU3692をより詳細に示す。少なくとも1つの実施例では、GPU3692は、サンタクララのAMD corporationによって開発される。少なくとも1つの実施例では、GPU3692は、高度並列様式でコンピュート動作を実施するように構成され得る。少なくとも1つの実施例では、GPU3692は、描画コマンド、ピクセル動作、幾何学的算出、及びディスプレイに画像をレンダリングすることに関連する他の動作など、グラフィックス・パイプライン動作を実行するように構成される。少なくとも1つの実施例では、GPU3692は、グラフィックに関係しない動作を実行するように構成される。少なくとも1つの実施例では、GPU3692は、グラフィックに関係する動作とグラフィックに関係しない動作の両方を実行するように構成される。少なくとも1つの実施例では、GPU3692は、HIPソース・コード3630中に含まれるデバイス・コードを実行するように構成され得る。
【0306】
少なくとも1つの実施例では、GPU3692は、限定はしないが、任意の数のプログラマブル処理ユニット3820と、コマンド・プロセッサ3810と、L2キャッシュ3822と、メモリ・コントローラ3870と、DMAエンジン3880(1)と、システム・メモリ・コントローラ3882と、DMAエンジン3880(2)と、GPUコントローラ3884とを含む。少なくとも1つの実施例では、各プログラマブル処理ユニット3820は、限定はしないが、ワークロード・マネージャ3830と、任意の数のコンピュート・ユニット3840とを含む。少なくとも1つの実施例では、コマンド・プロセッサ3810は、1つ又は複数のコマンド・キュー(図示せず)からコマンドを読み取り、ワークロード・マネージャ3830にコマンドを分散させる。少なくとも1つの実施例では、各プログラマブル処理ユニット3820について、関連するワークロード・マネージャ3830は、プログラマブル処理ユニット3820中に含まれるコンピュート・ユニット3840にワークを分散させる。少なくとも1つの実施例では、各コンピュート・ユニット3840は、任意の数のスレッド・ブロックを実行し得るが、各スレッド・ブロックは、単一のコンピュート・ユニット3840上で実行する。少なくとも1つの実施例では、ワークグループは、スレッド・ブロックである。
【0307】
少なくとも1つの実施例では、各コンピュート・ユニット3840は、限定はしないが、任意の数のSIMDユニット3850と、共有メモリ3860とを含む。少なくとも1つの実施例では、各SIMDユニット3850は、SIMDアーキテクチャを実装し、動作を並列に実施するように構成される。少なくとも1つの実施例では、各SIMDユニット3850は、限定はしないが、ベクトルALU3852とベクトル・レジスタ・ファイル3854とを含む。少なくとも1つの実施例では、各SIMDユニット3850は、異なるワープを実行する。少なくとも1つの実施例では、ワープは、スレッドのグループ(たとえば、16個のスレッド)であり、ここで、ワープ中の各スレッドは、単一のスレッド・ブロックに属し、命令の単一のセットに基づいて、データの異なるセットを処理するように構成される。少なくとも1つの実施例では、ワープ中の1つ又は複数のスレッドを無効にするために、プレディケーションが使用され得る。少なくとも1つの実施例では、レーンはスレッドである。少なくとも1つの実施例では、ワーク・アイテムはスレッドである。少なくとも1つの実施例では、ウェーブフロントはワープである。少なくとも1つの実施例では、スレッド・ブロック中の異なるウェーブフロントは、互いに同期し、共有メモリ3860を介して通信し得る。
【0308】
少なくとも1つの実施例では、プログラマブル処理ユニット3820は、「シェーダ・エンジン」と呼ばれる。少なくとも1つの実施例では、各プログラマブル処理ユニット3820は、限定はしないが、コンピュート・ユニット3840に加えて、任意の量の専用グラフィックス・ハードウェアを含む。少なくとも1つの実施例では、各プログラマブル処理ユニット3820は、限定はしないが、(ゼロを含む)任意の数のジオメトリ・プロセッサと、(ゼロを含む)任意の数のラスターライザと、(ゼロを含む)任意の数のレンダー・バック・エンドと、ワークロード・マネージャ3830と、任意の数のコンピュート・ユニット3840とを含む。
【0309】
少なくとも1つの実施例では、コンピュート・ユニット3840は、L2キャッシュ3822を共有する。少なくとも1つの実施例では、L2キャッシュ3822は区分けされる。少なくとも1つの実施例では、GPUメモリ3890は、GPU3692中のすべてのコンピュート・ユニット3840によってアクセス可能である。少なくとも1つの実施例では、メモリ・コントローラ3870及びシステム・メモリ・コントローラ3882は、GPU3692とホストとの間のデータ転送を容易にし、DMAエンジン3880(1)は、GPU3692とそのようなホストとの間の非同期メモリ転送を可能にする。少なくとも1つの実施例では、メモリ・コントローラ3870及びGPUコントローラ3884は、GPU3692と他のGPU3692との間のデータ転送を容易にし、DMAエンジン3880(2)は、GPU3692と他のGPU3692との間の非同期メモリ転送を可能にする。
【0310】
少なくとも1つの実施例では、GPU3692は、限定はしないが、GPU3692の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする、任意の量及びタイプのシステム相互接続を含む。少なくとも1つの実施例では、GPU3692は、限定はしないが、任意の数及びタイプの周辺デバイスに結合される、任意の数及びタイプのI/Oインターフェース(たとえば、PCIe)を含む。少なくとも1つの実施例では、GPU3692は、限定はしないが、(ゼロを含む)任意の数のディスプレイ・エンジンと、(ゼロを含む)任意の数のマルチメディア・エンジンとを含み得る。少なくとも1つの実施例では、GPU3692は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ(たとえば、メモリ・コントローラ3870及びシステム・メモリ・コントローラ3882)及びメモリ・デバイス(たとえば、共有メモリ3860)を含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、GPU3692は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ3822)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、SIMDユニット3850、コンピュート・ユニット3840、及びプログラマブル処理ユニット3820)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
【0311】
少なくとも1つの実施例では、
図38に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図38に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図38に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図38に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0312】
図39は、少なくとも1つの実施例による、例示的なCUDAグリッド3920のスレッドが
図38の異なるコンピュート・ユニット3840にどのようにマッピングされるかを示す。少なくとも1つの実施例では、及び単に説明目的のために、グリッド3920は、BX×BY×1のGridSizeと、TX×TY×1のBlockSizeとを有する。少なくとも1つの実施例では、グリッド3920は、したがって、限定はしないが、(BX*BY)個のスレッド・ブロック3930を含み、各スレッド・ブロック3930は、限定はしないが、(TX*TY)個のスレッド3940を含む。スレッド3940は、曲がりくねった矢印(squiggly arrow)として
図39に図示されている。
【0313】
少なくとも1つの実施例では、グリッド3920は、限定はしないが、コンピュート・ユニット3840(1)~3840(C)を含むプログラマブル処理ユニット3820(1)にマッピングされる。少なくとも1つの実施例では、及び示されているように、(BJ*BY)個のスレッド・ブロック3930が、コンピュート・ユニット3840(1)にマッピングされ、残りのスレッド・ブロック3930が、コンピュート・ユニット3840(2)にマッピングされる。少なくとも1つの実施例では、各スレッド・ブロック3930は、限定はしないが、任意の数のワープを含み得、各ワープは、
図38の異なるSIMDユニット3850にマッピングされる。
【0314】
少なくとも1つの実施例では、所与のスレッド・ブロック3930中のワープは、互いに同期し、関連するコンピュート・ユニット3840中に含まれる共有メモリ3860を通して通信し得る。たとえば、及び少なくとも1つの実施例では、スレッド・ブロック3930(BJ,1)中のワープは、互いに同期し、共有メモリ3860(1)を通して通信することができる。たとえば、及び少なくとも1つの実施例では、スレッド・ブロック3930(BJ+1,1)中のワープは、互いに同期し、共有メモリ3860(2)を通して通信することができる。
【0315】
少なくとも1つの実施例では、
図39に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図39に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図39に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図39に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0316】
図40は、少なくとも1つの実施例による、既存のCUDAコードをData Parallel C++コードにどのようにマイグレートするかを示す。Data Parallel C++(DPC++)は、単一アーキテクチャ・プロプライエタリ言語に対するオープンな規格ベースの代替を指し得、これは、開発者が、ハードウェア・ターゲット(CPU並びにGPU及びFPGAなどのアクセラレータ)にわたってコードを再使用し、また、特定のアクセラレータのためのカスタム調整を実施することを可能にする。DPC++は、開発者が精通していることがあるISO C++に従う、同様の及び/又は同一のC及びC++構築物を使用する。DPC++は、データ並列処理及び異種プログラミングをサポートするためにクロノス・グループからの標準SYCLを組み込む。SYCLは、OpenCLの基礎をなす概念、ポータビリティ及び効率に基づく、クロスプラットフォーム抽象化層を指し、これは、異種プロセッサのためのコードが、標準C++を使用して「単一ソース」スタイルで書かれることを可能にする。SYCLは、C++テンプレート関数が、ホスト・コードとデバイス・コードの両方を含んでおり、OpenCL加速を使用する複雑なアルゴリズムを構築し、次いで、それらを、異なるタイプのデータに関するそれらのソース・コード全体にわたって再使用することができる、単一ソース開発を可能にし得る。
【0317】
少なくとも1つの実施例では、DPC++コンパイラは、多様なハードウェア・ターゲットにわたって導入され得るDPC++ソース・コードをコンパイルするために使用される。少なくとも1つの実施例では、DPC++コンパイラは、多様なハードウェア・ターゲットにわたって導入され得るDPC++アプリケーションを生成するために使用され、DPC++互換性ツールは、CUDAアプリケーションをDPC++のマルチプラットフォーム・プログラムにマイグレートするために使用され得る。少なくとも1つの実施例では、DPC++ベース・ツール・キットは、多様なハードウェア・ターゲットにわたってアプリケーションを導入するためのDPC++コンパイラと、CPU、GPU、及びFPGAにわたって生産性及び性能を増加させるためのDPC++ライブラリと、CUDAアプリケーションをマルチプラットフォーム・アプリケーションにマイグレートするためのDPC++互換性ツールと、それらの任意の好適な組合せとを含む。
【0318】
少なくとも1つの実施例では、DPC++プログラミング・モデルは、Data Parallel C++と呼ばれるプログラミング言語を用いて並列処理を表現するための現代のC++特徴を使用することによって、単に、CPU及びアクセラレータをプログラムすることに関係する1つ又は複数の態様に対して利用される。DPC++プログラミング言語は、ホスト(たとえば、CPU)及びアクセラレータ(たとえば、GPU又はFPGA)のためのコード再使用に対して利用され、単一のソース言語を使用し、実行及びメモリ依存性が明確に通信され得る。DPC++コード内でのマッピングは、アプリケーションを移行させて、ワークロードを最も良く加速するハードウェア又はハードウェア・デバイスのセット上で稼働するために、使用され得る。利用可能なアクセラレータを有しないプラットフォーム上でも、デバイス・コードの開発及びデバッギングを簡略化するために、ホストが利用可能であり得る。
【0319】
少なくとも1つの実施例では、人間が読み取れるDPC++4004を生成するために、DPC++互換性ツール4002への入力として、CUDAソース・コード4000が提供される。少なくとも1つの実施例では、人間が読み取れるDPC+4004は、DPC++互換性ツール4002によって生成されたインライン・コメントを含み、これは、コーディングと所望の性能への調整とを完了4006するために、DPC++コードをどのように及び/又はどこで修正すべきかに関して開発者をガイドし、それにより、DPC++ソース・コード4008を生成する。
【0320】
少なくとも1つの実施例では、CUDAソース・コード4000は、CUDAプログラミング言語の人間が読み取れるソース・コードの集合であるか、又はその集合を含む。少なくとも1つの実施例では、CUDAソース・コード4000は、CUDAプログラミング言語の人間が読み取れるソース・コードである。少なくとも1つの実施例では、CUDAプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、デバイス・コードは、コンパイルの後に、デバイス(たとえば、GPU又はFPGA)上で実行可能であり、デバイスの1つ又は複数のプロセッサ・コア上で実行され得る、又はより並列化可能なワークフローを含み得る、ソース・コードである。少なくとも1つの実施例では、デバイスは、CUDA対応GPU、GPU、又は別のGPGPUなど、並列命令処理のために最適化されるプロセッサであり得る。少なくとも1つの実施例では、ホスト・コードは、コンパイルの後にホスト上で実行可能であるソース・コードである。少なくとも1つの実施例では、ホスト・コード及びデバイス・コードの一部又は全部は、CPU及びGPU/FPGAにわたって並列に実行され得る。少なくとも1つの実施例では、ホストは、CPUなど、連続命令処理のために最適化されるプロセッサである。
図40に関して説明されるCUDAソース・コード4000は、本明細書の他の場所で説明されるCUDAソース・コードに従い得る。
【0321】
少なくとも1つの実施例では、DPC++互換性ツール4002は、DPC++ソース・コード4008へのCUDAソース・コード4000のマイグレーションを容易にするために使用される、実行可能ツール、プログラム、アプリケーション、又は任意の他の好適なタイプのツールを指す。少なくとも1つの実施例では、DPC++互換性ツール4002は、既存のCUDAソースをDPC++に移植するために使用されるDPC++ツール・キットの一部として利用可能なコマンド・ライン・ベースのコード・マイグレーション・ツールである。少なくとも1つの実施例では、DPC++互換性ツール4002は、CUDAアプリケーションの一部又は全部のソース・コードをCUDAからDPC++にコンバートし、人間が読み取れるDPC++4004と呼ばれる、少なくとも部分的にDPC++で書かれる得られたファイルを生成する。少なくとも1つの実施例では、人間が読み取れるDPC++4004は、ユーザ介入がどこで必要であり得るかを示すためにDPC++互換性ツール4002によって生成されるコメントを含む。少なくとも1つの実施例では、ユーザ介入は、CUDAソース・コード4000が、類似するDPC++APIを有しないCUDA APIをコールするとき、必要であり、ユーザ介入が必要とされる他の実例は、後でより詳細に説明される。
【0322】
少なくとも1つの実施例では、CUDAソース・コード4000(たとえば、アプリケーション又はそれの部分)をマイグレートするためのワークフローは、1つ又は複数のコンパイル・データベース・ファイルを作成することと、DPC++互換性ツール4002を使用してCUDAをDPC++にマイグレートすることと、マイグレーションを完了し、正当性を確認し、それにより、DPC++ソース・コード4008を生成することと、DPC++アプリケーションを生成するためにDPC++コンパイラを用いてDPC++ソース・コード4008をコンパイルすることとを含む。少なくとも1つの実施例では、互換性ツールは、Makefileが実行するときに使用されるコマンドをインターセプトし、それらをコンパイル・データベース・ファイルに記憶する、ユーティリティを提供する。少なくとも1つの実施例では、ファイルは、JSONフォーマットで記憶される。少なくとも1つの実施例では、intercept-builtコマンドは、MakefileコマンドをDPC互換性コマンドにコンバートする。
【0323】
少なくとも1つの実施例では、intercept-buildは、ビルド・プロセスをインターセプトして、コンパイル・オプション、マクロ定義(macro defs)、及びインクルード・パス(include paths)をキャプチャし、このデータをコンパイル・データベース・ファイルに書き込む、ユーティリティ・スクリプトである。少なくとも1つの実施例では、コンパイル・データベース・ファイルは、JSONファイルである。少なくとも1つの実施例では、DPC++互換性ツール4002は、コンパイル・データベースを構文解析し、入力ソースをマイグレートするときにオプションを適用する。少なくとも1つの実施例では、intercept-buildの使用は、随意であるが、Make又はCMakeベースの環境について大いに推奨される。少なくとも1つの実施例では、マイグレーション・データベースは、コマンドとディレクトリとファイルとを含み、コマンドは、必要なコンパイル・フラグを含み得、ディレクトリは、ヘッダ・ファイルへのパスを含み得、ファイルは、CUDAファイルへのパスを含み得る。
【0324】
少なくとも1つの実施例では、DPC++互換性ツール4002は、可能な場合はいつでもDPC++を生成することによって、CUDAで書かれたCUDAコード(たとえば、アプリケーション)をDPC++にマイグレートする。少なくとも1つの実施例では、DPC++互換性ツール4002は、ツール・キットの一部として利用可能である。少なくとも1つの実施例では、DPC++ツール・キットは、intercept-buildツールを含む。少なくとも1つの実施例では、intercept-builtツールは、CUDAファイルをマイグレートするためにコンパイル・コマンドをキャプチャするコンパイル・データベースを作成する。少なくとも1つの実施例では、intercept-builtツールによって生成されたコンパイル・データベースは、CUDAコードをDPC++にマイグレートするためにDPC++互換性ツール4002によって使用される。少なくとも1つの実施例では、非CUDA C++コード及びファイルは、そのままマイグレートされる。少なくとも1つの実施例では、DPC++互換性ツール4002は、人間が読み取れるDPC++4004を生成し、これは、DPC++互換性ツール4002によって生成されたとき、DPC++コンパイラによってコンパイルされないことがあり、正しくマイグレートされなかったコードの部分を確認するための追加のプラミング(plumbing)を必要とする、DPC++コードであり得、開発者によってなど、手動の介入を伴い得る。少なくとも1つの実施例では、DPC++互換性ツール4002は、自動的にマイグレートされないことがある追加のコードを開発者が手動でマイグレートするのを助けるために、コード中に埋め込まれたヒント又はツールを提供する。少なくとも1つの実施例では、マイグレーションは、ソース・ファイル、プロジェクト、又はアプリケーションのための1回のアクティビティである。
【0325】
少なくとも1つの実施例では、DPC++互換性ツール40002は、CUDAコードのすべての部分をDPC++に正常にマイグレートすることが可能であり、単に、生成されたDPC++ソース・コードの性能を手動で確認及び調整するための随意のステップがあり得る。少なくとも1つの実施例では、DPC++互換性ツール4002は、DPC++互換性ツール4002によって生成されたDPC++コードを修正するための人間の介入を必要とするか又は利用することなしに、DPC++コンパイラによってコンパイルされるDPC++ソース・コード4008を直接生成する。少なくとも1つの実施例では、DPC++互換性ツールは、コンパイル可能なDPC++コードを生成し、これは、性能、読みやすさ、維持可能性、他の様々な考慮事項、又はそれらの任意の組合せについて、開発者によって随意に調整され得る。
【0326】
少なくとも1つの実施例では、1つ又は複数のCUDAソース・ファイルは、少なくとも部分的にDPC++互換性ツール4002を使用してDPC++ソース・ファイルにマイグレートされる。少なくとも1つの実施例では、CUDAソース・コードは、CUDAヘッダ・ファイルを含み得る1つ又は複数のヘッダ・ファイルを含む。少なくとも1つの実施例では、CUDAソース・ファイルは、<cuda.h>ヘッダ・ファイルと、テキストをプリントするために使用され得る<stdio.h>ヘッダ・ファイルとを含む。少なくとも1つの実施例では、ベクトル加算カーネルCUDAソース・ファイルの一部分は、以下のように書かれるか、又は以下に関係し得る。
【数1-1】
【数1-2】
【0327】
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、DPC++互換性ツール4002は、CUDAソース・コードを構文解析し、ヘッダ・ファイルを、適切なDPC++ヘッダ・ファイル及びSYCLヘッダ・ファイルと置き換える。少なくとも1つの実施例では、DPC++ヘッダ・ファイルは、ヘルパー宣言(helper declaration)を含む。CUDAでは、スレッドIDの概念があり、対応して、DPC++又はSYCLでは、各要素について、ローカル識別子がある。
【0328】
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、初期化される2つのベクトルA及びBがあり、ベクトル加算結果が、VectorAddKernel()の一部として、ベクトルCに入れられる。少なくとも1つの実施例では、DPC++互換性ツール4002は、CUDAコードをDPC++コードにマイグレートすることの一部として、ワーク要素をインデックス付けするために使用されるCUDAスレッドIDを、ローカルIDを介したワーク要素のためのSYCL標準アドレッシングにコンバートする。少なくとも1つの実施例では、DPC++互換性ツール4002によって生成されたDPC++コードは、たとえば、nd_itemの次元を低減し、それにより、メモリ及び/又はプロセッサ利用率を増加させることによって、最適化され得る。
【0329】
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、メモリ割振りがマイグレートされる。少なくとも1つの実施例では、cudaMalloc()は、プラットフォーム、デバイス、コンテキスト、及びキューなど、SYCL概念に依拠して、デバイス及びコンテキストが渡される、統一共有メモリSYCLコールmalloc_device()にマイグレートされる。少なくとも1つの実施例では、SYCLプラットフォームは、複数のデバイス(たとえば、ホスト及びGPUデバイス)を有することができ、デバイスは、ジョブがサブミットされ得る複数のキューを有し得、各デバイスは、コンテキストを有し得、コンテキストは、複数のデバイスを有し、共有メモリ・オブジェクトを管理し得る。
【0330】
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、main()関数は、2つのベクトルAとBとを互いに加算し、結果をベクトルCに記憶するための、VectorAddKernel()を呼び出すか又はコールする。少なくとも1つの実施例では、VectorAddKernel()を呼び出すためのCUDAコードは、実行のためにカーネルをコマンド・キューにサブミットするためのDPC++コードによって置き換えられる。少なくとも1つの実施例では、コマンド・グループ・ハンドラcghは、キューにサブミットされる、データ、同期、及び算出を渡し、parallel_forは、VectorAddKernel()がコールされるワーク・グループ中の、グローバル要素の数及びワーク・アイテムの数についてコールされる。
【0331】
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、デバイス・メモリをコピーし、次いで、ベクトルA、B、及びCのためのメモリを解放するためのCUDAコールが、対応するDPC++コールにマイグレートされる。少なくとも1つの実施例では、C++コード(たとえば、浮動小数点変数のベクトルをプリントするための標準ISO C++コード)は、DPC++互換性ツール4002によって修正されることなしに、そのままマイグレートされる。少なくとも1つの実施例では、DPC++互換性ツール4002は、加速デバイス上でカーネルを実行するために、メモリ・セットアップ及び/又はホスト・コールのためのCUDA APIを修正する。少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、(たとえば、コンパイルされ得る)対応する人間が読み取れるDPC++4004は、以下のように書かれるか、又は以下に関係する。
【数2-1】
【数2-2】
【数2-3】
【0332】
少なくとも1つの実施例では、人間が読み取れるDPC++4004は、DPC++互換性ツール4002によって生成された出力を指し、ある様式又は別の様式で最適化され得る。少なくとも1つの実施例では、DPC++互換性ツール4002によって生成された人間が読み取れるDPC++4004は、それをより維持可能にすること、性能、又は他の考慮事項のために、マイグレーションの後に開発者によって手動で編集され得る。少なくとも1つの実施例では、開示されるDPC++などのDPC++互換性ツール40002によって生成されたDPC++コードは、各malloc_device()コールのためのget_current_device()及び/又はget_default_context()への繰返しコールを削除することによって最適化され得る。少なくとも1つの実施例では、上記で生成されるDPC++コードは、3次元のnd_rangeを使用し、これは、単一次元のみを使用し、それにより、メモリ使用量を低減するために、再ファクタ化され得る。少なくとも1つの実施例では、開発者は、DPC++互換性ツール4002によって生成されたDPC++コードを手動で編集し、統一共有メモリの使用をアクセッサと置き換えることができる。少なくとも1つの実施例では、DPC++互換性ツール4002は、それがCUDAコードをDPC++コードにどのようにマイグレートするかを変更するためのオプションを有する。少なくとも1つの実施例では、DPC++互換性ツール4002は、それが、CUDAコードを、多数の場合について機能するDPC++コードにマイグレートするための一般的なテンプレートを使用しているので、冗長である。
【0333】
少なくとも1つの実施例では、CUDAからDPC++へのマイグレーション・ワークフローは、intercept-buildスクリプトを使用してマイグレーションの準備をするためのステップと、DPC++互換性ツール4002を使用してDPC++へのCUDAプロジェクトのマイグレーションを実施するためのステップと、完了及び正当性のために、マイグレートされたソース・ファイルを手動で検討及び編集するためのステップと、DPC++アプリケーションを生成するために最終DPC++コードをコンパイルするためのステップとを含む。少なくとも1つの実施例では、DPC++ソース・コードの手動の検討は、限定はしないが、マイグレートされたAPIがエラー・コードを返さないこと(CUDAコードは、エラー・コードを返すことができ、エラー・コードは、次いで、アプリケーションよって消費され得るが、SYCLは、エラーを報告するために例外を使用し、したがって、エラーを表面化させるためのエラー・コードを使用しない)、CUDAコンピュート能力依存論理がDPC++によってサポートされないこと、ステートメントが削除されないことがあることを含む、1つ又は複数のシナリオにおいて必要とされ得る。少なくとも1つの実施例では、DPC++コードが手動の介入を必要とするシナリオは、限定はしないが、エラー・コード論理が(*,0)コードと置き換えられるか又はコメント・アウトされる、等価なDPC++APIが利用可能でない、CUDAコンピュート能力依存論理、ハードウェア依存API(clock())、欠落した特徴、サポートされていないAPI、実行時間測定論理、組み込みベクトル・タイプ競合に対処すること、cuBLAS APIのマイグレーションなどを含み得る。
【0334】
少なくとも1つの実施例では、
図40に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにAPIを実施するために利用される。少なくとも1つの実施例では、
図40に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図40に図示された1つ又は複数のシステムは、コンピュータ・プログラムによる情報の使用量が、前記情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、
図40に図示された1つ又は複数のシステムは、
図1~
図8に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0335】
少なくとも1つの実施例では、本明細書で説明される1つ又は複数の技法は、oneAPIプログラミング・モデルを利用する。少なくとも1つの実施例では、oneAPIプログラミング・モデルは、様々なコンピュート・アクセラレータ・アーキテクチャと対話するためのプログラミング・モデルを指す。少なくとも1つの実施例では、oneAPIは、様々なコンピュート・アクセラレータ・アーキテクチャと対話するように設計されたアプリケーション・プログラミング・インターフェース(API)を指す。少なくとも1つの実施例では、oneAPIプログラミング・モデルは、DPC++プログラミング言語を利用する。少なくとも1つの実施例では、DPC++プログラミング言語は、データ並列プログラミング生産性のための高水準言語を指す。少なくとも1つの実施例では、DPC++プログラミング言語は、C及び/又はC++プログラミング言語に少なくとも部分的に基づく。少なくとも1つの実施例では、oneAPIプログラミング・モデルは、カリフォルニア州サンタクララのIntel Corporationによって開発されたものなどのプログラミング・モデルである。
【0336】
少なくとも1つの実施例では、oneAPI及び/又はoneAPIプログラミング・モデルは、様々なアクセラレータ・アーキテクチャ、GPUアーキテクチャ、プロセッサ・アーキテクチャ、及び/又はそれらの変形形態のアーキテクチャと対話するために利用される。少なくとも1つの実施例では、oneAPIは、様々な機能性を実装するライブラリのセットを含む。少なくとも1つの実施例では、oneAPIは、少なくとも、oneAPI DPC++ライブラリ、oneAPIマス・カーネル・ライブラリ、oneAPIデータ分析ライブラリ、oneAPI深層ニューラル・ネットワーク・ライブラリ、oneAPI集合通信ライブラリ、oneAPIスレッディング・ビルディング・ブロック・ライブラリ、oneAPIビデオ処理ライブラリ、及び/又はそれらの変形形態を含む。
【0337】
少なくとも1つの実施例では、oneDPLとも呼ばれるoneAPI DPC++ライブラリは、DPC++カーネル・プログラミングを加速するためのアルゴリズム及び機能を実装するライブラリである。少なくとも1つの実施例では、oneDPLは、1つ又は複数の標準テンプレート・ライブラリ(STL:standard template library)機能を実装する。少なくとも1つの実施例では、oneDPLは、1つ又は複数の並列STL機能を実装する。少なくとも1つの実施例では、oneDPLは、並列アルゴリズム、イテレーター、関数オブジェクト・クラス、範囲ベースのAPI、及び/又はそれらの変形形態など、ライブラリ・クラス及び関数のセットを提供する。少なくとも1つの実施例では、oneDPLは、C++標準ライブラリの1つ又は複数のクラス及び/又は関数を実装する。少なくとも1つの実施例では、oneDPLは、1つ又は複数の乱数生成器関数を実装する。
【0338】
少なくとも1つの実施例では、oneMKLとも呼ばれるoneAPIマス・カーネル・ライブラリは、様々な数学関数及び/又は演算のための様々な最適化及び並列化されたルーチンを実装するライブラリである。少なくとも1つの実施例では、oneMKLは、1つ又は複数の基本線形代数サブプログラム(BLAS)及び/又は線形代数パッケージ(LAPACK:linear algebra package)高密度線形代数ルーチンを実装する。少なくとも1つの実施例では、oneMKLは、1つ又は複数のスパースBLAS線形代数ルーチンを実装する。少なくとも1つの実施例では、oneMKLは、1つ又は複数の乱数生成器(RNG:random number generator)を実装する。少なくとも1つの実施例では、oneMKLは、ベクトルに関する数学演算のための1つ又は複数のベクトル数学(VM:vector mathematics)ルーチンを実装する。少なくとも1つの実施例では、oneMKLは、1つ又は複数の高速フーリエ変換(FFT)関数を実装する。
【0339】
少なくとも1つの実施例では、oneDALとも呼ばれるoneAPIデータ分析ライブラリは、様々なデータ分析アプリケーション及び分散算出を実装するライブラリである。少なくとも1つの実施例では、oneDALは、バッチ、オンライン、及び算出の分散処理モードにおける、データ分析のための前処理、変換、分析、モデリング、確認、及び意思決定のための、様々なアルゴリズムを実装する。少なくとも1つの実施例では、oneDALは、様々なC++及び/又はJava APIと、1つ又は複数のデータ・ソースへの様々なコネクタとを実装する。少なくとも1つの実施例では、oneDALは、旧来のC++インターフェースに対するDPC++API拡張を実装し、様々なアルゴリズムのためのGPU使用を可能にする。
【0340】
少なくとも1つの実施例では、oneDNNとも呼ばれるoneAPI深層ニューラル・ネットワーク・ライブラリは、様々な深層学習機能を実装するライブラリである。少なくとも1つの実施例では、oneDNNは、様々なニューラル・ネットワーク、機械学習、及び深層学習機能、アルゴリズム、並びに/又はそれらの変形形態を実装する。
【0341】
少なくとも1つの実施例では、oneCCLとも呼ばれるoneAPI集合通信ライブラリは、深層学習及び機械学習ワークロードのための様々なアプリケーションを実装するライブラリである。少なくとも1つの実施例では、oneCCLは、メッセージ・パッシング・インターフェース(MPI:message passing interface)及びlibfabricなど、下位レベル通信ミドルウェア上に築かれる。少なくとも1つの実施例では、oneCCLは、優先順位、永続的な動作、アウト・オブ・オーダー実行、及び/又はそれらの変形形態など、深層学習固有の最適化のセットを可能にする。少なくとも1つの実施例では、oneCCLは、様々なCPU及びGPU機能を実装する。
【0342】
少なくとも1つの実施例では、oneTBBとも呼ばれるoneAPIスレッディング・ビルディング・ブロック・ライブラリは、様々なアプリケーションのための様々な並列化されたプロセスを実装するライブラリである。少なくとも1つの実施例では、oneTBBは、ホスト上でのタスク・ベース共有並列プログラミングのために利用される。少なくとも1つの実施例では、oneTBBは、一般並列アルゴリズムを実装する。少なくとも1つの実施例では、oneTBBは、同時コンテナを実装する。少なくとも1つの実施例では、oneTBBは、スケーラブル・メモリ・アロケータを実装する。少なくとも1つの実施例では、oneTBBは、ワークスティーリング(work-stealing)・タスク・スケジューラを実装する。少なくとも1つの実施例では、oneTBBは、低レベル同期プリミティブを実装する。少なくとも1つの実施例では、oneTBBは、コンパイラ依存せず、GPU、PPU、CPU、及び/又はそれらの変形形態など、様々なプロセッサ上で使用可能である。
【0343】
少なくとも1つの実施例では、oneVPLとも呼ばれるoneAPIビデオ処理ライブラリは、1つ又は複数のアプリケーションにおけるビデオ処理を加速するために利用されるライブラリである。少なくとも1つの実施例では、oneVPLは、様々なビデオ復号、符号化、及び処理機能を実装する。少なくとも1つの実施例では、oneVPLは、CPU、GPU、及び他のアクセラレータ上のメディア・パイプラインのための様々な機能を実装する。少なくとも1つの実施例では、oneVPLは、メディア中心及びビデオ分析ワークロードにおけるデバイス発見及び選択を実装する。少なくとも1つの実施例では、oneVPLは、ゼロコピー・バッファ共有のためのAPIプリミティブを実装する。
【0344】
少なくとも1つの実施例では、oneAPIプログラミング・モデルは、DPC++プログラミング言語を利用する。少なくとも1つの実施例では、DPC++プログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための、機能的に同様のバージョンのCUDA機構を含むプログラミング言語である。少なくとも1つの実施例では、DPC++プログラミング言語は、CUDAプログラミング言語の機能性のサブセットを含み得る。少なくとも1つの実施例では、1つ又は複数のCUDAプログラミング・モデル動作は、DPC++プログラミング言語を使用するoneAPIプログラミング・モデルを使用して実施される。
【0345】
本明細書で説明される例示的な実施例はCUDAプログラミング・モデルに関し得るが、本明細書で説明される技法は、任意の好適なプログラミング・モデル、そのようなHIP、oneAPI(たとえば、本明細書で開示される方法を実施又は実装するためにoneAPIベース・プログラミングを使用する)、及び/又はそれらの変形形態とともに利用され得ることに留意されたい。
【0346】
少なくとも1つの実施例では、上記で開示されたシステム及び/又はプロセッサの1つ又は複数の構成要素は、たとえば、画像をアップスケールするためのアップスケーラ又はアップサンプラ、画像を一緒にブレンド、ミックス、又は加算するための画像ブレンダ又は画像ブレンダ構成要素、(たとえば、DSPの一部として)画像をサンプリングするためのサンプラ、(たとえば、低解像度画像から高解像度画像に)画像をアップスケールするためのアップスケーラを実施するように構成されたニューラル・ネットワーク回路、或いは、画像、フレーム、又はビデオを、それの解像度、サイズ、又はピクセルを調整するために、修正又は生成するための他のハードウェアを含む、1つ又は複数のCPU、ASIC、GPU、FPGA、或いは他のハードウェア、回路要素、又は集積回路構成要素と通信することができ、上記で開示されたシステム及び/又はプロセッサの1つ又は複数の構成要素は、画像を生成又は修正する方法、動作、又は命令を実施するために、本開示で説明される構成要素を使用することができる。
【0347】
本開示の少なくとも1つの実施例は、以下の条項を考慮して説明され得る。
条項1. コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにアプリケーション・プログラミング・インターフェース(API)を実施するための1つ又は複数の回路
を備える、プロセッサ。
条項2. 1つ又は複数のデータ構造が、コンピュータ・プログラムに関連する参照の少なくとも数を示す、条項1に記載のプロセッサ。
条項3. 情報が、メモリの少なくとも領域を含む、条項1又は2に記載のプロセッサ。
条項4. 1つ又は複数の回路が、1つ又は複数のデータ構造に対応するロケーションを示すパラメータ値に少なくとも部分的に基づいて、APIを実施するためのものである、条項1から3までのいずれか一項に記載のプロセッサ。
条項5. 1つ又は複数の回路が、さらに、コンピュータ・プログラムによる情報の使用に少なくとも部分的に基づいて、1つ又は複数の関数を実行するためのものである、条項1から4までのいずれか一項に記載のプロセッサ。
条項6. コンピュータ・プログラムが、1つ又は複数のグラフィックス処理ユニット(GPU)によって実行可能である、条項1から5までのいずれか一項に記載のプロセッサ。
条項7. コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにアプリケーション・プログラミング・インターフェース(API)を実施するための1つ又は複数のプロセッサを有する1つ又は複数のコンピュータ
を備える、システム。
条項8. 1つ又は複数のプロセッサが、さらに、
少なくともAPIを示すコードを取得することと、
少なくとも、コードを実行することによって、APIを実施することと
を行うためのものである、条項7に記載のシステム。
条項9. 1つ又は複数のデータ構造が、情報に関連する1つ又は複数の参照のカウントを符号化する、条項7又は8に記載のシステム。
条項10. 1つ又は複数のデータ構造が、1つ又は複数のデストラクタ関数を示す、条項7から9までのいずれか一項に記載のシステム。
条項11. コンピュータ・プログラムが、少なくとも1つ又は複数の並列処理ユニット(PPU)によって実行可能である、条項7から10までのいずれか一項に記載のシステム。
条項12. 情報が、コンピュータ・プログラムへの少なくとも入力データを含む、条項7から11までのいずれか一項に記載のシステム。
条項13. 1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、少なくとも、
コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにアプリケーション・プログラミング・インターフェース(API)を実施すること
を行わせる命令のセットを記憶した機械可読媒体。
条項14. 命令のセットが、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、参照の数を示すパラメータ値に少なくとも部分的に基づいてAPIを実施することを行わせる命令をさらに含む、条項13に記載の機械可読媒体。
条項15. 情報の使用が、コンピュータ・プログラムによって使用される1つ又は複数の参照によって示される、条項13又は14に記載の機械可読媒体。
条項16. 命令のセットが、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、コンピュータ・プログラムによる情報の使用に基づいて1つ又は複数のデータ構造を修正することを行わせる命令をさらに含む、条項13から15までのいずれか一項に記載の機械可読媒体。
条項17. 命令のセットが、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、1つ又は複数のデータ構造を1つ又は複数のグラフ・データ構造に関連付けることを行わせる命令をさらに含む、条項13から16までのいずれか一項に記載の機械可読媒体。
条項18. コンピュータ・プログラムが、1つ又は複数の汎用グラフィックス処理ユニット(GPGPU)によって実行可能である、条項13から17までのいずれか一項に記載の機械可読媒体。
条項19. コンピュータ・プログラムによる情報の使用を監視するために使用されるべき1つ又は複数のデータ構造を生成するためにアプリケーション・プログラミング・インターフェース(API)を実施するステップ
を含む、方法。
条項20. 1つ又は複数のデータ構造によって示された参照の数に少なくとも部分的に基づいて1つ又は複数の関数を実行するステップをさらに含む、条項19に記載の方法。
条項21. 1つ又は複数の関数を示す1つ又は複数のパラメータ値に少なくとも部分的に基づいてAPIを実施するステップをさらに含む、条項19又は20に記載の方法。
条項22. APIがランタイムAPIである、条項19から21までのいずれか一項に記載の方法。
条項23. コンピュータ・プログラムが、1つ又は複数中央処理ユニット(CPU)によって実行可能である、条項19から22までのいずれか一項に記載の方法。
条項24. APIを実施した結果として1つ又は複数のステータス指示を取得するステップをさらに含む、条項19から23までのいずれか一項に記載の方法。
条項25. コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施するための1つ又は複数の回路
を備える、プロセッサ。
条項26. 1つ又は複数の回路が、さらに、コンピュータ・プログラムに関連する参照のカウントを示す1つ又は複数のデータ構造の値を増加させるためのものである、条項25に記載のプロセッサ。
条項27. 1つ又は複数の回路が、参照の数を示すパラメータ値に少なくとも部分的に基づいてAPIを実施するためのものである、条項25又は26に記載のプロセッサ。
条項28. 情報が、コンピュータ・プログラムによって使用されるメモリの領域を含む、条項25から27までのいずれか一項に記載のプロセッサ。
条項29. コンピュータ・プログラムが、1つ又は複数のグラフィックス処理ユニット(GPU)によって実行可能である、条項25から28までのいずれか一項に記載のプロセッサ。
条項30. APIがランタイムAPIである、条項25から29までのいずれか一項に記載のプロセッサ。
条項31. コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施するための1つ又は複数のプロセッサを有する1つ又は複数のコンピュータ
を備える、システム。
条項32. 1つ又は複数のプロセッサが、1つ又は複数のデータ構造を示すパラメータ値に少なくとも部分的に基づいて、APIを実施するためのものである、条項31に記載のシステム。
条項33. 1つ又は複数のプロセッサが、さらに、1つ又は複数のデータ構造を1つ又は複数のグラフ・データ構造に関連付けるためのものである、条項31又は32に記載のシステム。
条項34. 情報の使用が、少なくとも、コンピュータ・プログラムに関連する参照のセットによって、示される、条項31から33までのいずれか一項に記載のシステム。
条項35. 1つ又は複数のデータ構造が、メモリを割振り解除するための1つ又は複数の関数を示す、条項31から34までのいずれか一項に記載のシステム。
条項36. コンピュータ・プログラムが、1つ又は複数の並列処理ユニット(PPU)によって実行可能である、条項31から35までのいずれか一項に記載のシステム。
条項37. 1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、少なくとも、
コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施すること
を行わせる命令のセットを記憶した機械可読媒体。
条項38. 命令のセットが、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、コンピュータ・プログラムによる情報の使用量が、少なくとも、使用量を示す1つ又は複数のデータ構造の1つ又は複数の値を増分することによって、増加されることを引き起こすことを行わせる命令をさらに含む、条項37に記載の機械可読媒体。
条項39. 命令のセットが、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、1つ又は複数のグラフ・データ構造を示すパラメータ値に基づいてAPIを実施することを行わせる命令をさらに含む、条項37又は38に記載の機械可読媒体。
条項40. コンピュータ・プログラムが、1つ又は複数のグラフ・データ構造動作を備える、条項37から39までのいずれか一項に記載の機械可読媒体。
条項41. 情報が、コンピュータ・プログラムによって使用される1つ又は複数のデータ・オブジェクトを含む、条項37から40までのいずれか一項に記載の機械可読媒体。
条項42. コンピュータ・プログラムが、1つ又は複数の汎用グラフィックス処理ユニット(GPGPU)によって実行可能である、条項37から41までのいずれか一項に記載の機械可読媒体。
条項43. コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて増加されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施するステップ
を含む、方法。
条項44. APIを実施した結果として1つ又は複数のステータス指示を取得するステップをさらに含む、条項43に記載の方法。
条項45. 少なくともAPIを示すコードを取得するステップと、
少なくとも、コードの実行を引き起こすことによって、APIを実施するステップと
をさらに含む、条項43又は44に記載の方法。
条項46. 関連付けを示すパラメータ値に少なくとも部分的に基づいて、1つ又は複数のデータ構造をグラフ・データ構造に関連付けるステップをさらに含む、条項43から45までのいずれか一項に記載の方法。
条項47. 1つ又は複数のデータ構造が、1つ又は複数のデストラクタ関数を示す、条項43から46までのいずれか一項に記載の方法。
条項48. コンピュータ・プログラムが、1つ又は複数の中央処理ユニット(CPU)によって実行可能である、条項43から47までのいずれか一項に記載の方法。
条項49. コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施するための1つ又は複数の回路
を備える、プロセッサ。
条項50. 1つ又は複数の回路は、少なくとも、1つ又は複数のデータ構造によって示される使用のカウントを低減することによって、コンピュータ・プログラムによる情報の使用量が低減されることを引き起こすためのものである、条項49に記載のプロセッサ。
条項51. 情報の使用が、情報に関連する1つ又は複数の参照によって示される、条項49又は50に記載のプロセッサ。
条項52. コンピュータ・プログラムが、1つ又は複数の並列処理ユニット(PPU)によって実行可能である、条項49から51までのいずれか一項に記載のプロセッサ。
条項53. 1つ又は複数の回路が、1つ又は複数のデータ構造を示すパラメータ値に少なくとも部分的に基づいて、APIを実施するためのものである、条項49から52までのいずれか一項に記載のプロセッサ。
条項54. 情報が、コンピュータ・プログラムによって使用されるメモリを含む、条項49から53までのいずれか一項に記載のプロセッサ。
条項55. コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施するための1つ又は複数のプロセッサを有する1つ又は複数のコンピュータ
を備える、システム。
条項56. 1つ又は複数のプロセッサは、コンピュータ・プログラムによる情報の使用量が、参照の数を示すパラメータ値に基づいて低減されることを引き起こすためのものである、条項55に記載のシステム。
条項57. APIがランタイムAPIである、条項55又は56に記載のシステム。
条項58. 1つ又は複数のプロセッサが、さらに、1つ又は複数のデータ構造によって示される参照のカウントを減分するためのものである、条項55から57までのいずれか一項に記載のシステム。
条項59. コンピュータ・プログラムが、1つ又は複数のグラフィックス処理ユニット(GPU)によって実行可能である、条項55から58までのいずれか一項に記載のシステム。
条項60. 1つ又は複数のプロセッサが、さらに、1つ又は複数のデータ構造によって示される1つ又は複数の関数の実行を引き起こすためのものである、条項55から59までのいずれか一項に記載のシステム。
条項61. 1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、少なくとも、
コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施すること
を行わせる命令のセットを記憶した機械可読媒体。
条項62. 命令のセットが、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、コンピュータ・プログラムによる情報の使用量が低減されることを引き起こすために、1つ又は複数のデストラクタ関数を実行することを行わせる命令をさらに含む、条項61に記載の機械可読媒体。
条項63. 情報の使用が、コンピュータ・プログラムによって使用される1つ又は複数の参照を通して示される、条項61又は62に記載の機械可読媒体。
条項64. コンピュータ・プログラムが、1つ又は複数のグラフ・データ構造に対応する、条項61から63までのいずれか一項に記載の機械可読媒体。
条項65. 命令のセットが、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、APIを実施した結果として1つ又は複数のステータス指示を取得することを行わせる命令をさらに含む、条項61から64までのいずれか一項に記載の機械可読媒体。
条項66. コンピュータ・プログラムが、1つ又は複数の汎用グラフィックス処理ユニット(GPGPU)によって実行可能である、条項61から65までのいずれか一項に記載の機械可読媒体。
条項67. コンピュータ・プログラムによる情報の使用量が、情報の使用を監視するために使用される1つ又は複数のデータ構造に少なくとも部分的に基づいて低減されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施するステップ
を含む、方法。
条項68. コンピュータ・プログラムによる情報の使用量に基づいて、1つ又は複数のデータ構造の1つ又は複数の値を低減するステップをさらに含む、条項67に記載の方法。
条項69. APIを実施するステップが、情報に関連する1つ又は複数のデストラクタ関数の実行を引き起こす、条項67又は68に記載の方法。
条項70. 情報は、1つ又は複数の動作がコンピュータ・プログラムによって実施されるべきである、データを含む、条項67から69までのいずれか一項に記載の方法。
条項71. グラフ・コードを示すパラメータ値に少なくとも部分的に基づいてAPIを実施するステップをさらに含む、条項67から70までのいずれか一項に記載の方法。
条項72. コンピュータ・プログラムが、1つ又は複数の中央処理ユニット(CPU)によって実行可能である、条項67から71までのいずれか一項に記載の方法。
【0348】
他の変形形態は、本開示の範囲内にある。したがって、開示される技法は、様々な修正及び代替構築が可能であるが、それらのいくつかの例示的な実施例が図面に示され、上記で詳細に説明された。しかしながら、特定の1つ又は複数の開示された形態に本開示を限定する意図はなく、その反対に、添付の特許請求の範囲において定義されるように、開示の趣旨及び範囲に入るすべての修正形態、代替構築、及び等価物を網羅することを意図していることが理解されるべきである。
【0349】
開示される実施例を説明する文脈において(特に、以下の特許請求の範囲の文脈において)「a」及び「an」及び「the」という用語、並びに同様の指示語を使用することは、本明細書に別段の記載のない限り、又は文脈によって明らかに否定されない限り、単数と複数の両方を網羅すると解釈されるべきであり、用語の定義であると解釈されるべきではない。「含む、備える(comprising)」、「有する(having)」、「含む(including)」、「含んでいる(containing)」という用語は、別段の記載のない限り、オープンエンドの用語(「限定はしないが、~を含む(including, but not limited to,)」を意味する)と解釈されるべきである。「接続される」という用語は、修飾されず、物理的接続を指しているとき、何か介在するものがある場合でも、部分的に又は完全に中に含まれているか、取り付けられるか、又は互いに接合されるものとして解釈されるべきである。本明細書で値の範囲を詳述することは、本明細書に別段の記載のない限り、及び各別個の値が、本明細書に個々に詳述されているかのように明細書に組み込まれていない限り、範囲内に入る各別個の値を個々に参照する簡潔な方法として働くことを単に意図しているにすぎない。「セット」(たとえば、「項目のセット」)又は「サブセット」という用語の使用は、文脈によって別段の記載がないか又は否定されない限り、1つ又は複数の部材を備える空ではない集合として解釈されるべきである。さらに、文脈によって別段の記載がないか又は否定されない限り、対応するセットの「サブセット」という用語は、対応するセットの厳密なサブセットを必ずしも指すとは限らず、サブセットと、対応するセットとは、等しくなり得る。
【0350】
「A、B、及びCのうちの少なくとも1つ」又は「A、B及びCのうちの少なくとも1つ」という形態の言い回しなどの結合語は、別段の具体的な記載がないか又はさもなければ文脈によって明確に否定されない限り、別様に、項目、用語などが、A又はB又はCのいずれか、或いはAとBとCとのセットの任意の空でないサブセットであり得ることを提示するために一般に使用される文脈で、理解される。たとえば、3つの部材を有するセットの説明的な実例では、「A、B、及びCのうちの少なくとも1つ」並びに「A、B及びCのうちの少なくとも1つ」という結合句は、次のセットのうちのいずれかを指す:{A}、{B}、{C}、{A、B}、{A、C}、{B、C}、{A、B、C}。したがって、そのような結合語は、いくつかの実施例が、Aのうちの少なくとも1つ、Bのうちの少なくとも1つ、及びCのうちの少なくとも1つの各々が存在することを必要とすることを全体的に暗示するものではない。さらに、別段の記載がないか又は文脈によって否定されない限り、「複数(plurality)」という用語は、複数である状態を示す(たとえば、「複数の項目(a plurality of items)」は複数の項目(multiple items)を示す)。複数である項目の数は、少なくとも2つであるが、明示的に、又は文脈によってのいずれかでそのように示されているとき、それよりも多いことがある。さらに、別段の記載がないか又はさもなければ文脈から明らかでない限り、「~に基づいて」という言い回しは、「少なくとも部分的に~に基づいて」を意味し、「~のみに基づいて」を意味しない。
【0351】
本明細書で説明されるプロセスの動作は、本明細書に別段の記載がないか又はさもなければ文脈によって明確に否定されない限り、任意の好適な順序で実施され得る。少なくとも1つの実施例では、本明細書で説明されるプロセス(又はその変形形態及び/又は組合せ)などのプロセスは、実行可能命令で構成された1つ又は複数のコンピュータ・システムの制御下で実施され、1つ又は複数のプロセッサ上で、ハードウェアによって、又はそれらの組合せによって集合的に実行するコード(たとえば、実行可能命令、1つ又は複数のコンピュータ・プログラム、又は1つ又は複数のアプリケーション)として実装される。少なくとも1つの実施例では、コードは、たとえば、1つ又は複数のプロセッサによって実行可能な複数の命令を備えるコンピュータ・プログラムの形態で、コンピュータ可読記憶媒体に記憶される。少なくとも1つの実施例では、コンピュータ可読記憶媒体は、一時的信号(たとえば、伝搬する一時的な電気又は電磁送信)を除外するが、一時的信号のトランシーバ内の非一時的データ・ストレージ回路要素(たとえば、バッファ、キャッシュ、及びキュー)を含む非一時的コンピュータ可読記憶媒体である。少なくとも1つの実施例では、コード(たとえば、実行可能コード又はソース・コード)は、1つ又は複数の非一時的コンピュータ可読記憶媒体のセットに記憶され、この記憶媒体は、コンピュータ・システムの1つ又は複数のプロセッサによって実行されたときに(たとえば、実行された結果として)、コンピュータ・システムに本明細書で説明される動作を実施させる実行可能命令を記憶している(又は、実行可能命令を記憶するための他のメモリを有する)。非一時的コンピュータ可読記憶媒体のセットは、少なくとも1つの実施例では、複数の非一時的コンピュータ可読記憶媒体を備え、複数の非一時的コンピュータ可読記憶媒体の個々の非一時的記憶媒体のうちの1つ又は複数は、コードのすべてがないが、複数の非一時的コンピュータ可読記憶媒体は、集合的にコードのすべてを記憶している。少なくとも1つの実施例では、実行可能命令は、異なる命令が異なるプロセッサによって実行されるように実行され、たとえば、非一時的コンピュータ可読記憶媒体は命令を記憶し、メイン中央処理ユニット(「CPU」)は命令のいくつかを実行し、グラフィックス処理ユニット(「GPU」)は他の命令を実行する。少なくとも1つの実施例では、コンピュータ・システムの異なる構成要素は、別個のプロセッサを有し、異なるプロセッサが命令の異なるサブセットを実行する。
【0352】
したがって、少なくとも1つの実施例では、コンピュータ・システムは、本明細書で説明されるプロセスの動作を単独で又は集合的に実施する1つ又は複数のサービスを実装するように構成され、そのようなコンピュータ・システムは、動作の実施を可能にする適用可能なハードウェア及び/又はソフトウェアで構成される。さらに、本開示の少なくとも1つの実施例を実装するコンピュータ・システムは、単一のデバイスであり、別の実施例では、分散型コンピュータ・システムが本明細書で説明される動作を実施するように、及び単一のデバイスがすべての動作を実施しないように、異なるやり方で動作する複数のデバイスを備える分散型コンピュータ・システムである。
【0353】
本明細書で提供されるあらゆる実例、又は例示的な言葉(たとえば、「など、などの(such as)」)の使用は、本開示の実施例をより明らかにすることのみを意図しており、別段の主張のない限り、本開示の範囲に制限を加えるものではない。本明細書のいかなる言葉も、特許請求されていない任意の要素を、本開示の実践に不可欠なものとして示すと解釈されるべきではない。
【0354】
本明細書で引用される出版物、特許出願、及び特許を含むすべての参考文献は、各参考文献が参照により組み込まれることが個別に明確に示され、その全体が本明細書に記載されたかのように、それと同程度まで参照により本明細書に組み込まれる。
【0355】
明細書及び特許請求の範囲において、「結合される」及び「接続される」という用語が、その派生語とともに使用され得る。これらの用語は、互いに同義語として意図されていないことがあることが理解されるべきである。むしろ、特定の実例では、「接続される」又は「結合される」は、2つ又はそれ以上の要素が物理的又は電気的に互いに直接又は間接的に接触していることを示すために使用され得る。「結合される」はまた、2つ又はそれ以上の要素が直接互いに接触していないが、それでもなお互いに連動又は対話することを意味し得る。
【0356】
別段の具体的な記載がない限り、明細書全体を通して、「処理する(processing)」、「算出する(computing)」、「計算する(calculating)」、又は「決定する(determining)」などの用語は、コンピューティング・システムのレジスタ及び/又はメモリ内の、電子的などの物理的な量として表されるデータを、コンピューティング・システムのメモリ、レジスタ又は他のそのような情報ストレージ、送信、若しくはディスプレイ・デバイス内の物理的な量として同様に表される他のデータになるように操作及び/又は変換する、コンピュータ又はコンピューティング・システム、或いは同様の電子コンピューティング・デバイスのアクション及び/又はプロセスを指すことが諒解され得る。
【0357】
同様に、「プロセッサ」という用語は、レジスタ及び/又はメモリからの電子データを処理し、その電子データを、レジスタ及び/又はメモリに記憶され得る他の電子データに変換する任意のデバイス、又はデバイスの一部分を指し得る。非限定的な実例として、「プロセッサ」は、CPU又はGPUであり得る。「コンピューティング・プラットフォーム」は、1つ又は複数のプロセッサを備え得る。本明細書で使用される「ソフトウェア」プロセスは、たとえば、タスク、スレッド、及び知的エージェントなど、経時的にワークを実施するソフトウェア及び/又はハードウェア・エンティティを含み得る。また、各プロセスは、命令を直列で又は並列で、連続的に又は断続的に行うための複数のプロセスを指し得る。「システム」及び「方法」という用語は、1つ又は複数の方法をシステムが具体化し得、方法がシステムと考えられ得る場合に限り、本明細書において交換可能に使用される。
【0358】
少なくとも1つの実施例では、算術論理ユニットは、結果を作り出すために1つ又は複数の入力をとる組合せ論理回路要素のセットである。少なくとも1つの実施例では、算術論理ユニットは、加算、減算、又は乗算などの数学演算を実装するためにプロセッサによって使用される。少なくとも1つの実施例では、算術論理ユニットは、論理AND/OR又はXORなどの論理演算を実装するために使用される。少なくとも1つの実施例では、算術論理ユニットは、ステートレスであり、論理ゲートを形成するように構成された半導体トランジスタなど、物理的切替え構成要素から作られる。少なくとも1つの実施例では、算術論理ユニットは、関連するクロックをもつステートフル論理回路として、内部で動作し得る。少なくとも1つの実施例では、算術論理ユニットは、関連するレジスタ・セット中で維持されない内部状態をもつ非同期論理回路として構築され得る。少なくとも1つの実施例では、算術論理ユニットは、プロセッサの1つ又は複数のレジスタに記憶されたオペランドを組み合わせ、別のレジスタ又はメモリ・ロケーションにプロセッサによって記憶され得る出力を作り出すために、プロセッサによって使用される。
【0359】
少なくとも1つの実施例では、プロセッサによって取り出された命令を処理した結果として、プロセッサは、1つ又は複数の入力又はオペランドを算術論理ユニットに提示し、算術論理ユニットに、算術論理ユニットの入力に提供された命令コードに少なくとも部分的に基づく結果を作り出させる。少なくとも1つの実施例では、プロセッサによってALUに提供された命令コードは、プロセッサによって実行された命令に少なくとも部分的に基づく。少なくとも1つの実施例では、ALUにおける組合せ論理は、入力を処理し、プロセッサ内のバス上に置かれる出力を作り出す。少なくとも1つの実施例では、プロセッサは、プロセッサをクロック制御することにより、ALUによって作り出された結果が所望のロケーションに送出されるように、宛先レジスタ、メモリ・ロケーション、出力デバイス、又は出力バス上の出力ストレージ・ロケーションを選択する。
【0360】
本明細書では、アナログ・データ又はデジタル・データを取得すること、獲得すること、受信すること、或いはそれらをサブシステム、コンピュータ・システム、又はコンピュータ実装機械に入力することに言及し得る。アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、関数コール、又はアプリケーション・プログラミング・インターフェースへのコールのパラメータとしてデータを受信することによってなど、様々なやり方で実現され得る。いくつかの実装形態では、アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、直列又は並列インターフェースを介してデータを転送することによって実現され得る。別の実装形態では、アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、提供するエンティティから獲得するエンティティにコンピュータ・ネットワークを介してデータを転送することによって実現され得る。アナログ・データ又はデジタル・データを提供すること、出力すること、送信すること、送出すること、又は提示することにも言及し得る。様々な実例では、アナログ・データ又はデジタル・データを提供する、出力する、送信する、送出する、又は提示するプロセスは、関数コールの入力又は出力パラメータ、アプリケーション・プログラミング・インターフェース又はプロセス間通信機構のパラメータとしてデータを転送することによって実現され得る。
【0361】
上記の説明は、説明された技法の例示的な実装形態について述べているが、他のアーキテクチャが、説明された機能性を実装するために使用され得、本開示の範囲内にあることが意図される。さらに、説明を目的として、責任の具体的な分散が上記で定義されたが、様々な機能及び責任は、状況に応じて異なるやり方で分散及び分割され得る。
【0362】
さらに、主題は、構造的特徴及び/又は方法論的行為に特有の言語で説明されたが、添付の特許請求の範囲で特許請求される主題は、説明された特有の特徴又は行為に必ずしも限定されるとは限らないことが理解されるべきである。むしろ、特有の特徴及び行為は、特許請求の範囲を実装する例示的な形態として開示される。
【国際調査報告】