IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ エヌビディア コーポレーションの特許一覧

特表2024-514372グラフ・コードの表現を生成するためのアプリケーション・プログラミング・インターフェース
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2024-04-02
(54)【発明の名称】グラフ・コードの表現を生成するためのアプリケーション・プログラミング・インターフェース
(51)【国際特許分類】
   G06F 8/34 20180101AFI20240326BHJP
【FI】
G06F8/34
【審査請求】有
【予備審査請求】未請求
(21)【出願番号】P 2022526176
(86)(22)【出願日】2022-04-12
(85)【翻訳文提出日】2023-10-11
(86)【国際出願番号】 US2022024456
(87)【国際公開番号】W WO2022221302
(87)【国際公開日】2022-10-20
(31)【優先権主張番号】63/175,193
(32)【優先日】2021-04-15
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】17/718,065
(32)【優先日】2022-04-11
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.TENSORFLOW
2.JAVA
3.JAVASCRIPT
4.BLUETOOTH
5.PYTHON
6.POSTSCRIPT
(71)【出願人】
【識別番号】501450960
【氏名又は名称】エヌビディア コーポレーション
(74)【代理人】
【識別番号】110000855
【氏名又は名称】弁理士法人浅村特許事務所
(72)【発明者】
【氏名】ズールバ、ウラディスラフ
(72)【発明者】
【氏名】スティーブンソン、サリー テッサ
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BC08
5B376BC32
5B376BC44
5B376FA13
(57)【要約】
グラフ・コードの記述表現を生成させるための装置、システム、及び技法。少なくとも1つの実施例では、グラフ・コードの記述表現が、たとえば、CUDA又は他の並列コンピューティング・プラットフォーム・コードに基づいて、生成されるようになされる。
【特許請求の範囲】
【請求項1】
グラフ・コードの記述表現が生成されるようにアプリケーション・プログラミング・インターフェース(API)を実施するための1つ又は複数の回路
を有する、プロセッサ。
【請求項2】
前記1つ又は複数の回路は、前記記述表現を生成するために、さらに、1つ又は複数のパラメータ値に少なくとも部分的に基づいて前記グラフ・コードをパースするようになっている、請求項1に記載のプロセッサ。
【請求項3】
前記記述表現がテキスト表現である、請求項1に記載のプロセッサ。
【請求項4】
前記1つ又は複数の回路は、さらに、前記APIに関連するパラメータ値によって示された1つ又は複数のロケーションにおいて前記記述表現を生成するようになっている、請求項1に記載のプロセッサ。
【請求項5】
前記1つ又は複数の回路は、さらに、1つ又は複数のグラフィックス処理ユニット(GPU)に前記記述表現を生成させるようになっている、請求項1に記載のプロセッサ。
【請求項6】
前記APIがランタイムAPIである、請求項1に記載のプロセッサ。
【請求項7】
グラフ・コードの記述表現が生成されるようにアプリケーション・プログラミング・インターフェース(API)を実施するための1つ又は複数のプロセッサを有する1つ又は複数のコンピュータ
を有する、システム。
【請求項8】
前記1つ又は複数のプロセッサは、さらに、
1つ又は複数のパラメータ値に少なくとも部分的に基づいて1つ又は複数の特性を取得することと、
前記1つ又は複数の特性に少なくとも部分的に基づいて前記記述表現を生成することと
を行うようになっている、請求項7に記載のシステム。
【請求項9】
前記グラフ・コードは、1つ又は複数の動作と、前記1つ又は複数の動作の間の依存性とを示す、請求項7に記載のシステム。
【請求項10】
前記1つ又は複数のプロセッサは、さらに、前記APIを実施した結果としてステータス表示を取得するようになっている、請求項7に記載のシステム。
【請求項11】
前記1つ又は複数のプロセッサは、1つ又は複数の並列処理ユニット(PPU)を用いて、前記グラフ・コードの前記記述表現を生成させるようになっている、請求項7に記載のシステム。
【請求項12】
前記記述表現が画像表現である、請求項7に記載のシステム。
【請求項13】
命令のセットを記憶した機械可読媒体であって、前記命令のセットは、1つ又は複数のプロセッサによって実施されると、前記1つ又は複数のプロセッサに、少なくとも、
グラフ・コードの記述表現が生成されるようにアプリケーション・プログラミング・インターフェース(API)を実施させる
ようになっている、機械可読媒体。
【請求項14】
前記命令のセットは、前記1つ又は複数のプロセッサによって実施されると、前記1つ又は複数のプロセッサに、前記グラフ・コードの1つ又は複数の値をエンコードする前記記述表現を生成させる命令をさらに含む、請求項13に記載の機械可読媒体。
【請求項15】
前記命令のセットは、前記1つ又は複数のプロセッサによって実施されると、前記1つ又は複数のプロセッサに、前記グラフ・コードの記述表現のセットを生成させる命令をさらに含む、請求項13に記載の機械可読媒体。
【請求項16】
前記命令のセットは、前記1つ又は複数のプロセッサによって実施されると、前記1つ又は複数のプロセッサに、1つ又は複数の中央処理ユニット(CPU)が前記グラフ・コードの前記記述表現を生成するようにさせる命令をさらに含む、請求項13に記載の機械可読媒体。
【請求項17】
前記グラフ・コードが1つ又は複数のカーネルをエンコードし、
前記記述表現が、前記1つ又は複数のカーネルに関連する情報を示す、
請求項13に記載の機械可読媒体。
【請求項18】
前記記述表現が1つ又は複数のファイルとして表現される、請求項13に記載の機械可読媒体。
【請求項19】
グラフ・コードの記述表現が生成されるようにアプリケーション・プログラミング・インターフェース(API)を実施するステップ
を含む、方法。
【請求項20】
前記APIに関連する1つ又は複数のパラメータ値に基づいて前記グラフ・コードから1つ又は複数の値を取得するステップと、
前記1つ又は複数の値を前記記述表現においてエンコードするステップと
をさらに含む、請求項19に記載の方法。
【請求項21】
前記記述表現は、少なくとも、前記グラフ・コードに関連するトポロジーを示す、請求項19に記載の方法。
【請求項22】
前記APIがドライバAPIである、請求項19に記載の方法。
【請求項23】
前記APIに対応するステータスの表示を取得するステップをさらに含む、請求項19に記載の方法。
【請求項24】
1つ又は複数の汎用グラフィックス処理ユニット(GPGPU)に、前記グラフ・コードの前記記述表現を生成させるステップをさらに含む、請求項19に記載の方法。
【発明の詳細な説明】
【技術分野】
【0001】
本出願は、2021年4月15日に出願された「GRAPH DEBUGGING INFORMATION」と題する米国仮出願第63/175,193号、及び2022年4月11日に出願された「APPLICATION PROGRAMMING INTERFACE TO GENERATE A REPRESENTATION OF GRAPH CODE」と題する米国特許出願第17/718,065号の利益を主張するものであり、それらの内容全体が参照により本明細書に組み込まれる。
【0002】
少なくとも1つの実施例は、グラフ・コードの記述表現(descriptive representation)を生成するために使用される処理リソースに関する。たとえば、少なくとも1つの実施例は、本明細書で説明される様々な新規の技法を実装する、グラフ・コードの記述表現を生成するために使用されるプロセッサ又はコンピューティング・システムに関する。
【背景技術】
【0003】
グラフなどのツールは、コンピュータ・プログラムにおける高められた機能性及び他の利点を提供するために使用され得る。そのようなツールがますます使用されるつれて、それらのツールは、ますます複雑になり、デバッギングがますます困難になることがある。その上、そのようなツールは、しばしば、有用な情報を取得することを困難にするフォーマットで記憶される。
【図面の簡単な説明】
【0004】
図1】少なくとも1つの実施例による、記述表現の一実例を示す図である。
図2】少なくとも1つの実施例による、記述表現の別の実例を示す図である。
図3】少なくとも1つの実施例による、記述表現の別の実例を示す図である。
図4】少なくとも1つの実施例による、記述表現の別の実例を示す図である。
図5】少なくとも1つの実施例による、グラフ・デバッグ・ドット・プリントAPIコール(graph debug dot print API call)の図である。
図6】少なくとも1つの実施例による、グラフ・コードの記述表現が生成されることを引き起こすプロセスの一実例を示す図である。
図7】少なくとも1つの実施例による、例示的なデータ・センタを示す図である。
図8】少なくとも1つの実施例による、処理システムを示す図である。
図9】少なくとも1つの実施例による、コンピュータ・システムを示す図である。
図10】少なくとも1つの実施例による、システムを示す図である。
図11】少なくとも1つの実施例による、例示的な集積回路を示す図である。
図12】少なくとも1つの実施例による、コンピューティング・システムを示す図である。
図13】少なくとも1つの実施例による、APUを示す図である。
図14】少なくとも1つの実施例による、CPUを示す図である。
図15】少なくとも1つの実施例による、例示的なアクセラレータ統合スライス(accelerator integration slice)を示す図である。
図16A】少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す図である。
図16B】少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す図である。
図17A】少なくとも1つの実施例による、グラフィックス・コアを示す図である。
図17B】少なくとも1つの実施例による、GPGPUを示す図である。
図18A】少なくとも1つの実施例による、並列プロセッサを示す図である。
図18B】少なくとも1つの実施例による、処理クラスタを示す図である。
図18C】少なくとも1つの実施例による、グラフィックス・マルチプロセッサを示す図である。
図19】少なくとも1つの実施例による、グラフィックス・プロセッサを示す図である。
図20】少なくとも1つの実施例による、プロセッサを示す図である。
図21】少なくとも1つの実施例による、プロセッサを示す図である。
図22】少なくとも1つの実施例による、グラフィックス・プロセッサ・コアを示す図である。
図23】少なくとも1つの実施例による、PPUを示す図である。
図24】少なくとも1つの実施例による、GPCを示す図である。
図25】少なくとも1つの実施例による、ストリーミング・マルチプロセッサを示す図である。
図26】少なくとも1つの実施例による、プログラミング・プラットフォームのソフトウェア・スタックを示す図である。
図27】少なくとも1つの実施例による、図26のソフトウェア・スタックのCUDA実装形態を示す図である。
図28】少なくとも1つの実施例による、図26のソフトウェア・スタックのROCm実装形態を示す図である。
図29】少なくとも1つの実施例による、図26のソフトウェア・スタックのOpenCL実装形態を示す図である。
図30】少なくとも1つの実施例による、プログラミング・プラットフォームによってサポートされるソフトウェアを示す図である。
図31】少なくとも1つの実施例による、図26図29のプログラミング・プラットフォーム上で実行するためのコードをコンパイルすることを示す図である。
図32】少なくとも1つの実施例による、図26図29のプログラミング・プラットフォーム上で実行するためのコードをコンパイルすることをより詳細に示す図である。
図33】少なくとも1つの実施例による、ソース・コードをコンパイルするより前にソース・コードをトランスレートすることを示す図である。
図34A】少なくとも1つの実施例による、異なるタイプの処理ユニットを使用してCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。
図34B】少なくとも1つの実施例による、CPU及びCUDA対応GPUを使用して、図34AのCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。
図34C】少なくとも1つの実施例による、CPU及びCUDA非対応(non-CUDA-enabled)GPUを使用して、図34AのCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。
図35】少なくとも1つの実施例による、図34CのCUDAからHIPへのトランスレーション・ツール(CUDA-to-HIP translation tool)によってトランスレートされた例示的なカーネルを示す図である。
図36】少なくとも1つの実施例による、図34CのCUDA非対応GPUをより詳細に示す図である。
図37】少なくとも1つの実施例による、例示的なCUDAグリッドのスレッドが図36の異なるコンピュート・ユニットにどのようにマッピングされるかを示す図である。
図38】少なくとも1つの実施例による、既存のCUDAコードをData Parallel C++コードにどのようにマイグレートするかを示す図である。
【発明を実施するための形態】
【0005】
少なくとも1つの実施例では、1つ又は複数のプログラミング・モデルが、様々な動作を実施するために、動作と前記動作の間の依存性とを表す1つ又は複数のデータ構造を利用する。少なくとも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つの実施例では、一連の1つ又は複数の動作は、ストリームと呼ばれる。少なくとも1つの実施例では、たとえば、APIコールが、ストリームとも呼ばれる一連の動作の始まりを示し、異なるAPIコールが、前記一連の動作の終わりを示し、前記一連の動作は、次いで、前記グラフとしてインスタンス化される。少なくとも1つの実施例では、グラフは、グラフ動作と呼ばれることがある、1つ又は複数の動作を通して作成される。少なくとも1つの実施例では、グラフは、様々なグラフAPI関数を通して作成及び修正される。少なくとも1つの実施例では、例示的な実例として、グラフは、1つ又は複数のAPI関数を通して作成され、API関数は、前記グラフを作成し、前記グラフにノード(たとえば、子グラフ・ノード、空のノード、イベント記録ノード、イベント待機ノード、外部セマフォ信号ノード、外部セマフォ待機ノード、ホスト実行ノード、カーネル実行ノード、メモリ・コピー・ノード、メモリ・セット・ノード、及び/又はそれらの変形形態)を追加し、前記グラフに依存性を追加し、及び/又はそれらの変形形態である。少なくとも1つの実施例では、任意の好適なAPI関数を通して、ノードを追加すること、ノードを削除すること、グラフをコピーすること、グラフを消去すること、及び/又はそれらの変形形態など、様々な動作がグラフに対して実施される。少なくとも1つの実施例では、グラフは、任意の好適なAPI関数、ソフトウェア・ライブラリ、及び/又はそれらの変形形態を使用して、任意の好適な様式で修正されるか又はさもなければ管理される。
【0008】
少なくとも1つの実施例では、前記グラフは、1つ又は複数のアレイ、リスト、及び/又は他の好適なデータ構造など、1つ又は複数のデータ構造及び/又はデータ・オブジェクトを使用して実装される。少なくとも1つの実施例では、前記グラフは、動作と前記動作の間の依存性とを符号化する、グラフ・コードとも呼ばれる、グラフ・データ・オブジェクトとして実装される。少なくとも1つの実施例では、本明細書で説明される技法は、前記グラフの詳細図、グラフ・トポロジー、ノード・ジオメトリ、属性構成、パラメータ値、及び/又はそれらの変形形態を含む、1つ又は複数のコンピュータ・ファイル及び/又は表現として、前記グラフを出力するか又はさもなければ表すアビリティ(ability)を提供する。
【0009】
少なくとも1つの実施例では、CUDA、HIP、oneAPI、及び/又はそれらの変形形態など、1つ又は複数のプログラミング・モデルのシステムなど、1つ又は複数のシステムが、本明細書で説明される様々な動作及び/又は技法を実施する。少なくとも1つの実施例では、1つ又は複数のシステムは、前記グラフを1つ又は複数の表現にコンバートするための1つ又は複数の機能を提供し、前記1つ又は複数の表現は、様々なグラフ構成問題点、欠陥、又は他の潜在的問題を効率的に識別するアビリティをユーザに提供し得る。少なくとも1つの実施例では、1つ又は複数のシステムは、グラフ記述言語(DOT)グラフなど、前記グラフの、記述表現、出力表現、出力データ、ファイル表現、及び/又はそれらの変形形態とも呼ばれる、表現、或いはxdot、ポータブル・ネットワーク・グラフィックス(PNG:portable network graphics)、ジョイント・フォトグラフィック・エキスパート・グループ(JPEG:Joint Photographic Experts Group)、JPEG2000、グラフィックス交換フォーマット(GIF:graphics interchange format)、ポータブル・ドキュメント・フォーマット(PDF:portable document format)、ビットマップ(BMP:bitmap)、シリコン・グラフィックス・イメージ(SGI)、JavaScriptオブジェクト表記法(JSON:JavaScript Object Notation)、XML、YAML、ポストスクリプト(PS:PostScript)、カプセル化されたポストスクリプト(EPS:Encapsulated PostScript)、スケーラブル・ベクター・グラフィックス(SVG:scalable vector graphics)、キャノン、コア・グラフィックス画像(CGImage)、平文、OpenEXR、図、GD/GD2フォーマット、アイコン画像ファイル・フォーマット、PICT、pic、トゥルービジョン・アドバンスト・ラスタ・グラフィックス・アダプタ(TARGA:Truevision Advanced Raster Graphics Adapter)、タグ画像ファイル・フォーマット、TKグラフィックス、ベクトル・マークアップ言語、ワイヤレス・ビットマップ・フォーマット、webpフォーマット、及び/又は前記グラフに関連する情報を符号化する任意の好適な表現などの他の好適な表現を生成するために、前記グラフを処理するための機能性を提供する。
【0010】
少なくとも1つの実施例では、DOTは、無向グラフ、有向グラフなどのグラフ、並びにグラフ、ノード、及びエッジの属性を記述することができる、グラフ記述言語である。少なくとも1つの実施例では、属性は、色、形状、ライン・スタイル、及び/又は他の情報などの態様を含む。少なくとも1つの実施例では、1つ又は複数のシステムは、ユーザが、前記グラフを指定し、前記グラフを、DOTファイル表現、又は本明細書で説明される他の表現にコンバートすることを可能にする1つ又は複数の機能を利用する。少なくとも1つの実施例では、前記DOTファイル表現は、前記グラフのノードを、多角形又は形状ベースのノードと呼ばれることがある異なる形状として表す。少なくとも1つの実施例では、前記DOTファイル表現は、前記グラフのノードを、記録ベースのノードと呼ばれることがある記録エントリとして表す。少なくとも1つの実施例では、前記DOTファイル表現は、前記グラフのノードを、ハイパーテキスト・マークアップ言語(HTML:HyperText Markup Language)などの言語に基づき得るストリングとして表す。
【0011】
少なくとも1つの実施例では、1つ又は複数のシステムは、1つ又は複数のAPI関数を利用する。少なくとも1つの実施例では、1つ又は複数のAPI関数は、グラフ・デバッグ・ドット・プリントAPI関数と呼ばれるドライバAPI関数を含み、これは、プログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)に依存することがある、「GraphDebugDotPrint」、「cuGraphDebugDotPrint」又は任意の好適な記法として示され得る。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPI関数は、プログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)に依存することがある「CUresult cuGraphDebugDotPrint(CUgraph hGraph, const char *path, unsigned int flags)」又は任意の好適な記法によって示され、「CUresult」は、前記グラフ・デバッグ・ドット・プリントAPI関数のステータス(たとえば、エラー・コード、成功コード、及び/又はそれらの変形形態)を示す前記グラフ・デバッグ・ドット・プリントAPI関数によって返されるべきデータのタイプを示し、「cuGraphDebugDotPrint」は、関数識別子又は名前を示し、「CUgraph hGraph」は前記グラフを示し、「const char *path」は、表現(たとえば、出力DOTファイル、又は他の好適な表現)のためのロケーションを示し、「unsigned int flags」は、1つ又は複数のフラグのための値を示す。少なくとも1つの実施例では、フラグは、関数又はプロセス(たとえば、API関数)の1つ又は複数の特性を決定する、前記関数又はプロセスのための信号である値を参照する。少なくとも1つの実施例では、フラグは、前記フラグのための値が1に設定されたとき、有効にされ、前記フラグのための値が0に設定されたとき、無効にされる。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPI関数は、前記グラフを表現(たとえば、DOTファイル、又は他の好適な表現)として出力するために利用され、その表現は、前記グラフ・デバッグ・ドット・プリントAPI関数を使用して示されるフラグに少なくとも部分的に基づいて構成される。
【0012】
少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPI関数のためのフラグは、有効にされたとき、あらゆるフラグが有効にされたかのようにすべてのデバッグ・データを出力するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_VERBOSE」と、有効にされたとき、出力データのための1つ又は複数のランタイム構造を使用するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_RUNTIME_TYPES」と、有効にされたとき、カーネル・ノード・パラメータ情報を出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_PARAMS」と、有効にされたとき、メモリ・コピー・ノード・パラメータ情報を出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_MEMCPY_NODE_PARAMS」と、有効にされたとき、メモリ・セット・ノード・パラメータ情報を出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_MEMSET_NODE_PARAMS」と、有効にされたとき、ホスト・ノード・パラメータ情報を出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_HOST_NODE_PARAMS」と、有効にされたとき、記録及び待機ノード情報(たとえば、ハンドル)を出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_EVENT_NODE_PARAMS」と、有効にされたとき、外部セマフォ信号ノード・パラメータ情報を出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_SIGNAL_NODE_PARAMS」と、有効にされたとき、外部セマフォ待機ノード・パラメータ情報を出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_WAIT_NODE_PARAMS」と、有効にされたとき、カーネル・ノード属性値情報を出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_ATTRIBUTES」と、有効にされたとき、ノード・ハンドル及びカーネル関数ハンドル情報を出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_HANDLES」と、有効にされたとき、メモリ割振りノード・パラメータを出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_MEM_ALLOC_NODE_PARAMS」と、有効にされたとき、メモリ解放(たとえば、割振り解除)ノード・パラメータを出力データに追加するフラグである「CU_GRAPH_DEBUG_DOT_FLAGS_MEM_FREE_NODE_PARAMS」とを含むが、それらの任意の変形形態が利用され得る。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPI関数のためのフラグは、DOT又は他の好適な表現など、出力データのための表現のタイプを示すための1つ又は複数のフラグを含む。
【0013】
少なくとも1つの実施例では、1つ又は複数のAPI関数は、前記グラフ・デバッグ・ドット・プリントAPI関数と呼ばれるランタイムAPI関数を含み、これは、プログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)に依存することがある、「GraphDebugDotPrint」、「cudaGraphDebugDotPrint」、又は任意の好適な記法として示され得る。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPI関数は、プログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)に依存することがある「__host__ cudaError_t cudaGraphDebugDotPrint(cudaGraph_t graph, const char *path, unsigned int flags)」又は任意の好適な記法によって示され、「__host__」は、ホスト(たとえば、CPUなどのホスト・プロセッサ)を示し、「cudaError_t」は、前記グラフ・デバッグ・ドット・プリントAPI関数のステータス(たとえば、エラー・コード、成功コード、及び/又はそれらの変形形態)を示す前記グラフ・デバッグ・ドット・プリントAPI関数によって返されるべきデータのタイプを示し、「cudaGraphDebugDotPrint」は、関数識別子又は名前を示し、「cudaGraph_t graph」は前記グラフを示し、「const char *path」は、表現(たとえば、出力DOTファイル、又は他のファイル表現)のためのロケーションを示し、「unsigned int flags」は、1つ又は複数のフラグのための値を示す。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPI関数は、前記グラフを表現(たとえば、DOTファイル、又は他の好適な表現)として出力するために利用され、その表現は、前記グラフ・デバッグ・ドット・プリントAPI関数を使用して示されるフラグに少なくとも部分的に基づいて構成される。
【0014】
少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPI関数のためのフラグは、有効にされたとき、あらゆるフラグが有効にされたかのようにすべてのデバッグ・データを出力するフラグである「cudaGraphDebugDotFlagsVerbose」と、有効にされたとき、カーネル・ノード・パラメータ情報を出力データに追加するフラグである「cudaGraphDebugDotFlagsKernelNodeParams」と、有効にされたとき、メモリ・コピー・ノード・パラメータ情報を出力データに追加するフラグである「cudaGraphDebugDotFlagsMemcpyNodeParams」と、有効にされたとき、メモリ・セット・ノード・パラメータ情報を出力データに追加するフラグである「cudaGraphDebugDotFlagsMemsetNodeParams」と、有効にされたとき、ホスト・ノード・パラメータ情報を出力データに追加するフラグである「cudaGraphDebugDotFlagsHostNodeParams」と、有効にされたとき、記録及び待機ノード情報(たとえば、ハンドル)を出力データに追加するフラグである「cudaGraphDebugDotFlagsEventNodeParams」と、有効にされたとき、外部セマフォ信号ノード・パラメータ情報を出力データに追加するフラグである「cudaGraphDebugDotFlagsExtSemasSignalNodeParams」と、有効にされたとき、外部セマフォ待機ノード・パラメータ情報を出力データに追加するフラグである「cudaGraphDebugDotFlagsExtSemasWaitNodeParams」と、有効にされたとき、カーネル・ノード属性値情報を出力データに追加するフラグである「cudaGraphDebugDotFlagsKernelNodeAttributes」と、有効にされたとき、ノード・ハンドル及びカーネル関数ハンドル情報を出力データに追加するフラグである「cudaGraphDebugDotFlagsHandles」とを含むが、それらの任意の変形形態が利用され得る。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPI関数のためのフラグは、DOT又は他の好適な表現など、出力データのための表現のタイプを示すための1つ又は複数のフラグを含む。
【0015】
API関数は、前記API関数の1つ又は複数の機能性に関係することも関係しないこともある、任意の好適な専門用語を使用して任意の好適な様式で示され得ることに留意されたい。さらに、本明細書で説明される例示的な実施例は、CUDAプログラミング・モデルに関係し得るが、本明細書で説明される技法は、任意の好適なプログラミング・モデル、及び/又は任意の好適なプログラミング・モデルの任意の好適なAPIとともに利用され得ることに留意されたい。
【0016】
少なくとも1つの実施例では、ユーザなど、1つ又は複数のエンティティは、1つ又は複数のAPIコールを通して1つ又は複数のAPI関数を利用する。少なくとも1つの実施例では、1つ又は複数のエンティティによる1つ又は複数のAPIコールは、1つ又は複数のグラフ、表現(たとえば、DOTファイル、又は他の好適な表現)のためのロケーション、及び/又はフラグを指定する。少なくとも1つの実施例では、1つ又は複数のシステムは、前記グラフ・デバッグ・ドット・プリントAPI関数に基づくAPIコールに応答して、ヘッダ(たとえば、DOTヘッダ、又は他の好適な表現ヘッダ)を書き込み、前記APIコールによって示された前記グラフのノードを通して反復し、前記APIコールによって示されたフラグに基づいてノード情報を表現(たとえば、DOTファイル、又は他の好適な表現)に書き込み、前記グラフのエッジを通して反復し、グラフ・トポロジー及び/又はエッジ情報を前記表現に書き込み、並びに/或いはフッタ(たとえば、DOTフッタ、又は他の好適な表現フッタ)を書き込む。少なくとも1つの実施例では、1つ又は複数のシステムは、前記グラフの様々な情報を符号化する前記表現を決定するために前記グラフを構文解析(パース)する。少なくとも1つの実施例では、前記表現(たとえば、DOTファイル、又は他の好適な表現)は、フラグによって指定された、ノードのトポロジー、ノード・タイプ、ノード・ハンドル、ノード属性、ノード・パラメータ、及び/又は追加のノード情報などの情報を含む。少なくとも1つの実施例では、前記表現(たとえば、DOTファイル、又は他の好適な表現)は、前記表現によって示された動作に伴う潜在的問題点を決定するために分析を実施することができる1つ又は複数のデバッギング・ソフトウェアとともに使用可能である。少なくとも1つの実施例では、前記表現は、GIMP ToolKit(GTK)ライブラリ、Xlibライブラリ、x11ライブラリ、及び/又はそれらの変形形態など、(たとえば、デバッギングのために)グラフ詳細を表示するか又はさもなければ閲覧するための様々なライブラリとともに使用可能である。
【0017】
図1は、少なくとも1つの実施例による、記述表現の実例100を示す。少なくとも1つの実施例では、1つ又は複数のシステムは、前記記述表現を生成するために、(たとえば、前記グラフ・デバッグ・ドット・プリントAPIを実施することによって)前記グラフ、或いは他の好適なデータ構造又はデータ・オブジェクトを処理する。少なくとも1つの実施例では、前記記述表現は、DOTファイル、又は他の好適な表現である。少なくとも1つの実施例では、図1は前記グラフの前記記述表現の視覚化であり、前記記述表現は、以下のコードを含むDOTファイルであるが、コードは、それらの任意の変形形態であり得る。
【数1】
【0018】
図2は、少なくとも1つの実施例による、記述表現の別の実例200を示す。少なくとも1つの実施例では、1つ又は複数のシステムは、前記記述表現を生成するために、(たとえば、前記グラフ・デバッグ・ドット・プリントAPIを実施することによって)前記グラフ、或いは他の好適なデータ構造又はデータ・オブジェクトを処理する。少なくとも1つの実施例では、前記記述表現は、DOTファイル、又は他の好適な表現である。少なくとも1つの実施例では、図2は前記グラフの前記記述表現の視覚化であり、前記記述表現は、以下のコードを含むDOTファイルであるが、コードは、それらの任意の変形形態であり得る。
【数2】
【0019】
図3は、少なくとも1つの実施例による、記述表現の別の実例300を示す。少なくとも1つの実施例では、1つ又は複数のシステムは、前記記述表現を生成するために、(たとえば、前記グラフ・デバッグ・ドット・プリントAPIを実施することによって)前記グラフ、或いは他の好適なデータ構造又はデータ・オブジェクトを処理する。少なくとも1つの実施例では、前記記述表現は、DOTファイル、又は他の好適な表現である。少なくとも1つの実施例では、図3は前記グラフの前記記述表現の視覚化であり、前記記述表現は、以下のコードを含むDOTファイルであるが、コードは、それらの任意の変形形態であり得る。
【数3-1】

【数3-2】
【0020】
図4は、少なくとも1つの実施例による、記述表現の別の実例400を示す。少なくとも1つの実施例では、1つ又は複数のシステムは、前記記述表現を生成するために、(たとえば、前記グラフ・デバッグ・ドット・プリントAPIを実施することによって)前記グラフ、或いは他の好適なデータ構造又はデータ・オブジェクトを処理する。少なくとも1つの実施例では、前記記述表現は、DOTファイル、又は他の好適な表現である。少なくとも1つの実施例では、図4は前記グラフの前記記述表現の視覚化であり、前記記述表現は、以下のコードを含むDOTファイルであるが、コードは、それらの任意の変形形態であり得る。
【数4】
【0021】
本明細書で説明される例示的な実施例は、前記CUDAプログラミング・モデルのグラフに関係し得るが、本明細書で説明される技法は、HIP、oneAPI、及び/又はそれらの変形形態など、任意の好適なプログラミング・モデルのグラフとともに利用され得ることに留意されたい。さらに、本明細書で説明される例示的な実施形態は、グラフに関し得るが、本明細書で説明される技法は、動作及び/又は前記動作の間の依存性を示す情報を符号化するか又はさもなければ記憶する、任意の好適なプログラミング・モデルの任意の好適なデータ・オブジェクト又はデータ構造とともに利用され得ることに留意されたい。少なくとも1つの実施例では、たとえば、前記記述表現(たとえば、DOTファイル、又は他の好適な表現)は、動作及び/又は前記動作の間の依存性を示す情報を符号化するか又はさもなければ記憶する、任意の好適なプログラミング・モデルの任意の好適なデータ・オブジェクト又はデータ構造から生成される。
【0022】
図5は、少なくとも1つの実施例による、前記グラフ・デバッグ・ドット・プリントAPI関数のグラフィック表現を示す。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPIは、1つ又は複数のCPU、GPU、GPGPU、PPU、及び/又はそれらの変形形態など、任意の好適なプロセッサ及び/又はプロセッサの組合せによって実施される。少なくとも1つの実施例では、図5は、前記グラフ・デバッグ・ドット・プリントAPI関数コール及び応答中に含まれ得る情報の特定の集合を示すが、変形形態が本開示の範囲内にあり、前記グラフ・デバッグ・ドット・プリントAPI関数コール及び応答は、より少数の又はより多くの情報構成要素を有することができ、これは、任意の好適な様式で示され得る。少なくとも1つの実施例では、同じAPI関数を使用して行われるすべてのAPIコールが同じ情報構成要素を含むとは限らない。少なくとも1つの実施例では、1つのパラメータについての重要な情報のタイプ及び/又は存在が、例示的な実例として、別のパラメータの値に依存することができる。少なくとも1つの実施例では、応答の構成要素についての重要な情報のタイプ及び/又は存在が、別のパラメータ、及び/又は前記応答をトリガしたAPIコールのパラメータの値に依存する。
【0023】
少なくとも1つの実施例では、本明細書で説明されるものなど、前記グラフ・デバッグ・ドット・プリントAPI関数は、ドライバAPI又はランタイムAPIである。少なくとも1つの実施例では、ドライバAPIは、プログラミング・モデルに関して言及され得る、低レベルAPIである(たとえば、CUDAドライバAPI)。少なくとも1つの実施例では、ドライバAPIは、1つ又は複数のデバイスと直接対話する。少なくとも1つの実施例では、ランタイムAPIは、プログラミング・モデルに関して言及され得る、高レベルAPIである(たとえば、CUDAランタイムAPI)。少なくとも1つの実施例では、ランタイムAPIは、ドライバAPIを利用して動作する。ドライバAPI及びランタイムAPIに関するさらなる情報は、図27の説明において見つけられ得る。
【0024】
少なくとも1つの実施例では、本明細書で説明されるものなど、APIコールは、前記APIコールに対応する少なくともAPI関数を示すコードの実行の一部として行われる。少なくとも1つの実施例では、例示的な実例として、1つ又は複数のシステムは、CUDA、HIP、oneAPI、及び/又はそれらの変形形態など、1つ又は複数のプログラミング・モデルに関するコードの実行の一部として、APIコールを行い、応答を取得する。
【0025】
図5は、少なくとも1つの実施例による、グラフ・デバッグ・ドット・プリントAPIコールの図500を示す。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPIは、プログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)に関し得る、cudaGraphDebugDotPrint、GraphDebugDotPrint、及び/又は任意の好適な記法として示される。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPIは、図1図4、及び図6に関して、並びに本明細書の他の場所で説明されるものによるものである。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPIは、1つ又は複数のプログラミング・モデル(たとえば、CUDA、HIP、oneAPI、及び/又はそれらの変形形態)の1つ又は複数のシステムが、前記グラフを処理することと、前記グラフの前記表現を生成することとを引き起こす。
【0026】
少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPIコールのためのパラメータは、「グラフ」、「経路」、「フラグ」を含み、前記グラフ及び/又は前記表現の態様をさらに定義する他のパラメータを含むことができる。少なくとも1つの実施例では、パラメータ「グラフ」は、前記表現を作成するための前記グラフを示す。少なくとも1つの実施例では、パラメータ「経路」は、前記表現を書き込むか又はさもなければ記憶するための、経路又は他の好適なロケーションを示す。少なくとも1つの実施例では、パラメータ「フラグ」は、1つ又は複数のフラグを示し、それらは、関数又はプロセス(たとえば、API関数)の1つ又は複数の特性を決定する、前記関数又はプロセスのための信号である値を参照する。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPIのためのフラグは、本明細書で説明されるものなど、1つ又は複数のフラグを含む。
【0027】
少なくとも1つの実施例では、1つ又は複数のシステムは、少なくとも、前記APIコールによって示された前記グラフのノードを通して反復することと、前記APIコールによって示されたフラグに少なくとも部分的に基づいて、前記グラフのノード、グラフ・トポロジー、エッジ、及び/又は他の好適な情報を取得することと、前記APIコールによって示された前記経路又は他の好適なロケーションにおいて前記情報を符号化する前記表現(たとえば、DOTファイル、又は他の好適な表現)を生成することとによって、前記グラフ・デバッグ・ドット・プリントAPIを実施する。少なくとも1つの実施例では、前記グラフ・デバッグ・ドット・プリントAPIコールに対する応答は、ステータスを含む。少なくとも1つの実施例では、前記ステータスは、前記グラフ・デバッグ・ドット・プリントAPIコールのステータス表示を示すために、前記グラフ・デバッグ・ドット・プリントAPIコールに応答して返される。少なくとも1つの実施例では、前記ステータス表示は、前記グラフ・デバッグ・ドット・プリントAPIの1つ又は複数の動作が成功したのか失敗したのか、又は他のエラーが生じたかどうかを示す。
【0028】
図6は、少なくとも1つの実施例による、グラフ・コードの記述表現が生成されることを引き起こすプロセス600の一実例を示す。少なくとも1つの実施例では、プロセス600(或いは本明細書で説明される任意の他のプロセス、或いはそれらの変形形態及び/又は組合せ)の一部又は全部は、コンピュータ実行可能命令で構成された1つ又は複数のコンピュータ・システムの制御下で実施され、1つ又は複数のプロセッサ上で、ハードウェア、ソフトウェア、又はそれらの組合せによって集合的に実行するコード(たとえば、コンピュータ実行可能命令、1つ又は複数のコンピュータ・プログラム、又は1つ又は複数のアプリケーション)として実装される。少なくとも1つの実施例では、コードは、1つ又は複数のプロセッサによって実行可能な複数のコンピュータ可読命令を備えるコンピュータ・プログラムの形態で、コンピュータ可読記憶媒体に記憶される。少なくとも1つの実施例では、コンピュータ可読記憶媒体は、非一時的コンピュータ可読媒体である。少なくとも1つの実施例では、プロセス600を実施するために使用可能な少なくともいくつかのコンピュータ可読命令は、一時的信号(たとえば、伝搬する一時的な電気又は電磁送信)のみを使用して記憶されない。少なくとも1つの実施例では、非一時的コンピュータ可読媒体は、必ずしも、一時的信号のトランシーバ内に非一時的データ・ストレージ回路要素(たとえば、バッファ、キャッシュ、及びキュー)を含むとは限らない。
【0029】
少なくとも1つの実施例では、プロセス600は、本開示で説明されるものなど、1つ又は複数のシステムによって実施される。少なくとも1つの実施例では、プロセス600は、1つ又は複数のプログラミング・モデルのシステムによって実施される。少なくとも1つの実施例では、プロセス600の1つ又は複数のプロセスは、連続、並列、及び/又はそれらの変形形態を含む、任意の好適な順序で、並びにCPU、GPU、PPU、GPGPU、及び/又はそれらの変形形態など、任意の好適な処理ユニットを使用して、実施される。
【0030】
少なくとも1つの実施例では、プロセス600の少なくとも一部を実施する前記システムは、602において、少なくとも、グラフ・コードの記述表現が生成されることを引き起こすために少なくともAPIを示すコードを取得するための、実行可能コードを含む。少なくとも1つの実施例では、前記APIは、図1図5に関して及び本明細書の他の場所で説明されるなど、前記グラフ・デバッグ・ドット・プリントAPIである。少なくとも1つの実施例では、前記APIは、図5に関して説明されたものなど、パラメータ値を含む。少なくとも1つの実施例では、前記APIは、少なくとも前記グラフ・コードを示すパラメータ値と、前記グラフ・コードの前記記述表現のための経路又はロケーションと、前記記述表現の1つ又は複数の特性を示す1つ又は複数のフラグ(たとえば、どのノード・パラメータ値を含めるべきかなど、前記グラフ・コードのどのデータを前記記述表現中に含めるべきか)とを含む。少なくとも1つの実施例では、前記APIは、生成されるべき前記記述表現のタイプ又は分類を示すパラメータ値を含む。少なくとも1つの実施例では、前記グラフ・コードは、前記グラフ・データ・オブジェクト、或いは動作及び/又は前記動作の間の依存性を示す情報を符号化するか又はさもなければ記憶する、任意の好適なプログラミング・モデルの任意の好適なデータ・オブジェクト又はデータ構造を指す。
【0031】
少なくとも1つの実施例では、プロセス600の少なくとも一部を実施する前記システムは、604において、少なくとも、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するための、実行可能コードを含む。少なくとも1つの実施例では、前記システムは、前記APIを示す前記コードの実行の一部として前記APIを実施する。少なくとも1つの実施例では、前記システムは、少なくとも、前記グラフ・コードに少なくとも部分的に基づいて前記記述表現を生成することによって、前記グラフ・コードの前記記述表現が生成されることを引き起こすために前記APIを実施する。少なくとも1つの実施例では、前記システムは、前記グラフ・コードのノードを通して反復し、前記1つ又は複数のフラグに少なくとも部分的に基づいて、前記グラフ・コードのノード、グラフ・トポロジー、エッジ、及び/又は他の好適な情報を取得し、前記経路又はロケーションにおいて前記情報を符号化する前記記述表現を生成する。少なくとも1つの実施例では、前記システムは、生成されるべき前記記述表現のタイプ又は分類を示す前記パラメータ値に基づいて前記記述表現を生成する。少なくとも1つの実施例では、前記システムは、前記グラフ・コードに基づいて記述表現のセットを生成し、前記セットの特性は、前記APIのパラメータ値(たとえば、表現のタイプ、表現の量)によって示され得る。
【0032】
少なくとも1つの実施例では、前記記述表現は、テキスト表現、画像表現、特定のプログラミング言語におけるコード表現、ビデオ表現、及び/又はそれらの変形形態など、前記情報を符号化する任意の好適な表現であり、これは、DOTグラフ、xdot、PNG、JPEG、JPEG2000、GIF、PDF、BMP、SGI、JSON、XML、YAML、PS、EPS、SVG、キャノン、CGImage、平文、OpenEXR、図、GD/GD2フォーマット、アイコン画像ファイル・フォーマット、PICT、pic、TARGA、タグ画像ファイル・フォーマット、TKグラフィックス、ベクトル・マークアップ言語、ワイヤレス・ビットマップ・フォーマット、webpフォーマットに対応するもの、及び/又は前記グラフ・コードに関連する情報を符号化する任意の好適な表現など、1つ又は複数のコンピュータ・ファイルを通して表され得る。
【0033】
先行する及び以下の説明では、少なくとも1つの実施例のより完全な理解を提供するために、多数の具体的な詳細が記載される。ただし、発明概念はこれらの具体的な詳細のうちの1つ又は複数なしに実施され得ることが当業者には明らかであろう。
【0034】
「データ・センタ」
図7は、少なくとも1つの実施例による、例示的なデータ・センタ700を示す。少なくとも1つの実施例では、データ・センタ700は、限定はしないが、データ・センタ・インフラストラクチャ層710と、フレームワーク層720と、ソフトウェア層730と、アプリケーション層740とを含む。
【0035】
少なくとも1つの実施例では、図7に示されているように、データ・センタ・インフラストラクチャ層710は、リソース・オーケストレータ712と、グループ化されたコンピューティング・リソース714と、ノード・コンピューティング・リソース(「ノードC.R.」:node computing resource)716(1)~716(N)とを含み得、ここで、「N」は、任意のすべての正の整数を表す。少なくとも1つの実施例では、ノードC.R.716(1)~716(N)は、限定はしないが、任意の数の中央処理ユニット(「CPU」)又は(アクセラレータ、フィールド・プログラマブル・ゲート・アレイ(「FPGA」:field programmable gate array)、ネットワーク・デバイス中のデータ処理ユニット(「DPU」:data processing unit)、グラフィックス・プロセッサなどを含む)他のプロセッサ、メモリ・デバイス(たとえば、動的読取り専用メモリ)、ストレージ・デバイス(たとえば、ソリッド・ステート又はディスク・ドライブ)、ネットワーク入力/出力(「NW I/O」:network input/output)デバイス、ネットワーク・スイッチ、仮想機械(「VM」:virtual machine)、電力モジュール、及び冷却モジュールなどを含み得る。少なくとも1つの実施例では、ノードC.R.716(1)~716(N)の中からの1つ又は複数のノードC.R.は、上述のコンピューティング・リソースのうちの1つ又は複数を有するサーバであり得る。
【0036】
少なくとも1つの実施例では、グループ化されたコンピューティング・リソース714は、1つ又は複数のラック(図示せず)内に格納されたノードC.R.の別個のグループ化、又は様々な地理的ロケーション(同じく図示せず)においてデータ・センタ中に格納された多くのラックを含み得る。グループ化されたコンピューティング・リソース714内のノードC.R.の別個のグループ化は、1つ又は複数のワークロードをサポートするように構成されるか又は割り振られ得る、グループ化されたコンピュート・リソース、ネットワーク・リソース、メモリ・リソース、又はストレージ・リソースを含み得る。少なくとも1つの実施例では、CPU又はプロセッサを含むいくつかのノードC.R.は、1つ又は複数のワークロードをサポートするためのコンピュート・リソースを提供するために1つ又は複数のラック内でグループ化され得る。少なくとも1つの実施例では、1つ又は複数のラックはまた、任意の数の電力モジュール、冷却モジュール、及びネットワーク・スイッチを、任意の組合せで含み得る。
【0037】
少なくとも1つの実施例では、リソース・オーケストレータ712は、1つ又は複数のノードC.R.716(1)~716(N)及び/又はグループ化されたコンピューティング・リソース714を構成するか、又はさもなければ、制御し得る。少なくとも1つの実施例では、リソース・オーケストレータ712は、データ・センタ700のためのソフトウェア設計インフラストラクチャ(「SDI」:software design infrastructure)管理エンティティを含み得る。少なくとも1つの実施例では、リソース・オーケストレータ712は、ハードウェア、ソフトウェア又はそれらの何らかの組合せを含み得る。
【0038】
少なくとも1つの実施例では、図7に示されているように、フレームワーク層720は、限定はしないが、ジョブ・スケジューラ732と、構成マネージャ734と、リソース・マネージャ736と、分散型ファイル・システム738とを含む。少なくとも1つの実施例では、フレームワーク層720は、ソフトウェア層730のソフトウェア752、及び/又はアプリケーション層740の1つ又は複数のアプリケーション742をサポートするためのフレームワークを含み得る。少なくとも1つの実施例では、ソフトウェア752又は(1つ又は複数の)アプリケーション742は、それぞれ、アマゾン・ウェブ・サービス、Google Cloud、及びMicrosoft Azureによって提供されるものなど、ウェブ・ベースのサービス・ソフトウェア又はアプリケーションを含み得る。少なくとも1つの実施例では、フレームワーク層720は、限定はしないが、大規模データ処理(たとえば、「ビック・データ」)のために分散型ファイル・システム738を利用し得るApache Spark(商標)(以下「Spark」)など、無料でオープンソースのソフトウェア・ウェブ・アプリケーション・フレームワークのタイプであり得る。少なくとも1つの実施例では、ジョブ・スケジューラ732は、データ・センタ700の様々な層によってサポートされるワークロードのスケジューリングを容易にするために、Sparkドライバを含み得る。少なくとも1つの実施例では、構成マネージャ734は、ソフトウェア層730、並びに大規模データ処理をサポートするためのSpark及び分散型ファイル・システム738を含むフレームワーク層720など、異なる層を構成することが可能であり得る。少なくとも1つの実施例では、リソース・マネージャ736は、分散型ファイル・システム738及びジョブ・スケジューラ732をサポートするようにマッピングされたか又は割り振られた、クラスタ化された又はグループ化されたコンピューティング・リソースを管理することが可能であり得る。少なくとも1つの実施例では、クラスタ化された又はグループ化されたコンピューティング・リソースは、データ・センタ・インフラストラクチャ層710において、グループ化されたコンピューティング・リソース714を含み得る。少なくとも1つの実施例では、リソース・マネージャ736は、リソース・オーケストレータ712と協調して、これらのマッピングされた又は割り振られたコンピューティング・リソースを管理し得る。
【0039】
少なくとも1つの実施例では、ソフトウェア層730中に含まれるソフトウェア752は、ノードC.R.716(1)~716(N)、グループ化されたコンピューティング・リソース714、及び/又はフレームワーク層720の分散型ファイル・システム738の少なくとも部分によって使用されるソフトウェアを含み得る。1つ又は複数のタイプのソフトウェアは、限定はしないが、インターネット・ウェブ・ページ検索ソフトウェアと、電子メール・ウイルス・スキャン・ソフトウェアと、データベース・ソフトウェアと、ストリーミング・ビデオ・コンテンツ・ソフトウェアとを含み得る。
【0040】
少なくとも1つの実施例では、アプリケーション層740中に含まれる(1つ又は複数の)アプリケーション742は、ノードC.R.716(1)~716(N)、グループ化されたコンピューティング・リソース714、及び/又はフレームワーク層720の分散型ファイル・システム738の少なくとも部分によって使用される1つ又は複数のタイプのアプリケーションを含み得る。少なくとも1つ又は複数のタイプのアプリケーションでは、限定はしないが、CUDAアプリケーションを含み得る。
【0041】
少なくとも1つの実施例では、構成マネージャ734、リソース・マネージャ736、及びリソース・オーケストレータ712のいずれかが、任意の技術的に実現可能な様式で獲得された任意の量及びタイプのデータに基づいて、任意の数及びタイプの自己修正アクションを実装し得る。少なくとも1つの実施例では、自己修正アクションは、データ・センタ700のデータ・センタ・オペレータを、不良の恐れのある構成を判定し、十分に利用されていない及び/又は性能の低いデータ・センタの部分を場合によっては回避することから解放し得る。
【0042】
少なくとも1つの実施例では、図7に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図7に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0043】
「コンピュータ・ベースのシステム」
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的なコンピュータ・ベースのシステムを記載する。
【0044】
図8は、少なくとも1つの実施例による、処理システム800を示す。少なくとも1つの実施例では、処理システム800は、1つ又は複数のプロセッサ802と1つ又は複数のグラフィックス・プロセッサ808とを含み、単一プロセッサ・デスクトップ・システム、マルチプロセッサ・ワークステーション・システム、或いは多数のプロセッサ802又はプロセッサ・コア807を有するサーバ・システムであり得る。少なくとも1つの実施例では、処理システム800は、モバイル・デバイス、ハンドヘルド・デバイス、又は組み込みデバイスにおいて使用するためのシステム・オン・チップ(「SoC」:system-on-a-chip)集積回路内に組み込まれた処理プラットフォームである。
【0045】
少なくとも1つの実施例では、処理システム800は、サーバ・ベースのゲーミング・プラットフォーム、ゲーム・コンソール、メディア・コンソール、モバイル・ゲーミング・コンソール、ハンドヘルド・ゲーム・コンソール、又はオンライン・ゲーム・コンソールを含むことができるか、或いはそれらの内部に組み込まれ得る。少なくとも1つの実施例では、処理システム800は、モバイル・フォン、スマート・フォン、タブレット・コンピューティング・デバイス又はモバイル・インターネット・デバイスである。少なくとも1つの実施例では、処理システム800はまた、スマート・ウォッチ・ウェアラブル・デバイス、スマート・アイウェア・デバイス、拡張現実デバイス、又は仮想現実デバイスなどのウェアラブル・デバイスを含むことができるか、それらと結合することができるか、又はそれらの内部に組み込まれ得る。少なくとも1つの実施例では、処理システム800は、1つ又は複数のプロセッサ802と、1つ又は複数のグラフィックス・プロセッサ808によって生成されるグラフィカル・インターフェースとを有するテレビ又はセット・トップ・ボックス・デバイスである。
【0046】
少なくとも1つの実施例では、1つ又は複数のプロセッサ802は、各々、実行されたときにシステム及びユーザ・ソフトウェアのための動作を実施する命令を処理するための1つ又は複数のプロセッサ・コア807を含む。少なくとも1つの実施例では、1つ又は複数のプロセッサ・コア807の各々は、特定の命令セット809を処理するように構成される。少なくとも1つの実施例では、命令セット809は、複合命令セット・コンピューティング(「CISC」:Complex Instruction Set Computing)、縮小命令セット・コンピューティング(「RISC」:Reduced Instruction Set Computing)、又は超長命令語(「VLIW」:Very Long Instruction Word)を介したコンピューティングを容易にし得る。少なくとも1つの実施例では、プロセッサ・コア807は、各々、異なる命令セット809を処理し得、命令セット809は、他の命令セットのエミュレーションを容易にするための命令を含み得る。少なくとも1つの実施例では、プロセッサ・コア807はまた、デジタル信号プロセッサ(「DSP」:digital signal processor)などの他の処理デバイスを含み得る。
【0047】
少なくとも1つの実施例では、プロセッサ802はキャッシュ・メモリ(「キャッシュ」)804を含む。少なくとも1つの実施例では、プロセッサ802は、単一の内部キャッシュ又は複数のレベルの内部キャッシュを有することができる。少なくとも1つの実施例では、キャッシュ・メモリは、プロセッサ802の様々な構成要素の間で共有される。少なくとも1つの実施例では、プロセッサ802はまた、外部キャッシュ(たとえば、レベル3(「L3」)キャッシュ又はラスト・レベル・キャッシュ(「LLC」:Last Level Cache))(図示せず)を使用し、外部キャッシュは、知られているキャッシュ・コヒーレンシ技法を使用してプロセッサ・コア807の間で共有され得る。少なくとも1つの実施例では、追加として、レジスタ・ファイル806がプロセッサ802中に含まれ、レジスタ・ファイル806は、異なるタイプのデータを記憶するための異なるタイプのレジスタ(たとえば、整数レジスタ、浮動小数点レジスタ、ステータス・レジスタ、及び命令ポインタ・レジスタ)を含み得る。少なくとも1つの実施例では、レジスタ・ファイル806は、汎用レジスタ又は他のレジスタを含み得る。
【0048】
少なくとも1つの実施例では、1つ又は複数のプロセッサ802は、アドレス、データ、又は制御信号などの通信信号を、プロセッサ802と処理システム800中の他の構成要素との間で送信するために、1つ又は複数のインターフェース・バス810と結合される。少なくとも1つの実施例では、1つの実施例におけるインターフェース・バス810は、ダイレクト・メディア・インターフェース(「DMI」:Direct Media Interface)バスのバージョンなどのプロセッサ・バスであり得る。少なくとも1つの実施例では、インターフェース・バス810は、DMIバスに限定されず、1つ又は複数の周辺構成要素相互接続バス(たとえば、「PCI」:Peripheral Component Interconnect、PCI Express(「PCIe」))、メモリ・バス、又は他のタイプのインターフェース・バスを含み得る。少なくとも1つの実施例では、(1つ又は複数の)プロセッサ802は、統合されたメモリ・コントローラ816と、プラットフォーム・コントローラ・ハブ830とを含む。少なくとも1つの実施例では、メモリ・コントローラ816は、メモリ・デバイスと処理システム800の他の構成要素との間の通信を容易にし、プラットフォーム・コントローラ・ハブ(「PCH」:platform controller hub)830は、ローカル入力/出力(「I/O」:Input/Output)バスを介してI/Oデバイスへの接続を提供する。
【0049】
少なくとも1つの実施例では、メモリ・デバイス820は、ダイナミック・ランダム・アクセス・メモリ(「DRAM」:dynamic random access memory)デバイス、スタティック・ランダム・アクセス・メモリ(「SRAM」:static random access memory)デバイス、フラッシュ・メモリ・デバイス、相変化メモリ・デバイス、又はプロセッサ・メモリとして働くのに好適な性能を有する何らかの他のメモリ・デバイスであり得る。少なくとも1つの実施例では、メモリ・デバイス820は、1つ又は複数のプロセッサ802がアプリケーション又はプロセスを実行するときの使用のためのデータ822及び命令821を記憶するために、処理システム800のためのシステム・メモリとして動作することができる。少なくとも1つの実施例では、メモリ・コントローラ816はまた、随意の外部グラフィックス・プロセッサ812と結合し、外部グラフィックス・プロセッサ812は、グラフィックス動作及びメディア動作を実施するために、プロセッサ802中の1つ又は複数のグラフィックス・プロセッサ808と通信し得る。少なくとも1つの実施例では、ディスプレイ・デバイス811は、(1つ又は複数の)プロセッサ802に接続することができる。少なくとも1つの実施例では、ディスプレイ・デバイス811は、モバイル電子デバイス又はラップトップ・デバイスの場合のような内部ディスプレイ・デバイス、或いは、ディスプレイ・インターフェース(たとえば、DisplayPortなど)を介して取り付けられた外部ディスプレイ・デバイスのうちの1つ又は複数を含むことができる。少なくとも1つの実施例では、ディスプレイ・デバイス811は、仮想現実(「VR」:virtual reality)アプリケーション又は拡張現実(「AR」:augmented reality)アプリケーションにおいて使用するための立体ディスプレイ・デバイスなどの頭部装着型ディスプレイ(「HMD」:head mounted display)を含むことができる。
【0050】
少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ830は、周辺機器が高速I/Oバスを介してメモリ・デバイス820及びプロセッサ802に接続することを可能にする。少なくとも1つの実施例では、I/O周辺機器は、限定はしないが、オーディオ・コントローラ846と、ネットワーク・コントローラ834と、ファームウェア・インターフェース828と、ワイヤレス・トランシーバ826と、タッチ・センサ825と、データ・ストレージ・デバイス824(たとえば、ハード・ディスク・ドライブ、フラッシュ・メモリなど)とを含む。少なくとも1つの実施例では、データ・ストレージ・デバイス824は、ストレージ・インターフェース(たとえば、SATA)を介して、或いはPCI又はPCIeなどの周辺バスを介して、接続することができる。少なくとも1つの実施例では、タッチ・センサ825は、タッチ・スクリーン・センサ、圧力センサ、又は指紋センサを含むことができる。少なくとも1つの実施例では、ワイヤレス・トランシーバ826は、Wi-Fiトランシーバ、Bluetoothトランシーバ、或いは3G、4G、又はロング・ターム・エボリューション(「LTE」:Long Term Evolution)トランシーバなどのモバイル・ネットワーク・トランシーバであり得る。少なくとも1つの実施例では、ファームウェア・インターフェース828は、システム・ファームウェアとの通信を可能にし、たとえば、ユニファイド・エクステンシブル・ファームウェア・インターフェース(「UEFI」:unified extensible firmware interface)であり得る。少なくとも1つの実施例では、ネットワーク・コントローラ834は、ワイヤード・ネットワークへのネットワーク接続を可能にすることができる。少なくとも1つの実施例では、高性能ネットワーク・コントローラ(図示せず)は、インターフェース・バス810と結合する。少なくとも1つの実施例では、オーディオ・コントローラ846は、マルチチャネル高精細度オーディオ・コントローラである。少なくとも1つの実施例では、処理システム800は、レガシー(たとえば、パーソナル・システム2(「PS/2」:Personal System 2))デバイスを処理システム800に結合するための随意のレガシーI/Oコントローラ840を含む。少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ830は、キーボードとマウス843との組合せ、カメラ844、又は他のUSB入力デバイスなど、1つ又は複数のユニバーサル・シリアル・バス(「USB」:Universal Serial Bus)コントローラ842接続入力デバイスにも接続することができる。
【0051】
少なくとも1つの実施例では、メモリ・コントローラ816及びプラットフォーム・コントローラ・ハブ830のインスタンスが、外部グラフィックス・プロセッサ812などの慎重な外部グラフィックス・プロセッサに組み込まれ得る。少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ830及び/又はメモリ・コントローラ816は、1つ又は複数のプロセッサ802の外部にあり得る。たとえば、少なくとも1つの実施例では、処理システム800は、外部のメモリ・コントローラ816とプラットフォーム・コントローラ・ハブ830とを含むことができ、それらは、(1つ又は複数の)プロセッサ802と通信しているシステム・チップセット内のメモリ・コントローラ・ハブ及び周辺コントローラ・ハブとして構成され得る。
【0052】
少なくとも1つの実施例では、図8に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図8に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0053】
図9は、少なくとも1つの実施例による、コンピュータ・システム900を示す。少なくとも1つの実施例では、コンピュータ・システム900は、相互接続されたデバイス及び構成要素をもつシステム、SOC、又は何らかの組合せであり得る。少なくとも1つの実施例では、コンピュータ・システム900は、命令を実行するための実行ユニットを含み得るプロセッサ902とともに形成される。少なくとも1つの実施例では、コンピュータ・システム900は、限定はしないが、データを処理するためのアルゴリズムを実施するための論理を含む実行ユニットを採用するための、プロセッサ902などの構成要素を含み得る。少なくとも1つの実施例では、コンピュータ・システム900は、カリフォルニア州サンタクララのIntel Corporationから入手可能なPENTIUM(登録商標)プロセッサ・ファミリー、Xeon(商標)、Itanium(登録商標)、XScale(商標)及び/又はStrongARM(商標)、Intel(登録商標)Core(商標)、又はIntel(登録商標)Nervana(商標)マイクロプロセッサなどのプロセッサを含み得るが、(他のマイクロプロセッサ、エンジニアリング・ワークステーション、セット・トップ・ボックスなどを有するPCを含む)他のシステムも使用され得る。少なくとも1つの実施例では、コンピュータ・システム900は、ワシントン州レドモンドのMicrosoft Corporationから入手可能なWINDOWS(登録商標)オペレーティング・システムのあるバージョンを実行し得るが、他のオペレーティング・システム(たとえば、UNIX(登録商標)及びLinux(登録商標))、組み込みソフトウェア、及び/又はグラフィカル・ユーザ・インターフェースも使用され得る。
【0054】
少なくとも1つの実施例では、コンピュータ・システム900は、ハンドヘルド・デバイス及び組み込みアプリケーションなど、他のデバイスにおいて使用され得る。ハンドヘルド・デバイスのいくつかの実例は、セルラー・フォン、インターネット・プロトコル・デバイス、デジタル・カメラ、パーソナル・デジタル・アシスタント(「PDA」:personal digital assistant)、及びハンドヘルドPCを含む。少なくとも1つの実施例では、組み込みアプリケーションは、マイクロコントローラ、デジタル信号プロセッサ(DSP)、SoC、ネットワーク・コンピュータ(「NetPC」:network computer)、セット・トップ・ボックス、ネットワーク・ハブ、ワイド・エリア・ネットワーク(「WAN」:wide area network)スイッチ、又は1つ又は複数の命令を実施し得る任意の他のシステムを含み得る。
【0055】
少なくとも1つの実施例では、コンピュータ・システム900は、限定はしないが、プロセッサ902を含み得、プロセッサ902は、限定はしないが、コンピュート・ユニファイド・デバイス・アーキテクチャ(「CUDA」)(CUDA(登録商標)は、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される)プログラムを実行するように構成され得る、1つ又は複数の実行ユニット908を含み得る。少なくとも1つの実施例では、CUDAプログラムは、CUDAプログラミング言語で書かれたソフトウェア・アプリケーションの少なくとも一部分である。少なくとも1つの実施例では、コンピュータ・システム900は、シングル・プロセッサ・デスクトップ又はサーバ・システムである。少なくとも1つの実施例では、コンピュータ・システム900は、マルチプロセッサ・システムであり得る。少なくとも1つの実施例では、プロセッサ902は、限定はしないが、CISCマイクロプロセッサ、RISCマイクロプロセッサ、VLIWマイクロプロセッサ、命令セットの組合せを実装するプロセッサ、又は、たとえばデジタル信号プロセッサなど、任意の他のプロセッサ・デバイスを含み得る。少なくとも1つの実施例では、プロセッサ902は、プロセッサ・バス910に結合され得、プロセッサ・バス910は、プロセッサ902とコンピュータ・システム900中の他の構成要素との間でデータ信号を送信し得る。
【0056】
少なくとも1つの実施例では、プロセッサ902は、限定はしないが、レベル1(「L1」)の内部キャッシュ・メモリ(「キャッシュ」)904を含み得る。少なくとも1つの実施例では、プロセッサ902は、単一の内部キャッシュ又は複数のレベルの内部キャッシュを有し得る。少なくとも1つの実施例では、キャッシュ・メモリは、プロセッサ902の外部に存在し得る。少なくとも1つの実施例では、プロセッサ902は、内部キャッシュと外部キャッシュの両方の組合せをも含み得る。少なくとも1つの実施例では、レジスタ・ファイル906は、限定はしないが、整数レジスタ、浮動小数点レジスタ、ステータス・レジスタ、及び命令ポインタ・レジスタを含む様々なレジスタに、異なるタイプのデータを記憶し得る。
【0057】
少なくとも1つの実施例では、限定はしないが、整数演算及び浮動小数点演算を実施するための論理を含む実行ユニット908も、プロセッサ902中に存在し得る。プロセッサ902は、いくつかのマクロ命令のためのマイクロコードを記憶するマイクロコード(「uコード」)読取り専用メモリ(「ROM」:read only memory)をも含み得る。少なくとも1つの実施例では、実行ユニット908は、パック命令セット909に対処するための論理を含み得る。少なくとも1つの実施例では、パック命令セット909を、命令を実行するための関連する回路要素とともに汎用プロセッサ902の命令セットに含めることによって、多くのマルチメディア・アプリケーションによって使用される演算が、汎用プロセッサ902中のパック・データを使用して実施され得る。少なくとも1つの実施例では、多くのマルチメディア・アプリケーションが、パック・データの演算を実施するためにプロセッサのデータ・バスの全幅を使用することによって加速され、より効率的に実行され得、これは、一度に1つのデータ要素ずつ1つ又は複数の演算を実施するために、プロセッサのデータ・バスにわたってより小さい単位のデータを転送する必要をなくし得る。
【0058】
少なくとも1つの実施例では、実行ユニット908はまた、マイクロコントローラ、組み込みプロセッサ、グラフィックス・デバイス、DSP、及び他のタイプの論理回路において使用され得る。少なくとも1つの実施例では、コンピュータ・システム900は、限定はしないが、メモリ920を含み得る。少なくとも1つの実施例では、メモリ920は、DRAMデバイス、SRAMデバイス、フラッシュ・メモリ・デバイス、又は他のメモリ・デバイスとして実装され得る。メモリ920は、プロセッサ902によって実行され得るデータ信号によって表される(1つ又は複数の)命令919及び/又はデータ921を記憶し得る。
【0059】
少なくとも1つの実施例では、システム論理チップが、プロセッサ・バス910及びメモリ920に結合され得る。少なくとも1つの実施例では、システム論理チップは、限定はしないが、メモリ・コントローラ・ハブ(「MCH」:memory controller hub)916を含み得、プロセッサ902は、プロセッサ・バス910を介してMCH916と通信し得る。少なくとも1つの実施例では、MCH916は、命令及びデータ・ストレージのための、並びにグラフィックス・コマンド、データ及びテクスチャのストレージのための、高帯域幅メモリ経路918をメモリ920に提供し得る。少なくとも1つの実施例では、MCH916は、プロセッサ902と、メモリ920と、コンピュータ・システム900中の他の構成要素との間でデータ信号をダイレクトし、プロセッサ・バス910と、メモリ920と、システムI/O922との間でデータ信号をブリッジし得る。少なくとも1つの実施例では、システム論理チップは、グラフィックス・コントローラに結合するためのグラフィックス・ポートを提供し得る。少なくとも1つの実施例では、MCH916は、高帯域幅メモリ経路918を通してメモリ920に結合され得、グラフィックス/ビデオ・カード912は、アクセラレーテッド・グラフィックス・ポート(「AGP」:Accelerated Graphics Port)相互接続914を介してMCH916に結合され得る。
【0060】
少なくとも1つの実施例では、コンピュータ・システム900は、MCH916をI/Oコントローラ・ハブ(「ICH」:I/O controller hub)930に結合するためのプロプライエタリ・ハブ・インターフェース・バスである、システムI/O922を使用し得る。少なくとも1つの実施例では、ICH930は、ローカルI/Oバスを介していくつかのI/Oデバイスに直接接続を提供し得る。少なくとも1つの実施例では、ローカルI/Oバスは、限定はしないが、周辺機器をメモリ920、チップセット、及びプロセッサ902に接続するための高速I/Oバスを含み得る。実例は、限定はしないが、オーディオ・コントローラ929と、ファームウェア・ハブ(「フラッシュBIOS」)928と、ワイヤレス・トランシーバ926と、データ・ストレージ924と、ユーザ入力インターフェース925及びキーボード・インターフェースを含んでいるレガシーI/Oコントローラ923と、USBなどのシリアル拡張ポート927と、ネットワーク・コントローラ934とを含み得る。データ・ストレージ924は、ハード・ディスク・ドライブ、フロッピー・ディスク・ドライブ、CD-ROMデバイス、フラッシュ・メモリ・デバイス、又は他の大容量ストレージ・デバイスを備え得る。
【0061】
少なくとも1つの実施例では、図9は、相互接続されたハードウェア・デバイス又は「チップ」を含むシステムを示す。少なくとも1つの実施例では、図9は、例示的なSoCを示し得る。少なくとも1つの実施例では、図9に示されているデバイスは、プロプライエタリ相互接続、標準相互接続(たとえば、PCIe)、又はそれらの何らかの組合せで相互接続され得る。少なくとも1つの実施例では、システム900の1つ又は複数の構成要素は、コンピュート・エクスプレス・リンク(「CXL」:compute express link)相互接続を使用して相互接続される。
【0062】
少なくとも1つの実施例では、図9に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図9に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0063】
図10は、少なくとも1つの実施例による、システム1000を示す。少なくとも1つの実施例では、システム1000は、プロセッサ1010を利用する電子デバイスである。少なくとも1つの実施例では、システム1000は、たとえば、限定はしないが、ノートブック、タワー・サーバ、ラック・サーバ、ブレード・サーバ、1つ又は複数の構内サービス・プロバイダ又はクラウド・サービス・プロバイダに通信可能に結合されたエッジ・デバイス、ラップトップ、デスクトップ、タブレット、モバイル・デバイス、電話、組み込みコンピュータ、或いは任意の他の好適な電子デバイスであり得る。
【0064】
少なくとも1つの実施例では、システム1000は、限定はしないが、任意の好適な数又は種類の構成要素、周辺機器、モジュール、又はデバイスに通信可能に結合されたプロセッサ1010を含み得る。少なくとも1つの実施例では、プロセッサ1010は、ICバス、システム管理バス(「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つの実施例では、図10は、相互接続されたハードウェア・デバイス又は「チップ」を含むシステムを示す。少なくとも1つの実施例では、図10は、例示的なSoCを示し得る。少なくとも1つの実施例では、図10に示されているデバイスは、プロプライエタリ相互接続、標準相互接続(たとえば、PCIe)又はそれらの何らかの組合せで相互接続され得る。少なくとも1つの実施例では、図10の1つ又は複数の構成要素は、CXL相互接続を使用して相互接続される。
【0065】
少なくとも1つの実施例では、図10は、ディスプレイ1024、タッチ・スクリーン1025、タッチ・パッド1030、ニア・フィールド通信ユニット(「NFC」:Near Field Communication)1045、センサ・ハブ1040、熱センサ1046、エクスプレス・チップセット(「EC」:Express Chipset)1035、トラステッド・プラットフォーム・モジュール(「TPM」:Trusted Platform Module)1038、BIOS/ファームウェア/フラッシュ・メモリ(「BIOS、FWフラッシュ」:BIOS/firmware/flash memory)1022、DSP1060、ソリッド・ステート・ディスク(「SSD」:Solid State Disk)又はハード・ディスク・ドライブ(「HDD」:Hard Disk Drive)1020、ワイヤレス・ローカル・エリア・ネットワーク・ユニット(「WLAN」:wireless local area network)1050、Bluetoothユニット1052、ワイヤレス・ワイド・エリア・ネットワーク・ユニット(「WWAN」:Wireless Wide Area Network)1056、全地球測位システム(「GPS」:Global Positioning System)1055、USB3.0カメラなどのカメラ(「USB3.0カメラ」)1054、或いは、たとえばLPDDR3規格において実装された低電力ダブル・データ・レート(「LPDDR」:Low Power Double Data Rate)メモリ・ユニット(「LPDDR3」)1015を含み得る。これらの構成要素は、各々、任意の好適な様式で実装され得る。
【0066】
少なくとも1つの実施例では、上記で説明された構成要素を通して、他の構成要素がプロセッサ1010に通信可能に結合され得る。少なくとも1つの実施例では、加速度計1041と、周囲光センサ(「ALS」:Ambient Light Sensor)1042と、コンパス1043と、ジャイロスコープ1044とが、センサ・ハブ1040に通信可能に結合され得る。少なくとも1つの実施例では、熱センサ1039と、ファン1037と、キーボード1036と、タッチ・パッド1030とが、EC1035に通信可能に結合され得る。少なくとも1つの実施例では、スピーカー1063と、ヘッドフォン1064と、マイクロフォン(「mic」)1065とが、オーディオ・ユニット(「オーディオ・コーデック及びクラスdアンプ」)1062に通信可能に結合され得、オーディオ・ユニット1062は、DSP1060に通信可能に結合され得る。少なくとも1つの実施例では、オーディオ・ユニット1062は、たとえば、限定はしないが、オーディオ・コーダ/デコーダ(「コーデック」)及びクラスD増幅器を含み得る。少なくとも1つの実施例では、SIMカード(「SIM」)1057は、WWANユニット1056に通信可能に結合され得る。少なくとも1つの実施例では、WLANユニット1050及びBluetoothユニット1052などの構成要素、並びにWWANユニット1056は、次世代フォーム・ファクタ(「NGFF」:Next Generation Form Factor)において実装され得る。
【0067】
少なくとも1つの実施例では、図10に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図10に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0068】
図11は、少なくとも1つの実施例による、例示的な集積回路1100を示す。少なくとも1つの実施例では、例示的な集積回路1100は、1つ又は複数のIPコアを使用して作製され得るSoCである。少なくとも1つの実施例では、集積回路1100は、1つ又は複数のアプリケーション・プロセッサ1105(たとえば、CPU、DPU)、少なくとも1つのグラフィックス・プロセッサ1110を含み、追加として、画像プロセッサ1115及び/又はビデオ・プロセッサ1120を含み得、それらのいずれも、モジュール式IPコアであり得る。少なくとも1つの実施例では、集積回路1100は、USBコントローラ1125、UARTコントローラ1130、SPI/SDIOコントローラ1135、及びIS/ICコントローラ1140を含む周辺機器又はバス論理を含む。少なくとも1つの実施例では、集積回路1100は、高精細度マルチメディア・インターフェース(「HDMI(登録商標)」:high-definition multimedia interface)コントローラ1150及びモバイル・インダストリ・プロセッサ・インターフェース(「MIPI」:mobile industry processor interface)ディスプレイ・インターフェース1155のうちの1つ又は複数に結合されたディスプレイ・デバイス1145を含むことができる。少なくとも1つの実施例では、フラッシュ・メモリとフラッシュ・メモリ・コントローラとを含むフラッシュ・メモリ・サブシステム1160によって、ストレージが提供され得る。少なくとも1つの実施例では、SDRAM又はSRAMメモリ・デバイスへのアクセスのために、メモリ・コントローラ1165を介してメモリ・インターフェースが提供され得る。少なくとも1つの実施例では、いくつかの集積回路は、追加として、組み込みセキュリティ・エンジン1170を含む。
【0069】
少なくとも1つの実施例では、図11に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図11に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0070】
図12は、少なくとも1つの実施例による、コンピューティング・システム1200を示す。少なくとも1つの実施例では、コンピューティング・システム1200は、メモリ・ハブ1205を含み得る相互接続経路を介して通信する1つ又は複数のプロセッサ1202とシステム・メモリ1204とを有する処理サブシステム1201を含む。少なくとも1つの実施例では、メモリ・ハブ1205は、チップセット構成要素内の別個の構成要素であり得るか、又は1つ又は複数のプロセッサ1202内に組み込まれ得る。少なくとも1つの実施例では、メモリ・ハブ1205は、通信リンク1206を介してI/Oサブシステム1211と結合する。少なくとも1つの実施例では、I/Oサブシステム1211は、コンピューティング・システム1200が1つ又は複数の入力デバイス1208からの入力を受信することを可能にすることができるI/Oハブ1207を含む。少なくとも1つの実施例では、I/Oハブ1207は、1つ又は複数のプロセッサ1202中に含まれ得るディスプレイ・コントローラが、1つ又は複数のディスプレイ・デバイス1210Aに出力を提供することを可能にすることができる。少なくとも1つの実施例では、I/Oハブ1207と結合された1つ又は複数のディスプレイ・デバイス1210Aは、ローカルの、内部の、又は組み込まれたディスプレイ・デバイスを含むことができる。
【0071】
少なくとも1つの実施例では、処理サブシステム1201は、バス又は他の通信リンク1213を介してメモリ・ハブ1205に結合された1つ又は複数の並列プロセッサ1212を含む。少なくとも1つの実施例では、通信リンク1213は、限定はしないがPCIeなど、任意の数の規格ベースの通信リンク技術又はプロトコルのうちの1つであり得るか、或いはベンダー固有の通信インターフェース又は通信ファブリックであり得る。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1212は、メニー・インテグレーテッド・コア・プロセッサなど、多数の処理コア及び/又は処理クラスタを含むことができる、算出に集中した並列又はベクトル処理システムを形成する。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1212は、グラフィックス処理サブシステムを形成し、グラフィックス処理サブシステムは、I/Oハブ1207を介して結合された1つ又は複数のディスプレイ・デバイス1210Aのうちの1つにピクセルを出力することができる。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1212はまた、ディスプレイ・コントローラと、1つ又は複数のディスプレイ・デバイス1210Bへの直接接続を可能にするためのディスプレイ・インターフェース(図示せず)とを含むことができる。
【0072】
少なくとも1つの実施例では、システム・ストレージ・ユニット1214は、I/Oハブ1207に接続して、コンピューティング・システム1200のためのストレージ機構を提供することができる。少なくとも1つの実施例では、I/Oハブ1207と、プラットフォームに組み込まれ得るネットワーク・アダプタ1218及び/又はワイヤレス・ネットワーク・アダプタ1219などの他の構成要素、並びに1つ又は複数のアドイン・デバイス1220を介して追加され得る様々な他のデバイスとの間の接続を可能にするためのインターフェース機構を提供するために、I/Oスイッチ1216が使用され得る。少なくとも1つの実施例では、ネットワーク・アダプタ1218は、イーサネット・アダプタ又は別のワイヤード・ネットワーク・アダプタであり得る。少なくとも1つの実施例では、ワイヤレス・ネットワーク・アダプタ1219は、Wi-Fi、Bluetooth、NFC、又は1つ又は複数のワイヤレス無線を含む他のネットワーク・デバイスのうちの1つ又は複数を含むことができる。
【0073】
少なくとも1つの実施例では、コンピューティング・システム1200は、USB又は他のポート接続、光学ストレージ・ドライブ、ビデオ・キャプチャ・デバイスなどを含む、I/Oハブ1207にも接続され得る、明示的に示されていない他の構成要素を含むことができる。少なくとも1つの実施例では、図12中の様々な構成要素を相互接続する通信経路が、PCIベースのプロトコル(たとえば、PCIe)などの任意の好適なプロトコル、或いはNVLink高速相互接続などの他のバス又はポイントツーポイント通信インターフェース及び/又は(1つ又は複数の)プロトコル、或いは相互接続プロトコルを使用して、実装され得る。
【0074】
少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1212は、たとえばビデオ出力回路要素を含むグラフィックス及びビデオ処理のために最適化された回路要素を組み込み、グラフィックス処理ユニット(「GPU」)を構成する。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1212は、汎用処理のために最適化された回路要素を組み込む。少なくとも実施例では、コンピューティング・システム1200の構成要素は、単一の集積回路上の1つ又は複数の他のシステム要素と統合され得る。たとえば、少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1212、メモリ・ハブ1205、(1つ又は複数の)プロセッサ1202、及びI/Oハブ1207は、SoC集積回路に組み込まれ得る。少なくとも1つの実施例では、コンピューティング・システム1200の構成要素は、システム・イン・パッケージ(「SIP」:system in package)構成を形成するために、単一のパッケージに組み込まれ得る。少なくとも1つの実施例では、コンピューティング・システム1200の構成要素の少なくとも一部分は、マルチチップ・モジュール(「MCM」:multi-chip module)に組み込まれ得、マルチチップ・モジュールは、他のマルチチップ・モジュールと相互接続されてモジュール式コンピューティング・システムにすることができる。少なくとも1つの実施例では、I/Oサブシステム1211及びディスプレイ・デバイス1210Bは、コンピューティング・システム1200から省略される。
【0075】
少なくとも1つの実施例では、図12に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図12に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0076】
「処理システム」
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的な処理システムを記載する。
【0077】
図13は、少なくとも1つの実施例による、加速処理ユニット(「APU」:accelerated processing unit)1300を示す。少なくとも1つの実施例では、APU1300は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、APU1300は、CUDAプログラムなど、アプリケーション・プログラムを実行するように構成され得る。少なくとも1つの実施例では、APU1300は、限定はしないが、コア複合体1310と、グラフィックス複合体1340と、ファブリック1360と、I/Oインターフェース1370と、メモリ・コントローラ1380と、ディスプレイ・コントローラ1392と、マルチメディア・エンジン1394とを含む。少なくとも1つの実施例では、APU1300は、限定はしないが、任意の数のコア複合体1310と、任意の数のグラフィックス複合体1350と、任意の数のディスプレイ・コントローラ1392と、任意の数のマルチメディア・エンジン1394とを、任意の組合せで含み得る。説明目的のために、同様のオブジェクトの複数のインスタンスは、オブジェクトを識別する参照番号と、必要な場合にインスタンスを識別する括弧付きの番号とともに、本明細書で示される。
【0078】
少なくとも1つの実施例では、コア複合体1310はCPUであり、グラフィックス複合体1340はGPUであり、APU1300は、限定はしないが、単一のチップ上に1310及び1340を組み込む処理ユニットである。少なくとも1つの実施例では、いくつかのタスクは、コア複合体1310に割り当てられ得、他のタスクは、グラフィックス複合体1340に割り当てられ得る。少なくとも1つの実施例では、コア複合体1310は、オペレーティング・システムなど、APU1300に関連するメイン制御ソフトウェアを実行するように構成される。少なくとも1つの実施例では、コア複合体1310は、APU1300のマスタ・プロセッサであり、他のプロセッサの動作を制御し、協調させる。少なくとも1つの実施例では、コア複合体1310は、グラフィックス複合体1340の動作を制御するコマンドを発行する。少なくとも1つの実施例では、コア複合体1310は、CUDAソース・コードから導出されたホスト実行可能コードを実行するように構成され得、グラフィックス複合体1340は、CUDAソース・コードから導出されたデバイス実行可能コードを実行するように構成され得る。
【0079】
少なくとも1つの実施例では、コア複合体1310は、限定はしないが、コア1320(1)~1320(4)と、L3キャッシュ1330とを含む。少なくとも1つの実施例では、コア複合体1310は、限定はしないが、任意の数のコア1320と、任意の数及びタイプのキャッシュとを、任意の組合せで含み得る。少なくとも1つの実施例では、コア1320は、特定の命令セット・アーキテクチャ(「ISA」:instruction set architecture)の命令を実行するように構成される。少なくとも1つの実施例では、各コア1320はCPUコアである。
【0080】
少なくとも1つの実施例では、各コア1320は、限定はしないが、フェッチ/復号ユニット1322と、整数実行エンジン1324と、浮動小数点実行エンジン1326と、L2キャッシュ1328とを含む。少なくとも1つの実施例では、フェッチ/復号ユニット1322は、命令をフェッチし、そのような命令を復号し、マイクロ・オペレーションを生成し、整数実行エンジン1324と浮動小数点実行エンジン1326とに別個のマイクロ命令をディスパッチする。少なくとも1つの実施例では、フェッチ/復号ユニット1322は、同時に、あるマイクロ命令を整数実行エンジン1324にディスパッチし、別のマイクロ命令を浮動小数点実行エンジン1326にディスパッチすることができる。少なくとも1つの実施例では、整数実行エンジン1324は、限定はしないが、整数及びメモリ演算を実行する。少なくとも1つの実施例では、浮動小数点エンジン1326は、限定はしないが、浮動小数点及びベクトル演算を実行する。少なくとも1つの実施例では、フェッチ復号ユニット1322は、整数実行エンジン1324と浮動小数点実行エンジン1326の両方を置き換える単一の実行エンジンに、マイクロ命令をディスパッチする。
【0081】
少なくとも1つの実施例では、iがコア1320の特定のインスタンスを表す整数である、各コア1320(i)は、コア1320(i)中に含まれるL2キャッシュ1328(i)にアクセスし得る。少なくとも1つの実施例では、jがコア複合体1310の特定のインスタンスを表す整数である、コア複合体1310(j)中に含まれる各コア1320は、コア複合体1310(j)中に含まれるL3キャッシュ1330(j)を介して、コア複合体1310(j)中に含まれる他のコア1320に接続される。少なくとも1つの実施例では、jがコア複合体1310の特定のインスタンスを表す整数である、コア複合体1310(j)中に含まれるコア1320は、コア複合体1310(j)中に含まれるL3キャッシュ1330(j)のすべてにアクセスすることができる。少なくとも1つの実施例では、L3キャッシュ1330は、限定はしないが、任意の数のスライスを含み得る。
【0082】
少なくとも1つの実施例では、グラフィックス複合体1340は、高度並列様式でコンピュート動作を実施するように構成され得る。少なくとも1つの実施例では、グラフィックス複合体1340は、描画コマンド、ピクセル動作、幾何学的算出、及びディスプレイに画像をレンダリングすることに関連する他の動作など、グラフィックス・パイプライン動作を実行するように構成される。少なくとも1つの実施例では、グラフィックス複合体1340は、グラフィックに関係しない動作を実行するように構成される。少なくとも1つの実施例では、グラフィックス複合体1340は、グラフィックに関係する動作とグラフィックに関係しない動作の両方を実行するように構成される。
【0083】
少なくとも1つの実施例では、グラフィックス複合体1340は、限定はしないが、任意の数のコンピュート・ユニット1350と、L2キャッシュ1342とを含む。少なくとも1つの実施例では、コンピュート・ユニット1350は、L2キャッシュ1342を共有する。少なくとも1つの実施例では、L2キャッシュ1342は区分けされる。少なくとも1つの実施例では、グラフィックス複合体1340は、限定はしないが、任意の数のコンピュート・ユニット1350と、(ゼロを含む)任意の数及びタイプのキャッシュとを含む。少なくとも1つの実施例では、グラフィックス複合体1340は、限定はしないが、任意の量の専用グラフィックス・ハードウェアを含む。
【0084】
少なくとも1つの実施例では、各コンピュート・ユニット1350は、限定はしないが、任意の数のSIMDユニット1352と、共有メモリ1354とを含む。少なくとも1つの実施例では、各SIMDユニット1352は、SIMDアーキテクチャを実装し、動作を並列に実施するように構成され得る。少なくとも1つの実施例では、各コンピュート・ユニット1350は、任意の数のスレッド・ブロックを実行し得るが、各スレッド・ブロックは、単一のコンピュート・ユニット1350上で実行する。少なくとも1つの実施例では、スレッド・ブロックは、限定はしないが、任意の数の実行のスレッドを含む。少なくとも1つの実施例では、ワークグループは、スレッド・ブロックである。少なくとも1つの実施例では、各SIMDユニット1352は、異なるワープを実行する。少なくとも1つの実施例では、ワープは、スレッドのグループ(たとえば、16個のスレッド)であり、ここで、ワープ中の各スレッドは、単一のスレッド・ブロックに属し、命令の単一のセットに基づいて、データの異なるセットを処理するように構成される。少なくとも1つの実施例では、ワープ中の1つ又は複数のスレッドを無効にするために、プレディケーションが使用され得る。少なくとも1つの実施例では、レーンはスレッドである。少なくとも1つの実施例では、ワーク・アイテムはスレッドである。少なくとも1つの実施例では、ウェーブフロントはワープである。少なくとも1つの実施例では、スレッド・ブロック中の異なるウェーブフロントは、互いに同期し、共有メモリ1354を介して通信し得る。
【0085】
少なくとも1つの実施例では、ファブリック1360は、コア複合体1310、グラフィックス複合体1340、I/Oインターフェース1370、メモリ・コントローラ1380、ディスプレイ・コントローラ1392、及びマルチメディア・エンジン1394にわたるデータ及び制御送信を容易にするシステム相互接続である。少なくとも1つの実施例では、APU1300は、限定はしないが、ファブリック1360に加えて又はそれの代わりに、任意の量及びタイプのシステム相互接続を含み得、それは、APU1300の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする。少なくとも1つの実施例では、I/Oインターフェース1370は、任意の数及びタイプのI/Oインターフェース(たとえば、PCI、PCI-Extended(「PCI-X」)、PCIe、ギガビット・イーサネット(「GBE」:gigabit Ethernet)、USBなど)を表す。少なくとも1つの実施例では、様々なタイプの周辺デバイスが、I/Oインターフェース1370に結合される。少なくとも1つの実施例では、I/Oインターフェース1370に結合される周辺デバイスは、限定はしないが、キーボード、マウス、プリンタ、スキャナ、ジョイスティック又は他のタイプのゲーム・コントローラ、メディア記録デバイス、外部ストレージ・デバイス、ネットワーク・インターフェース・カードなどを含み得る。
【0086】
少なくとも1つの実施例では、ディスプレイ・コントローラAMD92は、液晶ディスプレイ(「LCD」:liquid crystal display)デバイスなど、1つ又は複数のディスプレイ・デバイス上に画像を表示する。少なくとも1つの実施例では、マルチメディア・エンジン1394は、限定はしないが、ビデオ・デコーダ、ビデオ・エンコーダ、画像信号プロセッサなど、マルチメディアに関係する任意の量及びタイプの回路要素を含む。少なくとも1つの実施例では、メモリ・コントローラ1380は、APU1300と統一システム・メモリ1390との間のデータ転送を容易にする。少なくとも1つの実施例では、コア複合体1310とグラフィックス複合体1340とは、統一システム・メモリ1390を共有する。
【0087】
少なくとも1つの実施例では、APU1300は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ1380及びメモリ・デバイス(たとえば、共有メモリ1354)を含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、APU1300は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ1428、L3キャッシュ1330、及びL2キャッシュ1342)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、コア1320、コア複合体1310、SIMDユニット1352、コンピュート・ユニット1350、及びグラフィックス複合体1340)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
【0088】
少なくとも1つの実施例では、図13に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図13に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0089】
図14は、少なくとも1つの実施例による、CPU1400を示す。少なくとも1つの実施例では、CPU1400は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、CPU1400は、アプリケーション・プログラムを実行するように構成され得る。少なくとも1つの実施例では、CPU1400は、オペレーティング・システムなど、メイン制御ソフトウェアを実行するように構成される。少なくとも1つの実施例では、CPU1400は、外部GPU(図示せず)の動作を制御するコマンドを発行する。少なくとも1つの実施例では、CPU1400は、CUDAソース・コードから導出されたホスト実行可能コードを実行するように構成され得、外部GPUは、そのようなCUDAソース・コードから導出されたデバイス実行可能コードを実行するように構成され得る。少なくとも1つの実施例では、CPU1400は、限定はしないが、任意の数のコア複合体1410と、ファブリック1460と、I/Oインターフェース1470と、メモリ・コントローラ1480とを含む。
【0090】
少なくとも1つの実施例では、コア複合体1410は、限定はしないが、コア1420(1)~1420(4)と、L3キャッシュ1430とを含む。少なくとも1つの実施例では、コア複合体1410は、限定はしないが、任意の数のコア1420と、任意の数及びタイプのキャッシュとを、任意の組合せで含み得る。少なくとも1つの実施例では、コア1420は、特定のISAの命令を実行するように構成される。少なくとも1つの実施例では、各コア1420はCPUコアである。
【0091】
少なくとも1つの実施例では、各コア1420は、限定はしないが、フェッチ/復号ユニット1422と、整数実行エンジン1424と、浮動小数点実行エンジン1426と、L2キャッシュ1428とを含む。少なくとも1つの実施例では、フェッチ/復号ユニット1422は、命令をフェッチし、そのような命令を復号し、マイクロ・オペレーションを生成し、整数実行エンジン1424と浮動小数点実行エンジン1426とに別個のマイクロ命令をディスパッチする。少なくとも1つの実施例では、フェッチ/復号ユニット1422は、同時に、あるマイクロ命令を整数実行エンジン1424にディスパッチし、別のマイクロ命令を浮動小数点実行エンジン1426にディスパッチすることができる。少なくとも1つの実施例では、整数実行エンジン1424は、限定はしないが、整数及びメモリ演算を実行する。少なくとも1つの実施例では、浮動小数点エンジン1426は、限定はしないが、浮動小数点及びベクトル演算を実行する。少なくとも1つの実施例では、フェッチ復号ユニット1422は、整数実行エンジン1424と浮動小数点実行エンジン1426の両方を置き換える単一の実行エンジンに、マイクロ命令をディスパッチする。
【0092】
少なくとも1つの実施例では、iがコア1420の特定のインスタンスを表す整数である、各コア1420(i)は、コア1420(i)中に含まれるL2キャッシュ1428(i)にアクセスし得る。少なくとも1つの実施例では、jがコア複合体1410の特定のインスタンスを表す整数である、コア複合体1410(j)中に含まれる各コア1420は、コア複合体1410(j)中に含まれるL3キャッシュ1430(j)を介して、コア複合体1410(j)中の他のコア1420に接続される。少なくとも1つの実施例では、jがコア複合体1410の特定のインスタンスを表す整数である、コア複合体1410(j)中に含まれるコア1420は、コア複合体1410(j)中に含まれるL3キャッシュ1430(j)のすべてにアクセスすることができる。少なくとも1つの実施例では、L3キャッシュ1430は、限定はしないが、任意の数のスライスを含み得る。
【0093】
少なくとも1つの実施例では、ファブリック1460は、コア複合体1410(1)~1410(N)(ここで、Nは0よりも大きい整数である)、I/Oインターフェース1470、及びメモリ・コントローラ1480にわたるデータ及び制御送信を容易にするシステム相互接続である。少なくとも1つの実施例では、CPU1400は、限定はしないが、ファブリック1460に加えて又はそれの代わりに、任意の量及びタイプのシステム相互接続を含み得、それは、CPU1400の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする。少なくとも1つの実施例では、I/Oインターフェース1470は、任意の数及びタイプのI/Oインターフェース(たとえば、PCI、PCI-X、PCIe、GBE、USBなど)を表す。少なくとも1つの実施例では、様々なタイプの周辺デバイスが、I/Oインターフェース1470に結合される。少なくとも1つの実施例では、I/Oインターフェース1470に結合される周辺デバイスは、限定はしないが、ディスプレイ、キーボード、マウス、プリンタ、スキャナ、ジョイスティック又は他のタイプのゲーム・コントローラ、メディア記録デバイス、外部ストレージ・デバイス、ネットワーク・インターフェース・カードなどを含み得る。
【0094】
少なくとも1つの実施例では、メモリ・コントローラ1480は、CPU1400とシステム・メモリ1490との間のデータ転送を容易にする。少なくとも1つの実施例では、コア複合体1410とグラフィックス複合体1440とは、システム・メモリ1490を共有する。少なくとも1つの実施例では、CPU1400は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ1480及びメモリ・デバイスを含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、CPU1400は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ1428及びL3キャッシュ1430)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、コア1420及びコア複合体1410)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
【0095】
少なくとも1つの実施例では、図14に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図14に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0096】
図15は、少なくとも1つの実施例による、例示的なアクセラレータ統合スライス1590を示す。本明細書で使用される「スライス」は、アクセラレータ統合回路の処理リソースの指定部分を備える。少なくとも1つの実施例では、アクセラレータ統合回路は、グラフィックス加速モジュール中に含まれる複数のグラフィックス処理エンジンの代わりに、キャッシュ管理、メモリ・アクセス、コンテキスト管理、及び割込み管理サービスを提供する。グラフィックス処理エンジンは、各々、別個のGPUを備え得る。代替的に、グラフィックス処理エンジンは、GPU内に、グラフィックス実行ユニット、メディア処理エンジン(たとえば、ビデオ・エンコーダ/デコーダ)、サンプラ、及びblitエンジンなど、異なるタイプのグラフィックス処理エンジンを備え得る。少なくとも1つの実施例では、グラフィックス加速モジュールは、複数のグラフィックス処理エンジンをもつGPUであり得る。少なくとも1つの実施例では、グラフィックス処理エンジンは、共通のパッケージ、ライン・カード、又はチップ上に組み込まれた個々のGPUであり得る。
【0097】
システム・メモリ1514内のアプリケーション実効アドレス空間1582は、プロセス要素1583を記憶する。一実施例では、プロセス要素1583は、プロセッサ1507上で実行されるアプリケーション1580からのGPU呼出し1581に応答して、記憶される。プロセス要素1583は、対応するアプリケーション1580のプロセス状態を含んでいる。プロセス要素1583に含まれているワーク記述子(「WD」:work descriptor)1584は、アプリケーションによって要求される単一のジョブであり得るか、又はジョブのキューに対するポインタを含んでいることがある。少なくとも1つの実施例では、WD1584は、アプリケーション実効アドレス空間1582におけるジョブ要求キューに対するポインタである。
【0098】
グラフィックス加速モジュール1546及び/又は個々のグラフィックス処理エンジンは、システム中のプロセスのすべて又はサブセットによって共有され得る。少なくとも1つの実施例では、プロセス状態を設定し、WD1584をグラフィックス加速モジュール1546に送出して、仮想化環境中でジョブを開始するためのインフラストラクチャが、含められ得る。
【0099】
少なくとも1つの実施例では、専用プロセス・プログラミング・モデルは、実装固有である。このモデルでは、単一のプロセスが、グラフィックス加速モジュール1546又は個々のグラフィックス処理エンジンを所有する。グラフィックス加速モジュール1546が単一のプロセスによって所有されるので、ハイパーバイザは、所有パーティションについてアクセラレータ統合回路を初期化し、グラフィックス加速モジュール1546が割り当てられたとき、オペレーティング・システムは、所有プロセスについてアクセラレータ統合回路を初期化する。
【0100】
動作時、アクセラレータ統合スライス1590中のWDフェッチ・ユニット1591は、グラフィックス加速モジュール1546の1つ又は複数のグラフィックス処理エンジンによって行われるべきであるワークの指示を含む、次のWD1584をフェッチする。示されているように、WD1584からのデータは、レジスタ1545に記憶され、メモリ管理ユニット(「MMU」:memory management unit)1539、割込み管理回路1547、及び/又はコンテキスト管理回路1548によって使用され得る。たとえば、MMU1539の一実施例は、OS仮想アドレス空間1585内のセグメント/ページ・テーブル1586にアクセスするためのセグメント/ページ・ウォーク回路要素を含む。割込み管理回路1547は、グラフィックス加速モジュール1546から受信された割込みイベント(「INT」:interrupt)1592を処理し得る。グラフィックス動作を実施するとき、グラフィックス処理エンジンによって生成された実効アドレス1593は、MMU1539によって実アドレスにトランスレートされる。
【0101】
一実施例では、レジスタ1545の同じセットが、各グラフィックス処理エンジン、及び/又はグラフィックス加速モジュール1546について複製され、ハイパーバイザ又はオペレーティング・システムによって初期化され得る。これらの複製されたレジスタの各々は、アクセラレータ統合スライス1590中に含められ得る。ハイパーバイザによって初期化され得る例示的なレジスタが、表1に示されている。
【表1】
【0102】
オペレーティング・システムによって初期化され得る例示的なレジスタが、表2に示されている。
【表2】
【0103】
一実施例では、各WD1584は、特定のグラフィックス加速モジュール1546及び/又は特定のグラフィックス処理エンジンに固有である。WD1584は、ワークを行うためにグラフィックス処理エンジンによって必要とされるすべての情報を含んでいるか、又は、WD1584は、完了されるべきワークのコマンド・キューをアプリケーションが設定したメモリ・ロケーションに対するポインタであり得る。
【0104】
少なくとも1つの実施例では、図15に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図15に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0105】
図16A図16Bは、少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す。少なくとも1つの実施例では、例示的なグラフィックス・プロセッサのうちのいずれかは、1つ又は複数のIPコアを使用して作製され得る。示されているものに加えて、少なくとも1つの実施例では、追加のグラフィックス・プロセッサ/コア、周辺インターフェース・コントローラ、又は汎用プロセッサ・コアを含む他の論理及び回路が含まれ得る。少なくとも1つの実施例では、例示的なグラフィックス・プロセッサは、SoC内での使用のためのものである。
【0106】
図16Aは、少なくとも1つの実施例による、1つ又は複数のIPコアを使用して作製され得るSoC集積回路の例示的なグラフィックス・プロセッサ1610を示す。図16Bは、少なくとも1つの実施例による、1つ又は複数のIPコアを使用して作製され得るSoC集積回路の追加の例示的なグラフィックス・プロセッサ1640を示す。少なくとも1つの実施例では、図16Aのグラフィックス・プロセッサ1610は、低電力グラフィックス・プロセッサ・コアである。少なくとも1つの実施例では、図16Bのグラフィックス・プロセッサ1640は、より高性能のグラフィックス・プロセッサ・コアである。少なくとも1つの実施例では、グラフィックス・プロセッサ1610、1640の各々は、図11のグラフィックス・プロセッサ1110の変形態であり得る。
【0107】
少なくとも1つの実施例では、グラフィックス・プロセッサ1610は、頂点プロセッサ1605と、1つ又は複数のフラグメント・プロセッサ1615A~1615N(たとえば、1615A、1615B、1615C、1615D~1615N-1、及び1615N)とを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1610は、別個の論理を介して異なるシェーダ・プログラムを実行することができ、それにより、頂点プロセッサ1605は、頂点シェーダ・プログラムのための動作を実行するように最適化され、1つ又は複数のフラグメント・プロセッサ1615A~1615Nは、フラグメント又はピクセル・シェーダ・プログラムのためのフラグメント(たとえば、ピクセル)シェーディング動作を実行する。少なくとも1つの実施例では、頂点プロセッサ1605は、3Dグラフィックス・パイプラインの頂点処理段階を実施し、プリミティブ及び頂点データを生成する。少なくとも1つの実施例では、(1つ又は複数の)フラグメント・プロセッサ1615A~1615Nは、頂点プロセッサ1605によって生成されたプリミティブ及び頂点データを使用して、ディスプレイ・デバイス上に表示されるフレームバッファを作り出す。少なくとも1つの実施例では、(1つ又は複数の)フラグメント・プロセッサ1615A~1615Nは、OpenGL APIにおいて提供されるようなフラグメント・シェーダ・プログラムを実行するように最適化され、OpenGL APIは、Direct 3D APIにおいて提供されるようなピクセル・シェーダ・プログラムと同様の動作を実施するために使用され得る。
【0108】
少なくとも1つの実施例では、グラフィックス・プロセッサ1610は、追加として、1つ又は複数のMMU1620A~1620Bと、(1つ又は複数の)キャッシュ1625A~1625Bと、(1つ又は複数の)回路相互接続1630A~1630Bとを含む。少なくとも1つの実施例では、1つ又は複数のMMU1620A~1620Bは、頂点プロセッサ1605及び/又は(1つ又は複数の)フラグメント・プロセッサ1615A~1615Nを含む、グラフィックス・プロセッサ1610のための仮想-物理アドレス・マッピングを提供し、それらは、1つ又は複数のキャッシュ1625A~1625Bに記憶された頂点又は画像/テクスチャ・データに加えて、メモリに記憶された頂点又は画像/テクスチャ・データを参照し得る。少なくとも1つの実施例では、1つ又は複数のMMU1620A~1620Bは、図11の1つ又は複数のアプリケーション・プロセッサ1105、画像プロセッサ1115、及び/又はビデオ・プロセッサ1120に関連する1つ又は複数のMMUを含む、システム内の他のMMUと同期され得、それにより、各プロセッサ1105~1120は、共有又は統一仮想メモリ・システムに参加することができる。少なくとも1つの実施例では、1つ又は複数の回路相互接続1630A~1630Bは、グラフィックス・プロセッサ1610が、SoCの内部バスを介して又は直接接続を介してのいずれかで、SoC内の他のIPコアとインターフェースすることを可能にする。
【0109】
少なくとも1つの実施例では、グラフィックス・プロセッサ1640は、図16Aのグラフィックス・プロセッサ1610の1つ又は複数のMMU1620A~1620Bと、キャッシュ1625A~1625Bと、回路相互接続1630A~1630Bとを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1640は、1つ又は複数のシェーダ・コア1655A~1655N(たとえば、1655A、1655B、1655C、1655D、1655E、1655F~1655N-1、及び1655N)を含み、1つ又は複数のシェーダ・コア1655A~1655Nは、単一のコア、又はタイプ、又はコアが、頂点シェーダ、フラグメント・シェーダ、及び/又はコンピュート・シェーダを実装するためのシェーダ・プログラム・コードを含むすべてのタイプのプログラマブル・シェーダ・コードを実行することができる統一シェーダ・コア・アーキテクチャを提供する。少なくとも1つの実施例では、シェーダ・コアの数は変動することができる。少なくとも1つの実施例では、グラフィックス・プロセッサ1640は、1つ又は複数のシェーダ・コア1655A~1655Nに実行スレッドをディスパッチするためのスレッド・ディスパッチャとして作用するコア間タスク・マネージャ1645と、たとえばシーン内のローカル空間コヒーレンスを利用するため、又は内部キャッシュの使用を最適化するために、シーンについてのレンダリング動作が画像空間において下位区分される、タイル・ベースのレンダリングのためのタイリング動作を加速するためのタイリング・ユニット1658とを含む。
【0110】
少なくとも1つの実施例では、図16A図16Bに図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図16A図16Bに図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0111】
図17Aは、少なくとも1つの実施例による、グラフィックス・コア1700を示す。少なくとも1つの実施例では、グラフィックス・コア1700は、図11のグラフィックス・プロセッサ1110内に含まれ得る。少なくとも1つの実施例では、グラフィックス・コア1700は、図16Bの場合のような統一シェーダ・コア1655A~1655Nであり得る。少なくとも1つの実施例では、グラフィックス・コア1700は、共有命令キャッシュ1702と、テクスチャ・ユニット1718と、キャッシュ/共有メモリ1720とを含み、それらは、グラフィックス・コア1700内の実行リソースに共通である。少なくとも1つの実施例では、グラフィックス・コア1700は、複数のスライス1701A~1701N、又は各コアについてのパーティションを含むことができ、グラフィックス・プロセッサは、グラフィックス・コア1700の複数のインスタンスを含むことができる。スライス1701A~1701Nは、ローカル命令キャッシュ1704A~1704Nと、スレッド・スケジューラ1706A~1706Nと、スレッド・ディスパッチャ1708A~1708Nと、レジスタのセット1710A~1710Nとを含むサポート論理を含むことができる。少なくとも1つの実施例では、スライス1701A~1701Nは、追加機能ユニット(「AFU」:additional function unit)1712A~1712N、浮動小数点ユニット(「FPU」:floating-point unit)1714A~1714N、整数算術論理ユニット(「ALU」:integer arithmetic logic unit)1716~1716N、アドレス算出ユニット(「ACU」:address computational unit)1713A~1713N、倍精度浮動小数点ユニット(「DPFPU」:double-precision floating-point unit)1715A~1715N、及び行列処理ユニット(「MPU」:matrix processing unit)1717A~1717Nのセットを含むことができる。
【0112】
少なくとも1つの実施例では、FPU1714A~1714Nは、単精度(32ビット)及び半精度(16ビット)の浮動小数点演算を実施することができ、DPFPU1715A~1715Nは、倍精度(64ビット)の浮動小数点演算を実施する。少なくとも1つの実施例では、ALU1716A~1716Nは、8ビット、16ビット、及び32ビットの精度で可変精度整数演算を実施することができ、混合精度演算のために構成され得る。少なくとも1つの実施例では、MPU1717A~1717Nも、半精度浮動小数点演算と8ビット整数演算とを含む、混合精度行列演算のために構成され得る。少なくとも1つの実施例では、MPU1717~1717Nは、加速汎用行列-行列乗算(「GEMM」:general matrix to matrix multiplication)のサポートを可能にすることを含む、CUDAプログラムを加速するための様々な行列演算を実施することができる。少なくとも1つの実施例では、AFU1712A~1712Nは、三角関数演算(たとえば、サイン、コサインなど)を含む、浮動小数点ユニット又は整数ユニットによってサポートされていない追加の論理演算を実施することができる。
【0113】
図17Bは、少なくとも1つの実施例による、汎用グラフィックス処理ユニット(「GPGPU」:general-purpose graphics processing unit)1730を示す。少なくとも1つの実施例では、GPGPU1730は、高度並列であり、マルチチップ・モジュール上での導入に好適である。少なくとも1つの実施例では、GPGPU1730は、高度並列コンピュート動作がGPUのアレイによって実施されることを可能にするように構成され得る。少なくとも1つの実施例では、GPGPU1730は、CUDAプログラムのための実行時間を改善するためにマルチGPUクラスタを作成するために、GPGPU1730の他のインスタンスに直接リンクされ得る。少なくとも1つの実施例では、GPGPU1730は、ホスト・プロセッサとの接続を可能にするためのホスト・インターフェース1732を含む。少なくとも1つの実施例では、ホスト・インターフェース1732は、PCIeインターフェースである。少なくとも1つの実施例では、ホスト・インターフェース1732は、ベンダー固有の通信インターフェース又は通信ファブリックであり得る。少なくとも1つの実施例では、GPGPU1730は、ホスト・プロセッサからコマンドを受信し、グローバル・スケジューラ1734を使用して、それらのコマンドに関連する実行スレッドを、コンピュート・クラスタ1736A~1736Hのセットに分散させる。少なくとも1つの実施例では、コンピュート・クラスタ1736A~1736Hは、キャッシュ・メモリ1738を共有する。少なくとも1つの実施例では、キャッシュ・メモリ1738は、コンピュート・クラスタ1736A~1736H内のキャッシュ・メモリのためのより高レベルのキャッシュとして働くことができる。
【0114】
少なくとも1つの実施例では、GPGPU1730は、メモリ・コントローラ1742A~1742Bのセットを介してコンピュート・クラスタ1736A~1736Hと結合されたメモリ1744A~1744Bを含む。少なくとも1つの実施例では、メモリ1744A~1744Bは、DRAM、又は、グラフィックス・ダブル・データ・レート(「GDDR」:graphics double data rate)メモリを含む同期グラフィックス・ランダム・アクセス・メモリ(「SGRAM」:synchronous graphics random access memory)などのグラフィックス・ランダム・アクセス・メモリを含む、様々なタイプのメモリ・デバイスを含むことができる。
【0115】
少なくとも1つの実施例では、コンピュート・クラスタ1736A~1736Hは、各々、図17Aのグラフィックス・コア1700などのグラフィックス・コアのセットを含み、グラフィックス・コアのセットは、CUDAプログラムに関連する算出に適したものを含む、様々な精度で算出動作を実施することができる複数のタイプの整数及び浮動小数点論理ユニットを含むことができる。たとえば、少なくとも1つの実施例では、コンピュート・クラスタ1736A~1736Hの各々における浮動小数点ユニットの少なくともサブセットは、16ビット又は32ビットの浮動小数点演算を実施するように構成され得、浮動小数点ユニットの異なるサブセットは、64ビットの浮動小数点演算を実施するように構成され得る。
【0116】
少なくとも1つの実施例では、GPGPU1730の複数のインスタンスは、コンピュート・クラスタとして動作するように構成され得る。コンピュート・クラスタ1736A~1736Hは、同期及びデータ交換のための任意の技術的に実現可能な通信技法を実装し得る。少なくとも1つの実施例では、GPGPU1730の複数のインスタンスは、ホスト・インターフェース1732を介して通信する。少なくとも1つの実施例では、GPGPU1730は、I/Oハブ1739を含み、I/Oハブ1739は、GPGPU1730を、GPGPU1730の他のインスタンスへの直接接続を可能にするGPUリンク1740と結合する。少なくとも1つの実施例では、GPUリンク1740は、GPGPU1730の複数のインスタンス間での通信及び同期を可能にする専用GPU-GPUブリッジに結合される。少なくとも1つの実施例では、GPUリンク1740は、他のGPGPU1730又は並列プロセッサにデータを送信及び受信するために高速相互接続と結合される。少なくとも1つの実施例では、GPGPU1730の複数のインスタンスは、別個のデータ処理システムに位置し、ホスト・インターフェース1732を介してアクセス可能であるネットワーク・デバイスを介して通信する。少なくとも1つの実施例では、GPUリンク1740は、ホスト・インターフェース1732に加えて、又はその代替として、ホスト・プロセッサへの接続を可能にするように構成され得る。少なくとも1つの実施例では、GPGPU1730は、CUDAプログラムを実行するように構成され得る。
【0117】
少なくとも1つの実施例では、図17A図17Bに図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図17A図17Bに図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0118】
図18Aは、少なくとも1つの実施例による、並列プロセッサ1800を示す。少なくとも1つの実施例では、並列プロセッサ1800の様々な構成要素は、プログラマブル・プロセッサ、特定用途向け集積回路(「ASIC」:application specific integrated circuit)、又はFPGAなど、1つ又は複数の集積回路デバイスを使用して実装され得る。
【0119】
少なくとも1つの実施例では、並列プロセッサ1800は並列処理ユニット1802を含む。少なくとも1つの実施例では、並列処理ユニット1802は、並列処理ユニット1802の他のインスタンスを含む、他のデバイスとの通信を可能にするI/Oユニット1804を含む。少なくとも1つの実施例では、I/Oユニット1804は、他のデバイスに直接接続され得る。少なくとも1つの実施例では、I/Oユニット1804は、メモリ・ハブ1805など、ハブ又はスイッチ・インターフェースの使用を介して他のデバイスと接続する。少なくとも1つの実施例では、メモリ・ハブ1805とI/Oユニット1804との間の接続は、通信リンクを形成する。少なくとも1つの実施例では、I/Oユニット1804は、ホスト・インターフェース1806及びメモリ・クロスバー1816と接続し、ホスト・インターフェース1806は、処理動作を実施することを対象とするコマンドを受信し、メモリ・クロスバー1816は、メモリ動作を実施することを対象とするコマンドを受信する。
【0120】
少なくとも1つの実施例では、ホスト・インターフェース1806が、I/Oユニット1804を介してコマンド・バッファを受信したとき、ホスト・インターフェース1806は、それらのコマンドを実施するためのワーク動作をフロント・エンド1808に向けることができる。少なくとも1つの実施例では、フロント・エンド1808はスケジューラ1810と結合し、スケジューラ1810は、コマンド又は他のワーク・アイテムを処理アレイ1812に分散させるように構成される。少なくとも1つの実施例では、スケジューラ1810は、処理アレイ1812にタスクが分散される前に、処理アレイ1812が適切に構成され、有効な状態にあることを確実にする。少なくとも1つの実施例では、スケジューラ1810は、マイクロコントローラ上で実行しているファームウェア論理を介して実装される。少なくとも1つの実施例では、マイクロコントローラ実装スケジューラ1810は、複雑なスケジューリング及びワーク分散動作を、粗い粒度及び細かい粒度において実施するように構成可能であり、処理アレイ1812上で実行しているスレッドの迅速なプリエンプション及びコンテキスト切替えを可能にする。少なくとも1つの実施例では、ホスト・ソフトウェアは、処理アレイ1812上でのスケジューリングのためのワークロードを、複数のグラフィックス処理ドアベルのうちの1つを介して証明することができる。少なくとも1つの実施例では、ワークロードは、次いで、スケジューラ1810を含むマイクロコントローラ内のスケジューラ1810論理によって、処理アレイ1812にわたって自動的に分散され得る。
【0121】
少なくとも1つの実施例では、処理アレイ1812は、最高「N」個のクラスタ(たとえば、クラスタ1814A、クラスタ1814B~クラスタ1814N)を含むことができる。少なくとも1つの実施例では、処理アレイ1812の各クラスタ1814A~1814Nは、多数の同時スレッドを実行することができる。少なくとも1つの実施例では、スケジューラ1810は、様々なスケジューリング及び/又はワーク分散アルゴリズムを使用して処理アレイ1812のクラスタ1814A~1814Nにワークを割り振ることができ、それらのアルゴリズムは、プログラム又は算出の各タイプについて生じるワークロードに応じて変動し得る。少なくとも1つの実施例では、スケジューリングは、スケジューラ1810によって動的に対処され得るか、又は処理アレイ1812による実行のために構成されたプログラム論理のコンパイル中に、コンパイラ論理によって部分的に支援され得る。少なくとも1つの実施例では、処理アレイ1812の異なるクラスタ1814A~1814Nは、異なるタイプのプログラムを処理するために、又は異なるタイプの算出を実施するために割り振られ得る。
【0122】
少なくとも1つの実施例では、処理アレイ1812は、様々なタイプの並列処理動作を実施するように構成され得る。少なくとも1つの実施例では、処理アレイ1812は、汎用並列コンピュート動作を実施するように構成される。たとえば、少なくとも1つの実施例では、処理アレイ1812は、ビデオ及び/又はオーディオ・データをフィルタリングすること、物理動作を含むモデリング動作を実施すること、及びデータ変換を実施することを含む処理タスクを実行するための論理を含むことができる。
【0123】
少なくとも1つの実施例では、処理アレイ1812は、並列グラフィックス処理動作を実施するように構成される。少なくとも1つの実施例では、処理アレイ1812は、限定はしないが、テクスチャ動作を実施するためのテクスチャ・サンプリング論理、並びにテッセレーション論理及び他の頂点処理論理を含む、そのようなグラフィックス処理動作の実行をサポートするための追加の論理を含むことができる。少なくとも1つの実施例では、処理アレイ1812は、限定はしないが、頂点シェーダ、テッセレーション・シェーダ、ジオメトリ・シェーダ、及びピクセル・シェーダなど、グラフィックス処理関係シェーダ・プログラムを実行するように構成され得る。少なくとも1つの実施例では、並列処理ユニット1802は、処理のためにI/Oユニット1804を介してシステム・メモリからデータを転送することができる。少なくとも1つの実施例では、処理中に、転送されたデータは、処理中にオンチップ・メモリ(たとえば、並列プロセッサ・メモリ1822)に記憶され、次いでシステム・メモリに書き戻され得る。
【0124】
少なくとも1つの実施例では、並列処理ユニット1802がグラフィックス処理を実施するために使用されるとき、スケジューラ1810は、処理アレイ1812の複数のクラスタ1814A~1814Nへのグラフィックス処理動作の分散をより良く可能にするために、処理ワークロードをほぼ等しいサイズのタスクに分割するように構成され得る。少なくとも1つの実施例では、処理アレイ1812の部分は、異なるタイプの処理を実施するように構成され得る。たとえば、少なくとも1つの実施例では、表示のために、レンダリングされた画像を作り出すために、第1の部分は、頂点シェーディング及びトポロジー生成を実施するように構成され得、第2の部分は、テッセレーション及びジオメトリ・シェーディングを実施するように構成され得、第3の部分は、ピクセル・シェーディング又は他のスクリーン空間動作を実施するように構成され得る。少なくとも1つの実施例では、クラスタ1814A~1814Nのうちの1つ又は複数によって作り出された中間データは、中間データがさらなる処理のためにクラスタ1814A~1814N間で送信されることを可能にするために、バッファに記憶され得る。
【0125】
少なくとも1つの実施例では、処理アレイ1812は、実行されるべき処理タスクをスケジューラ1810を介して受信することができ、スケジューラ1810は、処理タスクを定義するコマンドをフロント・エンド1808から受信する。少なくとも1つの実施例では、処理タスクは、処理されるべきデータのインデックス、たとえば、表面(パッチ)データ、プリミティブ・データ、頂点データ、及び/又はピクセル・データ、並びに、データがどのように処理されるべきであるか(たとえば、どのプログラムが実行されるべきであるか)を定義する状態パラメータ及びコマンドを含むことができる。少なくとも1つの実施例では、スケジューラ1810は、タスクに対応するインデックスをフェッチするように構成され得るか、又はフロント・エンド1808からインデックスを受信し得る。少なくとも1つの実施例では、フロント・エンド1808は、入って来るコマンド・バッファ(たとえば、バッチ・バッファ、プッシュ・バッファなど)によって指定されるワークロードが始動される前に、処理アレイ1812が有効な状態に構成されることを確実にするように構成され得る。
【0126】
少なくとも1つの実施例では、並列処理ユニット1802の1つ又は複数のインスタンスの各々は、並列プロセッサ・メモリ1822と結合することができる。少なくとも1つの実施例では、並列プロセッサ・メモリ1822は、メモリ・クロスバー1816を介してアクセスされ得、メモリ・クロスバー1816は、処理アレイ1812並びにI/Oユニット1804からメモリ要求を受信することができる。少なくとも1つの実施例では、メモリ・クロスバー1816は、メモリ・インターフェース1818を介して並列プロセッサ・メモリ1822にアクセスすることができる。少なくとも1つの実施例では、メモリ・インターフェース1818は、複数のパーティション・ユニット(たとえば、パーティション・ユニット1820A、パーティション・ユニット1820B~パーティション・ユニット1820N)を含むことができ、複数のパーティション・ユニットは、各々、並列プロセッサ・メモリ1822の一部分(たとえば、メモリ・ユニット)に結合することができる。少なくとも1つの実施例では、パーティション・ユニット1820A~1820Nの数は、メモリ・ユニットの数に等しくなるように構成され、それにより、第1のパーティション・ユニット1820Aは、対応する第1のメモリ・ユニット1824Aを有し、第2のパーティション・ユニット1820Bは、対応するメモリ・ユニット1824Bを有し、第Nのパーティション・ユニット1820Nは、対応する第Nのメモリ・ユニット1824Nを有する。少なくとも1つの実施例では、パーティション・ユニット1820A~1820Nの数は、メモリ・デバイスの数に等しくないことがある。
【0127】
少なくとも1つの実施例では、メモリ・ユニット1824A~1824Nは、GDDRメモリを含むSGRAMなど、DRAM又はグラフィックス・ランダム・アクセス・メモリを含む、様々なタイプのメモリ・デバイスを含むことができる。少なくとも1つの実施例では、メモリ・ユニット1824A~1824Nは、限定はしないが高帯域幅メモリ(「HBM」:high bandwidth memory)を含む、3D積層メモリをも含み得る。少なくとも1つの実施例では、並列プロセッサ・メモリ1822の利用可能な帯域幅を効率的に使用するために、フレーム・バッファ又はテクスチャ・マップなどのレンダー・ターゲットが、メモリ・ユニット1824A~1824Nにわたって記憶されて、パーティション・ユニット1820A~1820Nが、各レンダー・ターゲットの部分を並列に書き込むことを可能にし得る。少なくとも1つの実施例では、ローカル・キャッシュ・メモリと併せてシステム・メモリを利用する統一メモリ設計に有利なように、並列プロセッサ・メモリ1822のローカル・インスタンスが除外され得る。
【0128】
少なくとも1つの実施例では、処理アレイ1812のクラスタ1814A~1814Nのうちのいずれか1つは、並列プロセッサ・メモリ1822内のメモリ・ユニット1824A~1824Nのいずれかに書き込まれることになるデータを処理することができる。少なくとも1つの実施例では、メモリ・クロスバー1816は、各クラスタ1814A~1814Nの出力を、出力に対して追加の処理動作を実施することができる任意のパーティション・ユニット1820A~1820Nに転送するか、又は別のクラスタ1814A~1814Nに転送するように構成され得る。少なくとも1つの実施例では、各クラスタ1814A~1814Nは、様々な外部メモリ・デバイスから読み取るか、又はそれに書き込むために、メモリ・クロスバー1816を通してメモリ・インターフェース1818と通信することができる。少なくとも1つの実施例では、メモリ・クロスバー1816は、I/Oユニット1804と通信するためのメモリ・インターフェース1818への接続、並びに、並列プロセッサ・メモリ1822のローカル・インスタンスへの接続を有し、これは、異なるクラスタ1814A~1814N内の処理ユニットが、システム・メモリ、又は並列処理ユニット1802にローカルでない他のメモリと通信することを可能にする。少なくとも1つの実施例では、メモリ・クロスバー1816は、クラスタ1814A~1814Nとパーティション・ユニット1820A~1820Nとの間でトラフィック・ストリームを分離するために、仮想チャネルを使用することができる。
【0129】
少なくとも1つの実施例では、並列処理ユニット1802の複数のインスタンスは、単一のアドイン・カード上で提供され得るか、又は複数のアドイン・カードが相互接続され得る。少なくとも1つの実施例では、並列処理ユニット1802の異なるインスタンスは、異なるインスタンスが異なる数の処理コア、異なる量のローカル並列プロセッサ・メモリ、及び/又は他の構成の差を有する場合でも、相互動作するように構成され得る。たとえば、少なくとも1つの実施例では、並列処理ユニット1802のいくつかのインスタンスは、他のインスタンスに対してより高い精度の浮動小数点ユニットを含むことができる。少なくとも1つの実施例では、並列処理ユニット1802又は並列プロセッサ1800の1つ又は複数のインスタンスを組み込んだシステムは、限定はしないが、デスクトップ、ラップトップ、又はハンドヘルド・パーソナル・コンピュータ、サーバ、ワークステーション、ゲーム・コンソール、及び/又は組み込みシステムを含む、様々な構成及びフォーム・ファクタにおいて実装され得る。
【0130】
図18Bは、少なくとも1つの実施例による、処理クラスタ1894を示す。少なくとも1つの実施例では、処理クラスタ1894は、並列処理ユニット内に含まれる。少なくとも1つの実施例では、処理クラスタ1894は、図18の処理クラスタ1814A~1814Nのうちの1つである。少なくとも1つの実施例では、処理クラスタ1894は、多くのスレッドを並列で実行するように構成され得、「スレッド」という用語は、入力データの特定のセットに対して実行している特定のプログラムのインスタンスを指す。少なくとも1つの実施例では、複数の独立した命令ユニットを提供することなしに多数のスレッドの並列実行をサポートするために、単一命令複数データ(「SIMD」:single instruction,multiple data)命令発行技法が使用される。少なくとも1つの実施例では、各処理クラスタ1894内の処理エンジンのセットに命令を発行するように構成された共通の命令ユニットを使用して、全体的に同期された多数のスレッドの並列実行をサポートするために、単一命令複数スレッド(「SIMT」:single instruction,multiple thread)技法が使用される。
【0131】
少なくとも1つの実施例では、処理クラスタ1894の動作は、SIMT並列プロセッサに処理タスクを分散させるパイプライン・マネージャ1832を介して制御され得る。少なくとも1つの実施例では、パイプライン・マネージャ1832は、図18のスケジューラ1810から命令を受信し、グラフィックス・マルチプロセッサ1834及び/又はテクスチャ・ユニット1836を介してそれらの命令の実行を管理する。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1834は、SIMT並列プロセッサの例示的なインスタンスである。しかしながら、少なくとも1つの実施例では、異なるアーキテクチャの様々なタイプのSIMT並列プロセッサが、処理クラスタ1894内に含められ得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1834の1つ又は複数のインスタンスは、処理クラスタ1894内に含められ得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1834はデータを処理することができ、処理されたデータを、他のシェーダ・ユニットを含む複数の可能な宛先のうちの1つに分散させるために、データ・クロスバー1840が使用され得る。少なくとも1つの実施例では、パイプライン・マネージャ1832は、データ・クロスバー1840を介して分散されることになる処理されたデータのための宛先を指定することによって、処理されたデータの分散を容易にすることができる。
【0132】
少なくとも1つの実施例では、処理クラスタ1894内の各グラフィックス・マルチプロセッサ1834は、関数実行論理(たとえば、算術論理ユニット、ロード/ストア・ユニット(「LSU」:load/store unit)など)の同一のセットを含むことができる。少なくとも1つの実施例では、関数実行論理は、前の命令が完了する前に新しい命令が発行され得るパイプライン様式で構成され得る。少なくとも1つの実施例では、関数実行論理は、整数及び浮動小数点算術、比較演算、ブール演算、ビット・シフト、及び様々な代数関数の算出を含む様々な演算をサポートする。少なくとも1つの実施例では、異なる演算を実施するために同じ関数ユニット・ハードウェアが活用され得、関数ユニットの任意の組合せが存在し得る。
【0133】
少なくとも1つの実施例では、処理クラスタ1894に送信される命令がスレッドを構成する。少なくとも1つの実施例では、並列処理エンジンのセットにわたって実行しているスレッドのセットが、スレッド・グループである。少なくとも1つの実施例では、スレッド・グループは、異なる入力データに対してプログラムを実行する。少なくとも1つの実施例では、スレッド・グループ内の各スレッドは、グラフィックス・マルチプロセッサ1834内の異なる処理エンジンに割り当てられ得る。少なくとも1つの実施例では、スレッド・グループは、グラフィックス・マルチプロセッサ1834内の処理エンジンの数よりも少ないスレッドを含み得る。少なくとも1つの実施例では、スレッド・グループが処理エンジンの数よりも少ないスレッドを含むとき、処理エンジンのうちの1つ又は複数は、そのスレッド・グループが処理されているサイクル中にアイドルであり得る。少なくとも1つの実施例では、スレッド・グループはまた、グラフィックス・マルチプロセッサ1834内の処理エンジンの数よりも多いスレッドを含み得る。少なくとも1つの実施例では、スレッド・グループがグラフィックス・マルチプロセッサ1834内の処理エンジンの数よりも多くのスレッドを含むとき、連続するクロック・サイクルにわたって処理が実施され得る。少なくとも1つの実施例では、複数のスレッド・グループが、グラフィックス・マルチプロセッサ1834上で同時に実行され得る。
【0134】
少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1834は、ロード動作及びストア動作を実施するための内部キャッシュ・メモリを含む。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1834は、内部キャッシュをやめ、処理クラスタ1894内のキャッシュ・メモリ(たとえば、L1キャッシュ1848)を使用することができる。少なくとも1つの実施例では、各グラフィックス・マルチプロセッサ1834は、パーティション・ユニット(たとえば、図18Aのパーティション・ユニット1820A~1820N)内のレベル2(「L2」)キャッシュへのアクセスをも有し、それらのL2キャッシュは、すべての処理クラスタ1894の間で共有され、スレッド間でデータを転送するために使用され得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1834はまた、オフチップ・グローバル・メモリにアクセスし得、オフチップ・グローバル・メモリは、ローカル並列プロセッサ・メモリ及び/又はシステム・メモリのうちの1つ又は複数を含むことができる。少なくとも1つの実施例では、並列処理ユニット1802の外部の任意のメモリが、グローバル・メモリとして使用され得る。少なくとも1つの実施例では、処理クラスタ1894は、グラフィックス・マルチプロセッサ1834の複数のインスタンスを含み、グラフィックス・マルチプロセッサ1834は、共通の命令及びデータを共有することができ、共通の命令及びデータは、L1キャッシュ1848に記憶され得る。
【0135】
少なくとも1つの実施例では、各処理クラスタ1894は、仮想アドレスを物理アドレスにマッピングするように構成されたMMU1845を含み得る。少なくとも1つの実施例では、MMU1845の1つ又は複数のインスタンスは、図18のメモリ・インターフェース1818内に存在し得る。少なくとも1つの実施例では、MMU1845は、仮想アドレスを、タイル及び随意にキャッシュ・ライン・インデックスの物理アドレスにマッピングするために使用されるページ・テーブル・エントリ(「PTE」:page table entry)のセットを含む。少なくとも1つの実施例では、MMU1845は、アドレス・トランスレーション・ルックアサイド・バッファ(「TLB」:translation lookaside buffer)又はキャッシュを含み得、これらは、グラフィックス・マルチプロセッサ1834又はL1キャッシュ1848或いは処理クラスタ1894内に存在し得る。少なくとも1つの実施例では、物理アドレスが、表面データ・アクセス・ローカリティを分散させて、パーティション・ユニットの間での効率的な要求インターリーブを可能にするために処理される。少なくとも1つの実施例では、キャッシュ・ライン・インデックスが、キャッシュ・ラインについての要求がヒットであるのかミスであるのかを決定するために使用され得る。
【0136】
少なくとも1つの実施例では、処理クラスタ1894は、各グラフィックス・マルチプロセッサ1834が、テクスチャ・マッピング動作、たとえば、テクスチャ・サンプル位置を決定すること、テクスチャ・データを読み取ること、及びテクスチャ・データをフィルタリングすることを実施するためのテクスチャ・ユニット1836に結合されるように、構成され得る。少なくとも1つの実施例では、テクスチャ・データは、内部テクスチャL1キャッシュ(図示せず)から又はグラフィックス・マルチプロセッサ1834内のL1キャッシュから読み取られ、必要に応じて、L2キャッシュ、ローカル並列プロセッサ・メモリ、又はシステム・メモリからフェッチされる。少なくとも1つの実施例では、各グラフィックス・マルチプロセッサ1834は、処理されたタスクをデータ・クロスバー1840に出力して、処理されたタスクを、さらなる処理のために別の処理クラスタ1894に提供するか、或いは、処理されたタスクを、メモリ・クロスバー1816を介してL2キャッシュ、ローカル並列プロセッサ・メモリ、又はシステム・メモリに記憶する。少なくとも1つの実施例では、プレ・ラスタ演算ユニット(「プレROP」:pre-raster operation)1842は、グラフィックス・マルチプロセッサ1834からデータを受信し、データをROPユニットにダイレクトするように構成され、ROPユニットは、本明細書で説明されるようなパーティション・ユニット(たとえば、図18のパーティション・ユニット1820A~1820N)とともに位置し得る。少なくとも1つの実施例では、プレROP1842は、色ブレンディングのための最適化を実施し、ピクセル色データを組織化し、アドレス・トランスレーションを実施することができる。
【0137】
図18Cは、少なくとも1つの実施例による、グラフィックス・マルチプロセッサ1896を示す。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1896は、図18Bのグラフィックス・マルチプロセッサ1834である。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1896は、処理クラスタ1894のパイプライン・マネージャ1832と結合する。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1896は、限定はしないが、命令キャッシュ1852と、命令ユニット1854と、アドレス・マッピング・ユニット1856と、レジスタ・ファイル1858と、1つ又は複数のGPGPUコア1862と、1つ又は複数のLSU1866とを含む実行パイプラインを有する。GPGPUコア1862及びLSU1866は、メモリ及びキャッシュ相互接続1868を介してキャッシュ・メモリ1872及び共有メモリ1870と結合される。
【0138】
少なくとも1つの実施例では、命令キャッシュ1852は、実行すべき命令のストリームをパイプライン・マネージャ1832から受信する。少なくとも1つの実施例では、命令は、命令キャッシュ1852においてキャッシュされ、命令ユニット1854による実行のためにディスパッチされる。少なくとも1つの実施例では、命令ユニット1854は、命令をスレッド・グループ(たとえば、ワープ)としてディスパッチすることができ、スレッド・グループの各スレッドは、GPGPUコア1862内の異なる実行ユニットに割り当てられる。少なくとも1つの実施例では、命令は、統一アドレス空間内のアドレスを指定することによって、ローカル、共有、又はグローバルのアドレス空間のいずれかにアクセスすることができる。少なくとも1つの実施例では、アドレス・マッピング・ユニット1856は、統一アドレス空間中のアドレスを、LSU1866によってアクセスされ得る個別メモリ・アドレスにトランスレートするために使用され得る。
【0139】
少なくとも1つの実施例では、レジスタ・ファイル1858は、グラフィックス・マルチプロセッサ1896の機能ユニットにレジスタのセットを提供する。少なくとも1つの実施例では、レジスタ・ファイル1858は、グラフィックス・マルチプロセッサ1896の機能ユニット(たとえば、GPGPUコア1862、LSU1866)のデータ経路に接続された、オペランドのための一時的ストレージを提供する。少なくとも1つの実施例では、レジスタ・ファイル1858は、各機能ユニットがレジスタ・ファイル1858の専用部分を割り振られるように、機能ユニットの各々の間で分割される。少なくとも1つの実施例では、レジスタ・ファイル1858は、グラフィックス・マルチプロセッサ1896によって実行されている異なるスレッド・グループ間で分割される。
【0140】
少なくとも1つの実施例では、GPGPUコア1862は、各々、グラフィックス・マルチプロセッサ1896の命令を実行するために使用されるFPU及び/又は整数ALUを含むことができる。GPGPUコア1862は、同様のアーキテクチャであることも異なるアーキテクチャであることもある。少なくとも1つの実施例では、GPGPUコア1862の第1の部分は、単精度FPU及び整数ALUを含み、GPGPUコア1862の第2の部分は、倍精度FPUを含む。少なくとも1つの実施例では、FPUは、浮動小数点算術のためのIEEE754-2008規格を実装することができるか、又は、可変精度の浮動小数点算術を有効にすることができる。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1896は、追加として、矩形コピー動作又はピクセル・ブレンディング動作などの特定の機能を実施するための1つ又は複数の固定機能ユニット又は特別機能ユニットを含むことができる。少なくとも1つの実施例では、GPGPUコア1862のうちの1つ又は複数は、固定又は特別機能論理をも含むことができる。
【0141】
少なくとも1つの実施例では、GPGPUコア1862は、データの複数のセットに対して単一の命令を実施することが可能なSIMD論理を含む。少なくとも1つの実施例では、GPGPUコア1862は、SIMD4、SIMD8、及びSIMD16命令を物理的に実行し、SIMD1、SIMD2、及びSIMD32命令を論理的に実行することができる。少なくとも1つの実施例では、GPGPUコア1862のためのSIMD命令は、シェーダ・コンパイラによるコンパイル時に生成されるか、或いは、単一プログラム複数データ(「SPMD」:single program multiple data)又はSIMTアーキテクチャのために書かれ、コンパイルされたプログラムを実行しているときに自動的に生成され得る。少なくとも1つの実施例では、SIMT実行モデルのために構成されたプログラムの複数のスレッドは、単一のSIMD命令を介して実行され得る。たとえば、少なくとも1つの実施例では、同じ又は同様の動作を実施する8つのSIMTスレッドが、単一のSIMD8論理ユニットを介して並列に実行され得る。
【0142】
少なくとも1つの実施例では、メモリ及びキャッシュ相互接続1868は、グラフィックス・マルチプロセッサ1896の各機能ユニットをレジスタ・ファイル1858及び共有メモリ1870に接続する相互接続ネットワークである。少なくとも1つの実施例では、メモリ及びキャッシュ相互接続1868は、LSU1866が、共有メモリ1870とレジスタ・ファイル1858との間でロード動作及びストア動作を実装することを可能にするクロスバー相互接続である。少なくとも1つの実施例では、レジスタ・ファイル1858は、GPGPUコア1862と同じ周波数において動作することができ、したがって、GPGPUコア1862とレジスタ・ファイル1858との間のデータ転送は、非常に低いレイテンシである。少なくとも1つの実施例では、共有メモリ1870は、グラフィックス・マルチプロセッサ1896内の機能ユニット上で実行するスレッド間の通信を可能にするために使用され得る。少なくとも1つの実施例では、キャッシュ・メモリ1872は、たとえば、機能ユニットとテクスチャ・ユニット1836との間で通信されるテクスチャ・データをキャッシュするために、データ・キャッシュとして使用され得る。少なくとも1つの実施例では、共有メモリ1870は、キャッシュされる管理されるプログラムとしても使用され得る。少なくとも1つの実施例では、GPGPUコア1862上で実行しているスレッドは、キャッシュ・メモリ1872内に記憶される自動的にキャッシュされるデータに加えて、データを共有メモリ内にプログラム的に記憶することができる。
【0143】
少なくとも1つの実施例では、本明細書で説明されるような並列プロセッサ又はGPGPUは、グラフィックス動作、機械学習動作、パターン分析動作、及び様々な汎用GPU(GPGPU)機能を加速するために、ホスト/プロセッサ・コアに通信可能に結合される。少なくとも1つの実施例では、GPUは、バス又は他の相互接続(たとえば、PCIe又はNVLinkなどの高速相互接続)を介してホスト・プロセッサ/コアに通信可能に結合され得る。少なくとも1つの実施例では、GPUは、コアとして同じパッケージ又はチップに集積され、パッケージ又はチップの内部にあるプロセッサ・バス/相互接続を介してコアに通信可能に結合され得る。少なくとも1つの実施例では、GPUが接続される様式にかかわらず、プロセッサ・コアは、WD中に含まれているコマンド/命令のシーケンスの形態で、ワークをGPUに割り振り得る。少なくとも1つの実施例では、GPUは、次いで、これらのコマンド/命令を効率的に処理するための専用回路要素/論理を使用する。
【0144】
少なくとも1つの実施例では、図18A図18Cに図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図18A図18Cに図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0145】
図19は、少なくとも1つの実施例による、グラフィックス・プロセッサ1900を示す。少なくとも1つの実施例では、グラフィックス・プロセッサ1900は、リング相互接続1902と、パイプライン・フロント・エンド1904と、メディア・エンジン1937と、グラフィックス・コア1980A~1980Nとを含む。少なくとも1つの実施例では、リング相互接続1902は、グラフィックス・プロセッサ1900を、他のグラフィックス・プロセッサ又は1つ又は複数の汎用プロセッサ・コアを含む他の処理ユニットに結合する。少なくとも1つの実施例では、グラフィックス・プロセッサ1900は、マルチコア処理システム内に組み込まれた多くのプロセッサのうちの1つである。
【0146】
少なくとも1つの実施例では、グラフィックス・プロセッサ1900は、リング相互接続1902を介してコマンドのバッチを受信する。少なくとも1つの実施例では、入って来るコマンドは、パイプライン・フロント・エンド1904中のコマンド・ストリーマ1903によって解釈される。少なくとも1つの実施例では、グラフィックス・プロセッサ1900は、(1つ又は複数の)グラフィックス・コア1980A~1980Nを介して3Dジオメトリ処理及びメディア処理を実施するためのスケーラブル実行論理を含む。少なくとも1つの実施例では、3Dジオメトリ処理コマンドについて、コマンド・ストリーマ1903は、コマンドをジオメトリ・パイプライン1936に供給する。少なくとも1つの実施例では、少なくともいくつかのメディア処理コマンドについて、コマンド・ストリーマ1903は、コマンドをビデオ・フロント・エンド1934に供給し、ビデオ・フロント・エンド1934はメディア・エンジン1937と結合する。少なくとも1つの実施例では、メディア・エンジン1937は、ビデオ及び画像後処理のためのビデオ品質エンジン(「VQE」:Video Quality Engine)1930と、ハードウェア加速メディア・データ・エンコード及びデコードを提供するためのマルチ・フォーマット・エンコード/デコード(「MFX」:multi-format encode/decode)エンジン1933とを含む。少なくとも1つの実施例では、ジオメトリ・パイプライン1936及びメディア・エンジン1937は、各々、少なくとも1つのグラフィックス・コア1980Aによって提供されるスレッド実行リソースのための実行スレッドを生成する。
【0147】
少なくとも1つの実施例では、グラフィックス・プロセッサ1900は、各々が(コア・サブ・スライスと呼ばれることがある)複数のサブ・コア1950A~550N、1960A~1960Nを有する、(コア・スライスと呼ばれることがある)モジュール式グラフィックス・コア1980A~1980Nを特徴とするスケーラブル・スレッド実行リソースを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1900は、任意の数のグラフィックス・コア1980A~1980Nを有することができる。少なくとも1つの実施例では、グラフィックス・プロセッサ1900は、少なくとも第1のサブ・コア1950A及び第2のサブ・コア1960Aを有するグラフィックス・コア1980Aを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1900は、単一のサブ・コア(たとえば、サブ・コア1950A)をもつ低電力プロセッサである。少なくとも1つの実施例では、グラフィックス・プロセッサ1900は、各々が第1のサブ・コア1950A~1950Nのセットと第2のサブ・コア1960A~1960Nのセットとを含む、複数のグラフィックス・コア1980A~1980Nを含む。少なくとも1つの実施例では、第1のサブ・コア1950A~1950N中の各サブ・コアは、少なくとも、実行ユニット(「EU」:execution unit)1952A~1952N及びメディア/テクスチャ・サンプラ1954A~1954Nの第1のセットを含む。少なくとも1つの実施例では、第2のサブ・コア1960A~1960N中の各サブ・コアは、少なくとも、実行ユニット1962A~1962N及びサンプラ1964A~1964Nの第2のセットを含む。少なくとも1つの実施例では、各サブ・コア1950A~1950N、1960A~1960Nは、共有リソース1970A~1970Nのセットを共有する。少なくとも1つの実施例では、共有リソース1970は、共有キャッシュ・メモリ及びピクセル動作論理を含む。
【0148】
少なくとも1つの実施例では、図19に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図19に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0149】
図20は、少なくとも1つの実施例による、プロセッサ2000を示す。少なくとも1つの実施例では、プロセッサ2000は、限定はしないが、命令を実施するための論理回路を含み得る。少なくとも1つの実施例では、プロセッサ2000は、x86命令、AMR命令、ASICのための特別命令などを含む命令を実施し得る。少なくとも1つの実施例では、プロセッサ2010は、カリフォルニア州サンタクララのIntel Corporationからの、MMX(商標)技術で可能にされたマイクロプロセッサ中の64ビット幅MMXレジスタなど、パック・データを記憶するためのレジスタを含み得る。少なくとも1つの実施例では、整数形式と浮動小数点形式の両方で利用可能なMMXレジスタは、SIMD及びストリーミングSIMD拡張(「SSE」:streaming SIMD extension)命令を伴うパック・データ要素で動作し得る。少なくとも1つの実施例では、SSE2、SSE3、SSE4、AVX、又はそれ以上(総称して「SSEx」と呼ばれる)技術に関係する128ビット幅XMMレジスタは、そのようなパック・データ・オペランドを保持し得る。少なくとも1つの実施例では、プロセッサ2010は、CUDAプログラムを加速するための命令を実施し得る。
【0150】
少なくとも1つの実施例では、プロセッサ2000は、実行されるべき命令をフェッチし、プロセッサ・パイプラインにおいて後で使用されるべき命令を準備するためのイン・オーダー・フロント・エンド(「フロント・エンド」)2001を含む。少なくとも1つの実施例では、フロント・エンド2001は、いくつかのユニットを含み得る。少なくとも1つの実施例では、命令プリフェッチャ2026が、メモリから命令をフェッチし、命令を命令デコーダ2028にフィードし、命令デコーダ2028が命令を復号又は解釈する。たとえば、少なくとも1つの実施例では、命令デコーダ2028は、受信された命令を、実行のために「マイクロ命令」又は「マイクロ・オペレーション」と呼ばれる(「マイクロ・オプ」又は「uop」とも呼ばれる)1つ又は複数のオペレーションに復号する。少なくとも1つの実施例では、命令デコーダ2028は、命令を、動作を実施するためにマイクロアーキテクチャによって使用され得るオプコード及び対応するデータ並びに制御フィールドに構文解析する。少なくとも1つの実施例では、トレース・キャッシュ2030は、復号されたuopを、実行のためにuopキュー2034においてプログラム順のシーケンス又はトレースにアセンブルし得る。少なくとも1つの実施例では、トレース・キャッシュ2030が複雑な命令に遭遇したとき、マイクロコードROM2032が、動作を完了するために必要なuopを提供する。
【0151】
少なくとも1つの実施例では、単一のマイクロ・オプにコンバートされ得る命令もあれば、全動作を完了するためにいくつかのマイクロ・オプを必要とする命令もある。少なくとも1つの実施例では、命令を完了するために5つ以上のマイクロ・オプが必要とされる場合、命令デコーダ2028は、マイクロコードROM2032にアクセスして命令を実施し得る。少なくとも1つの実施例では、命令は、命令デコーダ2028における処理のために少数のマイクロ・オプに復号され得る。少なくとも1つの実施例では、命令は、動作を達成するためにいくつかのマイクロ・オプが必要とされる場合、マイクロコードROM2032内に記憶され得る。少なくとも1つの実施例では、トレース・キャッシュ2030は、マイクロコードROM2032からの1つ又は複数の命令を完了するために、エントリ・ポイント・プログラマブル論理アレイ(「PLA」:programmable logic array)を参照して、マイクロコード・シーケンスを読み取るための正しいマイクロ命令ポインタを決定する。少なくとも1つの実施例では、マイクロコードROM2032が命令のためにマイクロ・オプのシーケンシングを終えた後、機械のフロント・エンド2001は、トレース・キャッシュ2030からマイクロ・オプをフェッチすることを再開し得る。
【0152】
少なくとも1つの実施例では、アウト・オブ・オーダー実行エンジン(「アウト・オブ・オーダー・エンジン」)2003は、実行のために命令を準備し得る。少なくとも1つの実施例では、アウト・オブ・オーダー実行論理は、命令がパイプラインを下り、実行のためにスケジューリングされるときの性能を最適化するために、命令のフローを滑らかにし、それを並べ替えるためのいくつかのバッファを有する。アウト・オブ・オーダー実行エンジン2003は、限定はしないが、アロケータ/レジスタ・リネーマ2040と、メモリuopキュー2042と、整数/浮動小数点uopキュー2044と、メモリ・スケジューラ2046と、高速スケジューラ2002と、低速/汎用浮動小数点スケジューラ(「低速/汎用FP(floating point)スケジューラ」)2004と、単純浮動小数点スケジューラ(「単純FPスケジューラ」)2006とを含む。少なくとも1つの実施例では、高速スケジューラ2002、低速/汎用浮動小数点スケジューラ2004、及び単純浮動小数点スケジューラ2006は、総称して本明細書では「uopスケジューラ2002、2004、2006」とも呼ばれる。アロケータ/レジスタ・リネーマ2040は、実行するために各uopが必要とする機械バッファ及びリソースを割り振る。少なくとも1つの実施例では、アロケータ/レジスタ・リネーマ2040は、レジスタ・ファイルへのエントリ時に論理レジスタをリネームする。少なくとも1つの実施例では、アロケータ/レジスタ・リネーマ2040はまた、メモリ・スケジューラ2046及びuopスケジューラ2002、2004、2006の前の、2つのuopキュー、すなわちメモリ動作のためのメモリuopキュー2042及び非メモリ動作のための整数/浮動小数点uopキュー2044のうちの1つにおいて、各uopのためのエントリを割り振る。少なくとも1つの実施例では、uopスケジューラ2002、2004、2006は、uopがいつ実行する準備ができるかを、それらの従属入力レジスタ・オペランド・ソースが準備されていることと、それらの動作を完了するためにuopが必要とする実行リソースの利用可能性とに基づいて、決定する。少なくとも1つの実施例では、少なくとも1つの実施例の高速スケジューラ2002は、メイン・クロック・サイクルの半分ごとにスケジューリングし得、低速/汎用浮動小数点スケジューラ2004及び単純浮動小数点スケジューラ2006は、メイン・プロセッサ・クロック・サイクル当たりに1回スケジューリングし得る。少なくとも1つの実施例では、uopスケジューラ2002、2004、2006は、実行のためにuopをスケジューリングするためにディスパッチ・ポートを調停する。
【0153】
少なくとも1つの実施例では、実行ブロック2011は、限定はしないが、整数レジスタ・ファイル/バイパス・ネットワーク2008と、浮動小数点レジスタ・ファイル/バイパス・ネットワーク(「FPレジスタ・ファイル/バイパス・ネットワーク」)2010と、アドレス生成ユニット(「AGU」:address generation unit)2012及び2014と、高速ALU2016及び2018と、低速ALU2020と、浮動小数点ALU(「FP」)2022と、浮動小数点移動ユニット(「FP移動」)2024とを含む。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2008及び浮動小数点レジスタ・ファイル/バイパス・ネットワーク2010は、本明細書では「レジスタ・ファイル2008、2010」とも呼ばれる。少なくとも1つの実施例では、AGU2012及び2014、高速ALU2016及び2018、低速ALU2020、浮動小数点ALU2022、及び浮動小数点移動ユニット2024は、本明細書では「実行ユニット2012、2014、2016、2018、2020、2022、及び2024」とも呼ばれる。少なくとも1つの実施例では、実行ブロックは、限定はしないが、(ゼロを含む)任意の数及びタイプのレジスタ・ファイル、バイパス・ネットワーク、アドレス生成ユニット、及び実行ユニットを、任意の組合せで含み得る。
【0154】
少なくとも1つの実施例では、レジスタ・ファイル2008、2010は、uopスケジューラ2002、2004、2006と、実行ユニット2012、2014、2016、2018、2020、2022、及び2024との間に配置され得る。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2008は、整数演算を実施する。少なくとも1つの実施例では、浮動小数点レジスタ・ファイル/バイパス・ネットワーク2010は、浮動小数点演算を実施する。少なくとも1つの実施例では、レジスタ・ファイル2008、2010の各々は、限定はしないが、バイパス・ネットワークを含み得、バイパス・ネットワークは、レジスタ・ファイルにまだ書き込まれていない完了したばかりの結果を、新しい従属uopにバイパス又はフォワーディングし得る。少なくとも1つの実施例では、レジスタ・ファイル2008、2010は、互いにデータを通信し得る。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2008は、限定はしないが、2つの別個のレジスタ・ファイル、すなわち低次32ビットのデータのための1つのレジスタ・ファイル及び高次32ビットのデータのための第2のレジスタ・ファイルを含み得る。少なくとも1つの実施例では、浮動小数点命令は、通常、64~128ビット幅のオペランドを有するので、浮動小数点レジスタ・ファイル/バイパス・ネットワーク2010は、限定はしないが、128ビット幅のエントリを含み得る。
【0155】
少なくとも1つの実施例では、実行ユニット2012、2014、2016、2018、2020、2022、2024は、命令を実行し得る。少なくとも1つの実施例では、レジスタ・ファイル2008、2010は、マイクロ命令が実行する必要がある整数及び浮動小数点データ・オペランド値を記憶する。少なくとも1つの実施例では、プロセッサ2000は、限定はしないが、任意の数及び組合せの実行ユニット2012、2014、2016、2018、2020、2022、2024を含み得る。少なくとも1つの実施例では、浮動小数点ALU2022及び浮動小数点移動ユニット2024は、浮動小数点、MMX、SIMD、AVX及びSSE、又は他の演算を実行し得る。少なくとも1つの実施例では、浮動小数点ALU2022は、限定はしないが、除算、平方根、及び剰余マイクロ・オプを実行するための64ビットずつの浮動小数点デバイダを含み得る。少なくとも1つの実施例では、浮動小数点値を伴う命令は、浮動小数点ハードウェアで対処され得る。少なくとも1つの実施例では、ALU演算は、高速ALU2016、2018に渡され得る。少なくとも1つの実施例では、高速ALU2016、2018は、クロック・サイクルの半分の実効レイテンシを伴う高速演算を実行し得る。少なくとも1つの実施例では、低速ALU2020は、限定はしないが、乗数、シフト、フラグ論理、及びブランチ処理などの長レイテンシ・タイプの演算のための整数実行ハードウェアを含み得るので、ほとんどの複雑な整数演算は低速ALU2020に進む。少なくとも1つの実施例では、メモリ・ロード/ストア動作は、AGU2012、2014によって実行され得る。少なくとも1つの実施例では、高速ALU2016、高速ALU2018、及び低速ALU2020は、64ビット・データ・オペランドで整数演算を実施し得る。少なくとも1つの実施例では、高速ALU2016、高速ALU2018、及び低速ALU2020は、16、32、128、256などを含む様々なデータ・ビット・サイズをサポートするために実装され得る。少なくとも1つの実施例では、浮動小数点ALU2022及び浮動小数点移動ユニット2024は、様々なビット幅を有する様々なオペランドをサポートするために実装され得る。少なくとも1つの実施例では、浮動小数点ALU2022及び浮動小数点移動ユニット2024は、SIMD及びマルチメディア命令と併せた128ビット幅のパック・データ・オペランドで動作し得る。
【0156】
少なくとも1つの実施例では、uopスケジューラ2002、2004、2006は、親ロードが実行し終える前に従属演算をディスパッチする。少なくとも1つの実施例では、uopは、プロセッサ2000において投機的にスケジューリング及び実行され得るので、プロセッサ2000は、メモリ・ミスに対処するための論理をも含み得る。少なくとも1つの実施例では、データ・キャッシュにおいてデータ・ロードがミスした場合、一時的に不正確なデータをもつスケジューラを通り過ぎたパイプラインにおいて、進行中の従属演算があり得る。少なくとも1つの実施例では、リプレイ機構が、不正確なデータを使用する命令を追跡及び再実行する。少なくとも1つの実施例では、従属演算は、リプレイされる必要があり得、独立した演算は、完了することを可能にされ得る。少なくとも1つの実施例では、プロセッサの少なくとも1つの実施例のスケジューラ及びリプレイ機構はまた、テキスト・ストリング比較演算のための命令シーケンスを捕捉するように設計され得る。
【0157】
少なくとも1つの実施例では、「レジスタ」という用語は、オペランドを識別するための命令の一部として使用され得るオンボード・プロセッサ・ストレージ・ロケーションを指し得る。少なくとも1つの実施例では、レジスタは、(プログラマの視点から見て)プロセッサの外部から使用可能であり得るものであり得る。少なくとも1つの実施例では、レジスタは、特定のタイプの回路に限定されないことがある。むしろ、少なくとも1つの実施例では、レジスタは、データを記憶し、データを提供し、本明細書で説明される機能を実施し得る。少なくとも1つの実施例では、本明細書で説明されるレジスタは、専用物理レジスタ、レジスタ・リネーミングを使用して動的に割り振られる物理レジスタ、専用物理レジスタと動的に割り振られる物理レジスタとの組合せなど、任意の数の異なる技法を使用して、プロセッサ内の回路要素によって実装され得る。少なくとも1つの実施例では、整数レジスタは、32ビット整数データを記憶する。少なくとも1つの実施例のレジスタ・ファイルは、パック・データのための8つのマルチメディアSIMDレジスタをも含んでいる。
【0158】
少なくとも1つの実施例では、図20に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図20に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0159】
図21は、少なくとも1つの実施例による、プロセッサ2100を示す。少なくとも1つの実施例では、プロセッサ2100は、限定はしないが、1つ又は複数のプロセッサ・コア(「コア」)2102A~2102Nと、統合されたメモリ・コントローラ2114と、統合されたグラフィックス・プロセッサ2108とを含む。少なくとも1つの実施例では、プロセッサ2100は、破線ボックスによって表される追加プロセッサ・コア2102Nまでの追加コアを含むことができる。少なくとも1つの実施例では、プロセッサ・コア2102A~2102Nの各々は、1つ又は複数の内部キャッシュ・ユニット2104A~2104Nを含む。少なくとも1つの実施例では、各プロセッサ・コアはまた、1つ又は複数の共有キャッシュ・ユニット2106へのアクセスを有する。
【0160】
少なくとも1つの実施例では、内部キャッシュ・ユニット2104A~2104Nと共有キャッシュ・ユニット2106とは、プロセッサ2100内のキャッシュ・メモリ階層を表す。少なくとも1つの実施例では、キャッシュ・メモリ・ユニット2104A~2104Nは、各プロセッサ・コア内の命令及びデータ・キャッシュの少なくとも1つのレベル、及びL2、L3、レベル4(「L4」)などの共有中間レベル・キャッシュの1つ又は複数のレベル、又はキャッシュの他のレベルを含み得、ここで、外部メモリの前の最高レベルのキャッシュは、LLCとして分類される。少なくとも1つの実施例では、キャッシュ・コヒーレンシ論理は、様々なキャッシュ・ユニット2106及び2104A~2104N間でコヒーレンシを維持する。
【0161】
少なくとも1つの実施例では、プロセッサ2100は、1つ又は複数のバス・コントローラ・ユニット2116とシステム・エージェント・コア2110とのセットをも含み得る。少なくとも1つの実施例では、1つ又は複数のバス・コントローラ・ユニット2116は、1つ又は複数のPCI又はPCIエクスプレス・バスなどの周辺バスのセットを管理する。少なくとも1つの実施例では、システム・エージェント・コア2110は、様々なプロセッサ構成要素のための管理機能性を提供する。少なくとも1つの実施例では、システム・エージェント・コア2110は、様々な外部メモリ・デバイス(図示せず)へのアクセスを管理するための1つ又は複数の統合されたメモリ・コントローラ2114を含む。
【0162】
少なくとも1つの実施例では、プロセッサ・コア2102A~2102Nのうちの1つ又は複数は、同時マルチスレッディングのサポートを含む。少なくとも1つの実施例では、システム・エージェント・コア2110は、マルチスレッド処理中にプロセッサ・コア2102A~2102Nを協調させ、動作させるための構成要素を含む。少なくとも1つの実施例では、システム・エージェント・コア2110は、追加として、電力制御ユニット(「PCU」:power control unit)を含み得、PCUは、プロセッサ・コア2102A~2102N及びグラフィックス・プロセッサ2108の1つ又は複数の電力状態を調節するための論理及び構成要素を含む。
【0163】
少なくとも1つの実施例では、プロセッサ2100は、追加として、グラフィックス処理動作を実行するためのグラフィックス・プロセッサ2108を含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2108は、共有キャッシュ・ユニット2106、及び1つ又は複数の統合されたメモリ・コントローラ2114を含むシステム・エージェント・コア2110と結合する。少なくとも1つの実施例では、システム・エージェント・コア2110は、1つ又は複数の結合されたディスプレイへのグラフィックス・プロセッサ出力を駆動するためのディスプレイ・コントローラ2111をも含む。少なくとも1つの実施例では、ディスプレイ・コントローラ2111はまた、少なくとも1つの相互接続を介してグラフィックス・プロセッサ2108と結合された別個のモジュールであり得るか、又はグラフィックス・プロセッサ2108内に組み込まれ得る。
【0164】
少なくとも1つの実施例では、プロセッサ2100の内部構成要素を結合するために、リング・ベースの相互接続ユニット2112が使用される。少なくとも1つの実施例では、ポイントツーポイント相互接続、切替え相互接続、又は他の技法などの代替相互接続ユニットが使用され得る。少なくとも1つの実施例では、グラフィックス・プロセッサ2108は、I/Oリンク2113を介してリング相互接続2112と結合する。
【0165】
少なくとも1つの実施例では、I/Oリンク2113は、様々なプロセッサ構成要素と、eDRAMモジュールなどの高性能組み込みメモリ・モジュール2118との間の通信を容易にするオン・パッケージI/O相互接続を含む、複数の種類のI/O相互接続のうちの少なくとも1つを表す。少なくとも1つの実施例では、プロセッサ・コア2102A~2102Nの各々と、グラフィックス・プロセッサ2108とは、共有LLCとして組み込みメモリ・モジュール2118を使用する。
【0166】
少なくとも1つの実施例では、プロセッサ・コア2102A~2102Nは、共通の命令セット・アーキテクチャを実行する同種のコアである。少なくとも1つの実施例では、プロセッサ・コア2102A~2102Nは、ISAという観点から異種であり、ここで、プロセッサ・コア2102A~2102Nのうちの1つ又は複数は、共通の命令セットを実行し、プロセッサ・コア2102A~21-02Nのうちの1つ又は複数の他のコアは、共通の命令セットのサブセット、又は異なる命令セットを実行する。少なくとも1つの実施例では、プロセッサ・コア2102A~2102Nは、マイクロアーキテクチャという観点から異種であり、ここで、電力消費量が比較的高い1つ又は複数のコアは、電力消費量がより低い1つ又は複数のコアと結合する。少なくとも1つの実施例では、プロセッサ2100は、1つ又は複数のチップ上に、又はSoC集積回路として実装され得る。
【0167】
少なくとも1つの実施例では、図21に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図21に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0168】
図22は、説明される少なくとも1つの実施例による、グラフィックス・プロセッサ・コア2200を示す。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2200は、グラフィックス・コア・アレイ内に含まれる。少なくとも1つの実施例では、コア・スライスと呼ばれることもあるグラフィックス・プロセッサ・コア2200は、モジュール式グラフィックス・プロセッサ内の1つ又は複数のグラフィックス・コアであり得る。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2200は、1つのグラフィックス・コア・スライスの例示であり、本明細書で説明されるグラフィックス・プロセッサは、ターゲット電力及び性能エンベロープに基づいて、複数のグラフィックス・コア・スライスを含み得る。少なくとも1つの実施例では、各グラフィックス・コア2200は、汎用及び固定機能論理のモジュール式ブロックを含む、サブ・スライスとも呼ばれる複数のサブ・コア2201A~2201Fと結合された固定機能ブロック2230を含むことができる。
【0169】
少なくとも1つの実施例では、固定機能ブロック2230は、たとえば、より低い性能及び/又はより低い電力のグラフィックス・プロセッサ実装形態において、グラフィックス・プロセッサ2200中のすべてのサブ・コアによって共有され得るジオメトリ/固定機能パイプライン2236を含む。少なくとも1つの実施例では、ジオメトリ/固定機能パイプライン2236は、3D固定機能パイプラインと、ビデオ・フロント・エンド・ユニットと、スレッド・スポーナ(spawner)及びスレッド・ディスパッチャと、統一リターン・バッファを管理する統一リターン・バッファ・マネージャとを含む。
【0170】
少なくとも1つの実施例では、固定機能ブロック2230はまた、グラフィックスSoCインターフェース2237と、グラフィックス・マイクロコントローラ2238と、メディア・パイプライン2239とを含む。グラフィックスSoCインターフェース2237は、グラフィックス・コア2200と、SoC集積回路内の他のプロセッサ・コアとの間のインターフェースを提供する。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2238は、スレッド・ディスパッチと、スケジューリングと、プリエンプションとを含む、グラフィックス・プロセッサ2200の様々な機能を管理するように構成可能であるプログラマブル・サブ・プロセッサである。少なくとも1つの実施例では、メディア・パイプライン2239は、画像及びビデオ・データを含むマルチメディア・データの復号、符号化、前処理、及び/又は後処理を容易にするための論理を含む。少なくとも1つの実施例では、メディア・パイプライン2239は、サブ・コア2201~2201F内のコンピュート論理又はサンプリング論理への要求を介して、メディア動作を実装する。
【0171】
少なくとも1つの実施例では、SoCインターフェース2237は、グラフィックス・コア2200が汎用アプリケーション・プロセッサ・コア(たとえば、CPU)及び/又はSoC内の他の構成要素と通信することを可能にし、SoC内の他の構成要素は、共有LLCメモリ、システムRAM、及び/或いは組み込みオンチップ又はオンパッケージDRAMなどのメモリ階層要素を含む。少なくとも1つの実施例では、SoCインターフェース2237はまた、カメラ撮像パイプラインなど、SoC内の固定機能デバイスとの通信を可能にすることができ、グラフィックス・コア2200とSoC内のCPUとの間で共有され得るグローバル・メモリ・アトミックの使用を可能にし、及び/又はそれを実装する。少なくとも1つの実施例では、SoCインターフェース2237はまた、グラフィックス・コア2200のための電力管理制御を実装し、グラフィック・コア2200のクロック・ドメインとSoC内の他のクロック・ドメインとの間のインターフェースを可能にすることができる。少なくとも1つの実施例では、SoCインターフェース2237は、グラフィックス・プロセッサ内の1つ又は複数のグラフィックス・コアの各々にコマンド及び命令を提供するように構成されたコマンド・ストリーマ及びグローバル・スレッド・ディスパッチャからのコマンド・バッファの受信を可能にする。少なくとも1つの実施例では、コマンド及び命令は、メディア動作が実施されるべきであるときにメディア・パイプライン2239にディスパッチされ得るか、又は、グラフィックス処理動作が実施されるべきであるときにジオメトリ及び固定機能パイプライン(たとえば、ジオメトリ及び固定機能パイプライン2236、ジオメトリ及び固定機能パイプライン2214)にディスパッチされ得る。
【0172】
少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2238は、グラフィックス・コア2200のための様々なスケジューリング及び管理タスクを実施するように構成され得る。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2238は、サブ・コア2201A~2201F内の実行ユニット(EU)アレイ2202A~2202F、2204A~2204F内の様々なグラフィックス並列エンジンに対して、グラフィックスを実施し、及び/又はワークロード・スケジューリングを算出することができる。少なくとも1つの実施例では、グラフィックス・コア2200を含むSoCのCPUコア上で実行しているホスト・ソフトウェアは、複数のグラフィック・プロセッサ・ドアベルのうちの1つにワークロードをサブミットすることができ、このドアベルが、適切なグラフィックス・エンジンに対するスケジューリング動作を呼び出す。少なくとも1つの実施例では、スケジューリング動作は、どのワークロードを次に稼働すべきかを決定することと、ワークロードをコマンド・ストリーマにサブミットすることと、エンジン上で稼働している既存のワークロードをプリエンプトすることと、ワークロードの進行を監視することと、ワークロードが完了したときにホスト・ソフトウェアに通知することとを含む。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2238はまた、グラフィックス・コア2200のための低電力又はアイドル状態を促進して、オペレーティング・システム及び/又はシステム上のグラフィックス・ドライバ・ソフトウェアとは無関係に、低電力状態移行にわたってグラフィックス・コア2200内のレジスタを保存及び復元するアビリティをグラフィックス・コア2200に提供することができる。
【0173】
少なくとも1つの実施例では、グラフィックス・コア2200は、示されているサブ・コア2201A~2201Fよりも多い又はそれよりも少ない、N個までのモジュール式サブ・コアを有し得る。N個のサブ・コアの各セットについて、少なくとも1つの実施例では、グラフィックス・コア2200はまた、共有機能論理2210、共有及び/又はキャッシュ・メモリ2212、ジオメトリ/固定機能パイプライン2214、並びに様々なグラフィックスを加速し、処理動作を算出するための追加の固定機能論理2216を含むことができる。少なくとも1つの実施例では、共有機能論理2210は、グラフィックス・コア2200内の各N個のサブ・コアによって共有され得る論理ユニット(たとえば、サンプラ、数理、及び/又はスレッド間通信論理)を含むことができる。共有及び/又はキャッシュ・メモリ2212は、グラフィックス・コア2200内のN個のサブ・コア2201A~2201FのためのLLCであり得、また、複数のサブ・コアによってアクセス可能である共有メモリとして働き得る。少なくとも1つの実施例では、ジオメトリ/固定機能パイプライン2214は、固定機能ブロック2230内のジオメトリ/固定機能パイプライン2236の代わりに含まれ得、同じ又は同様の論理ユニットを含むことができる。
【0174】
少なくとも1つの実施例では、グラフィックス・コア2200は、グラフィックス・コア2200による使用のための様々な固定機能加速論理を含むことができる追加の固定機能論理2216を含む。少なくとも1つの実施例では、追加の固定機能論理2216は、位置限定シェーディング(position only shading)において使用するための追加のジオメトリ・パイプラインを含む。位置限定シェーディングでは、少なくとも2つのジオメトリ・パイプラインが存在するが、ジオメトリ/固定機能パイプライン2216、2236内の完全ジオメトリ・パイプライン、並びに選別パイプライン(cull pipeline)においてであり、選別パイプラインは、追加の固定機能論理2216内に含まれ得る追加のジオメトリ・パイプラインである。少なくとも1つの実施例では、選別パイプラインは、完全ジオメトリ・パイプラインの縮小版である。少なくとも1つの実施例では、完全パイプライン及び選別パイプラインは、アプリケーションの異なるインスタンスを実行することができ、各インスタンスは別個のコンテキストを有する。少なくとも1つの実施例では、位置限定シェーディングは、切り捨てられた三角形の長い選別ランを隠すことができ、これは、いくつかのインスタンスにおいてシェーディングがより早く完了することを可能にする。たとえば、少なくとも1つの実施例では、選別パイプラインは、ピクセルの、フレーム・バッファへのラスタ化及びレンダリングを実施することなしに、頂点の位置属性をフェッチし、シェーディングするので、追加の固定機能論理2216内の選別パイプライン論理は、メイン・アプリケーションと並列で位置シェーダを実行することができ、全体的に完全パイプラインよりも速く臨界結果(critical result)を生成する。少なくとも1つの実施例では、選別パイプラインは、生成された臨界結果を使用して、すべての三角形について、それらの三角形が選別されているかどうかにかかわらず、可視性情報を算出することができる。少なくとも1つの実施例では、(このインスタンスではリプレイ・パイプラインと呼ばれることがある)完全パイプラインは、可視性情報を消費して、選別された三角形を飛ばして可視三角形のみをシェーディングすることができ、可視三角形は、最終的にラスタ化フェーズに渡される。
【0175】
少なくとも1つの実施例では、追加の固定機能論理2216はまた、CUDAプログラムを加速するために、固定機能行列乗算論理など、汎用処理加速論理を含むことができる。
【0176】
少なくとも1つの実施例では、各グラフィックス・サブ・コア2201A~2201Fは、実行リソースのセットを含み、実行リソースのセットは、グラフィックス・パイプライン、メディア・パイプライン、又はシェーダ・プログラムによる要求に応答して、グラフィックス動作、メディア動作、及びコンピュート動作を実施するために使用され得る。少なくとも1つの実施例では、グラフィックス・サブ・コア2201A~2201Fは、複数のEUアレイ2202A~2202F、2204A~2204Fと、スレッド・ディスパッチ及びスレッド間通信(「TD/IC」:thread dispatch and inter-thread communication)論理2203A~2203Fと、3D(たとえば、テクスチャ)サンプラ2205A~2205Fと、メディア・サンプラ2206A~2206Fと、シェーダ・プロセッサ2207A~2207Fと、共有ローカル・メモリ(「SLM」:shared local memory)2208A~2208Fとを含む。EUアレイ2202A~2202F、2204A~2204Fは、各々、複数の実行ユニットを含み、複数の実行ユニットは、グラフィックス、メディア、又はコンピュート・シェーダ・プログラムを含むグラフィックス動作、メディア動作、又はコンピュート動作のサービスにおいて浮動小数点及び整数/固定小数点論理演算を実施することが可能なGPGPUである。少なくとも1つの実施例では、TD/IC論理2203A~2203Fは、サブ・コア内の実行ユニットのためのローカル・スレッド・ディスパッチ及びスレッド制御動作を実施し、サブ・コアの実行ユニット上で実行しているスレッド間の通信を容易にする。少なくとも1つの実施例では、3Dサンプラ2205A~2205Fは、テクスチャ又は他の3Dグラフィックス関係データをメモリに読み取ることができる。少なくとも1つの実施例では、3Dサンプラは、所与のテクスチャに関連する、構成されたサンプル状態及びテクスチャ・フォーマットに基づいて、テクスチャ・データを異なるやり方で読み取ることができる。少なくとも1つの実施例では、メディア・サンプラ2206A~2206Fは、メディア・データに関連するタイプ及びフォーマットに基づいて、同様の読取り動作を実施することができる。少なくとも1つの実施例では、各グラフィックス・サブ・コア2201A~2201Fは、代替的に統一3D及びメディア・サンプラを含むことができる。少なくとも1つの実施例では、サブ・コア2201A~2201Fの各々内の実行ユニット上で実行しているスレッドは、スレッド・グループ内で実行しているスレッドがオンチップ・メモリの共通のプールを使用して実行することを可能にするために、各サブ・コア内の共有ローカル・メモリ2208A~2208Fを利用することができる。
【0177】
少なくとも1つの実施例では、図22に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図22に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0178】
図23は、少なくとも1つの実施例による、並列処理ユニット(「PPU」)2300を示す。少なくとも1つの実施例では、PPU2300は、PPU2300によって実行された場合、PPU2300に、本明細書で説明されるプロセス及び技法のいくつか又はすべてを実施させる機械可読コードで構成される。少なくとも1つの実施例では、PPU2300はマルチスレッド・プロセッサであり、マルチスレッド・プロセッサは、1つ又は複数の集積回路デバイス上で実装され、(機械可読命令又は単に命令とも呼ばれる)コンピュータ可読命令を複数のスレッド上で並列に処理するように設計されたレイテンシ隠蔽技法としてマルチスレッディングを利用する。少なくとも1つの実施例では、スレッドは、実行のスレッドを指し、PPU2300によって実行されるように構成された命令のセットのインスタンス化である。少なくとも1つの実施例では、PPU2300は、LCDデバイスなどのディスプレイ・デバイス上での表示のための2次元(「2D」)画像データを生成するために3次元(「3D」)グラフィックス・データを処理するためのグラフィックス・レンダリング・パイプラインを実装するように構成されたGPUである。少なくとも1つの実施例では、PPU2300は、線形代数演算及び機械学習演算などの算出を実施するために利用される。図23は、単に例示を目的とした例示的な並列プロセッサを示し、少なくとも1つの実施例において実装され得るプロセッサ・アーキテクチャの非限定的な実例として解釈されるべきである。
【0179】
少なくとも1つの実施例では、1つ又は複数のPPU2300は、高性能コンピューティング(「HPC」:High Performance Computing)、データ・センタ、及び機械学習アプリケーションを加速するように構成される。少なくとも1つの実施例では、1つ又は複数のPPU2300は、CUDAプログラムを加速するように構成される。少なくとも1つの実施例では、PPU2300は、限定はしないが、I/Oユニット2306と、フロント・エンド・ユニット2310と、スケジューラ・ユニット2312と、ワーク分散ユニット2314と、ハブ2316と、クロスバー(「Xバー」:crossbar)2320と、1つ又は複数の汎用処理クラスタ(「GPC」:general processing cluster)2318と、1つ又は複数のパーティション・ユニット(「メモリ・パーティション・ユニット」)2322とを含む。少なくとも1つの実施例では、PPU2300は、1つ又は複数の高速GPU相互接続(「GPU相互接続」)2308を介してホスト・プロセッサ又は他のPPU2300に接続される。少なくとも1つの実施例では、PPU2300は、システム・バス又は相互接続2302を介してホスト・プロセッサ又は他の周辺デバイスに接続される。少なくとも1つの実施例では、PPU2300は、1つ又は複数のメモリ・デバイス(「メモリ」)2304を備えるローカル・メモリに接続される。少なくとも1つの実施例では、メモリ・デバイス2304は、限定はしないが、1つ又は複数のダイナミック・ランダム・アクセス・メモリ(DRAM)デバイスを含む。少なくとも1つの実施例では、1つ又は複数のDRAMデバイスは、複数のDRAMダイが各デバイス内で積層された高帯域幅メモリ(「HBM」)サブシステムとして構成され、及び/又は構成可能である。
【0180】
少なくとも1つの実施例では、高速GPU相互接続2308は、ワイヤ・ベースのマルチ・レーン通信リンクを指し得、ワイヤ・ベースのマルチ・レーン通信リンクは、1つ又は複数のCPUと組み合わせられた1つ又は複数のPPU2300をスケーリングし、含めるために、システムによって使用され、PPU2300とCPUとの間のキャッシュ・コヒーレンス、及びCPUマスタリングをサポートする。少なくとも1つの実施例では、データ及び/又はコマンドは、高速GPU相互接続2308によって、ハブ2316を通して、1つ又は複数のコピー・エンジン、ビデオ・エンコーダ、ビデオ・デコーダ、電力管理ユニット、及び図23に明示的に示されていないこともある他の構成要素など、PPU2300の他のユニットに/から送信される。
【0181】
少なくとも1つの実施例では、I/Oユニット2306は、システム・バス2302を介して(図23に示されていない)ホスト・プロセッサから通信(たとえば、コマンド、データ)を送受信するように構成される。少なくとも1つの実施例では、I/Oユニット2306は、システム・バス2302を介して直接、又は、メモリ・ブリッジなどの1つ又は複数の中間デバイスを通して、ホスト・プロセッサと通信する。少なくとも1つの実施例では、I/Oユニット2306は、システム・バス2302を介してPPU2300のうちの1つ又は複数などの1つ又は複数の他のプロセッサと通信し得る。少なくとも1つの実施例では、I/Oユニット2306は、PCIeインターフェースを、PCIeバスを介した通信のために実装する。少なくとも1つの実施例では、I/Oユニット2306は、外部デバイスと通信するためのインターフェースを実装する。
【0182】
少なくとも1つの実施例では、I/Oユニット2306は、システム・バス2302を介して受信されたパケットを復号する。少なくとも1つの実施例では、少なくともいくつかのパケットは、PPU2300に様々な動作を実施させるように構成されたコマンドを表す。少なくとも1つの実施例では、I/Oユニット2306は、復号されたコマンドを、コマンドによって指定されるPPU2300の様々な他のユニットに送信する。少なくとも1つの実施例では、コマンドは、フロント・エンド・ユニット2310に送信され、及び/或いは、ハブ2316、又は(図23に明示的に示されていない)1つ又は複数のコピー・エンジン、ビデオ・エンコーダ、ビデオ・デコーダ、電力管理ユニットなど、PPU2300の他のユニットに送信される。少なくとも1つの実施例では、I/Oユニット2306はPPU2300の様々な論理ユニット間で及びそれらの間で通信をルーティングするように構成される。
【0183】
少なくとも1つの実施例では、ホスト・プロセッサによって実行されるプログラムは、処理のためにワークロードをPPU2300に提供するバッファにおいて、コマンド・ストリームを符号化する。少なくとも1つの実施例では、ワークロードは、命令と、それらの命令によって処理されるべきデータとを含む。少なくとも1つの実施例では、バッファは、ホスト・プロセッサとPPU2300の両方によってアクセス(たとえば、読取り/書込み)可能であるメモリ中の領域であり、ホスト・インターフェース・ユニットは、I/Oユニット2306によってシステム・バス2302を介して送信されるメモリ要求を介して、システム・バス2302に接続されたシステム・メモリ中のバッファにアクセスするように構成され得る。少なくとも1つの実施例では、ホスト・プロセッサは、バッファにコマンド・ストリームを書き込み、次いでコマンド・ストリームの開始に対するポインタをPPU2300に送信し、それにより、フロント・エンド・ユニット2310は、1つ又は複数のコマンド・ストリームに対するポインタを受信し、1つ又は複数のコマンド・ストリームを管理して、コマンド・ストリームからコマンドを読み取り、コマンドをPPU2300の様々なユニットにフォワーディングする。
【0184】
少なくとも1つの実施例では、フロント・エンド・ユニット2310は、1つ又は複数のコマンド・ストリームによって定義されるタスクを処理するように様々なGPC2318を構成するスケジューラ・ユニット2312に結合される。少なくとも1つの実施例では、スケジューラ・ユニット2312は、スケジューラ・ユニット2312によって管理される様々なタスクに関係する状態情報を追跡するように構成され、状態情報は、GPC2318のうちのどれにタスクが割り当てられるか、タスクがアクティブであるのか非アクティブであるのか、タスクに関連する優先レベルなどを示し得る。少なくとも1つの実施例では、スケジューラ・ユニット2312は、GPC2318のうちの1つ又は複数上での複数のタスクの実行を管理する。
【0185】
少なくとも1つの実施例では、スケジューラ・ユニット2312は、GPC2318上での実行のためのタスクをディスパッチするように構成されたワーク分散ユニット2314に結合される。少なくとも1つの実施例では、ワーク分散ユニット2314は、スケジューラ・ユニット2312から受信された、スケジューリングされたタスクの数を追跡し、ワーク分散ユニット2314は、GPC2318の各々について、ペンディング・タスク・プール及びアクティブ・タスク・プールを管理する。少なくとも1つの実施例では、ペンディング・タスク・プールは、特定のGPC2318によって処理されるように割り当てられたタスクを含んでいるいくつかのスロット(たとえば、32個のスロット)を備え、アクティブ・タスク・プールは、GPC2318によってアクティブに処理されているタスクのためのいくつかのスロット(たとえば、4つのスロット)を備え得、それにより、GPC2318のうちの1つがタスクの実行を完了したとき、GPC2318のためのアクティブ・タスク・プールからそのタスクが排除され、ペンディング・タスク・プールからの他のタスクのうちの1つが選択され、GPC2318上での実行のためにスケジューリングされる。少なくとも1つの実施例では、データ依存性が解決されるのを待っている間など、アクティブ・タスクがGPC2318上でアイドルである場合、アクティブ・タスクがGPC2318から排除され、ペンディング・タスク・プールに戻され、その間に、ペンディング・タスク・プール中の別のタスクが選択され、GPC2318上での実行のためにスケジューリングされる。
【0186】
少なくとも1つの実施例では、ワーク分散ユニット2314は、Xバー2320を介して1つ又は複数のGPC2318と通信する。少なくとも1つの実施例では、Xバー2320は、PPU2300の多くのユニットをPPU2300の他のユニットに結合する相互接続ネットワークであり、ワーク分散ユニット2314を特定のGPC2318に結合するように構成され得る。少なくとも1つの実施例では、PPU2300の1つ又は複数の他のユニットも、ハブ2316を介してXバー2320に接続され得る。
【0187】
少なくとも1つの実施例では、タスクはスケジューラ・ユニット2312によって管理され、ワーク分散ユニット2314によってGPC2318のうちの1つにディスパッチされる。GPC2318は、タスクを処理し、結果を生成するように構成される。少なくとも1つの実施例では、結果は、GPC2318内の他のタスクによって消費されるか、Xバー2320を介して異なるGPC2318にルーティングされるか、又はメモリ2304に記憶され得る。少なくとも1つの実施例では、結果は、パーティション・ユニット2322を介してメモリ2304に書き込まれ得、パーティション・ユニット2322は、メモリ2304への/からのデータの読取り及び書込みを行うためのメモリ・インターフェースを実装する。少なくとも1つの実施例では、結果は、高速GPU相互接続2308を介して別のPPU2304又はCPUに送信され得る。少なくとも1つの実施例では、PPU2300は、限定はしないが、PPU2300に結合された別個の個別メモリ・デバイス2304の数に等しいU個のパーティション・ユニット2322を含む。
【0188】
少なくとも1つの実施例では、ホスト・プロセッサはドライバ・カーネルを実行し、ドライバ・カーネルは、ホスト・プロセッサ上で実行している1つ又は複数のアプリケーションがPPU2300上での実行のために動作をスケジューリングすることを可能にするアプリケーション・プログラミング・インターフェース(「API」)を実装する。少なくとも1つの実施例では、複数のコンピュート・アプリケーションが、PPU2300によって同時に実行され、PPU2300は、複数のコンピュート・アプリケーションに対して、隔離、サービス品質(「QoS」:quality of service)、及び独立したアドレス空間を提供する。少なくとも1つの実施例では、アプリケーションは、PPU2300による実行のための1つ又は複数のタスクをドライバ・カーネルに生成させる(たとえば、APIコールの形態の)命令を生成し、ドライバ・カーネルは、PPU2300によって処理されている1つ又は複数のストリームにタスクを出力する。少なくとも1つの実施例では、各タスクは、ワープと呼ばれることがある関係スレッドの1つ又は複数のグループを備える。少なくとも1つの実施例では、ワープは、並列に実行され得る複数の関係スレッド(たとえば、32個のスレッド)を備える。少なくとも1つの実施例では、連動スレッドは、タスクを実施するための命令を含み、共有メモリを通してデータを交換する、複数のスレッドを指すことができる。
【0189】
少なくとも1つの実施例では、図23に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図23に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0190】
図24は、少なくとも1つの実施例による、GPC2400を示す。少なくとも1つの実施例では、GPC2400は、図23のGPC2318である。少なくとも1つの実施例では、各GPC2400は、限定はしないが、タスクを処理するためのいくつかのハードウェア・ユニットを含み、各GPC2400は、限定はしないが、パイプライン・マネージャ2402、プレ・ラスタ演算ユニット(「PROP」)2404、ラスタ・エンジン2408、ワーク分散クロスバー(「WDX」:work distribution crossbar)2416、MMU2418、1つ又は複数のデータ処理クラスタ(「DPC」:Data Processing Cluster)2406、及びパーツの任意の好適な組合せを含む。
【0191】
少なくとも1つの実施例では、GPC2400の動作は、パイプライン・マネージャ2402によって制御される。少なくとも1つの実施例では、パイプライン・マネージャ2402は、GPC2400に割り振られたタスクを処理するための1つ又は複数のDPC2406の構成を管理する。少なくとも1つの実施例では、パイプライン・マネージャ2402は、グラフィックス・レンダリング・パイプラインの少なくとも一部分を実装するように、1つ又は複数のDPC2406のうちの少なくとも1つを構成する。少なくとも1つの実施例では、DPC2406は、プログラマブル・ストリーミング・マルチプロセッサ(「SM」:streaming multiprocessor)2414上で頂点シェーダ・プログラムを実行するように構成される。少なくとも1つの実施例では、パイプライン・マネージャ2402は、ワーク分散ユニットから受信されたパケットを、GPC2400内の適切な論理ユニットにルーティングするように構成され、少なくとも1つの実施例では、いくつかのパケットは、PROP2404中の固定機能ハードウェア・ユニット及び/又はラスタ・エンジン2408にルーティングされ得、他のパケットは、プリミティブ・エンジン2412又はSM2414による処理のためにDPC2406にルーティングされ得る。少なくとも1つの実施例では、パイプライン・マネージャ2402は、コンピューティング・パイプラインを実装するように、DPC2406のうちの少なくとも1つを構成する。少なくとも1つの実施例では、パイプライン・マネージャ2402は、CUDAプログラムの少なくとも一部分を実行するように、DPC2406のうちの少なくとも1つを構成する。
【0192】
少なくとも1つの実施例では、PROPユニット2404は、ラスタ・エンジン2408及びDPC2406によって生成されたデータを、図23と併せて上記でより詳細に説明されたメモリ・パーティション・ユニット2322など、パーティション・ユニット中のラスタ演算(「ROP」:Raster Operation)ユニットにルーティングするように構成される。少なくとも1つの実施例では、PROPユニット2404は、色ブレンディングのための最適化を実施すること、ピクセル・データを組織化すること、アドレス・トランスレーションを実施することなどを行うように構成される。少なくとも1つの実施例では、ラスタ・エンジン2408は、限定はしないが、様々なラスタ演算を実施するように構成されたいくつかの固定機能ハードウェア・ユニットを含み、少なくとも1つの実施例では、ラスタ・エンジン2408は、限定はしないが、セットアップ・エンジン、粗いラスタ・エンジン、選別エンジン、クリッピング・エンジン、細かいラスタ・エンジン、タイル合体エンジン、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、セットアップ・エンジンは、変換された頂点を受信し、頂点によって定義された幾何学的プリミティブに関連する平面方程式を生成し、平面方程式は、プリミティブについてのカバレージ情報(たとえば、タイルのためのx、yカバレージ・マスク)を生成するために粗いラスタ・エンジンに送信され、粗いラスタ・エンジンの出力は選別エンジンに送信され、zテストに落ちたプリミティブに関連するフラグメントが選別され、クリッピング・エンジンに送信され、視錐台の外側にあるフラグメントがクリップされる。少なくとも1つの実施例では、クリッピング及び選別を通過したフラグメントは、セットアップ・エンジンによって生成された平面方程式に基づいてピクセル・フラグメントについての属性を生成するために、細かいラスタ・エンジンに渡される。少なくとも1つの実施例では、ラスタ・エンジン2408の出力は、DPC2406内に実装されたフラグメント・シェーダによってなど、任意の好適なエンティティによって処理されるべきフラグメントを含む。
【0193】
少なくとも1つの実施例では、GPC2400中に含まれる各DPC2406は、限定はしないが、Mパイプ・コントローラ(「MPC」:M-Pipe Controller)2410、プリミティブ・エンジン2412、1つ又は複数のSM2414、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、MPC2410は、DPC2406の動作を制御して、パイプライン・マネージャ2402から受信されたパケットを、DPC2406中の適切なユニットにルーティングする。少なくとも1つの実施例では、頂点に関連するパケットは、頂点に関連する頂点属性をメモリからフェッチするように構成されたプリミティブ・エンジン2412にルーティングされ、対照的に、シェーダ・プログラムに関連するパケットは、SM2414に送信され得る。
【0194】
少なくとも1つの実施例では、SM2414は、限定はしないが、いくつかのスレッドによって表されたタスクを処理するように構成されたプログラマブル・ストリーミング・プロセッサを含む。少なくとも1つの実施例では、SM2414はマルチスレッド化され、スレッドの特定のグループからの複数のスレッド(たとえば、32個のスレッド)を同時に実行するように構成され、SIMDアーキテクチャを実装し、スレッドのグループ(たとえば、ワープ)中の各スレッドは、命令の同じセットに基づいてデータの異なるセットを処理するように構成される。少なくとも1つの実施例では、スレッドのグループ中のすべてのスレッドが同じ命令を実行する。少なくとも1つの実施例では、SM2414は、SIMTアーキテクチャを実装し、スレッドのグループ中の各スレッドは、命令の同じセットに基づいて、データの異なるセットを処理するように構成されるが、スレッドのグループ中の個々のスレッドは、実行中に発散することを可能にされる。少なくとも1つの実施例では、プログラム・カウンタ、コール・スタック、及び実行状態が、各ワープについて維持されて、ワープ内のスレッドが発散するときのワープ間の同時処理及びワープ内の直列実行を可能にする。別の実施例では、プログラム・カウンタ、コール・スタック、及び実行状態が、各個々のスレッドについて維持されて、すべてのスレッド間、ワープ内及びワープ間での等しい同時処理を可能にする。少なくとも1つの実施例では、実行状態が、各個々のスレッドについて維持され、同じ命令を実行しているスレッドが、より良い効率性のために収束され、並列に実行され得る。SM2414の少なくとも1つの実施例は、図25と併せてさらに詳細に説明される。
【0195】
少なくとも1つの実施例では、MMU2418は、GPC2400とメモリ・パーティション・ユニット(たとえば、図23のパーティション・ユニット2322)との間のインターフェースを提供し、MMU2418は、仮想アドレスから物理アドレスへのトランスレーションと、メモリ保護と、メモリ要求の調停とを提供する。少なくとも1つの実施例では、MMU2418は、仮想アドレスからメモリ中の物理アドレスへのトランスレーションを実施するための1つ又は複数のトランスレーション・ルックアサイド・バッファ(TLB)を提供する。
【0196】
少なくとも1つの実施例では、図24に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図24に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0197】
図25は、少なくとも1つの実施例による、ストリーミング・マルチプロセッサ(「SM」)2500を示す。少なくとも1つの実施例では、SM2500は、図24のSM2414である。少なくとも1つの実施例では、SM2500は、限定はしないが、命令キャッシュ2502、1つ又は複数のスケジューラ・ユニット2504、レジスタ・ファイル2508、1つ又は複数の処理コア(「コア」)2510、1つ又は複数の特殊機能ユニット(「SFU」:special function unit)2512、1つ又は複数のLSU2514、相互接続ネットワーク2516、共有メモリ/L1キャッシュ2518、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、ワーク分散ユニットは、並列処理ユニット(PPU)のGPC上での実行のためにタスクをディスパッチし、各タスクは、GPC内の特定のデータ処理クラスタ(DPC)に割り振られ、タスクがシェーダ・プログラムに関連する場合、タスクはSM2500のうちの1つに割り振られる。少なくとも1つの実施例では、スケジューラ・ユニット2504は、ワーク分散ユニットからタスクを受信し、SM2500に割り当てられた1つ又は複数のスレッド・ブロックについて命令スケジューリングを管理する。少なくとも1つの実施例では、スケジューラ・ユニット2504は、並列スレッドのワープとしての実行のためにスレッド・ブロックをスケジューリングし、各スレッド・ブロックは、少なくとも1つのワープを割り振られる。少なくとも1つの実施例では、各ワープは、スレッドを実行する。少なくとも1つの実施例では、スケジューラ・ユニット2504は、複数の異なるスレッド・ブロックを管理して、異なるスレッド・ブロックにワープを割り振り、次いで、複数の異なる連動グループからの命令を、各クロック・サイクル中に様々な機能ユニット(たとえば、処理コア2510、SFU2512、及びLSU2514)にディスパッチする。
【0198】
少なくとも1つの実施例では、「連動グループ」は、通信するスレッドのグループを組織化するためのプログラミング・モデルを指し得、プログラミング・モデルは、スレッドが通信している粒度を開発者が表現することを可能にして、より豊富でより効率的な並列分解の表現を可能にする。少なくとも1つの実施例では、連動起動APIは、並列アルゴリズムの実行のためにスレッド・ブロックの間の同期をサポートする。少なくとも1つの実施例では、従来のプログラミング・モデルのAPIは、連動スレッドを同期するための単一の簡単な構築物、すなわちスレッド・ブロックのすべてのスレッドにわたるバリア(たとえば、syncthreads()関数)を提供する。しかしながら、少なくとも1つの実施例では、プログラマは、スレッド・ブロックよりも小さい粒度においてスレッドのグループを定義し、定義されたグループ内で同期して、集合的なグループ全般にわたる機能インターフェースの形態で、より高い性能、設計のフレキシビリティ、及びソフトウェア再使用を可能にし得る。少なくとも1つの実施例では、連動グループは、プログラマが、サブ・ブロック粒度及びマルチ・ブロック粒度において、スレッドのグループを明示的に定義し、連動グループ中のスレッドに対する同期などの集合的な動作を実施することを可能にする。少なくとも1つの実施例では、サブ・ブロック粒度は、単一スレッドと同じくらい小さい。少なくとも1つの実施例では、プログラミング・モデルは、ソフトウェア境界にわたるクリーンな合成をサポートし、それにより、ライブラリ及びユーティリティ関数が、収束に関して仮定する必要なしにそれらのローカル・コンテキスト内で安全に同期することができる。少なくとも1つの実施例では、連動グループ・プリミティブは、限定はしないが、プロデューサ-コンシューマ並列性、日和見並列性(opportunistic parallelism)、及びスレッド・ブロックのグリッド全体にわたるグローバルな同期を含む、新しいパターンの連動並列性を可能にする。
【0199】
少なくとも1つの実施例では、ディスパッチ・ユニット2506は、機能ユニットのうちの1つ又は複数に命令を送信するように構成され、スケジューラ・ユニット2504は、限定はしないが、同じワープからの2つの異なる命令が各クロック・サイクル中にディスパッチされることを可能にする2つのディスパッチ・ユニット2506を含む。少なくとも1つの実施例では、各スケジューラ・ユニット2504は、単一のディスパッチ・ユニット2506又は追加のディスパッチ・ユニット2506を含む。
【0200】
少なくとも1つの実施例では、各SM2500は、少なくとも1つの実施例では、限定はしないが、SM2500の機能ユニットにレジスタのセットを提供するレジスタ・ファイル2508を含む。少なくとも1つの実施例では、レジスタ・ファイル2508は、各機能ユニットがレジスタ・ファイル2508の専用部分を割り振られるように、機能ユニットの各々の間で分割される。少なくとも1つの実施例では、レジスタ・ファイル2508は、SM2500によって実行されている異なるワープ間で分割され、レジスタ・ファイル2508は、機能ユニットのデータ経路に接続されたオペランドのための一時的ストレージを提供する。少なくとも1つの実施例では、各SM2500は、限定はしないが、複数のL個の処理コア2510を含む。少なくとも1つの実施例では、SM2500は、限定はしないが、多数の(たとえば、128個以上の)個別の処理コア2510を含む。少なくとも1つの実施例では、各処理コア2510は、限定はしないが、完全にパイプライン化された、単精度の、倍精度の、及び/又は混合精度の処理ユニットを含み、これは、限定はしないが、浮動小数点算術論理ユニット及び整数算術論理ユニットを含む。少なくとも1つの実施例では、浮動小数点算術論理ユニットは、浮動小数点算術のためのIEEE754-2008規格を実装する。少なくとも1つの実施例では、処理コア2510は、限定はしないが、64個の単精度(32ビット)浮動小数点コアと、64個の整数コアと、32個の倍精度(64ビット)浮動小数点コアと、8つのテンソル・コアとを含む。
【0201】
少なくとも1つの実施例では、テンソル・コアは、行列演算を実施するように構成される。少なくとも1つの実施例では、1つ又は複数のテンソル・コアは、処理コア2510中に含まれる。少なくとも1つの実施例では、テンソル・コアは、ニューラル・ネットワーク訓練及び推論のための畳み込み演算など、深層学習行列算術を実施するように構成される。少なくとも1つの実施例では、各テンソル・コアは、4×4の行列で動作し、行列の積和演算(matrix multiply and accumulate operation)D=A×B+Cを実施し、ここで、A、B、C、及びDは4×4の行列である。
【0202】
少なくとも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サイズの行列を仮定する。
【0203】
少なくとも1つの実施例では、各SM2500は、限定はしないが、特殊関数(たとえば、属性評価、逆数平方根など)を実施するM個のSFU2512を含む。少なくとも1つの実施例では、SFU2512は、限定はしないが、階層ツリー・データ構造をトラバースするように構成されたツリー・トラバーサル・ユニットを含む。少なくとも1つの実施例では、SFU2512は、限定はしないが、テクスチャ・マップ・フィルタリング動作を実施するように構成されたテクスチャ・ユニットを含む。少なくとも1つの実施例では、テクスチャ・ユニットは、メモリ及びサンプル・テクスチャ・マップからテクスチャ・マップ(たとえば、テクセルの2Dアレイ)をロードして、SM2500によって実行されるシェーダ・プログラムにおける使用のためのサンプリングされたテクスチャ値を作り出すように構成される。少なくとも1つの実施例では、テクスチャ・マップは、共有メモリ/L1キャッシュ2518に記憶される。少なくとも1つの実施例では、テクスチャ・ユニットは、ミップ・マップ(たとえば、詳細のレベルが異なるテクスチャ・マップ)を使用したフィルタリング動作などのテクスチャ動作を実装する。少なくとも1つの実施例では、各SM2500は、限定はしないが、2つのテクスチャ・ユニットを含む。
【0204】
少なくとも1つの実施例では、各SM2500は、限定はしないが、共有メモリ/L1キャッシュ2518とレジスタ・ファイル2508との間でロード及びストア動作を実装するN個のLSU2514を含む。少なくとも1つの実施例では、各SM2500は、限定はしないが、相互接続ネットワーク2516を含み、相互接続ネットワーク2516は、機能ユニットの各々をレジスタ・ファイル2508に接続し、LSU2514をレジスタ・ファイル2508及び共有メモリ/L1キャッシュ2518に接続する。少なくとも1つの実施例では、相互接続ネットワーク2516はクロスバーであり、クロスバーは、機能ユニットのうちのいずれかをレジスタ・ファイル2508中のレジスタのうちのいずれかに接続し、LSU2514をレジスタ・ファイル2508と共有メモリ/L1キャッシュ2518中のメモリ・ロケーションとに接続するように構成され得る。
【0205】
少なくとも1つの実施例では、共有メモリ/L1キャッシュ2518は、SM2500とプリミティブ・エンジンとの間及びSM2500中のスレッド間でのデータ・ストレージ及び通信を可能にするオンチップ・メモリのアレイである。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2518は、限定はしないが、128KBのストレージ容量を備え、SM2500からパーティション・ユニットへの経路中にある。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2518は、読取り及び書込みをキャッシュするために使用される。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2518、L2キャッシュ、及びメモリのうちの1つ又は複数は、補助ストアである。
【0206】
少なくとも1つの実施例では、データ・キャッシュと共有メモリ機能性とを単一のメモリ・ブロックに組み合わせることは、両方のタイプのメモリ・アクセスについて改善された性能を提供する。少なくとも1つの実施例では、容量は、共有メモリが容量の半分を使用するように構成され、テクスチャ及びロード/ストア動作が残りの容量を使用することができる場合など、共有メモリを使用しないプログラムによってキャッシュとして使用されるか、又は使用可能である。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2518内の統合は、共有メモリ/L1キャッシュ2518が、データをストリーミングするための高スループット管として機能しながら、同時に高帯域幅及び低レイテンシのアクセスを、頻繁に再使用されるデータに提供することを可能にする。少なくとも1つの実施例では、汎用並列算出のために構成されたとき、グラフィックス処理と比較してより簡単な構成が使用され得る。少なくとも1つの実施例では、固定機能GPUがバイパスされて、はるかに簡単なプログラミング・モデルを作成する。少なくとも1つの実施例では及び汎用並列算出構成では、ワーク分散ユニットは、スレッドのブロックをDPCに直接割り当て、分散させる。少なくとも1つの実施例では、ブロック中のスレッドは、各スレッドが一意の結果を生成することを確実にするように、計算において一意のスレッドIDを使用して、同じプログラムを実行し、SM2500を使用してプログラムを実行し、計算を実施し、共有メモリ/L1キャッシュ2518を使用してスレッド間で通信し、LSU2514を使用して、共有メモリ/L1キャッシュ2518及びメモリ・パーティション・ユニットを通してグローバル・メモリを読み取り、書き込む。少なくとも1つの実施例では、汎用並列算出のために構成されたとき、SM2500は、DPC上で新しいワークを起動するためにスケジューラ・ユニット2504が使用することができるコマンドを書き込む。
【0207】
少なくとも1つの実施例では、PPUは、デスクトップ・コンピュータ、ラップトップ・コンピュータ、タブレット・コンピュータ、サーバ、スーパーコンピュータ、スマート・フォン(たとえば、ワイヤレス・ハンドヘルド・デバイス)、PDA、デジタル・カメラ、車両、頭部装着型ディスプレイ、ハンドヘルド電子デバイスなどに含まれるか、又はそれらに結合される。少なくとも1つの実施例では、PPUは、単一の半導体基板上で具体化される。少なくとも1つの実施例では、PPUは、追加のPPU、メモリ、RISC CPU、MMU、デジタル-アナログ変換器(「DAC」:digital-to-analog converter)などの1つ又は複数の他のデバイスとともにSoC中に含まれる。
【0208】
少なくとも1つの実施例では、PPUは、1つ又は複数のメモリ・デバイスを含むグラフィックス・カード上に含まれ得る。少なくとも1つの実施例では、グラフィックス・カードは、デスクトップ・コンピュータのマザーボード上のPCIeスロットとインターフェースするように構成され得る。少なくとも1つの実施例では、PPUは、マザーボードのチップセット中に含まれる統合されたGPU(「iGPU」:integrated GPU)であり得る。
【0209】
少なくとも1つの実施例では、図25に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図25に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0210】
「汎用コンピューティングのためのソフトウェア構築物」
以下の図は、限定はしないが、少なくとも1つの実施例を実装するための例示的なソフトウェア構築物を記載する。
【0211】
図26は、少なくとも1つの実施例による、プログラミング・プラットフォームのソフトウェア・スタックを示す。少なくとも1つの実施例では、プログラミング・プラットフォームは、算出タスクを加速するために、コンピューティング・システム上のハードウェアを活用するためのプラットフォームである。少なくとも1つの実施例では、プログラミング・プラットフォームは、ライブラリ、コンパイラ指令、及び/又はプログラミング言語への拡張を通して、ソフトウェア開発者にとってアクセス可能であり得る。少なくとも1つの実施例では、プログラミング・プラットフォームは、限定はしないが、CUDA、Radeonオープン・コンピュート・プラットフォーム(「ROCm」:Radeon Open Compute Platform)、OpenCL(OpenCL(商標)はクロノス・グループ(Khronos group)によって開発される)、SYCL、又はIntel One APIであり得る。
【0212】
少なくとも1つの実施例では、プログラミング・プラットフォームのソフトウェア・スタック2600は、アプリケーション2601のための実行環境を提供する。少なくとも1つの実施例では、アプリケーション2601は、ソフトウェア・スタック2600上で起動されることが可能な任意のコンピュータ・ソフトウェアを含み得る。少なくとも1つの実施例では、アプリケーション2601は、限定はしないが、人工知能(「AI」:artificial intelligence)/機械学習(「ML」:machine learning)アプリケーション、高性能コンピューティング(「HPC」)アプリケーション、仮想デスクトップ・インフラストラクチャ(「VDI」:virtual desktop infrastructure)、又はデータ・センタ・ワークロードを含み得る。
【0213】
少なくとも1つの実施例では、アプリケーション2601及びソフトウェア・スタック2600は、ハードウェア2607上で稼働する。少なくとも1つの実施例では、ハードウェア2607は、1つ又は複数のGPU、CPU、FPGA、AIエンジン、及び/又はプログラミング・プラットフォームをサポートする他のタイプのコンピュート・デバイスを含み得る。CUDAの場合など、少なくとも1つの実施例では、ソフトウェア・スタック2600は、ベンダー固有であり、(1つ又は複数の)特定のベンダーからのデバイスのみと互換性があり得る。OpenCLの場合など、少なくとも1つの実施例では、ソフトウェア・スタック2600は、異なるベンダーからのデバイスで使用され得る。少なくとも1つの実施例では、ハードウェア2607は、アプリケーション・プログラミング・インターフェース(「API」)コールを介して算出タスクを実施するためにアクセスされ得るもう1つのデバイスに接続されたホストを含む。少なくとも1つの実施例では、限定はしないが、CPU(ただし、コンピュート・デバイスをも含み得る)及びそのメモリを含み得る、ハードウェア2607内のホストとは対照的に、ハードウェア2607内のデバイスは、限定はしないが、GPU、FPGA、AIエンジン、又は他のコンピュート・デバイス(ただし、CPUをも含み得る)及びそのメモリを含み得る。
【0214】
少なくとも1つの実施例では、プログラミング・プラットフォームのソフトウェア・スタック2600は、限定はしないが、いくつかのライブラリ2603と、ランタイム2605と、デバイス・カーネル・ドライバ2606とを含む。少なくとも1つの実施例では、ライブラリ2603の各々は、コンピュータ・プログラムによって使用され、ソフトウェア開発中に活用され得る、データ及びプログラミング・コードを含み得る。少なくとも1つの実施例では、ライブラリ2603は、限定はしないが、事前に書かれたコード及びサブルーチン、クラス、値、タイプ仕様、構成データ、ドキュメンテーション、ヘルプ・データ、並びに/又はメッセージ・テンプレートを含み得る。少なくとも1つの実施例では、ライブラリ2603は、1つ又は複数のタイプのデバイス上での実行のために最適化される機能を含む。少なくとも1つの実施例では、ライブラリ2603は、限定はしないが、デバイス上で数学、深層学習、及び/又は他のタイプの動作を実施するための機能を含み得る。少なくとも1つの実施例では、ライブラリ2603は、ライブラリ2603において実装される機能を公開する、1つ又は複数のAPIを含み得る、対応するAPI2602に関連する。
【0215】
少なくとも1つの実施例では、アプリケーション2601は、図31図33と併せて以下でより詳細に説明されるように、実行可能コードにコンパイルされるソース・コードとして書かれる。少なくとも1つの実施例では、アプリケーション2601の実行可能コードは、少なくとも部分的に、ソフトウェア・スタック2600によって提供される実行環境上で稼働し得る。少なくとも1つの実施例では、アプリケーション2601の実行中に、ホストとは対照的な、デバイス上で稼働する必要があるコードに達し得る。少なくとも1つの実施例では、そのような場合、デバイス上で必須のコードをロード及び起動するために、ランタイム2605がコールされ得る。少なくとも1つの実施例では、ランタイム2605は、アプリケーションS01の実行をサポートすることが可能である、任意の技術的に実現可能なランタイム・システムを含み得る。
【0216】
少なくとも1つの実施例では、ランタイム2605は、(1つ又は複数の)API2604として示されている、対応するAPIに関連する、1つ又は複数のランタイム・ライブラリとして実装される。少なくとも1つの実施例では、そのようなランタイム・ライブラリのうちの1つ又は複数は、限定はしないが、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、及び/又は同期のための機能を含み得る。少なくとも1つの実施例では、メモリ管理機能は、限定はしないが、デバイス・メモリを割り振り、割振り解除し、コピーし、並びにホスト・メモリとデバイス・メモリとの間でデータを転送するための機能を含み得る。少なくとも1つの実施例では、実行制御機能は、限定はしないが、デバイス上で機能(機能がホストからコール可能なグローバル機能であるとき、「カーネル」と呼ばれることがある)を起動し、デバイス上で実行されるべき所与の機能のためのランタイム・ライブラリによって維持されるバッファ中に属性値をセットするための機能を含み得る。
【0217】
少なくとも1つの実施例では、ランタイム・ライブラリ及び対応する(1つ又は複数の)API2604は、任意の技術的に実現可能な様式で実装され得る。少なくとも1つの実施例では、ある(又は任意の数の)APIは、デバイスのきめ細かい制御のための機能の低レベルのセットを公開し得るが、別の(又は任意の数の)APIは、そのような機能のより高いレベルのセットを公開し得る。少なくとも1つの実施例では、高レベル・ランタイムAPIは、低レベルAPIの上に築かれ得る。少なくとも1つの実施例では、ランタイムAPIのうちの1つ又は複数は、言語依存しないランタイムAPIの上に階層化された言語固有APIであり得る。
【0218】
少なくとも1つの実施例では、デバイス・カーネル・ドライバ2606は、基礎をなすデバイスとの通信を容易にするように構成される。少なくとも1つの実施例では、デバイス・カーネル・ドライバ2606は、(1つ又は複数の)API2604などのAPI及び/又は他のソフトウェアが依拠する、低レベル機能性を提供し得る。少なくとも1つの実施例では、デバイス・カーネル・ドライバ2606は、ランタイムにおいて中間表現(「IR」:intermediate representation)コードをバイナリ・コードにコンパイルするように構成され得る。少なくとも1つの実施例では、CUDAの場合、デバイス・カーネル・ドライバ2606は、ハードウェア固有でない並列スレッド実行(「PTX」:Parallel Thread Execution)IRコードを、(コンパイルされたバイナリ・コードのキャッシングを伴って)ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにコンパイルし得、これは、コードを「ファイナライズする」(finalizing)と呼ばれることもある。少なくとも1つの実施例では、そうすることは、ファイナライズされたコードがターゲット・デバイス上で稼働することを許し得、これは、ソース・コードが最初にPTXコードにコンパイルされたとき、存在していないことがある。代替的に、少なくとも1つの実施例では、デバイス・ソース・コードは、デバイス・カーネル・ドライバ2606がランタイムにおいてIRコードをコンパイルすることを必要とすることなしに、オフラインでバイナリ・コードにコンパイルされ得る。
【0219】
少なくとも1つの実施例では、図26に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図26に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0220】
図27は、少なくとも1つの実施例による、図26のソフトウェア・スタック2600のCUDA実装形態を示す。少なくとも1つの実施例では、アプリケーション2701が起動され得るCUDAソフトウェア・スタック2700は、CUDAライブラリ2703と、CUDAランタイム2705と、CUDAドライバ2707と、デバイス・カーネル・ドライバ2708とを含む。少なくとも1つの実施例では、CUDAソフトウェア・スタック2700は、ハードウェア2709上で実行し、ハードウェア2709はGPUを含み得、GPUは、CUDAをサポートし、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される。
【0221】
少なくとも1つの実施例では、アプリケーション2701、CUDAランタイム2705、及びデバイス・カーネル・ドライバ2708は、それぞれ、図26と併せて上記で説明された、アプリケーション2601、ランタイム2605、及びデバイス・カーネル・ドライバ2606と同様の機能性を実施し得る。少なくとも1つの実施例では、CUDAドライバ2707は、CUDAドライバAPI2706を実装するライブラリ(libcuda.so)を含む。少なくとも1つの実施例では、CUDAランタイム・ライブラリ(cudart)によって実装されるCUDAランタイムAPI2704と同様に、CUDAドライバAPI2706は、限定はしないが、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、同期、及び/又はグラフィックス相互運用性のための機能を公開し得る。少なくとも1つの実施例では、CUDAドライバAPI2706は、CUDAランタイムAPI2704が、暗黙的な初期化、(プロセスに類似する)コンテキスト管理、及び(動的にロードされたライブラリに類似する)モジュール管理を提供することによって、デバイス・コード管理を簡略化するという点で、CUDAランタイムAPI2704とは異なる。少なくとも1つの実施例では、高レベルCUDAランタイムAPI2704とは対照的に、CUDAドライバAPI2706は、特にコンテキスト及びモジュール・ローディングに関して、デバイスのよりきめ細かい制御を提供する低レベルAPIである。少なくとも1つの実施例では、CUDAドライバAPI2706は、CUDAランタイムAPI2704によって公開されないコンテキスト管理のための機能を公開し得る。少なくとも1つの実施例では、CUDAドライバAPI2706はまた、言語依存せず、たとえば、CUDAランタイムAPI2704に加えて、OpenCLをサポートする。さらに、少なくとも1つの実施例では、CUDAランタイム2705を含む開発ライブラリは、ユーザモードCUDAドライバ2707と(「ディスプレイ」ドライバと呼ばれることもある)カーネルモード・デバイス・ドライバ2708とを含むドライバ構成要素とは別個のものと見なされ得る。
【0222】
少なくとも1つの実施例では、CUDAライブラリ2703は、限定はしないが、数学ライブラリ、深層学習ライブラリ、並列アルゴリズム・ライブラリ、及び/又は信号/画像/ビデオ処理ライブラリを含み得、それらをアプリケーション2701などの並列コンピューティング・アプリケーションが利用し得る。少なくとも1つの実施例では、CUDAライブラリ2703は、とりわけ、線形代数演算を実施するための基本線形代数サブプログラム(「BLAS」:Basic Linear Algebra Subprograms)の実装であるcuBLASライブラリ、高速フーリエ変換(「FFT」:fast Fourier transform)を算出するためのcuFFTライブラリ、及び乱数を生成するためのcuRANDライブラリなど、数学ライブラリを含み得る。少なくとも1つの実施例では、CUDAライブラリ2703は、とりわけ、深層ニューラル・ネットワークのためのプリミティブのcuDNNライブラリ及び高性能深層学習推論のためのTensorRTプラットフォームなど、深層学習ライブラリを含み得る。
【0223】
少なくとも1つの実施例では、図27に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図27に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0224】
図28は、少なくとも1つの実施例による、図26のソフトウェア・スタック2600のROCm実装形態を示す。少なくとも1つの実施例では、アプリケーション2801が起動され得るROCmソフトウェア・スタック2800は、言語ランタイム2803と、システム・ランタイム2805と、サンク(thunk)2807と、ROCmカーネル・ドライバ2808とを含む。少なくとも1つの実施例では、ROCmソフトウェア・スタック2800は、ハードウェア2809上で実行し、ハードウェア2809はGPUを含み得、GPUは、ROCmをサポートし、カリフォルニア州サンタクララのAMD Corporationによって開発される。
【0225】
少なくとも1つの実施例では、アプリケーション2801は、図26と併せて上記で説明されたアプリケーション2601と同様の機能性を実施し得る。少なくとも1つの実施例では、さらに、言語ランタイム2803及びシステム・ランタイム2805は、図26と併せて上記で説明されたランタイム2605と同様の機能性を実施し得る。少なくとも1つの実施例では、言語ランタイム2803とシステム・ランタイム2805とは、システム・ランタイム2805が、ROCrシステム・ランタイムAPI2804を実装し、異種システム・アーキテクチャ(「HSA」:Heterogeneous System Architecture)ランタイムAPIを利用する、言語依存しないランタイムであるという点で、異なる。少なくとも1つの実施例では、HSAランタイムAPIは、とりわけ、メモリ管理、カーネルの設計されたディスパッチを介した実行制御、エラー対処、システム及びエージェント情報、並びにランタイム初期化及び停止(shutdown)のための機能を含む、AMD GPUにアクセスし、それと対話するためのインターフェースを公開する、シン(thin)・ユーザモードAPIである。少なくとも1つの実施例では、システム・ランタイム2805とは対照的に、言語ランタイム2803は、ROCrシステム・ランタイムAPI2804の上に階層化された言語固有ランタイムAPI2802の実装である。少なくとも1つの実施例では、言語ランタイムAPIは、限定はしないが、とりわけ、ポータビリティのための異種コンピュート・インターフェース(「HIP」)言語ランタイムAPI、異種コンピュート・コンパイラ(「HCC」:Heterogeneous Compute Compiler)言語ランタイムAPI、又はOpenCL APIを含み得る。特にHIP言語は、機能的に同様のバージョンのCUDA機構をもつC++プログラミング言語の拡張であり、少なくとも1つの実施例では、HIP言語ランタイムAPIは、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、及び同期のための機能など、図27と併せて上記で説明されたCUDAランタイムAPI2704の機能と同様である機能を含む。
【0226】
少なくとも1つの実施例では、サンク(ROCt)2807は、基礎をなすROCmドライバ2808と対話するために使用され得るインターフェース2806である。少なくとも1つの実施例では、ROCmドライバ2808は、AMDGPUドライバとHSAカーネル・ドライバ(amdkfd)との組合せである、ROCkドライバである。少なくとも1つの実施例では、AMDGPUドライバは、図26と併せて上記で説明されたデバイス・カーネル・ドライバ2606と同様の機能性を実施する、AMDによって開発されたGPUのためのデバイス・カーネル・ドライバである。少なくとも1つの実施例では、HSAカーネル・ドライバは、異なるタイプのプロセッサがハードウェア特徴を介してより効果的にシステム・リソースを共有することを許すドライバである。
【0227】
少なくとも1つの実施例では、様々なライブラリ(図示せず)が、言語ランタイム2803より上にROCmソフトウェア・スタック2800中に含まれ、図27と併せて上記で説明されたCUDAライブラリ2703に対する機能性の類似性を提供し得る。少なくとも1つの実施例では、様々なライブラリは、限定はしないが、とりわけ、CUDA cuBLASの機能と同様の機能を実装するhipBLASライブラリ、CUDA cuFFTと同様であるFFTを算出するためのrocFFTライブラリなど、数学、深層学習、及び/又は他のライブラリを含み得る。
【0228】
少なくとも1つの実施例では、図28に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図28に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0229】
図29は、少なくとも1つの実施例による、図26のソフトウェア・スタック2600のOpenCL実装形態を示す。少なくとも1つの実施例では、アプリケーション2901が起動され得るOpenCLソフトウェア・スタック2900は、OpenCLフレームワーク2910と、OpenCLランタイム2906と、ドライバ2907とを含む。少なくとも1つの実施例では、OpenCLソフトウェア・スタック2900は、ベンダー固有でないハードウェア2709上で実行する。少なくとも1つの実施例では、OpenCLは、異なるベンダーによって開発されたデバイスによってサポートされるので、そのようなベンダーからのハードウェアと相互動作するために、特定のOpenCLドライバが必要とされ得る。
【0230】
少なくとも1つの実施例では、アプリケーション2901、OpenCLランタイム2906、デバイス・カーネル・ドライバ2907、及びハードウェア2908は、それぞれ、図26と併せて上記で説明された、アプリケーション2601、ランタイム2605、デバイス・カーネル・ドライバ2606、及びハードウェア2607と同様の機能性を実施し得る。少なくとも1つの実施例では、アプリケーション2901は、デバイス上で実行されるべきであるコードをもつOpenCLカーネル2902をさらに含む。
【0231】
少なくとも1つの実施例では、OpenCLは、ホストに接続されたデバイスをホストが制御することを可能にする「プラットフォーム」を定義する。少なくとも1つの実施例では、OpenCLフレームワークは、プラットフォームAPI2903及びランタイムAPI2905として示されている、プラットフォーム層API及びランタイムAPIを提供する。少なくとも1つの実施例では、ランタイムAPI2905は、デバイス上でのカーネルの実行を管理するためにコンテキストを使用する。少なくとも1つの実施例では、各識別されたデバイスは、それぞれのコンテキストに関連し得、ランタイムAPI2905は、それぞれのコンテキストを使用して、そのデバイスのために、とりわけ、コマンド・キュー、プログラム・オブジェクト、及びカーネル・オブジェクトを管理し、メモリ・オブジェクトを共有し得る。少なくとも1つの実施例では、プラットフォームAPI2903は、とりわけ、デバイスを選択及び初期化し、コマンド・キューを介してデバイスにワークをサブミットし、デバイスとの間でのデータ転送を可能にするために、デバイス・コンテキストが使用されることを許す機能を公開する。少なくとも1つの実施例では、さらに、OpenCLフレームワークは、とりわけ、数学関数とリレーショナル関数と画像処理関数とを含む、様々な組み込み関数(図示せず)を提供する。
【0232】
少なくとも1つの実施例では、コンパイラ2904も、OpenCLフレームワーク2910中に含まれる。少なくとも1つの実施例では、ソース・コードは、アプリケーションを実行するより前にオフラインでコンパイルされるか、又はアプリケーションの実行中にオンラインでコンパイルされ得る。CUDA及びROCmとは対照的に、少なくとも1つの実施例におけるOpenCLアプリケーションは、コンパイラ2904によってオンラインでコンパイルされ得、コンパイラ2904は、標準ポータブル中間表現(「SPIR-V」:Standard Portable Intermediate Representation)コードなど、ソース・コード及び/又はIRコードをバイナリ・コードにコンパイルするために使用され得る、任意の数のコンパイラを表すために含まれる。代替的に、少なくとも1つの実施例では、OpenCLアプリケーションは、そのようなアプリケーションの実行より前に、オフラインでコンパイルされ得る。
【0233】
少なくとも1つの実施例では、図29に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図29に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0234】
図30は、少なくとも1つの実施例による、プログラミング・プラットフォームによってサポートされるソフトウェアを示す。少なくとも1つの実施例では、プログラミング・プラットフォーム3004は、アプリケーション3000が依拠し得る、様々なプログラミング・モデル3003、ミドルウェア及び/又はライブラリ3002、並びにフレームワーク3001をサポートするように構成される。少なくとも1つの実施例では、アプリケーション3000は、たとえば、MXNet、PyTorch、又はTensorFlowなど、深層学習フレームワークを使用して実装される、AI/MLアプリケーションであり得、これは、基礎をなすハードウェア上で加速コンピューティングを提供するために、cuDNN、NVIDIA集合通信ライブラリ(「NCCL」:NVIDIA Collective Communications Library)、及び/又はNVIDAディベロッパー・データ・ローディング・ライブラリ(「DALI(登録商標)」:NVIDA Developer Data Loading Library)CUDAライブラリなど、ライブラリに依拠し得る。
【0235】
少なくとも1つの実施例では、プログラミング・プラットフォーム3004は、それぞれ、図27図28、及び図29と併せて上記で説明された、CUDA、ROCm、又はOpenCLプラットフォームのうちの1つであり得る。少なくとも1つの実施例では、プログラミング・プラットフォーム3004は、アルゴリズム及びデータ構造の表現を許す基礎をなすコンピューティング・システムの抽象化である、複数のプログラミング・モデル3003をサポートする。少なくとも1つの実施例では、プログラミング・モデル3003は、性能を改善するために、基礎をなすハードウェアの特徴を公開し得る。少なくとも1つの実施例では、プログラミング・モデル3003は、限定はしないが、CUDA、HIP、OpenCL、C++加速超並列処理(「C++AMP」:C++ Accelerated Massive Parallelism)、オープン・マルチプロセシング(「OpenMP」:Open Multi-Processing)、オープン・アクセラレータ(「OpenACC」:Open Accelerators)、及び/又はVulcanコンピュート(Vulcan Compute)を含み得る。
【0236】
少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3002は、プログラミング・モデル3004の抽象化の実装を提供する。少なくとも1つの実施例では、そのようなライブラリは、コンピュータ・プログラムによって使用され、ソフトウェア開発中に活用され得る、データ及びプログラミング・コードを含む。少なくとも1つの実施例では、そのようなミドルウェアは、プログラミング・プラットフォーム3004から利用可能なソフトウェア以外にアプリケーションにサービスを提供するソフトウェアを含む。少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3002は、限定はしないが、cuBLAS、cuFFT、cuRAND、及び他のCUDAライブラリ、又は、rocBLAS、rocFFT、rocRAND、及び他のROCmライブラリを含み得る。さらに、少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3002は、GPUのための通信ルーチンを提供するNCCL及びROCm通信集合ライブラリ(「RCCL」:ROCm Communication Collectives Library)のライブラリ、深層学習加速のためのMIOpenライブラリ、並びに/又は、線形代数、行列及びベクトル演算、幾何学的変換、数値ソルバー、及び関係するアルゴリズムのための固有(Eigen)ライブラリを含み得る。
【0237】
少なくとも1つの実施例では、アプリケーション・フレームワーク3001は、ライブラリ及び/又はミドルウェア3002に依存する。少なくとも1つの実施例では、アプリケーション・フレームワーク3001の各々は、アプリケーション・ソフトウェアの標準構造を実装するために使用されるソフトウェア・フレームワークである。少なくとも1つの実施例では、上記で説明されたAI/ML実例に戻ると、AI/MLアプリケーションは、Caffe、Caffe2、TensorFlow、Keras、PyTorch、又はMxNet深層学習フレームワークなど、フレームワークを使用して実装され得る。
【0238】
少なくとも1つの実施例では、図30に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図30に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0239】
図31は、少なくとも1つの実施例による、図26図29のプログラミング・プラットフォームのうちの1つの上で実行するためのコードをコンパイルすることを示す。少なくとも1つの実施例では、コンパイラ3101は、ホスト・コード並びにデバイス・コードの両方を含むソース・コード3100を受信する。少なくとも1つの実施例では、コンパイラ3101は、ソース・コード3100を、ホスト上での実行のためのホスト実行可能コード3102及びデバイス上での実行のためのデバイス実行可能コード3103にコンバートするように構成される。少なくとも1つの実施例では、ソース・コード3100は、アプリケーションの実行より前にオフラインでコンパイルされるか、又はアプリケーションの実行中にオンラインでコンパイルされるかのいずれかであり得る。
【0240】
少なくとも1つの実施例では、ソース・コード3100は、C++、C、Fortranなど、コンパイラ3101によってサポートされる任意のプログラミング言語のコードを含み得る。少なくとも1つの実施例では、ソース・コード3100は、ホスト・コードとデバイス・コードとの混合物を有する単一ソース・ファイル中に含まれ得、その中にデバイス・コードのロケーションが示されている。少なくとも1つの実施例では、単一ソース・ファイルは、CUDAコードを含む.cuファイル、又はHIPコードを含む.hip.cppファイルであり得る。代替的に、少なくとも1つの実施例では、ソース・コード3100は、その中でホスト・コードとデバイス・コードとが分離される単一ソース・ファイルではなく、複数のソース・コード・ファイルを含み得る。
【0241】
少なくとも1つの実施例では、コンパイラ3101は、ソース・コード3100を、ホスト上での実行のためのホスト実行可能コード3102及びデバイス上での実行のためのデバイス実行可能コード3103にコンパイルするように構成される。少なくとも1つの実施例では、コンパイラ3101は、ソース・コード3100を抽象システム・ツリー(AST:abstract system tree)に構文解析することと、最適化を実施することと、実行可能コードを生成することとを含む、動作を実施する。ソース・コード3100が単一ソース・ファイルを含む、少なくとも1つの実施例では、コンパイラ3101は、図32に関して以下でより詳細に説明されるように、そのような単一ソース・ファイル中でデバイス・コードをホスト・コードから分離し、デバイス・コード及びホスト・コードを、それぞれ、デバイス実行可能コード3103及びホスト実行可能コード3102にコンパイルし、デバイス実行可能コード3103とホスト実行可能コード3102とを単一のファイルにおいて互いにリンクし得る。
【0242】
少なくとも1つの実施例では、ホスト実行可能コード3102及びデバイス実行可能コード3103は、バイナリ・コード及び/又はIRコードなど、任意の好適なフォーマットのものであり得る。少なくとも1つの実施例では、CUDAの場合、ホスト実行可能コード3102は、ネイティブ・オブジェクト・コードを含み得、デバイス実行可能コード3103は、PTX中間表現のコードを含み得る。少なくとも1つの実施例では、ROCmの場合、ホスト実行可能コード3102とデバイス実行可能コード3103の両方は、ターゲット・バイナリ・コードを含み得る。
【0243】
少なくとも1つの実施例では、図31に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図31に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0244】
図32は、少なくとも1つの実施例による、図26図29のプログラミング・プラットフォームのうちの1つの上で実行するためのコードをコンパイルすることのより詳細な図である。少なくとも1つの実施例では、コンパイラ3201は、ソース・コード3200を受信し、ソース・コード3200をコンパイルし、実行可能ファイル3210を出力するように構成される。少なくとも1つの実施例では、ソース・コード3200は、ホスト・コードとデバイス・コードの両方を含む、.cuファイル、.hip.cppファイル、又は別のフォーマットのファイルなど、単一ソース・ファイルである。少なくとも1つの実施例では、コンパイラ3201は、限定はしないが、.cuファイル中のCUDAコードをコンパイルするためのNVIDIA CUDAコンパイラ(「NVCC」:NVIDIA CUDA compiler)、又は.hip.cppファイル中のHIPコードをコンパイルするためのHCCコンパイラであり得る。
【0245】
少なくとも1つの実施例では、コンパイラ3201は、コンパイラ・フロント・エンド3202と、ホスト・コンパイラ3205と、デバイス・コンパイラ3206と、リンカ3209とを含む。少なくとも1つの実施例では、コンパイラ・フロント・エンド3202は、ソース・コード3200中でデバイス・コード3204をホスト・コード3203から分離するように構成される。少なくとも1つの実施例では、デバイス・コード3204は、デバイス・コンパイラ3206によってデバイス実行可能コード3208にコンパイルされ、デバイス実行可能コード3208は、説明されたように、バイナリ・コード又はIRコードを含み得る。少なくとも1つの実施例では、別個に、ホスト・コード3203は、ホスト・コンパイラ3205によってホスト実行可能コード3207にコンパイルされる。少なくとも1つの実施例では、NVCCの場合、ホスト・コンパイラ3205は、限定はしないが、ネイティブ・オブジェクト・コードを出力する汎用C/C++コンパイラであり得るが、デバイス・コンパイラ3206は、限定はしないが、LLVMコンパイラ・インフラストラクチャをフォークし、PTXコード又はバイナリ・コードを出力する、低レベル仮想機械(「LLVM」:Low Level Virtual Machine)ベースのコンパイラであり得る。少なくとも1つの実施例では、HCCの場合、ホスト・コンパイラ3205とデバイス・コンパイラ3206の両方は、限定はしないが、ターゲット・バイナリ・コードを出力するLLVMベースのコンパイラであり得る。
【0246】
少なくとも1つの実施例では、ソース・コード3200をホスト実行可能コード3207及びデバイス実行可能コード3208にコンパイルした後に、リンカ3209は、ホスト実行可能コード3207とデバイス実行可能コード3208とを実行可能ファイル3210において互いにリンクする。少なくとも1つの実施例では、ホストのためのネイティブ・オブジェクト・コードと、デバイスのためのPTX又はバイナリ・コードとは、オブジェクト・コードを記憶するために使用されるコンテナ・フォーマットである、実行可能及びリンク可能フォーマット(「ELF」:Executable and Linkable Format)ファイルにおいて互いにリンクされ得る。
【0247】
少なくとも1つの実施例では、図32に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図32に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0248】
図33は、少なくとも1つの実施例による、ソース・コードをコンパイルするより前にソース・コードをトランスレートすることを示す。少なくとも1つの実施例では、ソース・コード3300は、トランスレーション・ツール3301を通して渡され、トランスレーション・ツール3301は、ソース・コード3300を、トランスレートされたソース・コード3302にトランスレートする。少なくとも1つの実施例では、コンパイラ3303は、図31と併せて上記で説明されたように、ホスト実行可能コード3102及びデバイス実行可能3103へのコンパイラ3101によるソース・コード3100のコンパイルと同様であるプロセスにおいて、トランスレートされたソース・コード3302をホスト実行可能コード3304及びデバイス実行可能コード3305にコンパイルするために使用される。
【0249】
少なくとも1つの実施例では、トランスレーション・ツール3301によって実施されるトランスレーションは、稼働することが最初に意図された環境とは異なる環境における実行のためにソース3300を移植するために使用される。少なくとも1つの実施例では、トランスレーション・ツール3301は、限定はしないが、CUDAプラットフォームを対象とするCUDAコードを、ROCmプラットフォーム上でコンパイル及び実行され得るHIPコードに「hipify」するために使用される、HIPトランスレータを含み得る。少なくとも1つの実施例では、ソース・コード3300のトランスレーションは、図34A図35と併せて以下でより詳細に説明されるように、ソース・コード3300を構文解析することと、あるプログラミング・モデル(たとえば、CUDA)によって提供される(1つ又は複数の)APIへのコールを、別のプログラミング・モデル(たとえば、HIP)によって提供される(1つ又は複数の)APIへの対応するコールにコンバートすることとを含み得る。少なくとも1つの実施例では、CUDAコードをhipifyすることの実例に戻ると、CUDAランタイムAPI、CUDAドライバAPI、及び/又はCUDAライブラリへのコールは、対応するHIP APIコールにコンバートされ得る。少なくとも1つの実施例では、トランスレーション・ツール3301によって実施される自動トランスレーションは、時々、不完全であり、ソース・コード3300を完全に移植するために追加の手動の労力を必要とし得る。
【0250】
少なくとも1つの実施例では、図33に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図33に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0251】
汎用コンピューティングのためのGPUを構成すること
以下の図は、限定はしないが、少なくとも1つの実施例による、コンピュート・ソース・コードをコンパイル及び実行するための例示的なアーキテクチャを記載する。
【0252】
図34Aは、少なくとも1つの実施例による、異なるタイプの処理ユニットを使用してCUDAソース・コード3410をコンパイル及び実行するように構成されたシステム3400を示す。少なくとも1つの実施例では、システム3400は、限定はしないが、CUDAソース・コード3410と、CUDAコンパイラ3450と、ホスト実行可能コード3470(1)と、ホスト実行可能コード3470(2)と、CUDAデバイス実行可能コード3484と、CPU3490と、CUDA対応GPU3494と、GPU3492と、CUDAからHIPへのトランスレーション・ツール3420と、HIPソース・コード3430と、HIPコンパイラ・ドライバ3440と、HCC3460と、HCCデバイス実行可能コード3482とを含む。
【0253】
少なくとも1つの実施例では、CUDAソース・コード3410は、CUDAプログラミング言語の人間が読み取れるコードの集合である。少なくとも1つの実施例では、CUDAコードは、CUDAプログラミング言語の人間が読み取れるコードである。少なくとも1つの実施例では、CUDAプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、デバイス・コードは、コンパイルの後にデバイス上で並列に実行可能であるソース・コードである。少なくとも1つの実施例では、デバイスは、CUDA対応GPU3490、GPU34192、又は別のGPGPUなど、並列命令処理のために最適化されるプロセッサであり得る。少なくとも1つの実施例では、ホスト・コードは、コンパイルの後にホスト上で実行可能であるソース・コードである。少なくとも1つの実施例では、ホストは、CPU3490など、連続命令処理のために最適化されるプロセッサである。
【0254】
少なくとも1つの実施例では、CUDAソース・コード3410は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3412と、(ゼロを含む)任意の数のデバイス機能3414と、(ゼロを含む)任意の数のホスト機能3416と、(ゼロを含む)任意の数のホスト/デバイス機能3418とを含む。少なくとも1つの実施例では、グローバル機能3412と、デバイス機能3414と、ホスト機能3416と、ホスト/デバイス機能3418とは、CUDAソース・コード3410中で混合され得る。少なくとも1つの実施例では、グローバル機能3412の各々は、デバイス上で実行可能であり、ホストからコール可能である。少なくとも1つの実施例では、グローバル機能3412のうちの1つ又は複数は、したがって、デバイスへのエントリ・ポイントとして働き得る。少なくとも1つの実施例では、グローバル機能3412の各々はカーネルである。少なくとも1つの実施例では、及び動的並列処理として知られる技法では、グローバル機能3412のうちの1つ又は複数は、カーネルを定義し、カーネルは、デバイス上で実行可能であり、そのようなデバイスからコール可能である。少なくとも1つの実施例では、カーネルは、実行中にデバイス上のN(ここで、Nは任意の正の整数である)個の異なるスレッドによって並列にN回実行される。
【0255】
少なくとも1つの実施例では、デバイス機能3414の各々は、デバイス上で実行され、そのようなデバイスからのみコール可能である。少なくとも1つの実施例では、ホスト機能3416の各々は、ホスト上で実行され、そのようなホストからのみコール可能である。少なくとも1つの実施例では、ホスト/デバイス機能3416の各々は、ホスト上で実行可能であり、そのようなホストからのみコール可能であるホスト・バージョンの機能と、デバイス上で実行可能であり、そのようなデバイスからのみコール可能であるデバイス・バージョンの機能の両方を定義する。
【0256】
少なくとも1つの実施例では、CUDAソース・コード3410は、限定はしないが、CUDAランタイムAPI3402を介して定義される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、CUDAランタイムAPI3402は、限定はしないが、デバイス・メモリを割り振り、割振り解除し、ホスト・メモリとデバイス・メモリとの間でデータを転送し、複数のデバイスをもつシステムを管理するなどのためにホスト上で実行する、任意の数の機能を含み得る。少なくとも1つの実施例では、CUDAソース・コード3410は、任意の数の他のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、CUDA APIは、CUDAコードによる使用のために設計される任意のAPIであり得る。少なくとも1つの実施例では、CUDA APIは、限定はしないが、CUDAランタイムAPI3402、CUDAドライバAPI、任意の数のCUDAライブラリのためのAPIなどを含む。少なくとも1つの実施例では、及びCUDAランタイムAPI3402に対して、CUDAドライバAPIは、より低いレベルのAPIであるが、デバイスのよりきめ細かい制御を提供する。少なくとも1つの実施例では、CUDAライブラリの実例は、限定はしないが、cuBLAS、cuFFT、cuRAND、cuDNNなどを含む。
【0257】
少なくとも1つの実施例では、CUDAコンパイラ3450は、ホスト実行可能コード3470(1)及びCUDAデバイス実行可能コード3484を生成するために、入力CUDAコード(たとえば、CUDAソース・コード3410)をコンパイルする。少なくとも1つの実施例では、CUDAコンパイラ3450はNVCCである。少なくとも1つの実施例では、ホスト実行可能コード3470(1)は、CPU3490上で実行可能である、入力ソース・コード中に含まれるホスト・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、CPU3490は、連続命令処理のために最適化される任意のプロセッサであり得る。
【0258】
少なくとも1つの実施例では、CUDAデバイス実行可能コード3484は、CUDA対応GPU3494上で実行可能である、入力ソース・コード中に含まれるデバイス・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、CUDAデバイス実行可能コード3484は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3484は、限定はしないが、PTXコードなどのIRコードを含み、これは、デバイス・ドライバによって、特定のターゲット・デバイス(たとえば、CUDA対応GPU3494)のためのバイナリ・コードに、ランタイムにおいてさらにコンパイルされる。少なくとも1つの実施例では、CUDA対応GPU3494は、並列命令処理のために最適化され、CUDAをサポートする、任意のプロセッサであり得る。少なくとも1つの実施例では、CUDA対応GPU3494は、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される。
【0259】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410を機能的に同様のHIPソース・コード3430にトランスレートするように構成される。少なくとも1つの実施例では、HIPソース・コード3430は、HIPプログラミング言語の人間が読み取れるコードの集合である。少なくとも1つの実施例では、HIPコードは、HIPプログラミング言語の人間が読み取れるコードである。少なくとも1つの実施例では、HIPプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための、機能的に同様のバージョンのCUDA機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、HIPプログラミング言語は、CUDAプログラミング言語の機能性のサブセットを含み得る。少なくとも1つの実施例では、たとえば、HIPプログラミング言語は、限定はしないが、グローバル機能3412を定義するための(1つ又は複数の)機構を含むが、そのようなHIPプログラミング言語は、動的並列処理のサポートがないことがあり、したがって、HIPコードにおいて定義されたグローバル機能3412は、ホストからのみコール可能であり得る。
【0260】
少なくとも1つの実施例では、HIPソース・コード3430は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3412と、(ゼロを含む)任意の数のデバイス機能3414と、(ゼロを含む)任意の数のホスト機能3416と、(ゼロを含む)任意の数のホスト/デバイス機能3418とを含む。少なくとも1つの実施例では、HIPソース・コード3430は、HIPランタイムAPI3432において指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、HIPランタイムAPI3432は、限定はしないが、CUDAランタイムAPI3402中に含まれる機能のサブセットの機能的に同様のバージョンを含む。少なくとも1つの実施例では、HIPソース・コード3430は、任意の数の他のHIP APIにおいて指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、HIP APIは、HIPコード及び/又はROCmによる使用のために設計される任意のAPIであり得る。少なくとも1つの実施例では、HIP APIは、限定はしないが、HIPランタイムAPI3432、HIPドライバAPI、任意の数のHIPライブラリのためのAPI、任意の数のROCmライブラリのためのAPIなどを含む。
【0261】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3420は、CUDAコード中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、CUDAコード中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。少なくとも1つの実施例では、CUDAコールは、CUDA APIにおいて指定された機能へのコールであり、HIPコールは、HIP APIにおいて指定された機能へのコールである。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3420は、CUDAランタイムAPI3402において指定された機能への任意の数のコールを、HIPランタイムAPI3432において指定された機能への任意の数のコールにコンバートする。
【0262】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3420は、テキスト・ベースのトランスレーション・プロセスを実行するhipify-perlとして知られるツールである。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3420は、hipify-clangとして知られるツールであり、これは、hipify-perlに対して、clang(コンパイラ・フロント・エンド)を使用してCUDAコードを構文解析することと、次いで、得られたシンボルをトランスレートすることとを伴う、より複雑でよりロバストなトランスレーション・プロセスを実行する。少なくとも1つの実施例では、CUDAコードをHIPコードに適切にコンバートすることは、CUDAからHIPへのトランスレーション・ツール3420によって実施される修正に加えて、修正(たとえば、手動の編集)を必要とし得る。
【0263】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3440は、ターゲット・デバイス3446を決定し、次いで、ターゲット・デバイス3446と互換性があるコンパイラを、HIPソース・コード3430をコンパイルするように構成する、フロント・エンドである。少なくとも1つの実施例では、ターゲット・デバイス3446は、並列命令処理のために最適化されるプロセッサである。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3440は、任意の技術的に実現可能な様式でターゲット・デバイス3446を決定し得る。
【0264】
少なくとも1つの実施例では、ターゲット・デバイス3446が、CUDA(たとえば、CUDA対応GPU3494)と互換性がある場合、HIPコンパイラ・ドライバ3440は、HIP/NVCCコンパイル・コマンド3442を生成する。少なくとも1つの実施例では、及び図34Bと併せてより詳細に説明されるように、HIP/NVCCコンパイル・コマンド3442は、限定はしないが、HIPからCUDAへのトランスレーション・ヘッダ及びCUDAランタイム・ライブラリを使用してHIPソース・コード3430をコンパイルするようにCUDAコンパイラ3450を構成する。少なくとも1つの実施例では、及びHIP/NVCCコンパイル・コマンド3442に応答して、CUDAコンパイラ3450は、ホスト実行可能コード3470(1)及びCUDAデバイス実行可能コード3484を生成する。
【0265】
少なくとも1つの実施例では、ターゲット・デバイス3446が、CUDAと互換性がない場合、HIPコンパイラ・ドライバ3440は、HIP/HCCコンパイル・コマンド3444を生成する。少なくとも1つの実施例では、及び図34Cと併せてより詳細に説明されるように、HIP/HCCコンパイル・コマンド3444は、限定はしないが、HCCヘッダ及びHIP/HCCランタイム・ライブラリを使用してHIPソース・コード3430をコンパイルするようにHCC3460を構成する。少なくとも1つの実施例では、及びHIP/HCCコンパイル・コマンド3444に応答して、HCC3460は、ホスト実行可能コード3470(2)及びHCCデバイス実行可能コード3482を生成する。少なくとも1つの実施例では、HCCデバイス実行可能コード3482は、GPU3492上で実行可能である、HIPソース・コード3430中に含まれるデバイス・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、GPU3492は、並列命令処理のために最適化され、CUDAと互換性がなく、HCCと互換性がある、任意のプロセッサであり得る。少なくとも1つの実施例では、GPU3492は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、GPU3492は、CUDA非対応GPU3492である。
【0266】
単に説明目的のために、CPU3490及び異なるデバイス上での実行のためにCUDAソース・コード3410をコンパイルするために少なくとも1つの実施例において実装され得る3つの異なるフローが、図34Aに図示されている。少なくとも1つの実施例では、直接的CUDAフローが、CUDAソース・コード3410をHIPソース・コード3430にトランスレートすることなしに、CPU3490及びCUDA対応GPU3494上での実行のためにCUDAソース・コード3410をコンパイルする。少なくとも1つの実施例では、間接的CUDAフローが、CUDAソース・コード3410をHIPソース・コード3430にトランスレートし、次いで、CPU3490及びCUDA対応GPU3494上での実行のためにHIPソース・コード3430をコンパイルする。少なくとも1つの実施例では、CUDA/HCCフローが、CUDAソース・コード3410をHIPソース・コード3430にトランスレートし、次いで、CPU3490及びGPU3492上での実行のためにHIPソース・コード3430をコンパイルする。
【0267】
少なくとも1つの実施例において実装され得る直接的CUDAフローは、破線及びA1~A3とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びA1とアノテーション付けされたバブルで図示されているように、CUDAコンパイラ3450は、CUDAソース・コード3410と、CUDAソース・コード3410をコンパイルするようにCUDAコンパイラ3450を構成するCUDAコンパイル・コマンド3448とを受信する。少なくとも1つの実施例では、直接的CUDAフローにおいて使用されるCUDAソース・コード3410は、C++以外のプログラミング言語(たとえば、C、Fortran、Python、Javaなど)に基づくCUDAプログラミング言語で書かれる。少なくとも1つの実施例では、及びCUDAコンパイル・コマンド3448に応答して、CUDAコンパイラ3450は、ホスト実行可能コード3470(1)及びCUDAデバイス実行可能コード3484を生成する(A2とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びA3とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3470(1)及びCUDAデバイス実行可能コード3484は、それぞれ、CPU3490及びCUDA対応GPU3494上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3484は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3484は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
【0268】
少なくとも1つの実施例において実装され得る間接的CUDAフローは、点線及びB1~B6とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びB1とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410を受信する。少なくとも1つの実施例では、及びB2とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410をHIPソース・コード3430にトランスレートする。少なくとも1つの実施例では、及びB3とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3440は、HIPソース・コード3430を受信し、ターゲット・デバイス3446がCUDA対応であると決定する。
【0269】
少なくとも1つの実施例では、及びB4とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3440は、HIP/NVCCコンパイル・コマンド3442を生成し、HIP/NVCCコンパイル・コマンド3442とHIPソース・コード3430の両方をCUDAコンパイラ3450に送信する。少なくとも1つの実施例では、及び図34Bと併せてより詳細に説明されるように、HIP/NVCCコンパイル・コマンド3442は、限定はしないが、HIPからCUDAへのトランスレーション・ヘッダ及びCUDAランタイム・ライブラリを使用してHIPソース・コード3430をコンパイルするようにCUDAコンパイラ3450を構成する。少なくとも1つの実施例では、及びHIP/NVCCコンパイル・コマンド3442に応答して、CUDAコンパイラ3450は、ホスト実行可能コード3470(1)及びCUDAデバイス実行可能コード3484を生成する(B5とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びB6とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3470(1)及びCUDAデバイス実行可能コード3484は、それぞれ、CPU3490及びCUDA対応GPU3494上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3484は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3484は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
【0270】
少なくとも1つの実施例において実装され得るCUDA/HCCフローは、実線及びC1~C6とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びC1とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410を受信する。少なくとも1つの実施例では、及びC2とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410をHIPソース・コード3430にトランスレートする。少なくとも1つの実施例では、及びC3とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3440は、HIPソース・コード3430を受信し、ターゲット・デバイス3446がCUDA対応でないと決定する。
【0271】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3440は、HIP/HCCコンパイル・コマンド3444を生成し、HIP/HCCコンパイル・コマンド3444とHIPソース・コード3430の両方をHCC3460に送信する(C4とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及び図34Cと併せてより詳細に説明されるように、HIP/HCCコンパイル・コマンド3444は、限定はしないが、HCCヘッダ及びHIP/HCCランタイム・ライブラリを使用してHIPソース・コード3430をコンパイルするようにHCC3460を構成する。少なくとも1つの実施例では、及びHIP/HCCコンパイル・コマンド3444に応答して、HCC3460は、ホスト実行可能コード3470(2)及びHCCデバイス実行可能コード3482を生成する(C5とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びC6とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3470(2)及びHCCデバイス実行可能コード3482は、それぞれ、CPU3490及びGPU3492上で実行され得る。
【0272】
少なくとも1つの実施例では、CUDAソース・コード3410がHIPソース・コード3430にトランスレートされた後に、HIPコンパイラ・ドライバ3440は、その後、CUDAからHIPへのトランスレーション・ツール3420を再実行することなしに、CUDA対応GPU3494又はGPU3492のいずれかのための実行可能コードを生成するために使用され得る。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410をHIPソース・コード3430にトランスレートし、HIPソース・コード3430は、次いで、メモリに記憶される。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3440は、次いで、HIPソース・コード3430に基づいてホスト実行可能コード3470(2)及びHCCデバイス実行可能コード3482を生成するようにHCC3460を構成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3440は、その後、記憶されたHIPソース・コード3430に基づいてホスト実行可能コード3470(1)及びCUDAデバイス実行可能コード3484を生成するようにCUDAコンパイラ3450を構成する。
【0273】
図34Bは、少なくとも1つの実施例による、CPU3490及びCUDA対応GPU3494を使用して、図34AのCUDAソース・コード3410をコンパイル及び実行するように構成されたシステム3404を示す。少なくとも1つの実施例では、システム3404は、限定はしないが、CUDAソース・コード3410と、CUDAからHIPへのトランスレーション・ツール3420と、HIPソース・コード3430と、HIPコンパイラ・ドライバ3440と、CUDAコンパイラ3450と、ホスト実行可能コード3470(1)と、CUDAデバイス実行可能コード3484と、CPU3490と、CUDA対応GPU3494とを含む。
【0274】
少なくとも1つの実施例では、及び図34Aと併せて本明細書で前に説明されたように、CUDAソース・コード3410は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3412と、(ゼロを含む)任意の数のデバイス機能3414と、(ゼロを含む)任意の数のホスト機能3416と、(ゼロを含む)任意の数のホスト/デバイス機能3418とを含む。少なくとも1つの実施例では、CUDAソース・コード3410は、限定はしないが、任意の数のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含む。
【0275】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410をHIPソース・コード3430にトランスレートする。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、CUDAソース・コード3410中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。
【0276】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3440は、ターゲット・デバイス3446がCUDA対応であると決定し、HIP/NVCCコンパイル・コマンド3442を生成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3440は、次いで、HIPソース・コード3430をコンパイルするようにHIP/NVCCコンパイル・コマンド3442を介してCUDAコンパイラ3450を構成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3440は、CUDAコンパイラ3450を構成することの一部として、HIPからCUDAへのトランスレーション・ヘッダ3452へのアクセスを提供する。少なくとも1つの実施例では、HIPからCUDAへのトランスレーション・ヘッダ3452は、任意の数のHIP APIにおいて指定された任意の数の機構(たとえば、機能)を、任意の数のCUDA APIにおいて指定された任意の数の機構にトランスレートする。少なくとも1つの実施例では、CUDAコンパイラ3450は、ホスト実行可能コード3470(1)及びCUDAデバイス実行可能コード3484を生成するために、CUDAランタイムAPI3402に対応するCUDAランタイム・ライブラリ3454と併せて、HIPからCUDAへのトランスレーション・ヘッダ3452を使用する。少なくとも1つの実施例では、ホスト実行可能コード3470(1)及びCUDAデバイス実行可能コード3484は、次いで、それぞれ、CPU3490及びCUDA対応GPU3494上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3484は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3484は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
【0277】
図34Cは、少なくとも1つの実施例による、CPU3490及びCUDA非対応GPU3492を使用して、図34AのCUDAソース・コード3410をコンパイル及び実行するように構成されたシステム3406を示す。少なくとも1つの実施例では、システム3406は、限定はしないが、CUDAソース・コード3410と、CUDAからHIPへのトランスレーション・ツール3420と、HIPソース・コード3430と、HIPコンパイラ・ドライバ3440と、HCC3460と、ホスト実行可能コード3470(2)と、HCCデバイス実行可能コード3482と、CPU3490と、GPU3492とを含む。
【0278】
少なくとも1つの実施例では、及び図34Aと併せて本明細書で前に説明されたように、CUDAソース・コード3410は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3412と、(ゼロを含む)任意の数のデバイス機能3414と、(ゼロを含む)任意の数のホスト機能3416と、(ゼロを含む)任意の数のホスト/デバイス機能3418とを含む。少なくとも1つの実施例では、CUDAソース・コード3410は、限定はしないが、任意の数のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含む。
【0279】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410をHIPソース・コード3430にトランスレートする。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、ソース・コード3410中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。
【0280】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3440は、その後、ターゲット・デバイス3446がCUDA対応でないと決定し、HIP/HCCコンパイル・コマンド3444を生成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3440は、次いで、HIPソース・コード3430をコンパイルするためにHIP/HCCコンパイル・コマンド3444を実行するようにHCC3460を構成する。少なくとも1つの実施例では、HIP/HCCコンパイル・コマンド3444は、限定はしないが、ホスト実行可能コード3470(2)及びHCCデバイス実行可能コード3482を生成するためにHIP/HCCランタイム・ライブラリ3458及びHCCヘッダ3456を使用するようにHCC3460を構成する。少なくとも1つの実施例では、HIP/HCCランタイム・ライブラリ3458は、HIPランタイムAPI3432に対応する。少なくとも1つの実施例では、HCCヘッダ3456は、限定はしないが、HIP及びHCCのための任意の数及びタイプの相互運用性機構を含む。少なくとも1つの実施例では、ホスト実行可能コード3470(2)及びHCCデバイス実行可能コード3482は、それぞれ、CPU3490及びGPU3492上で実行され得る。
【0281】
少なくとも1つの実施例では、図34A図34Cに図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図34A図34Cに図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0282】
図35は、少なくとも1つの実施例による、図34CのCUDAからHIPへのトランスレーション・ツール3420によってトランスレートされた例示的なカーネルを示す。少なくとも1つの実施例では、CUDAソース・コード3410は、所与のカーネルが解くように設計される全体的な問題を、スレッド・ブロックを使用して独立して解かれ得る比較的粗いサブ問題に区分けする。少なくとも1つの実施例では、各スレッド・ブロックは、限定はしないが、任意の数のスレッドを含む。少なくとも1つの実施例では、各サブ問題は、スレッド・ブロック内のスレッドによって並列に連動して解かれ得る比較的細かい部片に区分けされる。少なくとも1つの実施例では、スレッド・ブロック内のスレッドは、共有メモリを通してデータを共有することによって、及びメモリ・アクセスを協調させるために実行を同期させることによって連動することができる。
【0283】
少なくとも1つの実施例では、CUDAソース・コード3410は、所与のカーネルに関連するスレッド・ブロックを、スレッド・ブロックの1次元グリッド、2次元グリッド、又は3次元グリッドに組織化する。少なくとも1つの実施例では、各スレッド・ブロックは、限定はしないが、任意の数のスレッドを含み、グリッドは、限定はしないが、任意の数のスレッド・ブロックを含む。
【0284】
少なくとも1つの実施例では、カーネルは、「__global__」宣言指定子(declaration specifier)を使用して定義されるデバイス・コード中の関数である。少なくとも1つの実施例では、所与のカーネル・コール及び関連するストリームについてカーネルを実行するグリッドの次元は、CUDAカーネル起動シンタックス3510を使用して指定される。少なくとも1つの実施例では、CUDAカーネル起動シンタックス3510は、「KernelName<<<GridSize,BlockSize,SharedMemorySize,Stream>>>(KernelArguments);」として指定される。少なくとも1つの実施例では、実行構成シンタックスは、カーネル名(「KernelName」)とカーネル引数の括弧に入れられたリスト(「KernelArguments」)との間に挿入される「<<<...>>>」構築物である。少なくとも1つの実施例では、CUDAカーネル起動シンタックス3510は、限定はしないが、実行構成シンタックスの代わりにCUDA起動機能シンタックスを含む。
【0285】
少なくとも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を与えられる。
【0286】
少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3510に関して、「SharedMemorySize」は、静的に割り振られたメモリに加えて、所与のカーネル・コールについてスレッド・ブロックごとに動的に割り振られる共有メモリ中のバイトの数を指定する随意の引数である。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3510に関して、SharedMemorySizeは0にデフォルト設定される。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3510に関して、「Stream」は、関連するストリームを指定する随意の引数であり、デフォルト・ストリームを指定するために0にデフォルト設定される。少なくとも1つの実施例では、ストリームは、イン・オーダーで実行する(場合によっては、異なるホスト・スレッドによって発行された)コマンドのシーケンスである。少なくとも1つの実施例では、異なるストリームは、互いに対してアウト・オブ・オーダーで、又は同時に、コマンドを実行し得る。
【0287】
少なくとも1つの実施例では、CUDAソース・コード3410は、限定はしないが、例示的なカーネル「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カーネル起動シンタックス3510通りに、カーネルMatAddは、寸法N/16×N/16を有する、スレッド・ブロックのグリッドを使用して実行され、ここで、各スレッド・ブロックは、16×16の寸法を有する。少なくとも1つの実施例では、各スレッド・ブロックは、256個のスレッドを含み、グリッドは、行列要素ごとに1つのスレッドを有するのに十分なブロックで作成され、そのようなグリッド中の各スレッドは、1つのペアワイズ加算を実施するためにカーネルMatAddを実行する。
【0288】
少なくとも1つの実施例では、CUDAソース・コード3410をHIPソース・コード3430にトランスレートする間、CUDAからHIPへのトランスレーション・ツール3420は、CUDAソース・コード3410中の各カーネル・コールを、CUDAカーネル起動シンタックス3510からHIPカーネル起動シンタックス3520にトランスレートし、ソース・コード3410中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。少なくとも1つの実施例では、HIPカーネル起動シンタックス3520は、「hipLaunchKernelGGL(KernelName,GridSize,BlockSize,SharedMemorySize,Stream,KernelArguments);」として指定される。少なくとも1つの実施例では、KernelName、GridSize、BlockSize、ShareMemorySize、Stream、及びKernelArgumentsの各々は、HIPカーネル起動シンタックス3520において、(本明細書で前に説明された)CUDAカーネル起動シンタックス3510の場合と同じ意味を有する。少なくとも1つの実施例では、引数SharedMemorySize及びStreamは、HIPカーネル起動シンタックス3520では必要とされ、CUDAカーネル起動シンタックス3510では随意である。
【0289】
少なくとも1つの実施例では、図35に図示されたHIPソース・コード3430の一部分は、カーネルMatAddにデバイス上で実行させるカーネル・コールを除いて、図35に図示されたCUDAソース・コード3410の一部分と同一である。少なくとも1つの実施例では、カーネルMatAddは、カーネルMatAddがCUDAソース・コード3410において定義される、同じ「__global__」宣言指定子を用いて、HIPソース・コード3430において定義される。少なくとも1つの実施例では、HIPソース・コード3430中のカーネル・コールは、「hipLaunchKernelGGL(MatAdd,numBlocks,threadsPerBlock,0,0,A,B,C);」であるが、CUDAソース・コード3410中の対応するカーネル・コールは、「MatAdd<<<numBlocks,threadsPerBlock>>>(A,B,C);」である。
【0290】
少なくとも1つの実施例では、図35に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図35に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0291】
図36は、少なくとも1つの実施例による、図34CのCUDA非対応GPU3492をより詳細に示す。少なくとも1つの実施例では、GPU3492は、サンタクララのAMD corporationによって開発される。少なくとも1つの実施例では、GPU3492は、高度並列様式でコンピュート動作を実施するように構成され得る。少なくとも1つの実施例では、GPU3492は、描画コマンド、ピクセル動作、幾何学的算出、及びディスプレイに画像をレンダリングすることに関連する他の動作など、グラフィックス・パイプライン動作を実行するように構成される。少なくとも1つの実施例では、GPU3492は、グラフィックに関係しない動作を実行するように構成される。少なくとも1つの実施例では、GPU3492は、グラフィックに関係する動作とグラフィックに関係しない動作の両方を実行するように構成される。少なくとも1つの実施例では、GPU3492は、HIPソース・コード3430中に含まれるデバイス・コードを実行するように構成され得る。
【0292】
少なくとも1つの実施例では、GPU3492は、限定はしないが、任意の数のプログラマブル処理ユニット3620と、コマンド・プロセッサ3610と、L2キャッシュ3622と、メモリ・コントローラ3670と、DMAエンジン3680(1)と、システム・メモリ・コントローラ3682と、DMAエンジン3680(2)と、GPUコントローラ3684とを含む。少なくとも1つの実施例では、各プログラマブル処理ユニット3620は、限定はしないが、ワークロード・マネージャ3630と、任意の数のコンピュート・ユニット3640とを含む。少なくとも1つの実施例では、コマンド・プロセッサ3610は、1つ又は複数のコマンド・キュー(図示せず)からコマンドを読み取り、ワークロード・マネージャ3630にコマンドを分散させる。少なくとも1つの実施例では、各プログラマブル処理ユニット3620について、関連するワークロード・マネージャ3630は、プログラマブル処理ユニット3620中に含まれるコンピュート・ユニット3640にワークを分散させる。少なくとも1つの実施例では、各コンピュート・ユニット3640は、任意の数のスレッド・ブロックを実行し得るが、各スレッド・ブロックは、単一のコンピュート・ユニット3640上で実行する。少なくとも1つの実施例では、ワークグループは、スレッド・ブロックである。
【0293】
少なくとも1つの実施例では、各コンピュート・ユニット3640は、限定はしないが、任意の数のSIMDユニット3650と、共有メモリ3660とを含む。少なくとも1つの実施例では、各SIMDユニット3650は、SIMDアーキテクチャを実装し、動作を並列に実施するように構成され得る。少なくとも1つの実施例では、各SIMDユニット3650は、限定はしないが、ベクトルALU3652とベクトル・レジスタ・ファイル3654とを含む。少なくとも1つの実施例では、各SIMDユニット3650は、異なるワープを実行する。少なくとも1つの実施例では、ワープは、スレッドのグループ(たとえば、16個のスレッド)であり、ここで、ワープ中の各スレッドは、単一のスレッド・ブロックに属し、命令の単一のセットに基づいて、データの異なるセットを処理するように構成される。少なくとも1つの実施例では、ワープ中の1つ又は複数のスレッドを無効にするために、プレディケーションが使用され得る。少なくとも1つの実施例では、レーンはスレッドである。少なくとも1つの実施例では、ワーク・アイテムはスレッドである。少なくとも1つの実施例では、ウェーブフロントはワープである。少なくとも1つの実施例では、スレッド・ブロック中の異なるウェーブフロントは、互いに同期し、共有メモリ3660を介して通信し得る。
【0294】
少なくとも1つの実施例では、プログラマブル処理ユニット3620は、「シェーダ・エンジン」と呼ばれる。少なくとも1つの実施例では、各プログラマブル処理ユニット3620は、限定はしないが、コンピュート・ユニット3640に加えて、任意の量の専用グラフィックス・ハードウェアを含む。少なくとも1つの実施例では、各プログラマブル処理ユニット3620は、限定はしないが、(ゼロを含む)任意の数のジオメトリ・プロセッサと、(ゼロを含む)任意の数のラスターライザと、(ゼロを含む)任意の数のレンダー・バック・エンドと、ワークロード・マネージャ3630と、任意の数のコンピュート・ユニット3640とを含む。
【0295】
少なくとも1つの実施例では、コンピュート・ユニット3640は、L2キャッシュ3622を共有する。少なくとも1つの実施例では、L2キャッシュ3622は区分けされる。少なくとも1つの実施例では、GPUメモリ3690は、GPU3492中のすべてのコンピュート・ユニット3640によってアクセス可能である。少なくとも1つの実施例では、メモリ・コントローラ3670及びシステム・メモリ・コントローラ3682は、GPU3492とホストとの間のデータ転送を容易にし、DMAエンジン3680(1)は、GPU3492とそのようなホストとの間の非同期メモリ転送を可能にする。少なくとも1つの実施例では、メモリ・コントローラ3670及びGPUコントローラ3684は、GPU3492と他のGPU3492との間のデータ転送を容易にし、DMAエンジン3680(2)は、GPU3492と他のGPU3492との間の非同期メモリ転送を可能にする。
【0296】
少なくとも1つの実施例では、GPU3492は、限定はしないが、GPU3492の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする、任意の量及びタイプのシステム相互接続を含む。少なくとも1つの実施例では、GPU3492は、限定はしないが、任意の数及びタイプの周辺デバイスに結合される、任意の数及びタイプのI/Oインターフェース(たとえば、PCIe)を含む。少なくとも1つの実施例では、GPU3492は、限定はしないが、(ゼロを含む)任意の数のディスプレイ・エンジンと、(ゼロを含む)任意の数のマルチメディア・エンジンとを含み得る。少なくとも1つの実施例では、GPU3492は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ(たとえば、メモリ・コントローラ3670及びシステム・メモリ・コントローラ3682)及びメモリ・デバイス(たとえば、共有メモリ3660)を含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、GPU3492は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ3622)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、SIMDユニット3650、コンピュート・ユニット3640、及びプログラマブル処理ユニット3620)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
【0297】
少なくとも1つの実施例では、図36に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図36に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0298】
図37は、少なくとも1つの実施例による、例示的なCUDAグリッド3720のスレッドが図36の異なるコンピュート・ユニット3640にどのようにマッピングされるかを示す。少なくとも1つの実施例では、及び単に説明目的のために、グリッド3720は、BX×BY×1のGridSizeと、TX×TY×1のBlockSizeとを有する。少なくとも1つの実施例では、グリッド3720は、したがって、限定はしないが、(BX*BY)個のスレッド・ブロック3730を含み、各スレッド・ブロック3730は、限定はしないが、(TX*TY)個のスレッド3740を含む。スレッド3740は、曲がりくねった矢印(squiggly arrow)として図37に図示されている。
【0299】
少なくとも1つの実施例では、グリッド3720は、限定はしないが、コンピュート・ユニット3640(1)~3640(C)を含むプログラマブル処理ユニット3620(1)にマッピングされる。少なくとも1つの実施例では、及び示されているように、(BJ*BY)個のスレッド・ブロック3730が、コンピュート・ユニット3640(1)にマッピングされ、残りのスレッド・ブロック3730が、コンピュート・ユニット3640(2)にマッピングされる。少なくとも1つの実施例では、各スレッド・ブロック3730は、限定はしないが、任意の数のワープを含み得、各ワープは、図36の異なるSIMDユニット3650にマッピングされる。
【0300】
少なくとも1つの実施例では、所与のスレッド・ブロック3730中のワープは、互いに同期し、関連するコンピュート・ユニット3640中に含まれる共有メモリ3660を通して通信し得る。たとえば、及び少なくとも1つの実施例では、スレッド・ブロック3730(BJ,1)中のワープは、互いに同期し、共有メモリ3660(1)を通して通信することができる。たとえば、及び少なくとも1つの実施例では、スレッド・ブロック3730(BJ+1,1)中のワープは、互いに同期し、共有メモリ3660(2)を通して通信することができる。
【0301】
少なくとも1つの実施例では、図37に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図37に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0302】
図38は、少なくとも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加速を使用する複雑なアルゴリズムを構築し、次いで、それらを、異なるタイプのデータに関するそれらのソース・コード全体にわたって再使用することができる、単一ソース開発を可能にし得る。
【0303】
少なくとも1つの実施例では、DPC++コンパイラは、多様なハードウェア・ターゲットにわたって導入され得るDPC++ソース・コードをコンパイルするために使用される。少なくとも1つの実施例では、DPC++コンパイラは、多様なハードウェア・ターゲットにわたって導入され得るDPC++アプリケーションを生成するために使用され、DPC++互換性ツールは、CUDAアプリケーションをDPC++のマルチプラットフォーム・プログラムにマイグレートするために使用され得る。少なくとも1つの実施例では、DPC++ベース・ツール・キットは、多様なハードウェア・ターゲットにわたってアプリケーションを導入するためのDPC++コンパイラと、CPU、GPU、及びFPGAにわたって生産性及び性能を増加させるためのDPC++ライブラリと、CUDAアプリケーションをマルチプラットフォーム・アプリケーションにマイグレートするためのDPC++互換性ツールと、それらの任意の好適な組合せとを含む。
【0304】
少なくとも1つの実施例では、DPC++プログラミング・モデルは、Data Parallel C++と呼ばれるプログラミング言語を用いて並列処理を表現するための現代のC++特徴を使用することによって、単に、CPU及びアクセラレータをプログラムすることに関係する1つ又は複数の態様に対して利用される。DPC++プログラミング言語は、ホスト(たとえば、CPU)及びアクセラレータ(たとえば、GPU又はFPGA)のためのコード再使用に対して利用され、単一のソース言語を使用し、実行及びメモリ依存性が明確に通信され得る。DPC++コード内でのマッピングは、アプリケーションを移行させて、ワークロードを最も良く加速するハードウェア又はハードウェア・デバイスのセット上で稼働するために、使用され得る。利用可能なアクセラレータを有しないプラットフォーム上でも、デバイス・コードの開発及びデバッギングを簡略化するために、ホストが利用可能であり得る。
【0305】
少なくとも1つの実施例では、人間が読み取れるDPC++3804を生成するために、DPC++互換性ツール3802への入力として、CUDAソース・コード3800が提供される。少なくとも1つの実施例では、人間が読み取れるDPC++3804は、DPC++互換性ツール3802によって生成されたインライン・コメントを含み、これは、コーディングと所望の性能への調整とを完了3806するために、DPC++コードをどのように及び/又はどこで修正すべきかに関して開発者をガイドし、それにより、DPC++ソース・コード3808を生成する。
【0306】
少なくとも1つの実施例では、CUDAソース・コード3800は、CUDAプログラミング言語の人間が読み取れるソース・コードの集合であるか、又はその集合を含む。少なくとも1つの実施例では、CUDAソース・コード3800は、CUDAプログラミング言語の人間が読み取れるソース・コードである。少なくとも1つの実施例では、CUDAプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、デバイス・コードは、コンパイルの後に、デバイス(たとえば、GPU又はFPGA)上で実行可能であり、デバイスの1つ又は複数のプロセッサ・コア上で実行され得る、又はより並列化可能なワークフローを含み得る、ソース・コードである。少なくとも1つの実施例では、デバイスは、CUDA対応GPU、GPU、又は別のGPGPUなど、並列命令処理のために最適化されるプロセッサであり得る。少なくとも1つの実施例では、ホスト・コードは、コンパイルの後にホスト上で実行可能であるソース・コードである。少なくとも1つの実施例では、ホスト・コード及びデバイス・コードの一部又は全部は、CPU及びGPU/FPGAにわたって並列に実行され得る。少なくとも1つの実施例では、ホストは、CPUなど、連続命令処理のために最適化されるプロセッサである。図38に関して説明されるCUDAソース・コード3800は、本明細書の他の場所で説明されるCUDAソース・コードに従い得る。
【0307】
少なくとも1つの実施例では、DPC++互換性ツール3802は、DPC++ソース・コード3808へのCUDAソース・コード3800のマイグレーションを容易にするために使用される、実行可能ツール、プログラム、アプリケーション、又は任意の他の好適なタイプのツールを指す。少なくとも1つの実施例では、DPC++互換性ツール3802は、既存のCUDAソースをDPC++に移植するために使用されるDPC++ツール・キットの一部として利用可能なコマンド・ライン・ベースのコード・マイグレーション・ツールである。少なくとも1つの実施例では、DPC++互換性ツール3802は、CUDAアプリケーションの一部又は全部のソース・コードをCUDAからDPC++にコンバートし、人間が読み取れるDPC++3804と呼ばれる、少なくとも部分的にDPC++で書かれる得られたファイルを生成する。少なくとも1つの実施例では、人間が読み取れるDPC++3804は、ユーザ介入がどこで必要であり得るかを示すためにDPC++互換性ツール3802によって生成されるコメントを含む。少なくとも1つの実施例では、ユーザ介入は、CUDAソース・コード3800が、類似するDPC++APIを有しないCUDA APIをコールするとき、必要であり、ユーザ介入が必要とされる他の実例は、後でより詳細に説明される。
【0308】
少なくとも1つの実施例では、CUDAソース・コード3800(たとえば、アプリケーション又はそれの部分)をマイグレートするためのワークフローは、1つ又は複数のコンパイル・データベース・ファイルを作成することと、DPC++互換性ツール3802を使用してCUDAをDPC++にマイグレートすることと、マイグレーションを完了し、正当性を確認し、それにより、DPC++ソース・コード3808を生成することと、DPC++アプリケーションを生成するためにDPC++コンパイラを用いてDPC++ソース・コード3808をコンパイルすることとを含む。少なくとも1つの実施例では、互換性ツールは、Makefileが実行するときに使用されるコマンドをインターセプトし、それらをコンパイル・データベース・ファイルに記憶する、ユーティリティを提供する。少なくとも1つの実施例では、ファイルは、JSONフォーマットで記憶される。少なくとも1つの実施例では、intercept-builtコマンドは、MakefileコマンドをDPC互換性コマンドにコンバートする。
【0309】
少なくとも1つの実施例では、intercept-buildは、ビルド・プロセスをインターセプトして、コンパイル・オプション、マクロ定義(macro defs)、及びインクルード・パス(include paths)をキャプチャし、このデータをコンパイル・データベース・ファイルに書き込む、ユーティリティ・スクリプトである。少なくとも1つの実施例では、コンパイル・データベース・ファイルは、JSONファイルである。少なくとも1つの実施例では、DPC++互換性ツール3802は、コンパイル・データベースを構文解析し、入力ソースをマイグレートするときにオプションを適用する。少なくとも1つの実施例では、intercept-buildの使用は、随意であるが、Make又はCMakeベースの環境について大いに推奨される。少なくとも1つの実施例では、マイグレーション・データベースは、コマンドとディレクトリとファイルとを含み、コマンドは、必要なコンパイル・フラグを含み得、ディレクトリは、ヘッダ・ファイルへのパスを含み得、ファイルは、CUDAファイルへのパスを含み得る。
【0310】
少なくとも1つの実施例では、DPC++互換性ツール3802は、可能な場合はいつでもDPC++を生成することによって、CUDAで書かれたCUDAコード(たとえば、アプリケーション)をDPC++にマイグレートする。少なくとも1つの実施例では、DPC++互換性ツール3802は、ツール・キットの一部として利用可能である。少なくとも1つの実施例では、DPC++ツール・キットは、intercept-buildツールを含む。少なくとも1つの実施例では、intercept-builtツールは、CUDAファイルをマイグレートするためにコンパイル・コマンドをキャプチャするコンパイル・データベースを作成する。少なくとも1つの実施例では、intercept-builtツールによって生成されたコンパイル・データベースは、CUDAコードをDPC++にマイグレートするためにDPC++互換性ツール3802によって使用される。少なくとも1つの実施例では、非CUDA C++コード及びファイルは、そのままマイグレートされる。少なくとも1つの実施例では、DPC++互換性ツール3802は、人間が読み取れるDPC++3804を生成し、これは、DPC++互換性ツール3802によって生成されたとき、DPC++コンパイラによってコンパイルされないことがあり、正しくマイグレートされなかったコードの部分を確認するための追加のプラミング(plumbing)を必要とする、DPC++コードであり得、開発者によってなど、手動の介入を伴い得る。少なくとも1つの実施例では、DPC++互換性ツール3802は、自動的にマイグレートされないことがある追加のコードを開発者が手動でマイグレートするのを助けるために、コード中に埋め込まれたヒント又はツールを提供する。少なくとも1つの実施例では、マイグレーションは、ソース・ファイル、プロジェクト、又はアプリケーションのための1回のアクティビティである。
【0311】
少なくとも1つの実施例では、DPC++互換性ツール38002は、CUDAコードのすべての部分をDPC++に正常にマイグレートすることが可能であり、単に、生成されたDPC++ソース・コードの性能を手動で確認及び調整するための随意のステップがあり得る。少なくとも1つの実施例では、DPC++互換性ツール3802は、DPC++互換性ツール3802によって生成されたDPC++コードを修正するための人間の介入を必要とするか又は利用することなしに、DPC++コンパイラによってコンパイルされるDPC++ソース・コード3808を直接生成する。少なくとも1つの実施例では、DPC++互換性ツールは、コンパイル可能なDPC++コードを生成し、これは、性能、読みやすさ、維持可能性、他の様々な考慮事項、又はそれらの任意の組合せについて、開発者によって随意に調整され得る。
【0312】
少なくとも1つの実施例では、1つ又は複数のCUDAソース・ファイルは、少なくとも部分的にDPC++互換性ツール3802を使用してDPC++ソース・ファイルにマイグレートされる。少なくとも1つの実施例では、CUDAソース・コードは、CUDAヘッダ・ファイルを含み得る1つ又は複数のヘッダ・ファイルを含む。少なくとも1つの実施例では、CUDAソース・ファイルは、<cuda.h>ヘッダ・ファイルと、テキストをプリントするために使用され得る<stdio.h>ヘッダ・ファイルとを含む。少なくとも1つの実施例では、ベクトル加算カーネルCUDAソース・ファイルの一部分は、以下のように書かれるか、又は以下に関係し得る。
【数5-1】

【数5-2】
【0313】
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、DPC++互換性ツール3802は、CUDAソース・コードを構文解析し、ヘッダ・ファイルを、適切なDPC++ヘッダ・ファイル及びSYCLヘッダ・ファイルと置き換える。少なくとも1つの実施例では、DPC++ヘッダ・ファイルは、ヘルパー宣言(helper declaration)を含む。CUDAでは、スレッドIDの概念があり、対応して、DPC++又はSYCLでは、各要素について、ローカル識別子がある。
【0314】
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、初期化される2つのベクトルA及びBがあり、ベクトル加算結果が、VectorAddKernel()の一部として、ベクトルCに入れられる。少なくとも1つの実施例では、DPC++互換性ツール3802は、CUDAコードをDPC++コードにマイグレートすることの一部として、ワーク要素をインデックス付けするために使用されるCUDAスレッドIDを、ローカルIDを介したワーク要素のためのSYCL標準アドレッシングにコンバートする。少なくとも1つの実施例では、DPC++互換性ツール3802によって生成されたDPC++コードは、たとえば、nd_itemの次元を低減し、それにより、メモリ及び/又はプロセッサ利用率を増加させることによって、最適化され得る。
【0315】
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、メモリ割振りがマイグレートされる。少なくとも1つの実施例では、cudaMalloc()は、プラットフォーム、デバイス、コンテキスト、及びキューなど、SYCL概念に依拠して、デバイス及びコンテキストが渡される、統一共有メモリSYCLコールmalloc_device()にマイグレートされる。少なくとも1つの実施例では、SYCLプラットフォームは、複数のデバイス(たとえば、ホスト及びGPUデバイス)を有することができ、デバイスは、ジョブがサブミットされ得る複数のキューを有し得、各デバイスは、コンテキストを有し得、コンテキストは、複数のデバイスを有し、共有メモリ・オブジェクトを管理し得る。
【0316】
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、main()関数は、2つのベクトルAとBとを互いに加算し、結果をベクトルCに記憶するための、VectorAddKernel()を呼び出すか又はコールする。少なくとも1つの実施例では、VectorAddKernel()を呼び出すためのCUDAコードは、実行のためにカーネルをコマンド・キューにサブミットするためのDPC++コードによって置き換えられる。少なくとも1つの実施例では、コマンド・グループ・ハンドラcghは、キューにサブミットされる、データ、同期、及び算出を渡し、parallel_forは、VectorAddKernel()がコールされるワーク・グループ中の、グローバル要素の数及びワーク・アイテムの数についてコールされる。
【0317】
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、デバイス・メモリをコピーし、次いで、ベクトルA、B、及びCのためのメモリを解放するためのCUDAコールが、対応するDPC++コールにマイグレートされる。少なくとも1つの実施例では、C++コード(たとえば、浮動小数点変数のベクトルをプリントするための標準ISO C++コード)は、DPC++互換性ツール3802によって修正されることなしに、そのままマイグレートされる。少なくとも1つの実施例では、DPC++互換性ツール3802は、加速デバイス上でカーネルを実行するために、メモリ・セットアップ及び/又はホスト・コールのためのCUDA APIを修正する。少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、(たとえば、コンパイルされ得る)対応する人間が読み取れるDPC++3804は、以下のように書かれるか、又は以下に関係する。
【数6-1】

【数6-2】

【数6-3】
【0318】
少なくとも1つの実施例では、人間が読み取れるDPC++3804は、DPC++互換性ツール3802によって生成された出力を指し、ある様式又は別の様式で最適化され得る。少なくとも1つの実施例では、DPC++互換性ツール3802によって生成された人間が読み取れるDPC++3804は、それをより維持可能にすること、性能、又は他の考慮事項のために、マイグレーションの後に開発者によって手動で編集され得る。少なくとも1つの実施例では、開示されるDPC++などのDPC++互換性ツール38002によって生成されたDPC++コードは、各malloc_device()コールのためのget_current_device()及び/又はget_default_context()への繰返しコールを削除することによって最適化され得る。少なくとも1つの実施例では、上記で生成されるDPC++コードは、3次元のnd_rangeを使用し、これは、単一次元のみを使用し、それにより、メモリ使用量を低減するために、再ファクタ化され得る。少なくとも1つの実施例では、開発者は、DPC++互換性ツール3802によって生成されたDPC++コードを手動で編集し、統一共有メモリの使用をアクセッサと置き換えることができる。少なくとも1つの実施例では、DPC++互換性ツール3802は、それがCUDAコードをDPC++コードにどのようにマイグレートするかを変更するためのオプションを有する。少なくとも1つの実施例では、DPC++互換性ツール3802は、それが、CUDAコードを、多数の場合について機能するDPC++コードにマイグレートするための一般的なテンプレートを使用しているので、冗長である。
【0319】
少なくとも1つの実施例では、CUDAからDPC++へのマイグレーション・ワークフローは、intercept-buildスクリプトを使用してマイグレーションの準備をするためのステップと、DPC++互換性ツール3802を使用してDPC++へのCUDAプロジェクトのマイグレーションを実施するためのステップと、完了及び正当性のために、マイグレートされたソース・ファイルを手動で検討及び編集するためのステップと、DPC++アプリケーションを生成するために最終DPC++コードをコンパイルするためのステップとを含む。少なくとも1つの実施例では、DPC++ソース・コードの手動の検討は、限定はしないが、マイグレートされたAPIがエラー・コードを返さないこと(CUDAコードは、エラー・コードを返すことができ、エラー・コードは、次いで、アプリケーションよって消費され得るが、SYCLは、エラーを報告するために例外を使用し、したがって、エラーを表面化させるためのエラー・コードを使用しない)、CUDAコンピュート能力依存論理がDPC++によってサポートされないこと、ステートメントが削除されないことがあることを含む、1つ又は複数のシナリオにおいて必要とされ得る。少なくとも1つの実施例では、DPC++コードが手動の介入を必要とするシナリオは、限定はしないが、エラー・コード論理が(*,0)コードと置き換えられるか又はコメント・アウトされる、等価なDPC++APIが利用可能でない、CUDAコンピュート能力依存論理、ハードウェア依存API(clock())、欠落した特徴、サポートされていないAPI、実行時間測定論理、組み込みベクトル・タイプ競合に対処すること、cuBLAS APIのマイグレーションなどを含み得る。
【0320】
少なくとも1つの実施例では、図38に図示された1つ又は複数のシステムは、グラフ・コードの記述表現が生成されることを引き起こすためにAPIを実施するために利用される。少なくとも1つの実施例では、図38に図示された1つ又は複数のシステムは、図1図6に関して説明されたものなど、1つ又は複数のシステム及び/又はプロセスを実装するために利用される。
【0321】
少なくとも1つの実施例では、本明細書で説明される1つ又は複数の技法は、oneAPIプログラミング・モデルを利用する。少なくとも1つの実施例では、oneAPIプログラミング・モデルは、様々なコンピュート・アクセラレータ・アーキテクチャと対話するためのプログラミング・モデルを指す。少なくとも1つの実施例では、oneAPIは、様々なコンピュート・アクセラレータ・アーキテクチャと対話するように設計されたアプリケーション・プログラミング・インターフェース(API)を指す。少なくとも1つの実施例では、oneAPIプログラミング・モデルは、DPC++プログラミング言語を利用する。少なくとも1つの実施例では、DPC++プログラミング言語は、データ並列プログラミング生産性のための高水準言語を指す。少なくとも1つの実施例では、DPC++プログラミング言語は、C及び/又はC++プログラミング言語に少なくとも部分的に基づく。少なくとも1つの実施例では、oneAPIプログラミング・モデルは、カリフォルニア州サンタクララのIntel Corporationによって開発されたものなどのプログラミング・モデルである。
【0322】
少なくとも1つの実施例では、oneAPI及び/又はoneAPIプログラミング・モデルは、様々なアクセラレータ・アーキテクチャ、GPUアーキテクチャ、プロセッサ・アーキテクチャ、及び/又はそれらの変形形態のアーキテクチャと対話するために利用される。少なくとも1つの実施例では、oneAPIは、様々な機能性を実装するライブラリのセットを含む。少なくとも1つの実施例では、oneAPIは、少なくとも、oneAPI DPC++ライブラリ、oneAPIマス・カーネル・ライブラリ、oneAPIデータ分析ライブラリ、oneAPI深層ニューラル・ネットワーク・ライブラリ、oneAPI集合通信ライブラリ、oneAPIスレッディング・ビルディング・ブロック・ライブラリ、oneAPIビデオ処理ライブラリ、及び/又はそれらの変形形態を含む。
【0323】
少なくとも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つ又は複数の乱数生成器関数を実装する。
【0324】
少なくとも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)関数を実装する。
【0325】
少なくとも1つの実施例では、oneDALとも呼ばれるoneAPIデータ分析ライブラリは、様々なデータ分析アプリケーション及び分散算出を実装するライブラリである。少なくとも1つの実施例では、oneDALは、バッチ、オンライン、及び算出の分散処理モードにおける、データ分析のための前処理、変換、分析、モデリング、確認、及び意思決定のための、様々なアルゴリズムを実装する。少なくとも1つの実施例では、oneDALは、様々なC++及び/又はJava APIと、1つ又は複数のデータ・ソースへの様々なコネクタとを実装する。少なくとも1つの実施例では、oneDALは、旧来のC++インターフェースに対するDPC++API拡張を実装し、様々なアルゴリズムのためのGPU使用を可能にする。
【0326】
少なくとも1つの実施例では、oneDNNとも呼ばれるoneAPI深層ニューラル・ネットワーク・ライブラリは、様々な深層学習機能を実装するライブラリである。少なくとも1つの実施例では、oneDNNは、様々なニューラル・ネットワーク、機械学習、及び深層学習機能、アルゴリズム、並びに/又はそれらの変形形態を実装する。
【0327】
少なくとも1つの実施例では、oneCCLとも呼ばれるoneAPI集合通信ライブラリは、深層学習及び機械学習ワークロードのための様々なアプリケーションを実装するライブラリである。少なくとも1つの実施例では、oneCCLは、メッセージ・パッシング・インターフェース(MPI:message passing interface)及びlibfabricなど、下位レベル通信ミドルウェア上に築かれる。少なくとも1つの実施例では、oneCCLは、優先順位、永続的な動作、アウト・オブ・オーダー実行、及び/又はそれらの変形形態など、深層学習固有の最適化のセットを可能にする。少なくとも1つの実施例では、oneCCLは、様々なCPU及びGPU機能を実装する。
【0328】
少なくとも1つの実施例では、oneTBBとも呼ばれるoneAPIスレッディング・ビルディング・ブロック・ライブラリは、様々なアプリケーションのための様々な並列化されたプロセスを実装するライブラリである。少なくとも1つの実施例では、oneTBBは、ホスト上でのタスク・ベース共有並列プログラミングのために利用される。少なくとも1つの実施例では、oneTBBは、一般並列アルゴリズムを実装する。少なくとも1つの実施例では、oneTBBは、同時コンテナを実装する。少なくとも1つの実施例では、oneTBBは、スケーラブル・メモリ・アロケータを実装する。少なくとも1つの実施例では、oneTBBは、ワークスティーリング(work-stealing)・タスク・スケジューラを実装する。少なくとも1つの実施例では、oneTBBは、低レベル同期プリミティブを実装する。少なくとも1つの実施例では、oneTBBは、コンパイラ依存せず、GPU、PPU、CPU、及び/又はそれらの変形形態など、様々なプロセッサ上で使用可能である。
【0329】
少なくとも1つの実施例では、oneVPLとも呼ばれるoneAPIビデオ処理ライブラリは、1つ又は複数のアプリケーションにおけるビデオ処理を加速するために利用されるライブラリである。少なくとも1つの実施例では、oneVPLは、様々なビデオ復号、符号化、及び処理機能を実装する。少なくとも1つの実施例では、oneVPLは、CPU、GPU、及び他のアクセラレータ上のメディア・パイプラインのための様々な機能を実装する。少なくとも1つの実施例では、oneVPLは、メディア中心及びビデオ分析ワークロードにおけるデバイス発見及び選択を実装する。少なくとも1つの実施例では、oneVPLは、ゼロコピー・バッファ共有のためのAPIプリミティブを実装する。
【0330】
少なくとも1つの実施例では、oneAPIプログラミング・モデルは、DPC++プログラミング言語を利用する。少なくとも1つの実施例では、DPC++プログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための、機能的に同様のバージョンのCUDA機構を含むプログラミング言語である。少なくとも1つの実施例では、DPC++プログラミング言語は、CUDAプログラミング言語の機能性のサブセットを含み得る。少なくとも1つの実施例では、1つ又は複数のCUDAプログラミング・モデル動作は、DPC++プログラミング言語を使用するoneAPIプログラミング・モデルを使用して実施される。
【0331】
本明細書で説明される例示的な実施例はCUDAプログラミング・モデルに関し得るが、本明細書で説明される技法は、任意の好適なプログラミング・モデル、そのようなHIP、oneAPI(たとえば、本明細書で開示される方法を実施又は実装するためにoneAPIベース・プログラミングを使用する)、及び/又はそれらの変形形態とともに利用され得ることに留意されたい。
【0332】
少なくとも1つの実施例では、上記で開示されたシステム及び/又はプロセッサの1つ又は複数の構成要素は、たとえば、画像をアップスケールするためのアップスケーラ又はアップサンプラ、画像を一緒にブレンド、ミックス、又は加算するための画像ブレンダ又は画像ブレンダ構成要素、(たとえば、DSPの一部として)画像をサンプリングするためのサンプラ、(たとえば、低解像度画像から高解像度画像に)画像をアップスケールするためのアップスケーラを実施するように構成されたニューラル・ネットワーク回路、或いは、画像、フレーム、又はビデオを、それの解像度、サイズ、又はピクセルを調整するために、修正又は生成するための他のハードウェアを含む、1つ又は複数のCPU、ASIC、GPU、FPGA、或いは他のハードウェア、回路要素、又は集積回路構成要素と通信することができ、上記で開示されたシステム及び/又はプロセッサの1つ又は複数の構成要素は、画像を生成又は修正する方法、動作、又は命令を実施するために、本開示で説明される構成要素を使用することができる。
【0333】
本開示の少なくとも1つの実施例は、以下の条項を考慮して説明され得る。
(条項1)
グラフ・コードの記述表現が生成されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施するための1つ又は複数の回路
を備える、プロセッサ。
(条項2)
1つ又は複数の回路が、さらに、記述表現を生成するために、1つ又は複数のパラメータ値に少なくとも部分的に基づいてグラフ・コードを構文解析するためのものである、条項1に記載のプロセッサ。
(条項3)
記述表現がテキスト表現である、条項1又は2に記載のプロセッサ。
(条項4)
1つ又は複数の回路が、さらに、APIに関連するパラメータ値によって示される1つ又は複数のロケーションにおいて記述表現を生成するためのものである、条項1から3までのいずれか一項に記載のプロセッサ。
(条項5)
1つ又は複数の回路は、さらに、1つ又は複数のグラフィックス処理ユニット(GPU)が記述表現を生成することを引き起こすためのものである、条項1から4までのいずれか一項に記載のプロセッサ。
(条項6)
APIがランタイムAPIである、条項1から5までのいずれか一項に記載のプロセッサ。
(条項7)
グラフ・コードの記述表現が生成されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施するための1つ又は複数のプロセッサを有する1つ又は複数のコンピュータ
を備える、システム。
(条項8)
1つ又は複数のプロセッサが、さらに、
1つ又は複数のパラメータ値に少なくとも部分的に基づいて1つ又は複数の特性を取得することと、
1つ又は複数の特性に少なくとも部分的に基づいて記述表現を生成することと
を行うためのものである、条項7に記載のシステム。
(条項9)
グラフ・コードが、1つ又は複数の動作と、1つ又は複数の動作の間の依存性とを示す、条項7又は8に記載のシステム。
(条項10)
1つ又は複数のプロセッサが、さらに、APIを実施した結果としてステータス表示を取得するためのものである、条項7から9までのいずれか一項に記載のシステム。
(条項11)
1つ又は複数のプロセッサは、グラフ・コードの記述表現が1つ又は複数の並列処理ユニット(PPU)を使用して生成されることを引き起こすためのものである、条項7から10までのいずれか一項に記載のシステム。
(条項12)
記述表現が画像表現である、条項7から11までのいずれか一項に記載のシステム。
(条項13)
命令のセットを記憶した機械可読媒体であって、命令のセットが、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、少なくとも、
グラフ・コードの記述表現が生成されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施すること
を行わせる、機械可読媒体。
(条項14)
命令のセットが、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、グラフ・コードの1つ又は複数の値を符号化する記述表現を生成することを行わせる命令をさらに含む、条項13に記載の機械可読媒体。
(条項15)
命令のセットが、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、グラフ・コードの記述表現のセットを生成することを行わせる命令をさらに含む、条項13又は14に記載の機械可読媒体。
(条項16)
命令のセットは、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、1つ又は複数の中央処理ユニット(CPU)がグラフ・コードの記述表現を生成することを引き起こすことを行わせる命令をさらに含む、条項13から15までのいずれか一項に記載の機械可読媒体。
(条項17)
グラフ・コードが1つ又は複数のカーネルを符号化し、
記述表現が、1つ又は複数のカーネルに関連する情報を示す、
条項13から16までのいずれか一項に記載の機械可読媒体。
(条項18)
記述表現が1つ又は複数のファイルとして表される、条項13から17までのいずれか一項に記載の機械可読媒体。
(条項19)
グラフ・コードの記述表現が生成されることを引き起こすためにアプリケーション・プログラミング・インターフェース(API)を実施するステップ
を含む、方法。
(条項20)
APIに関連する1つ又は複数のパラメータ値に基づいてグラフ・コードから1つ又は複数の値を取得するステップと、
1つ又は複数の値を記述表現において符号化するステップと
をさらに含む、条項19に記載の方法。
(条項21)
記述表現が、少なくとも、グラフ・コードに関連するトポロジーを示す、条項19又は20に記載の方法。
(条項22)
APIがドライバAPIである、条項19から21までのいずれか一項に記載の方法。
(条項23)
APIに対応するステータスの指示を取得するステップをさらに含む、条項19から22までのいずれか一項に記載の方法。
(条項24)
1つ又は複数の汎用グラフィックス処理ユニット(GPGPU)がグラフ・コードの記述表現を生成することを引き起こすステップをさらに含む、条項19から23までのいずれか一項に記載の方法。
【0334】
他の変形形態は、本開示の範囲内にある。したがって、開示される技法は、様々な修正及び代替構築が可能であるが、それらのいくつかの例示的な実施例が図面に示され、上記で詳細に説明された。しかしながら、特定の1つ又は複数の開示された形態に本開示を限定する意図はなく、その反対に、添付の特許請求の範囲において定義されるように、開示の趣旨及び範囲に入るすべての修正形態、代替構築、及び等価物を網羅することを意図していることが理解されるべきである。
【0335】
開示される実施例を説明する文脈において(特に、以下の特許請求の範囲の文脈において)「a」及び「an」及び「the」という用語、並びに同様の指示語を使用することは、本明細書に別段の記載のない限り、又は文脈によって明らかに否定されない限り、単数と複数の両方を網羅すると解釈されるべきであり、用語の定義であると解釈されるべきではない。「含む、備える(comprising)」、「有する(having)」、「含む(including)」、「含んでいる(containing)」という用語は、別段の記載のない限り、オープンエンドの用語(「限定はしないが、~を含む(including, but not limited to,)」を意味する)と解釈されるべきである。「接続される」という用語は、修飾されず、物理的接続を指しているとき、何か介在するものがある場合でも、部分的に又は完全に中に含まれているか、取り付けられるか、又は互いに接合されるものとして解釈されるべきである。本明細書で値の範囲を詳述することは、本明細書に別段の記載のない限り、及び各別個の値が、本明細書に個々に詳述されているかのように明細書に組み込まれていない限り、範囲内に入る各別個の値を個々に参照する簡潔な方法として働くことを単に意図しているにすぎない。「セット」(たとえば、「項目のセット」)又は「サブセット」という用語の使用は、文脈によって別段の記載がないか又は否定されない限り、1つ又は複数の部材を備える空ではない集合として解釈されるべきである。さらに、文脈によって別段の記載がないか又は否定されない限り、対応するセットの「サブセット」という用語は、対応するセットの厳密なサブセットを必ずしも指すとは限らず、サブセットと、対応するセットとは、等しくなり得る。
【0336】
「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つであるが、明示的に、又は文脈によってのいずれかでそのように示されているとき、それよりも多いことがある。さらに、別段の記載がないか又はさもなければ文脈から明らかでない限り、「~に基づいて」という言い回しは、「少なくとも部分的に~に基づいて」を意味し、「~のみに基づいて」を意味しない。
【0337】
本明細書で説明されるプロセスの動作は、本明細書に別段の記載がないか又はさもなければ文脈によって明確に否定されない限り、任意の好適な順序で実施され得る。少なくとも1つの実施例では、本明細書で説明されるプロセス(又はその変形形態及び/又は組合せ)などのプロセスは、実行可能命令で構成された1つ又は複数のコンピュータ・システムの制御下で実施され、1つ又は複数のプロセッサ上で、ハードウェアによって、又はそれらの組合せによって集合的に実行するコード(たとえば、実行可能命令、1つ又は複数のコンピュータ・プログラム、又は1つ又は複数のアプリケーション)として実装される。少なくとも1つの実施例では、コードは、たとえば、1つ又は複数のプロセッサによって実行可能な複数の命令を備えるコンピュータ・プログラムの形態で、コンピュータ可読記憶媒体に記憶される。少なくとも1つの実施例では、コンピュータ可読記憶媒体は、一時的信号(たとえば、伝搬する一時的な電気又は電磁送信)を除外するが、一時的信号のトランシーバ内の非一時的データ・ストレージ回路要素(たとえば、バッファ、キャッシュ、及びキュー)を含む非一時的コンピュータ可読記憶媒体である。少なくとも1つの実施例では、コード(たとえば、実行可能コード又はソース・コード)は、1つ又は複数の非一時的コンピュータ可読記憶媒体のセットに記憶され、この記憶媒体は、コンピュータ・システムの1つ又は複数のプロセッサによって実行されたときに(たとえば、実行された結果として)、コンピュータ・システムに本明細書で説明される動作を実施させる実行可能命令を記憶している(又は、実行可能命令を記憶するための他のメモリを有する)。非一時的コンピュータ可読記憶媒体のセットは、少なくとも1つの実施例では、複数の非一時的コンピュータ可読記憶媒体を備え、複数の非一時的コンピュータ可読記憶媒体の個々の非一時的記憶媒体のうちの1つ又は複数は、コードのすべてがないが、複数の非一時的コンピュータ可読記憶媒体は、集合的にコードのすべてを記憶している。少なくとも1つの実施例では、実行可能命令は、異なる命令が異なるプロセッサによって実行されるように実行され、たとえば、非一時的コンピュータ可読記憶媒体は命令を記憶し、メイン中央処理ユニット(「CPU」)は命令のいくつかを実行し、グラフィックス処理ユニット(「GPU」)は他の命令を実行する。少なくとも1つの実施例では、コンピュータ・システムの異なる構成要素は、別個のプロセッサを有し、異なるプロセッサが命令の異なるサブセットを実行する。
【0338】
したがって、少なくとも1つの実施例では、コンピュータ・システムは、本明細書で説明されるプロセスの動作を単独で又は集合的に実施する1つ又は複数のサービスを実装するように構成され、そのようなコンピュータ・システムは、動作の実施を可能にする適用可能なハードウェア及び/又はソフトウェアで構成される。さらに、本開示の少なくとも1つの実施例を実装するコンピュータ・システムは、単一のデバイスであり、別の実施例では、分散型コンピュータ・システムが本明細書で説明される動作を実施するように、及び単一のデバイスがすべての動作を実施しないように、異なるやり方で動作する複数のデバイスを備える分散型コンピュータ・システムである。
【0339】
本明細書で提供されるあらゆる実例、又は例示的な言葉(たとえば、「など、などの(such as)」)の使用は、本開示の実施例をより明らかにすることのみを意図しており、別段の主張のない限り、本開示の範囲に制限を加えるものではない。本明細書のいかなる言葉も、特許請求されていない任意の要素を、本開示の実践に不可欠なものとして示すと解釈されるべきではない。
【0340】
本明細書で引用される出版物、特許出願、及び特許を含むすべての参考文献は、各参考文献が参照により組み込まれることが個別に明確に示され、その全体が本明細書に記載されたかのように、それと同程度まで参照により本明細書に組み込まれる。
【0341】
明細書及び特許請求の範囲において、「結合される」及び「接続される」という用語が、その派生語とともに使用され得る。これらの用語は、互いに同義語として意図されていないことがあることが理解されるべきである。むしろ、特定の実例では、「接続される」又は「結合される」は、2つ又はそれ以上の要素が物理的又は電気的に互いに直接又は間接的に接触していることを示すために使用され得る。「結合される」はまた、2つ又はそれ以上の要素が直接互いに接触していないが、それでもなお互いに連動又は対話することを意味し得る。
【0342】
別段の具体的な記載がない限り、明細書全体を通して、「処理する(processing)」、「算出する(computing)」、「計算する(calculating)」、又は「決定する(determining)」などの用語は、コンピューティング・システムのレジスタ及び/又はメモリ内の、電子的などの物理的な量として表されるデータを、コンピューティング・システムのメモリ、レジスタ又は他のそのような情報ストレージ、送信、若しくはディスプレイ・デバイス内の物理的な量として同様に表される他のデータになるように操作及び/又は変換する、コンピュータ又はコンピューティング・システム、或いは同様の電子コンピューティング・デバイスのアクション及び/又はプロセスを指すことが諒解され得る。
【0343】
同様に、「プロセッサ」という用語は、レジスタ及び/又はメモリからの電子データを処理し、その電子データを、レジスタ及び/又はメモリに記憶され得る他の電子データに変換する任意のデバイス、又はデバイスの一部分を指し得る。非限定的な実例として、「プロセッサ」は、CPU又はGPUであり得る。「コンピューティング・プラットフォーム」は、1つ又は複数のプロセッサを備え得る。本明細書で使用される「ソフトウェア」プロセスは、たとえば、タスク、スレッド、及び知的エージェントなど、経時的にワークを実施するソフトウェア及び/又はハードウェア・エンティティを含み得る。また、各プロセスは、命令を直列で又は並列で、連続的に又は断続的に行うための複数のプロセスを指し得る。「システム」及び「方法」という用語は、1つ又は複数の方法をシステムが具体化し得、方法がシステムと考えられ得る場合に限り、本明細書において交換可能に使用される。
【0344】
少なくとも1つの実施例では、算術論理ユニットは、結果を作り出すために1つ又は複数の入力をとる組合せ論理回路要素のセットである。少なくとも1つの実施例では、算術論理ユニットは、加算、減算、又は乗算などの数学演算を実装するためにプロセッサによって使用される。少なくとも1つの実施例では、算術論理ユニットは、論理AND/OR又はXORなどの論理演算を実装するために使用される。少なくとも1つの実施例では、算術論理ユニットは、ステートレスであり、論理ゲートを形成するように構成された半導体トランジスタなど、物理的切替え構成要素から作られる。少なくとも1つの実施例では、算術論理ユニットは、関連するクロックをもつステートフル論理回路として、内部で動作し得る。少なくとも1つの実施例では、算術論理ユニットは、関連するレジスタ・セット中で維持されない内部状態をもつ非同期論理回路として構築され得る。少なくとも1つの実施例では、算術論理ユニットは、プロセッサの1つ又は複数のレジスタに記憶されたオペランドを組み合わせ、別のレジスタ又はメモリ・ロケーションにプロセッサによって記憶され得る出力を作り出すために、プロセッサによって使用される。
【0345】
少なくとも1つの実施例では、プロセッサによって取り出された命令を処理した結果として、プロセッサは、1つ又は複数の入力又はオペランドを算術論理ユニットに提示し、算術論理ユニットに、算術論理ユニットの入力に提供された命令コードに少なくとも部分的に基づく結果を作り出させる。少なくとも1つの実施例では、プロセッサによってALUに提供された命令コードは、プロセッサによって実行された命令に少なくとも部分的に基づく。少なくとも1つの実施例では、ALUにおける組合せ論理は、入力を処理し、プロセッサ内のバス上に置かれる出力を作り出す。少なくとも1つの実施例では、プロセッサは、プロセッサをクロック制御することにより、ALUによって作り出された結果が所望のロケーションに送出されるように、宛先レジスタ、メモリ・ロケーション、出力デバイス、又は出力バス上の出力ストレージ・ロケーションを選択する。
【0346】
本明細書では、アナログ・データ又はデジタル・データを取得すること、獲得すること、受信すること、或いはそれらをサブシステム、コンピュータ・システム、又はコンピュータ実装機械に入力することに言及し得る。アナログ・データ及びデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、関数コール、又はアプリケーション・プログラミング・インターフェースへのコールのパラメータとしてデータを受信することによってなど、様々なやり方で実現され得る。いくつかの実装形態では、アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、直列又は並列インターフェースを介してデータを転送することによって実現され得る。別の実装形態では、アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、提供するエンティティから獲得するエンティティにコンピュータ・ネットワークを介してデータを転送することによって実現され得る。アナログ・データ又はデジタル・データを提供すること、出力すること、送信すること、送出すること、又は提示することにも言及し得る。様々な実例では、アナログ・データ又はデジタル・データを提供する、出力する、送信する、送出する、又は提示するプロセスは、関数コールの入力又は出力パラメータ、アプリケーション・プログラミング・インターフェース又はプロセス間通信機構のパラメータとしてデータを転送することによって実現され得る。
【0347】
上記の説明は、説明された技法の例示的な実装形態について述べているが、他のアーキテクチャが、説明された機能性を実装するために使用され得、本開示の範囲内にあることが意図される。さらに、説明を目的として、責任の具体的な分散が上記で定義されたが、様々な機能及び責任は、状況に応じて異なるやり方で分散及び分割され得る。
【0348】
さらに、主題は、構造的特徴及び/又は方法論的行為に特有の言語で説明されたが、添付の特許請求の範囲で特許請求される主題は、説明された特有の特徴又は行為に必ずしも限定されるとは限らないことが理解されるべきである。むしろ、特有の特徴及び行為は、特許請求の範囲を実装する例示的な形態として開示される。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16A
図16B
図17A
図17B
図18A
図18B
図18C
図19
図20
図21
図22
図23
図24
図25
図26
図27
図28
図29
図30
図31
図32
図33
図34A
図34B
図34C
図35
図36
図37
図38
【国際調査報告】