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

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

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

特表2024-513616メモリを特定するためのアプリケーション・プログラミング・インターフェース
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2024-03-27
(54)【発明の名称】メモリを特定するためのアプリケーション・プログラミング・インターフェース
(51)【国際特許分類】
   G06F 9/50 20060101AFI20240319BHJP
   G06F 15/16 20060101ALI20240319BHJP
【FI】
G06F9/50 120A
G06F15/16
【審査請求】有
【予備審査請求】未請求
(21)【出願番号】P 2022525381
(86)(22)【出願日】2022-04-14
(85)【翻訳文提出日】2022-08-02
(86)【国際出願番号】 US2022024876
(87)【国際公開番号】W WO2022221569
(87)【国際公開日】2022-10-20
(31)【優先権主張番号】63/174,895
(32)【優先日】2021-04-14
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】17/719,961
(32)【優先日】2022-04-13
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】17/720,095
(32)【優先日】2022-04-13
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】17/720,179
(32)【優先日】2022-04-13
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.BLUETOOTH
2.TENSORFLOW
3.PYTHON
(71)【出願人】
【識別番号】501450960
【氏名又は名称】エヌビディア コーポレーション
(74)【代理人】
【識別番号】110000855
【氏名又は名称】弁理士法人浅村特許事務所
(72)【発明者】
【氏名】ヴィシュナスワループ ラメシュ、フヌ
(72)【発明者】
【氏名】ホフマン、ヒューストン トンプソン
(57)【要約】
並列コンピューティングを容易にするために、1つ又は複数のアプリケーション・プログラミング・インターフェース(API)関数を実行するための、装置、システム、及び技法。少なくとも1つの実施例では、1つ又は複数のAPIは、本明細書で説明される様々な新規な技法を使用して、1つ又は複数のストレージ・ロケーションを示す。
【特許請求の範囲】
【請求項1】
アプリケーション・プログラミング・インターフェース(API)を実行して、前記APIが参照するデータの1つ又は複数のアドレスを示す1つ又は複数の回路
を備える、プロセッサ。
【請求項2】
前記APIが、入力として、メモリ・アドレスを受信し、前記1つ又は複数のアドレスが前記メモリ・アドレスを含む結果として、前記1つ又は複数のアドレスの識別子を提供することによって前記1つ又は複数のアドレスを示す、請求項1に記載のプロセッサ。
【請求項3】
前記APIが、前記APIが参照する前記データの1つ又は複数のアドレスが、パラメータとして前記APIに示されるアドレスを含まない場合、ヌル・データ値を示す、請求項1に記載のプロセッサ。
【請求項4】
前記プロセッサが、前記APIを実行するためのドライバをさらに実行する、請求項1に記載のプロセッサ。
【請求項5】
前記APIが、1つ又は複数のメモリのブロック内の1つ又は複数のアドレスを含む1つ又は複数のデータ値を示す1つ又は複数のAPIコールに応答して、前記APIが参照する前記データの1つ又は複数のアドレスを示す、請求項1に記載のプロセッサ。
【請求項6】
前記1つ又は複数のアドレスが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能なメモリのブロックを示す、請求項1に記載のプロセッサ。
【請求項7】
前記APIが参照する前記データの1つ又は複数のアドレスが、1つ又は複数のストリーム・オーダー・メモリ・アロケータを使用して割り振られる1つ又は複数のメモリのブロックを含む1つ又は複数のメモリ・プールを含む、請求項1に記載のプロセッサ。
【請求項8】
アプリケーション・プログラミング・インターフェース(API)を実行して、前記APIが参照するデータの1つ又は複数のアドレスを示す1つ又は複数のプロセッサ
を備える、システム。
【請求項9】
前記APIが、1つ又は複数のメモリ・ロケーションを示す1つ又は複数のパラメータを受信し、前記APIが、前記APIが参照する前記データの1つ又は複数のアドレスを、少なくとも部分的に、前記1つ又は複数のメモリ・ロケーションを含む前記1つ又は複数のアドレスに基づいて示す、請求項8に記載のシステム。
【請求項10】
前記APIが、前記APIが参照する前記データの1つ又は複数のアドレスが、パラメータとして前記APIに示される1つ又は複数のメモリ・ロケーションを含まない場合、ヌル・データ値を示す、請求項8に記載のシステム。
【請求項11】
前記1つ又は複数のプロセッサが、1つ又は複数のドライバをさらに実行し、前記1つ又は複数のドライバによって、1つ又は複数のAPIコールに応答して、前記APIが実行される、請求項8に記載のシステム。
【請求項12】
前記APIが、1つ又は複数のメモリのブロック内の1つ又は複数のアドレスを含む1つ又は複数のデータ値を示す1つ又は複数のAPIコールに応答して、前記APIが参照する前記データの1つ又は複数のアドレスを示す、請求項8に記載のシステム。
【請求項13】
前記APIが参照する前記データの1つ又は複数のアドレスが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能な1つ又は複数のメモリのブロックを示す、請求項8に記載のシステム。
【請求項14】
前記APIが参照する前記データの1つ又は複数のアドレスが、1つ又は複数のストリーム・オーダー・メモリ・アロケータを使用して割振り可能な1つ又は複数のメモリのブロックを示す、請求項8に記載のシステム。
【請求項15】
1つ又は複数のアプリケーション・プログラミング・インターフェース(API)を記憶している機械可読媒体であって、前記1つ又は複数のAPIによって、少なくとも部分的に、1つ又は複数のプロセッサによって実行された場合、前記1つ又は複数のプロセッサが、少なくとも、
前記1つ又は複数のAPIが参照するデータの1つ又は複数のアドレスを示す、機械可読媒体。
【請求項16】
前記1つ又は複数のAPIが、1つ又は複数のAPIコールの結果として、1つ又は複数のメモリ・ロケーションを示す1つ又は複数のデータ値を受信し、前記1つ又は複数のプロセッサが、前記APIが参照する前記データの1つ又は複数のアドレスを、少なくとも部分的に、前記1つ又は複数のメモリ・ロケーションを含む前記1つ又は複数のアドレスに基づいて示す、請求項15に記載の機械可読媒体。
【請求項17】
前記1つ又は複数のプロセッサが、前記1つ又は複数のAPIが参照する前記データの1つ又は複数のアドレスが、1つ又は複数のパラメータとして前記1つ又は複数のAPIに示される1つ又は複数の他のアドレスを含まない場合、ヌル・データ値を示す、請求項15に記載の機械可読媒体。
【請求項18】
前記1つ又は複数のプロセッサによって実行された場合、前記1つ又は複数のプロセッサに、1つ又は複数のドライバを実行させる命令をさらに含み、前記1つ又は複数のドライバによって、前記1つ又は複数のAPIへの1つ又は複数のAPIコールに応答して、前記1つ又は複数のプロセッサが前記1つ又は複数のアドレスを示す、請求項15に記載の機械可読媒体。
【請求項19】
前記1つ又は複数のAPIが、前記1つ又は複数のAPIへの1つ又は複数のAPIコールに応答して、前記1つ又は複数のAPIが参照する前記データの1つ又は複数のアドレスを示し、前記1つ又は複数のAPIコールが、1つ又は複数のメモリのブロック内の1つ又は複数のアドレスを示すデータを含む、請求項15に記載の機械可読媒体。
【請求項20】
前記1つ又は複数のAPIが参照する前記データの1つ又は複数のアドレスが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能な1つ又は複数のメモリの領域を示す、請求項15に記載の機械可読媒体。
【請求項21】
前記1つ又は複数のAPIが参照する前記データの1つ又は複数のアドレスが、1つ又は複数の非同期アロケータを使用して割振り可能な1つ又は複数のメモリの領域を示す、請求項15に記載の機械可読媒体。
【請求項22】
アプリケーション・プログラミング・インターフェース(API)によって、前記APIが参照するデータの1つ又は複数のアドレスを示すステップ
を含む、方法。
【請求項23】
前記APIへの1つ又は複数のAPIコールに応答して、前記1つ又は複数のアドレスを示すステップをさらに含み、前記APIコールが、1つ又は複数のメモリ・ロケーションを示す1つ又は複数のデータ値を含む、請求項22に記載の方法。
【請求項24】
前記1つ又は複数のアドレスが1つ又は複数のAPIコールのパラメータとして前記APIに示される1つ又は複数のメモリ・ロケーションを含むことに応答して、前記1つ又は複数のアドレスを示すステップをさらに含む、請求項22に記載の方法。
【請求項25】
前記APIが参照する前記データの1つ又は複数のアドレスが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能な1つ又は複数のメモリのブロックを示す、請求項22に記載の方法。
【請求項26】
前記APIによって、1つ又は複数のAPIコールの結果として、1つ又は複数のメモリ・ロケーションを示す1つ又は複数のデータ値を受信するステップと、前記APIが参照する前記データの1つ又は複数のアドレスを、少なくとも部分的に、前記1つ又は複数のメモリ・ロケーションを含む前記1つ又は複数のアドレスに基づいて示すステップとをさらに含む、請求項22に記載の方法。
【請求項27】
前記APIが参照する前記データの1つ又は複数のアドレスが、1つ又は複数のパラメータとして前記APIに示される1つ又は複数の他のアドレスを含まない場合、ヌル・データ値を示すステップをさらに含む、請求項22に記載の方法。
【請求項28】
前記APIが参照する前記データの1つ又は複数のアドレスが、1つ又は複数のストリーム・オーダー・メモリ・アロケータを使用して割振り可能な1つ又は複数のメモリのプールを示す、請求項22に記載の方法。
【発明の詳細な説明】
【技術分野】
【0001】
本出願は、2021年4月14日に提出された「ENHANCEMENTS TO STREAM ORDERED ALLOCATORS」と題される米国仮特許出願第63/174,895号(Attorney Docket No. 0112912-269PR0)、2022年4月13日に提出された「APPLICATION PROGRAMMING INTERFACE TO IDENTIFY MEMORY」と題される米国特許出願第17/720,179号(Attorney Docket No. 0112912-269US0)、2022年4月13日に提出された「APPLICATION PROGRAMMING INTERFACE TO IDENTIFY SHARABLE MEMORY」と題される米国特許出願第17/719,961号(Attorney Docket No. 0112912-269US1)、及び2022年4月13日に提出された「APPLICATION PROGRAMMING INTERFACE TO INDICATE MEMORY INFORMATION」と題される米国特許出願第17/720,095号(Attorney Docket No. 0112912-269US2)の利益を主張するものであり、それぞれの内容全体が、参照により本明細書に組み込まれる。
【0002】
少なくとも1つの実施例は、1つ又は複数のアプリケーション・プログラミング・インターフェース(API:application programming interface)を実行して並列コンピューティングを容易にするために使用される処理リソースに関する。たとえば、少なくとも1つの実施例は、1つ又は複数のAPIを実装して本明細書で説明される様々な新規な技法を含む並列コンピューティングを容易にする、1つ又は複数のプログラムを実行するために使用されるプロセッサ又はコンピューティング・システムに関する。
【背景技術】
【0003】
様々なアクセラレータ(たとえば、グラフィックス処理ユニット(GPU:graphics processing unit))の発展により、多くの利点がもたらされているが、これらの利点には高度な複雑性が伴う。一般的には、異なるプログラミング・モデルは複雑性を作り出し、効果的に管理されない場合、最適なパフォーマンスに至らない可能性がある。一実例として、特に、カーネルを実行することなどによって、あるプロセッサが別のプロセッサに演算を行わせるコンテキストにおいて、メモリ管理が複雑となる可能性がある。これらの問題に対処するいくつかの技法は、メモリをオーバー・アロケートするか、アンダー・アロケートするかのいずれかであり、非効率性を招く、及び/又はパフォーマンス上の問題を招く可能性がある。
【図面の簡単な説明】
【0004】
図1】少なくとも1つの実施例による、1つ又は複数のアプリケーション・プログラミング・インターフェース(API)を提供するための1つ又は複数のライブラリを含む、ドライバ及び/又はランタイムを示すブロック図である。
図2】少なくとも1つの実施例による、メモリ・アドレスが、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロックに含まれるかどうかを判定するためのAPIを示すブロック図である。
図3】少なくとも1つの実施例による、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロックが、1つ又は複数のソフトウェア・モジュールの実行中に共有可能かどうかを判定するためのAPIを示すブロック図である。
図4】少なくとも1つの実施例による、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロックの1つ又は複数の属性を決定するためのAPIを示すブロック図である。
図5】少なくとも1つの実施例による、1つ又は複数のAPIによって、メモリ・アドレスが、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロックに含まれるかどうかを判定するためのプロセスの図である。
図6】少なくとも1つの実施例による、1つ又は複数のAPIによって、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロックが、1つ又は複数のソフトウェア・モジュールの実行中に共有されるかどうか、及び/又は共有されていたかどうかを判定するためのプロセスの図である。
図7】少なくとも1つの実施例による、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロックの1つ又は複数の属性を、1つ又は複数のAPIへの1つ又は複数のコールに応答して、決定するためのプロセスの図である。
図8】少なくとも1つの実施例による、例示的なデータ・センタを示す図である。
図9】少なくとも1つの実施例による、処理システムを示す図である。
図10】少なくとも1つの実施例による、コンピュータ・システムを示す図である。
図11】少なくとも1つの実施例による、システムを示す図である。
図12】少なくとも1つの実施例による、例示的な集積回路を示す図である。
図13】少なくとも1つの実施例による、コンピューティング・システムを示す図である。
図14】少なくとも1つの実施例による、APUを示す図である。
図15】少なくとも1つの実施例による、CPUを示す図である。
図16】少なくとも1つの実施例による、例示的なアクセラレータ統合スライス(accelerator integration slice)を示す図である。
図17A】少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す図である。
図17B】少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す図である。
図18A】少なくとも1つの実施例による、グラフィックス・コアを示す図である。
図18B】少なくとも1つの実施例による、GPGPUを示す図である。
図19A】少なくとも1つの実施例による、並列プロセッサを示す図である。
図19B】少なくとも1つの実施例による、処理クラスタを示す図である。
図19C】少なくとも1つの実施例による、グラフィックス・マルチプロセッサを示す図である。
図20】少なくとも1つの実施例による、グラフィックス・プロセッサを示す図である。
図21】少なくとも1つの実施例による、プロセッサを示す図である。
図22】少なくとも1つの実施例による、プロセッサを示す図である。
図23】少なくとも1つの実施例による、グラフィックス・プロセッサ・コアを示す図である。
図24】少なくとも1つの実施例による、PPUを示す図である。
図25】少なくとも1つの実施例による、GPCを示す図である。
図26】少なくとも1つの実施例による、ストリーミング・マルチプロセッサを示す図である。
図27】少なくとも1つの実施例による、プログラミング・プラットフォームのソフトウェア・スタックを示す図である。
図28】少なくとも1つの実施例による、図27のソフトウェア・スタックのCUDA実装形態を示す図である。
図29】少なくとも1つの実施例による、図27のソフトウェア・スタックのROCm実装形態を示す図である。
図30】少なくとも1つの実施例による、図27のソフトウェア・スタックのOpenCL実装形態を示す図である。
図31】少なくとも1つの実施例による、プログラミング・プラットフォームによってサポートされるソフトウェアを示す図である。
図32】少なくとも1つの実施例による、図27図30のプログラミング・プラットフォーム上で実行するためのコードをコンパイルすることを示す図である。
図33】少なくとも1つの実施例による、図27図30のプログラミング・プラットフォーム上で実行するためのコードをコンパイルすることをより詳細に示す図である。
図34】少なくとも1つの実施例による、ソース・コードをコンパイルするより前にソース・コードをトランスレートすることを示す図である。
図35A】少なくとも1つの実施例による、異なるタイプの処理ユニットを使用してCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。
図35B】少なくとも1つの実施例による、CPU及びCUDA対応GPUを使用して、図35AのCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。
図35C】少なくとも1つの実施例による、CPU及びCUDA非対応(non-CUDA-enabled)GPUを使用して、図35AのCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。
図36】少なくとも1つの実施例による、図35CのCUDAからHIPへのトランスレーション・ツール(CUDA-to-HIP translation tool)によってトランスレートされた例示的なカーネルを示す図である。
図37】少なくとも1つの実施例による、図35CのCUDA非対応GPUをより詳細に示す図である。
図38】少なくとも1つの実施例による、例示的なCUDAグリッドのスレッドが図37の異なるコンピュート・ユニットにどのようにマッピングされるかを示す図である。
図39】少なくとも1つの実施例による、既存のCUDAコードをData Parallel C++コードにどのようにマイグレートするかを示す図である。
【発明を実施するための形態】
【0005】
図1は、1つ又は複数のライブラリ106へのアクセスを備えるか、提供する、ドライバ及び/又はランタイム104を示すブロック図であり、ここでは前記1つ又は複数のライブラリには、少なくとも1つの実施例に従って、ソフトウェア・プログラム102による呼出しの結果として実施される1つ又は複数のアプリケーション・プログラミング・インターフェース(API)が含まれる。少なくとも1つの実施例では、ソフトウェア・プログラム102はソフトウェア・モジュールである。少なくとも1つの実施例では、ソフトウェア・プログラム102は1つ又は複数のソフトウェア・モジュールを含む。少なくとも1つの実施例では、1つ又は複数のAPI110は、実行されると、1つ又は複数のプロセッサに1つ又は複数の算出動作を実行させる、ソフトウェア命令のセットである。少なくとも1つの実施例では、1つ又は複数のAPI110は、1つ又は複数のライブラリ106、ランタイム104、ドライバ104、並びに/又は、本明細書でさらに説明されるソフトウェア及び/若しくは実行可能コードのあらゆる他のグルーピングの一部として、分散又は提供される。少なくとも1つの実施例では、1つ又は複数のAPI110は、ソフトウェア・プログラム102による呼出しに応答して、1つ又は複数の算出動作を実行する。少なくとも1つの実施例では、ソフトウェア・プログラム102は、ソフトウェア・コード、コマンド、命令、或いはコンピューティング・デバイスに1つ若しくは複数の算出動作を実行するよう命令する、及び/又はAPI110若しくはAPI関数112などの1つ若しくは複数の他の命令のセットを呼び出して実行する、他のテキストのシーケンスの集合である。少なくとも1つの実施例では、1つ又は複数のAPI110によって提供される機能性には、グラフィックス処理ユニット(GPU)のような1つ又は複数の並列処理ユニット(PPU:parallel processing unit)を使用してソフトウェア・プログラム102の1つ又は複数の部分を加速するために使用可能なものなど、ソフトウェア関数112が含まれる。
【0006】
少なくとも1つの実施例では、API110は、1つ又は複数の算出動作を実行させるための1つ又は複数の回路への、ハードウェア・インターフェースである。少なくとも1つの実施例では、本明細書で説明される1つ又は複数のソフトウェアAPI110は、図2図7と併せて以下で説明される1つ又は複数の技法を実施するための1つ又は複数の回路として実装される。少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラム102は、実行されると、1つ又は複数のハードウェア・デバイス及び/又は回路に、図2図7と併せて以下でさらに説明される1つ又は複数の技法を実施させる命令を含む。
【0007】
少なくとも1つの実施例では、ユーザ実装のソフトウェア・プログラムなどのソフトウェア・プログラム102は、1つ又は複数のアプリケーション・プログラミング・インターフェース(API)110を利用して、メモリ予約、行列乗算、又は本明細書でさらに説明されるようなグラフィック処理ユニット(GPU)のような並列処理ユニット(PPU)によって実行されるあらゆる計算演算などの、様々な計算演算を実行する。少なくとも1つの実施例では、1つ又は複数のAPI110は、本明細書ではAPI、API関数、及び/又は関数と称されるコール可能関数112のセットを提供し、これらは個々に並列コンピューティングに関連する計算演算などの1つ又は複数の計算演算を実行する。たとえば、1つの実施例では、1つ又は複数のAPI110は、グラフィック処理ユニットGPUなどの1つ又は複数のPPUのためのメモリ割り振り及び管理を実行するために、関数112を提供する。
【0008】
少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラム102は、1つ又は複数のAPI110と対話又は通信して、GPUなどの1つ又は複数のPPUを使用して、1つ又は複数の計算演算を実行する。少なくとも1つの実施例では、1つ又は複数のPPUを使用する1つ又は複数の計算演算は、少なくとも部分的に前記1つ又は複数のPPUによる実行によって加速される、少なくとも1つ又は複数の計算演算のグループを含む。少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラム102は、1つ又は複数のAPI110と対話して、リモート又はローカルのインターフェースを使用して、並列コンピューティングを容易にする。
【0009】
少なくとも1つの実施例では、インターフェースは、実行されると、1つ又は複数のAPI110によって提供される1つ又は複数の関数112へのアクセスを提供するソフトウェア命令である。少なくとも1つの実施例では、ソフトウェア・プログラム102は、ソフトウェアのデベロッパが、1つ又は複数のAPI110へのアクセスを含むか提供する1つ又は複数のライブラリ106と併せて、1つ又は複数のソフトウェア・プログラム102をコンパイルする場合、ローカル・インターフェースを使用する。少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラム102は、プリコンパイルされたライブラリ106又は1つ又は複数のAPI110を実行するための命令を含む未コンパイルのソース・コードと併せて静的にコンパイルされる。少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラム102は、動的にコンパイルされ、前記1つ又は複数のソフトウェア・プログラムは、1つ又は複数のAPI110を含む1つ又は複数のプリコンパイルされたライブラリ106へリンクするために、リンカを利用する。
【0010】
少なくとも1つの実施例では、ソフトウェア・プログラム102は、ソフトウェアのデベロッパが、ネットワーク又は他のリモート通信媒体を介して、1つ又は複数のAPI110を含むライブラリ106を利用するか、ライブラリ106と通信するソフトウェア・プログラムを実行する場合、リモート・インターフェースを使用する。少なくとも1つの実施例では、1つ又は複数のAPI110を含む1つ又は複数のライブラリ106は、コンピューティング・リソースサービス・プロバイダなどのリモートのコンピューティング・デバイスによって実行される。別の実施例では、1つ又は複数のAPI110を含む1つ又は複数のライブラリ106は、前記1つ又は複数のAPI110を1つ又は複数のソフトウェア・プログラム102に提供するあらゆる他のコンピューティング・ホストによって実行される。
【0011】
少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラム102は、1つ又は複数のAPI110を利用して、前記ソフトウェア・プログラム102によって使用されるメモリを割り振り及び管理する。少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラム102は、1つ又は複数のAPI110を利用して、GPUなどの1つ若しくは複数のPPU又はあらゆる他のアクセラレータ若しくは本明細書でさらに説明されるプロセッサを使用して加速される前記ソフトウェア・プログラム102の1つ又は複数の部分によって使用されるメモリを割振り及び管理する。このようなソフトウェア・プログラム102は、1つ又は複数のPPUのメモリを、1つの実施例では1つ又は複数のAPI110によって提供されるメモリ割振り関数112を使用して、要求して割振りする。
【0012】
少なくとも1つの実施例では、API110は、並列コンピューティングを容易にするためのAPIである。少なくとも1つの実施例では、API110は、本明細書でさらに説明されるあらゆる他のAPIである。少なくとも1つの実施例では、API110は、ドライバ及び/又はランタイム104によって提供される。少なくとも1つの実施例では、API110は、CUDAユーザモード・ドライバによって提供される。少なくとも1つの実施例では、API110は、CUDAランタイムによって提供される。少なくとも1つの実施例では、ドライバ104は、実行されると、API110の1つ又は複数の関数112の動作を、ソフトウェア・プログラム102の1つ又は複数の部分のロード及び実行の間、実行する又は容易にする、データ値及びソフトウェア命令である。少なくとも1つの実施例では、ランタイム104は、実行されると、API110の1つ又は複数の関数112の動作を、ソフトウェア・プログラム102の実行の間、実行する又は容易にする、データ値及びソフトウェア命令である。少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラム102は、ドライバ及び/又はランタイム104によって実装されるか提供される1つ又は複数のAPI110を利用して、GPUなどの1つ又は複数のPPUによる実行の間、前記1つ又は複数のソフトウェア・プログラム102の部分によって使用される1つ又は複数のメモリ領域を、割振り又は予約する。
【0013】
少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラム102は、ドライバ及び/又はランタイム104によって提供される1つ又は複数のAPI110を利用して、GPUなどの1つ又は複数のPPUのメモリ114の1つ又は複数のブロックを、割振り又は予約する。少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラム102は、ドライバ及び/又はランタイム104によって提供される1つ又は複数のAPI110を利用して、GPUなどの1つ又は複数のPPUのメモリ114の1つ又は複数のプール116、118、120を、割振り又は予約する。少なくとも1つの実施例では、本明細書ではメモリプール(mempool)及び/又はメモリゾーン(memzone)と称されるメモリ114のプール116、118、120は、GPUのような1つ又は複数のPPUの個々のプロセッサなどの、1つ又は複数のコンピューティング・デバイスによって使用可能な、又は使用される、メモリの1つ又は複数のブロックの論理的なグルーピングである。少なくとも1つの実施例では、1つ又は複数のAPI110は、1つ若しくは複数のプール116、118、120及び/又はメモリ114の他のブロックを管理するために使用可能である。たとえば、1つの実施例では、本明細書でさらに説明されるような、GPUのような1つ又は複数のPPU上の1つ又は複数のストリーミング・プロセッサは、1つ若しくは複数のストリーミング・プロセッサのそれぞれによって使用可能な物理メモリ、及び/又は前記1つ若しくは複数のストリーミング・プロセッサのそれぞれによって使用可能な共有された物理メモリを有する。少なくとも1つの実施例では、API110は、ドライバ及び/又はランタイム104を通じて、1つ又は複数のAPI110又はAPI関数112を提供して、各ストリーミング・プロセッサに個別の、又はそれらの間で共有されるメモリのプール116、118、120又はメモリの他の部分を割り振り、割振り解除、又は管理する。
【0014】
少なくとも1つの実施例では、1つ又は複数のAPI110は、メモリ114の1つ若しくは複数のプール116、118、120又は他の領域を、割り振る及び/又は管理するための1つ又は複数の関数121を含む。少なくとも1つの実施例では、1つ又は複数のAPI110は、メモリの割振り及び管理動作を、上述のようなドライバ及び/又はランタイム104を通じて、実現する。少なくとも1つの実施例では、1つ又は複数のAPI110を提供する1つ又は複数のドライバ及び/又はランタイム104は、メモリ114を、メモリプール又は本明細書でさらに説明されるあらゆる他のグルーピングなどの、論理的なグルーピング又はプール116、118、120に編成する。少なくとも1つの実施例では、メモリ114の論理的なグルーピング又はプール116、118、120は、1つ又は複数のコンピューティング・デバイスによって使用可能なメモリ114の1つ又は複数のブロックの領域又はサブ領域を含む。少なくとも1つの実施例では、メモリのブロックは、1つ若しくは複数のPPUで利用可能な、又は1つ若しくは複数のPPUによって使用可能な、すべてのメモリを含む。少なくとも1つの実施例では、メモリ114のブロックは、ストリーミング・プロセッサ又は本明細書でさらに説明されるあらゆる他のプロセッサなどの、単一のコンピューティング・デバイスに関連付けられた、又はそのような単一のコンピューティング・デバイスによって使用可能な、すべてのメモリ114を含む。少なくとも1つの実施例では、プール116、118、120は、ストリーミング・プロセッサ又は本明細書でさらに説明されるあらゆる他のプロセッサなどの、1つ又は複数のデバイスによって使用可能又は使用される、1つ又は複数のPPUのメモリ114の1つ又は複数の領域を含む
【0015】
少なくとも1つの実施例では、1つ又は複数のAPI110は、図2図4と併せて以下で説明されるような、メモリ114の1つ又は複数のプール116、118、120の、割振り、管理、及び/又はそれらへのアクセスを実行する。少なくとも1つの実施例では、1つ又は複数のAPI110は、メモリプール又は本明細書でさらに説明されるあらゆる他のグルーピングなどの、メモリ114の1つ又は複数のグルーピング又はプール116、118、120の、割振り、管理、及び/又はそれらへのアクセスを提供する。少なくとも1つの実施例では、1つ又は複数のAPI110は、メモリ114のプール116、118、120又は他のメモリ114のグルーピングへの、同期割振り及び/又は割振り解除及び/又はアクセスを行う。少なくとも1つの実施例では、1つ又は複数のAPI110は、メモリ114のプール116、118、120又は他のメモリ114のグルーピングへの、同期割振り及び/又は割振り解除及び/又はアクセスを、ドライバ及び/又はランタイム104を通じて行う。少なくとも1つの実施例では、1つ又は複数のAPI110は、メモリ114のプール116、118、120又は他のメモリ114のグルーピングの、非同期割振り及び/又は割振り解除及び/又はそれらへのアクセスを行う。少なくとも1つの実施例では、1つ又は複数のAPI110は、メモリ114のプール116、118、120又は他のメモリ114のグルーピングの、非同期割振り及び/又は割振り解除及び/又はそれらへのアクセスを、ドライバ及び/又はランタイム104を通じて行う。
【0016】
少なくとも1つの実施例では、1つ又は複数のAPI110は、stream ordered memory allocator(ストリーム・オーダー・メモリ・アロケータ)などの非同期アロケータを含む、1つ又は複数のAPI110関数112を、実行する及び/又は提供する。少なくとも1つの実施例では、stream ordered memory allocatorは、実行されると、ソフトウェア・プログラム102がメモリ114を、プール116、118、120などの論理的なメモリ・グルーピング及びフリーに割り振られたメモリに割振りできるようにする、データ値及びソフトウェア命令である。少なくとも1つの実施例では、stream ordered memory allocatorは、メモリ114をストリーム順に割り振る。少なくとも1つの実施例では、メモリ114は、メモリの1つ又は複数のプール116、118、120の1つ又は複数の領域又はサブ領域が、使用する前記1つ又は複数の領域又はサブ領域に依存する、GPUのような1つ又は複数のPPUによって実行されるストリーム中の1つ又は複数の動作による使用に先立って割り振られる場合、ストリーム順に割り振られる。少なくとも1つの実施例では、stream ordered memory allocatorは、実行されると、ソフトウェア・プログラム102による1つ又は複数のコール又は関数112コール又はAPI110コールに非同期的に応答して、メモリ114をプール116、118、120及びフリーに割り振られたメモリなどの論理的なメモリのグルーピングに割り振る、データ値及びソフトウェア命令である。少なくとも1つの実施例では、stream ordered memory allocatorは、プール116、118、120などのメモリの論理的なグルーピングにおけるメモリ114の1つ又は複数の割振りを、1つ又は複数のユーザ実装のソフトウェア・プログラムによる使用と使用の間、フリーな動作が前記メモリの割振りを解放するまで、保存する少なくとも1つの実施例では、stream ordered allocatorによって割り振られたメモリ114の1つ又は複数の領域又はサブ領域は、複数のソフトウェア・プログラム102同士で共有されてもよい。少なくとも1つの実施例では、2つ以上のソフトウェア・プログラム102の間で共有される割り振られたメモリ114の領域又はサブ領域は、前記2つ以上のソフトウェア・プログラム102のセグメントの並列な実行の間、前記メモリの領域又はサブ領域がアクセスされるように、重複しない。
【0017】
少なくとも1つの実施例では、1つ又は複数のAPI110によって提供されるstream ordered memory allocatorなどの1つ又は複数の非同期アロケータ関数112は、GPUのような1つ又は複数のPPUのメモリ114を管理する。GPUのような1つ又は複数のPPUによって加速されるように、ソフトウェア・プログラム102及び/又は前記ソフトウェア・プログラム102の1つ若しくは複数の部分の最適化を改善するために、1つの実施例では、1つ又は複数のAPI110は、1つ又は複数のAPI関数112を提供して、上述のように、また図2図4と併せて以下でさらに説明されるように、1つ又は複数のコンピューティング・デバイスによって使用可能又は使用されるプール116、118、120などのメモリ114の1つ又は複数のブロックのメモリ使用状況を収集する又は判定する。
【0018】
図2は、少なくとも1つの実施例による、メモリ・アドレスが、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロックに含まれるかどうかを判定するアプリケーション・プログラミング・インターフェース(API)202、204を示すブロック図である。少なくとも1つの実施例では、1つ又は複数のAPI202、204は、実行されると、図1と併せて上述したような1つ又は複数の計算演算を行うソフトウェア命令である。少なくとも1つの実施例では、1つ又は複数のAPI202、204は、呼び出されると、1つ又は複数の計算演算を行うソフトウェア関数である。少なくとも1つの実施例では、1つ又は複数のAPI202、204は、図1と併せて上述されるような、1つ又は複数のメモリ動作を実施するための1つ又は複数の関数へのインターフェースである。少なくとも1つの実施例では、1つ又は複数のAPI202、204は、呼び出されると、本明細書でさらに説明されるようなグラフィック処理ユニット(GPU)のような並列処理ユニット(PPU)を含む1つ又は複数のプロセッサによって、1つ又は複数のソフトウェア命令及び/又はハードウェア動作を実行させる、1つ又は複数の関数を含む。
【0019】
少なくとも1つの実施例では、1つ又は複数のAPI202、204は、APIコール202、及びAPI応答204を含む。少なくとも1つの実施例では、APIコール202は、呼び出されると、1つ又は複数の算出動作を実行する1つ又は複数の関数への、インターフェースである。少なくとも1つの実施例では、APIコール202は、実行されると、1つ又は複数の関数、API、API関数、及び/又は他の算出動作を実行させる、1つ又は複数の命令である。少なくとも1つの実施例では、APIコール202は、入力として、1つ又は複数のパラメータを受信する。少なくとも1つの実施例では、API応答204は、1つ又は複数の関数、API、API関数、又はあらゆる他の算出動作が実行された結果、1つ又は複数のデータ値を、示す、送信する、返す、又は通信する、インターフェースである。少なくとも1つの実施例では、API応答204は、1つ又は複数のデータ値を、APIコール202を呼出し中、又は実行中の1つ又は複数の関数に向けて、示す、送信する、返す、又は通信する。少なくとも1つの実施例では、API応答204は、実行されると、1つ又は複数のAPIコール202の呼出しの結果として1つ又は複数のデータ値を返す、1つ又は複数の命令である。
【0020】
少なくとも1つの実施例では、1つ又は複数のAPIコール202は、1つ又は複数のAPIに、1つ又は複数のAPIが参照するデータの1つ又は複数のアドレスを示させる。少なくとも1つの実施例では、1つ又は複数のAPIは、図1と併せて上述したような1つ又は複数のメモリのブロック、領域、又はプールが、前記1つ又は複数のAPIによって特定可能であるか、又は特定することができる場合、データの1つ又は複数のアドレスを参照する。少なくとも1つの実施例では、1つ又は複数のAPIは、前記1つ又は複数のAPI又は図1と併せて上述したような非同期割振り関数などのあらゆる他のAPIが、前記1つ又は複数のアドレスを含むメモリの1つ又は複数のブロック、領域、及び/又はプールを割り振る、又は使用する場合、データの1つ又は複数のアドレスを参照する。少なくとも1つの実施例では、1つ又は複数のAPIコール202は、図1と併せて上述したような1つ又は複数のAPI又は他のソフトウェア・ライブラリに、1つ又は複数のメモリ・ロケーション識別子が、図1と併せて上述したような非同期アロケータによって割り振られたメモリのプールなどの1つ又は複数のメモリ・ブロック及び/又はメモリ領域に対して範囲内かどうかを判定させる。少なくとも1つの実施例では、1つ又は複数のAPIコール202は、図1と併せて上述したような1つ又は複数のAPI又は他のソフトウェア・ライブラリに、1つ又は複数のメモリ・ロケーションが、前記1つ又は複数のAPIが参照するデータの1つ又は複数のアドレスによって含まれるかどうかを判定させる。少なくとも1つの実施例では、メモリ・ロケーション識別子は、メモリ・アドレスなどの1つ又は複数のメモリ・ロケーションを示すための情報を含む、ポインタなどのデータ値である。少なくとも1つの実施例では、1つ又は複数のAPIコール202は、呼び出されると、1つ又は複数のソフトウェア命令を実行させ、この場合、前記1つ又は複数のソフトウェア命令は、1つ又は複数の特定の関数コールの結果としてメモリ・ロケーションが割り振られることになるか、又は割り振られてあったかを判定する。たとえば、1つの実施例では、APIコール202へのメモリ・ロケーション識別子パラメータが、特定の非同期アロケータへのコールの結果として割り振られたメモリ領域又はメモリ・アドレスを示す場合、特定のメモリ・プール又は前記メモリ領域を含むグルーピングへのハンドルが、API応答204によって返される。少なくとも1つの実施例では、1つ又は複数のAPIコール202により、1つ又は複数のAPI又は他のソフトウェア・ライブラリが、1つ又は複数のメモリ・ロケーション識別子が1つ又は複数のメモリ領域内にあるかどうかを判定したことに応答して、前記1つ又は複数のAPIは、API応答304にメモリ・セット識別子を含む1つ又は複数のデータ値を示させる。少なくとも1つの実施例では、メモリ・セット識別子は、図1と併せて上述したようなメモリのプールなど、1つ又は複数のメモリ・ブロック及び/又はメモリ領域を示すための情報を含む1つ又は複数のデータ値である。少なくとも1つの実施例では、メモリ・セット識別子は、以下で説明するように、メモリ・ブロック及び/又はメモリ領域がないことを示すための、NULLデータ値である。
【0021】
少なくとも1つの実施例では、例示的なAPIコール202は、compute uniform device architecture(CUDA)などのAPIに、1つ又は複数のメモリ割振り動作の結果として取得されるポインタなどの1つ又は複数のメモリ・ロケーション識別子が、図1と併せて上述したようなメモリプールなど、非同期アロケータによってメモリのグルーピング又はプール内に割り振られた1つ又は複数のメモリ領域を示す及び/又はポイントするための情報を含むかどうかを判定させ、次の通りである:
CUMemoryPool pool = NULL;
cuPointerGetAttribute(&pool, CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE, ptr);
少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラムは、呼び出されるか、実行させられると、前記APIコール202の1つへのパラメータとして示されたポインタを割り振った特定のメモリ・プール又はグルーピングを問い合わせる、1つ又は複数のAPIコール202を含む。少なくとも1つの実施例では、CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLEは、CUDA又は本明細書でさらに説明されるあらゆる他のAPIなどの、1つ又は複数のAPIに特有の属性である。少なくとも1つの実施例では、CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLEは、アロケータによって実施される特定のメモリ割振り動作を示すための属性である。少なくとも1つの実施例では、pointerGetAttributeは、図1と併せて上述したようなAPIなどの命令のセットを含む関数である。少なくとも1つの実施例では、cuPointerGetAttributeは、APIなどの命令のセットを含む関数である。少なくとも1つの実施例では、pointerGetAttribute、cuPointerGetAttribute、又はあらゆる他のAPIコール202は、1つ又は複数のパラメータとして、CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLEなどの属性を含む少なくとも1つ又は複数のメモリ・ロケーション識別子を受信する。少なくとも1つの実施例では、pointerGetAttribute、cuPointerGetAttribute、又は関数へのあらゆる他のAPIコール202は、API応答204を通じて、ポインタ(ptrなど)がポイントするメモリプールなどのメモリのプール若しくはグルーピングを示すか、又は前記関数にパラメータとして与えられたポインタによってポイントされるメモリ領域を含む、メモリ・アドレスへのハンドル又はポインタなどのメモリ・セット識別子を返す。少なくとも1つの実施例では、メモリ・セット識別子は、メモリプールなどのメモリのプール又はグルーピングを示すための情報を含むデータ値である。少なくとも1つの実施例では、メモリ・セット識別子は、メモリプールなどのメモリのプール又はグルーピングの第1のアドレスを示すメモリ・アドレスを含む。
【0022】
少なくとも1つの実施例では、API又は関数によって、API応答204によって示されることになるメモリ・セット識別子を決定するために、前記API又は関数は、1つ又は複数の計算演算を実施して、前記メモリ・ロケーション識別子が、メモリのプール又はグルーピングなどのメモリ・セット内に含まれるかどうかを判定する。少なくとも1つの実施例では、API応答204によって返されることになる、特定のownerによってpointerGetAttribute、cuPointerGetAttribute、又はあらゆる他のAPIコール202にパラメータとして与えられたポインタによってポイントされるアドレスを含むメモリ・オブジェクト(memobj)内のメモリのグルーピング又はプールを示すメモリ・セット識別子は、次のように計算及び/又は取り出される:
&((CUImemblockPool)(memobj->PoolObj->info->pool->owner))->publicHandle;
少なくとも1つの実施例では、API応答204によって返されることになる、メモリ・オブジェクト(memobj)内のメモリがpointerGetAttribute、cuPointerGetAttribute、又はあらゆる他のAPIコール202にパラメータとして与えられたポインタによってポイントされるアドレスを含む場合にグルーピング又はプールを示すメモリ・セット識別子は、次のように計算及び/又は取り出される:
&memobj-<extPoolObg->extMemPool->publicHandle;
少なくとも1つの実施例では、pointerGetAttribute、cuPointerGetAttribute、又はあらゆる他のAPIコール202へのパラメータとして示されるメモリ・ロケーション識別子が、見つからないか、決定することができない場合、又はメモリプール・オブジェクトではない場合、API応答204は、pointerGetAttribute、cuPointerGetAttribute、又はあらゆる他のAPIコール202に応答して、NULLデータ値を含むメモリ・セット識別子を返す。
【0023】
図3は、少なくとも1つの実施例による、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールが、1つ又は複数のソフトウェア・モジュールの実行中に共有可能かどうかを判定するAPI302、304を示すブロック図である。少なくとも1つの実施例では、1つ又は複数のコンピューティング・デバイスは、並列処理ユニット(PPU)である。少なくとも1つの実施例では、1つ又は複数のコンピューティング・デバイスは、中央処理装置(CPU)である。少なくとも1つの実施例では、1つ又は複数のコンピューティング・デバイスは、グラフィックス処理ユニット(GPU)である。少なくとも1つの実施例では、1つ又は複数のコンピューティング・デバイスは、本明細書でさらに説明される、あらゆる他のプロセッサ及び/又はハードウェア及び/又はソフトウェア・デバイスである。少なくとも1つの実施例では、1つ又は複数のソフトウェア・モジュールは、実行されると、1つ又は複数のプロセッサに1つ又は複数の動作を実行させる、ソフトウェア命令のあらゆる構成物又は論理的な編成物である。少なくとも1つの実施例では、1つ又は複数のソフトウェア・モジュールは、カーネルである。少なくとも1つの実施例では、1つ又は複数のソフトウェア・モジュールは、グラフィックス処理ユニット(GPU)カーネルである。少なくとも1つの実施例では、1つ又は複数のソフトウェア・モジュールは、compute uniform device architecture(CUDA)カーネルである。少なくとも1つの実施例では、1つ又は複数のソフトウェア・モジュールは、ユーザモード・プロセスである。少なくとも1つの実施例では、1つ又は複数のソフトウェア・モジュールは、カーネルモード・プロセスである。少なくとも1つの実施例では、1つ又は複数のソフトウェア・モジュールは、実行されると、1つ又は複数のプロセッサに1つ又は複数の動作を実行させる、あらゆる他のパッケージング又はタイプのソフトウェアである。
【0024】
少なくとも1つの実施例では、1つ又は複数のAPI302、304は、1つ若しくは複数のAPIコール302、及び/又は1つ若しくは複数のAPI応答304を含む。少なくとも1つの実施例では、図1及び図2と併せて上述したようなAPIコール302は、1つ又は複数のデータ値をパラメータとして受信し、1つ又は複数のAPI又は他のソフトウェア・ライブラリに、情報を判定、計算、又は生成させて、前記1つ又は複数のパラメータによって示される1つ又は複数のデバイスの1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールが、1つ又は複数のソフトウェア・モジュールの実行中に共有可能になるかどうか、又は共有可能であったかどうかを示す。少なくとも1つの実施例では、API応答304は、図1及び図2と併せて上述したように、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールを共有するために使用可能な、サポートされるハンドル・タイプのセットを含む1つ又は複数のデータ値を返す、又は通信する、又は示す。
【0025】
少なくとも1つの実施例では、1つ又は複数のAPIコール302は、図1と併せて上述したような1つ又は複数のAPI又は他のソフトウェア・ライブラリに、1つ又は複数のデバイス識別子パラメータによって示される1つ又は複数のデバイスの、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールが、1つ又は複数のソフトウェア・モジュールの実行中に、現在共有可能であるかどうか、共有可能となるかどうか、又は共有可能であったかどうかを判定させる。少なくとも1つの実施例では、1つ又は複数のAPIコール302は、図1と併せて上述したような1つ又は複数のAPI又は他のソフトウェア・ライブラリに、1つ又は複数のデバイス識別子パラメータによって示される1つ又は複数のデバイスの、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールが、1つ又は複数のソフトウェア・モジュールの実行中に、現在割振り可能であるかどうか、割振り可能となるかどうか、又は割振り可能であったかどうかを判定させる。少なくとも1つの実施例では、デバイス識別子パラメータは、本明細書でさらに説明されるあらゆるコンピューティング・デバイスなどの、1つ又は複数のデバイスを示すために使用可能な、1つ又は複数のデータ値である。少なくとも1つの実施例では、デバイス識別子はデバイス属性である。少なくとも1つの実施例では、デバイス識別子は、本明細書でさらに説明されるあらゆるコンピューティング・デバイスなどの、1つ若しくは複数のデバイス、又は1つ若しくは複数のデバイスの1つ若しくは複数の属性を識別するために使用可能な、あらゆるタイプのデータ値である。少なくとも1つの実施例では、1つ又は複数のAPIは、前記1つ又は複数のAPIに対して1つ又は複数のパラメータによって示される1つ又は複数のストレージ・ロケーションが、1つ又は複数のソフトウェア・モジュールの実行中に共有することが可能かどうかを、本明細書でさらに説明されるAPIなどの、1つ又は複数の他のAPIを使用して判定し、前記1つ又は複数のストレージ・ロケーションを共有するために使用可能な1つ又は複数のハンドルを示す。少なくとも1つの実施例では、1つ又は複数のAPIは、前記1つ又は複数のAPIに対して1つ又は複数のパラメータによって示される1つ又は複数のストレージ・ロケーションが、図1と併せて上述した非同期割振りAPIなどの1つ又は複数の他のAPIを使用して割り振ることが可能かどうかを判定し、前記1つ又は複数のストレージ・ロケーションを割り振ることが可能であるかどうかを示す。少なくとも1つの実施例では、1つ又は複数のAPIは、1つ又は複数のストレージ・ロケーションが、API応答304によって示される1つ又は複数のデータ値を使用して共有することが可能かどうかを示す。少なくとも1つの実施例では、1つ又は複数のAPIは、1つ又は複数のストレージ・ロケーションを、API応答304によって示される1つ又は複数のデータ値を使用して割り振ることが可能かどうかを示す。少なくとも1つの実施例では、メモリ・セット識別子は、図1と併せて上述したようなメモリのプールなど、1つ又は複数のメモリ・ブロック及び/又はメモリ領域を示すための情報を含む1つ又は複数のデータ値である。少なくとも1つの実施例では、1つ又は複数のAPIコール302は、呼び出されると、1つ又は複数のソフトウェア命令を実行させ、この場合、前記1つ又は複数のソフトウェア命令は、1つ又は複数のプロセッサに、1つ又は複数のデバイス識別子パラメータによって示される、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールが、上述のように、1つ又は複数のソフトウェア・モジュールの実行中に、現在共有されているか共有可能であるかどうか、共有されることになるか共有可能となるかどうか、又は共有されていたか共有可能であったかどうかを判定させる。少なくとも1つの実施例では、1つ又は複数のAPIコール302は、呼び出されると、1つ又は複数のソフトウェア命令を実行させ、この場合、前記1つ又は複数のソフトウェア命令は、1つ又は複数のプロセッサに、1つ又は複数のメモリ・セット識別子パラメータによって示される、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールが、図1と併せて上述した非同期メモリ割振り関数などの1つ又は複数の非同期APIを使用して、割り振られることになるか割振り可能になるかどうか、又は割り振られていたか割振り可能であったかどうかを判定させる。少なくとも1つの実施例では、1つ又は複数のAPIコール302に応答して、1つ又は複数のAPIは、1つ又は複数のハンドルを含む1つ又は複数のデータ値を示すよう、API応答304に行わせる又はAPI応答304を実行する。少なくとも1つの実施例では、ハンドルは、1つ又は複数のソフトウェア・モジュールによって使用可能な、メモリを1つ又は複数の他のソフトウェア・モジュールと共有するためのデータ値である。少なくとも1つの実施例では、1つ又は複数のAPIコール302に応答して、1つ又は複数のAPIは、APIインジケータを含む1つ又は複数のデータ値を示すよう、API応答304に行わせる又はAPI応答304を実行する。少なくとも1つの実施例では、APIインジケータは、1つ又は複数のメモリ・セット識別子パラメータによって示される、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールが、図1と併せて上述した非同期メモリ割振り関数などの1つ又は複数の非同期APIを使用して、割り振られることになるか割振り可能になるかどうか、又は割り振られていたか割振り可能であったかどうかを示す情報を含む、1つ又は複数のデータ値である。
【0026】
少なくとも1つの実施例では、1つ又は複数のAPIコール302は、1つ又は複数のAPI又は他のソフトウェア・ライブラリに、1つ又は複数の計算演算を実施させ、1つ又は複数のメモリ・セット識別子パラメータによって示される、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールが、上述のような割振り及び/又は共有などの特定のメモリ動作をサポートするかどうかを判定する。少なくとも1つの実施例では、1つ又は複数のAPIコール302の結果、1つ又は複数のAPIは、1つ又は複数の動作を実施することになり、メモリ及び他の構成要素を含むコンピューティング・デバイスが、2つ以上のプロセス間でのプロセス間通信(IPC:inter-process communication)を、メモリプールなどの指定されたメモリのプール又はグルーピング内に割り振られたメモリ領域を使用してサポートするかどうかを判定する。たとえば、1つの実施例では、1つ又は複数の非同期アロケータによって割り振られるメモリを含む1つ又は複数のデバイスが、メモリプール・ベースのIPCなどのIPCをサポートしていない場合、1つ又は複数の属性は、1つ又は複数の関数コールの結果として1つ又は複数のAPIに返され、前記1つ又は複数のデバイスの前記属性を要求する並列コンピューティングを容易にする。
【0027】
少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラムを実行する1つ又は複数のデバイスが、非同期メモリ割振り動作及び/又は共有を含む、メモリプール動作などの特定のメモリ動作をサポートするかどうかを判定するための例示的なAPIコール302は、次の通りである:
int supportedHandles = 0;
Curesult result = cuDeviceGetAttribute(&supportedHandles, CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPES, dev);
少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラムは、特定のデバイスに問い合わせをして、メモリプールIPCなどの1つ又は複数のメモリ動作が、前記デバイスによってサポートされるかどうかを判定してもよい。少なくとも1つの実施例では、CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPESは、CUDA又は本明細書でさらに説明されるあらゆる他のAPIなどの、1つ又は複数のAPIに特有の属性である。少なくとも1つの実施例では、CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPESは、1つ又は複数のデバイス内で問い合わせされるハンドルなどの1つ又は複数のメモリ・アドレスを示すための情報を含む、1つ又は複数のデータのタイプを示すデータを含むデータ値である。
【0028】
少なくとも1つの実施例では、deviceGetAttributeは、実行されると、1つ又は複数のAPI動作を実行する命令のセットである。少なくとも1つの実施例では、deviceGetAttributeは、APIコール302、又はAPIコール302へのインターフェースである。少なくとも1つの実施例では、cuDeviceGetAttributeは、CUDAなどの並列コンピューティングを容易にするためのAPIによって提供される命令のセットである。少なくとも1つの実施例では、deviceGetAttribute、cuDeviceGetAttribute、又は1つ若しくは複数のAPI若しくはAPI関数へのあらゆる他のAPIコール302インターフェースは、API応答304の結果、1つ又は複数のハンドルを返す。少なくとも1つの実施例では、deviceGetAttribute、cuDeviceGetAttribute、又は1つ若しくは複数のAPI若しくはAPI関数へのあらゆる他のAPIコール302インターフェースは、API応答304の結果、1つ又は複数のAPIインジケータを返す。少なくとも1つの実施例では、1つ又は複数のハンドル及び/又はAPI応答304によって返される他のデータは、CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPESをパラメータとして受信した結果、サポートされるハンドル・タイプのマスクを含む。少なくとも1つの実施例では、1つ又は複数のAPIインジケータは、CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPESをパラメータとして受信した結果、サポートされるハンドル・タイプのマスクを含む。少なくとも1つの実施例では、1つ又は複数のAPIコール302は、パラメータとして、上述のように1つ又は複数のAPIコール302の結果として返されたマスクにセットされたハンドル・タイプを含むあらゆるデバイス識別子を受け入れる。少なくとも1つの実施例では、1つ又は複数のAPIコール302は、パラメータとして、上述のように1つ又は複数のAPIコール302の結果として返されたマスクにセットされたハンドル・タイプを含むあらゆるメモリ・セット識別子を受け入れる。少なくとも1つの実施例では、cuMempoolExportToShareableHandle及びcuMempoolImportFromShareableHandleなど、1つ又は複数のAPIコール302によって呼び出されることになる1つ又は複数の関数は、真を示すデータ値又は成功を示すあらゆる他のデータ値を含む、1つ又は複数のデバイスのメモリが共有可能かどうかについての情報を示すための、あらゆるデータ値を返す場合がある。少なくとも1つの実施例では、cuMempoolExportToShareableHandle及びcuMempoolImportFromShareableHandleなど、1つ又は複数のAPIコール302によって呼び出されることになる1つ又は複数の関数は、真を示すデータ値又は成功を示すあらゆる他のデータ値を含む、あらゆるAPIインジケータを返す場合がある。
【0029】
図4は、少なくとも1つの実施例による、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールの1つ又は複数の属性を決定するAPI402、404を示すブロック図である。少なくとも1つの実施例では、1つ又は複数のAPI402、404は、1つ若しくは複数のAPIコール402、及び/又は1つ若しくは複数のAPI応答404を含む。少なくとも1つの実施例では、図1及び図2と併せて上述したようなAPIコール402は、1つ又は複数のデータ値をパラメータとして受信し、1つ又は複数のAPI又は他のソフトウェア・ライブラリに、情報を判定、計算、又は生成させて、使用状況情報などの、前記1つ又は複数のパラメータによって示される1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールの1つ又は複数の特性を示す。少なくとも1つの実施例では、API応答404は、図1図3と併せて上述したように、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールについての情報を含む1つ又は複数のデータ値を返す、又は通信する、又は示す。
【0030】
少なくとも1つの実施例では、1つ又は複数のAPIコール302は、図1と併せて上述したような1つ又は複数のAPI又は他のソフトウェア・ライブラリに、前記1つ又は複数のAPIコール302に対して1つ又は複数のメモリ・セット識別子パラメータによって示される、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールについての情報を、計算、生成又は決定させる。少なくとも1つの実施例では、メモリ・セット識別子は、図1と併せて上述したようなメモリのプールなど、1つ又は複数のメモリ・ブロック及び/又はメモリ領域を示すための情報を含む1つ又は複数のデータ値である。少なくとも1つの実施例では、1つ又は複数のAPIコール402は、呼び出されると、1つ又は複数のソフトウェア命令を実行させ、この場合、前記1つ又は複数のソフトウェア命令は、前記1つ又は複数のAPIコール402に対して1つ又は複数の属性インジケータ・パラメータによって示される、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールの1つ又は複数の属性を、計算、生成又は決定させる。少なくとも1つの実施例では、属性インジケータは、以下で説明するような使用状況情報など、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールの1つ又は複数の特性を示すための情報を含むデータ値である。少なくとも1つの実施例では、1つ又は複数のAPIコール402に応答して、1つ又は複数のAPIは、APIコール402に対して属性インジケータ・パラメータによって示される属性情報を含む1つ又は複数のデータ値を示すよう、API応答404に行わせる又はAPI応答404を実施する。少なくとも1つの実施例では、属性情報は、使用状況情報など、1つ若しくは複数のメモリ・ブロック、領域、及び/若しくはメモリのプールについての情報を含む1つ若しくは複数のデータ値、又は本明細書でさらに説明される前記1つ若しくは複数のメモリ・ブロック、領域、及び/若しくはメモリのプールのあらゆる他の属性である。
【0031】
少なくとも1つの実施例では、1つ又は複数のAPIコール402は、呼び出されると、1つ又は複数のAPIに、1つ又は複数のメモリ・セット識別子パラメータによって示される、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールについての、1つ又は複数の属性インジケータ・パラメータによって示される属性情報を収集させる。少なくとも1つの実施例では、1つ又は複数のAPIは、1つ又は複数のAPIコール402に応答して、1つ又は複数のAPIが参照する1つ又は複数のストレージ・ロケーションについての情報を示す。少なくとも1つの実施例では、1つ又は複数のAPIが参照する1つ又は複数のストレージ・ロケーションは、図1と併せて上述したような、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールである。少なくとも1つの実施例では、1つ又は複数のAPIが参照する1つ又は複数のストレージ・ロケーションは、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールを特定する1つ又は複数のメモリ・セット識別子パラメータによって、前記1つ又は複数のAPIに示される。少なくとも1つの実施例では、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールの1つ又は複数の属性は、使用状況統計を含む。少なくとも1つの実施例では、1つ又は複数のAPIコール402に応答して、本明細書でさらに説明されるようなユーザモードのドライバは、1つ又は複数のメモリ・ブロック、領域、及び/又はメモリのプールについての1つ又は複数の属性を収集する。少なくとも1つの実施例では、1つ又は複数のAPIコール402に応答して、ユーザモードのドライバは、1つ又は複数の属性インジケータによって示される属性情報を示す統計値を計算する。少なくとも1つの実施例では、1つ又は複数のAPIコール402に応答して、1つ又は複数のAPIは、1つ又は複数のAPI応答404を実行して、属性情報を含むデータを前記1つ又は複数のAPIコール402を実行中の1つ又は複数のソフトウェア・プログラムに示す、又は返す。少なくとも1つの実施例では、1つ又は複数のAPIコール402の結果、API及び/又はユーザモードのドライバは、API応答404として、メモリプールなど、メモリの論理的なグルーピング又はプールによって現在予約されている及び/又はキャッシュされている合計のデバイス・メモリを示す属性情報を計算又は収集し、前記1つ又は複数のAPIコール402に提供する。少なくとも1つの実施例では、1つ又は複数のAPIコール402の結果、API及び/又はユーザモードのドライバは、API応答404として、現在割り振られている、及び/又は使用中のメモリの量を示す属性情報を計算又は収集し、前記1つ又は複数のAPIコール402に提供する。少なくとも1つの実施例では、1つ又は複数のAPIコール402の結果、API及び/又はユーザモードのドライバは、API応答404として、履歴的なハイ・ウォーターマーク又は現在予約されている及び/若しくはキャッシュされているメモリの最大量を示す属性情報を計算又は収集し、前記1つ又は複数のAPIコール402に提供する。少なくとも1つの実施例では、1つ又は複数のAPIコール402の結果、API及び/又はユーザモードのドライバは、API応答404として、履歴的なハイ・ウォーターマーク又は割り振られたメモリの最大量を示す属性情報を計算又は収集し、前記1つ又は複数のAPIコール402に提供する。少なくとも1つの実施例では、1つ又は複数のAPIコール402は、1つ又は複数のAPIに、使用状況統計などの1つ若しくは複数のメモリ・ブロック、領域、及び/若しくはメモリのプールの1つ若しくは複数の属性、又はユーザモードのドライバによって収集若しくは計算された属性を、リセットさせる。
【0032】
少なくとも1つの実施例では、1つ又は複数のAPI応答404によって示される属性情報は、次のようなデータ値を含む:
enum CUmemPool_attribute {
CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT,
CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH,
CU_MEMPOOL_ATTR_USED_MEM_CURRENT,
CU_MEMPOOL_ATTR_USED_MEM_HIGH

少なくとも1つの実施例では、属性情報は、上述のような列挙すなわちenumによって示される1つ又は複数のデータ値を含み、memPoolGetAttribute及び/又はmemPoolSetAttributeなどの1つ又は複数のAPIコール402の結果、取り出されるかセットされ得る。少なくとも1つの実施例では、属性情報は、CUmemPool_attributeなどの列挙すなわちenumによって示される1つ又は複数のデータ値を含み、CUDAに対応するcuMemPoolGetAttribute及びcuMemPoolSetAttributeなどの、1つ又は複数のAPIコール402の結果としてAPI応答404によって示される。少なくとも1つの実施例では、1つ又は複数のデータ値を含む属性情報は、本明細書でさらに説明される1つ又は複数のAPIコール402のいずれかの結果として、取り出される、計算される、又は生成される、又はセットされる。少なくとも1つの実施例では、CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT属性インジケータは、API応答404を通じて、メモリプールなどのメモリのプールに現在割り振られている物理メモリの量を示すデータ結果を含む属性情報を受信するために、1つ又は複数のAPIコール402に対して示されるデータ値である。少なくとも1つの実施例では、CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENTによって示される属性をセットしようとするあらゆる試みは、無効なデータ値又は無効な値を示すデータ値をリターンさせる。少なくとも1つの実施例では、CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH属性インジケータは、上述のようなCU_MEMPOOL_ATTR_RESERVED_MEM_CURRENTなど別の属性によって達成される最大値を示すデータ結果を含む属性情報を受信するために、1つ又は複数のAPIコール402に対して示されるデータ値である。少なくとも1つの実施例では、CU_MEMPOOL_ATTR_RESERVED_MEM_HIGHによって示される属性をセットしようとするあらゆる試みは、cuMemPoolGetAttribute又は1つ若しくは複数のAPIによってパラメータとしてCU_MEMPOOL_ATTR_RESERVED_MEM_HIGH属性インジケータを使用して提供されるあらゆる他の関数へのコールの結果として返される、あらゆるハイ・ウォーターマーク値をリセットさせる。少なくとも1つの実施例では、CU_MEMPOOL_ATTR_USED_MEM_CURRENT属性インジケータは、API応答404において、まだ解放されていない割振りのサイズの合計を示すデータ結果を含む属性情報を受信するために、1つ又は複数のAPIコール402に対して示されるデータ値である。少なくとも1つの実施例では、CU_MEMPOOL_ATTR_USED_MEM_CURRENTによって示される属性をセットしようとするあらゆる試みは、無効なデータ値又は無効な値を示すデータ値をリターンさせる。少なくとも1つの実施例では、CU_MEMPOOL_ATTR_USED_MEM_HIGH属性インジケータは、API応答404において、上述のようなCU_MEMPOOL_ATTR_USED_MEM_CURRENTなど別の属性によって達成される最大値を示すデータ結果を含む属性情報を受信するために、1つ又は複数のAPIコール402に対して示されるデータ値である。少なくとも1つの実施例では、CU_MEMPOOL_ATTR_USED_MEM_HIGHによって示される属性をセットしようとするあらゆる試みは、cuMemPoolGetAttribute又は1つ若しくは複数のAPIによってパラメータとしてCU_MEMPOOL_ATTR_USED_MEM_HIGH属性インジケータを使用して提供されるあらゆる他の関数へのAPIコール402の結果として返される、あらゆるハイ・ウォーターマーク値をリセットさせる。
【0033】
少なくとも1つの実施例では、メモリプールなどのメモリの1つ又は複数のグルーピング又はプールについての使用状況統計を問い合わせするための例示的なAPIコール402は、次の通りである:
uint64_t poolAllocatedMem = 0;
CUresult result = cuMemPoolGetAttribute(pool, CU_MEMPOOL_ATTR_REERVED_MEM_CURRENT, &poolAllocatedMem);
少なくとも1つの実施例では、1つ又は複数のAPIへのmemPoolGetAttribute又はあらゆる他のAPIコール402は、前記1つ又は複数のAPIによって提供される関数を含め、API応答404を通じて、memPoolGetAttribute又は前記1つ若しくは複数のAPIによって提供される他の前記関数に提供される1つ又は複数のパラメータに対応するデータ値を示す1つ又は複数の結果を含む属性情報を返す。少なくとも1つの実施例では、cuMemPoolGetAttributeなどのAPIコール402は、API応答404に、前記cuMemPoolGetAttributeAPIコール402に提供される1つ又は複数の属性インジケータ・パラメータに対応するデータ値を示す1つ又は複数の結果を含む属性情報を返させる。少なくとも1つの実施例では、memPoolGetAttribute、memPoolSetAttribute、cuMemPoolGetAttribute、cuMemPoolSetAttribute、又は1つ若しくは複数のAPIによって提供されるあらゆる他の関数への、1つ又は複数のAPIコール402に提供される1つ又は複数のパラメータは、CUmemPool_attribute又は他の属性と併せて上で説明した。
【0034】
少なくとも1つの実施例では、memPoolGetAttribute、memPoolSetAttribute、cuMemPoolGetAttribute、cuMemPoolSetAttribute、又は本明細書でさらに説明されるあらゆる他のAPIなどの1つ又は複数のAPIコール402は、前記1つ又は複数のAPIに対応するユーザモードのドライバに、前記1つ又は複数のAPIコール402の結果としてAPI応答404を介して返されるデータを収集又は計算させる。少なくとも1つの実施例では、memPoolGetAttribute、memPoolSetAttribute、cuMemPoolGetAttribute、cuMemPoolSetAttribute、又は1つ若しくは複数のAPIによって提供されるあらゆる他の関数などの1つ又は複数のAPIコール402は、前記1つ又は複数のAPIをサポートするあらゆる他のソフトウェア関数に、前記1つ又は複数のAPIコール402の結果として返される属性情報を収集又は計算させる。少なくとも1つの実施例では、1つ又は複数のソフトウェア・プログラムは、memPoolGetAttribute、memPoolSetAttribute、cuMemPoolGetAttribute、cuMemPoolSetAttribute、又は1つ若しくは複数のAPIによって提供されるあらゆる他の関数などの1つ又は複数のAPIコールを実行して、1つ又は複数の属性インジケータ・パラメータによって前記1つ又は複数のAPIコールに対して示される1つ又は複数の使用状況データ値又は統計をリセットする。
【0035】
図5は、少なくとも1つの実施例による、1つ又は複数のAPIによって、1つ又は複数のメモリ・ロケーション識別子によって示される1つ又は複数のメモリ・アドレスが、1つ又は複数のメモリ・セットに含まれるかどうかを判定するためのプロセス500の図である。少なくとも1つの実施例では、プロセス500は、図1及び図2と併せて上述したような1つ又は複数のAPIコールの結果、1つ又は複数のメモリ・ロケーション識別子を受信する504ことによって、開始する502。少なくとも1つの実施例では、1つ又は複数のメモリ・ロケーション識別子は、図2と併せて上述したような、ポインタ、メモリ・アドレス、又はメモリ内で1つ又は複数のロケーションを特定するために使用可能なあらゆる他のデータ値を含む、データ値である。
【0036】
少なくとも1つの実施例では、図2と併せて上述したように、1つ又は複数のAPIコールの結果、1つ又は複数のAPIが1つ又は複数のメモリ・ロケーション識別子を受信すると504、前記1つ又は複数のAPIは、1つ又は複数の動作を実施して、図1と併せて上述したもののように、前記1つ又は複数のメモリ・ロケーション識別子が、1つ又はメモリ・セット内にあるかどうかを判定及び/又は計算する506。
【0037】
少なくとも1つの実施例では、1つ又は複数のAPIコールへのパラメータとして1つ又は複数のAPIによって受信された504、1つ又は複数のメモリ・ロケーション識別子が、1つ又は複数のメモリ・セット内にある506場合、前記1つ又は複数のAPIは、図2と併せて上述したような1つ又は複数のAPI応答を介して、1つ又は複数のメモリ・セット識別子を返す508。少なくとも1つの実施例では、1つ又は複数のAPIコールへのパラメータとして1つ又は複数のAPIによって受信された504、1つ又は複数のメモリ・ロケーション識別子が、1つ又は複数のメモリ・セット内にない506場合、前記1つ又は複数のAPIは、図2と併せて上述したような1つ又は複数のAPI応答を介して、NULL値を示す1つ又は複数のデータ値を返す510。少なくとも1つの実施例では、1つ又は複数のAPIが、1つ又は複数のAPIコールの結果として1つ又は複数のAPI応答508、510を実施すると、1つ又は複数のAPIによって、1つ又は複数のメモリ・ロケーション識別子によって示される1つ又は複数のメモリ・アドレスが1つ又は複数のメモリ・セットに含まれるかどうかを判定するためのプロセス500は、終了する512。
【0038】
図6は、少なくとも1つの実施例による、1つ又は複数のAPIによって、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロックが、1つ又は複数のソフトウェア・モジュールの実行中に共有されるかどうか、及び/又は共有されていたかどうかを判定するためのプロセスの図である。少なくとも1つの実施例では、プロセス600は、図2及び図3と併せて上述したように、1つ又は複数のAPIコールの結果として、1つ又は複数のAPIが1つ又は複数のデバイス識別子を受信する604ことによって開始する602。少なくとも1つの実施例では、デバイス識別子は、図1及び図3と併せて上述したように、1つ又は複数のメモリ・ブロック、領域、及び/又はプールを識別するための情報を含む。
【0039】
少なくとも1つの実施例では、1つ又は複数のAPIが、1つ又は複数のAPIコールの結果として、デバイス識別子を受信すると604、前記1つ又は複数のAPIは、前記1つ又は複数のデバイスによって示される1つ又は複数のデバイスによって使用可能な1つ又は複数のメモリ・セットが、図3と併せて上述したように、1つ又は複数のソフトウェア・モジュールの実行中に共有をサポートするかどうかを判定する。少なくとも1つの実施例では、1つ又は複数のメモリ・セットが1つ又は複数のソフトウェア・モジュールの実行中に共有をサポートするかどうかを判定するための1つ又は複数のAPIコールに応答して、1つ又は複数のAPIは、1つ又は複数のハンドル及び/又は図3と併せて上述され、本明細書でさらに説明される他のデータ値を返す608。少なくとも1つの実施例では、1つ又は複数のハンドルは、本明細書で説明される1つ又は複数のメモリ・セットを示す及び/又は共有するために使用可能な1つ又は複数のデータ値である。少なくとも1つの実施例では、1つ又は複数のAPIが1つ又は複数のAPI応答を実行し、1つ又は複数のハンドル及び/又は図3と併せて上述した他のデータ値を返すと608、1つ又は複数のAPIによって、1つ又は複数のコンピューティング・デバイスによって使用されることになる1つ又は複数のメモリ・ブロックが、1つ又は複数のソフトウェア・モジュールの実行中に共有されるかどうか、及び/又は共有されていたかどうかを判定するためのプロセスは、終了する612。
【0040】
図7は、少なくとも1つの実施例による、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・ブロックの1つ又は複数の属性を、1つ又は複数のAPIへの1つ又は複数のコールに応答して、決定するためのプロセス700の図である。少なくとも1つの実施例では、プロセス700は、図4と併せて上述したように、1つ又は複数のAPIコールの結果として、1つ又は複数のAPIが、1つ若しくは複数のメモリ・セット識別子及び/又は1つ若しくは複数の属性識別子を受信する704ことによって開始する702。少なくとも1つの実施例では、1つ又は複数の属性識別子は、図1と併せて上述したように、1つ又は複数のメモリ・ブロック、領域、又は及び/プールの1つ又は複数の属性を示すための情報を含むデータ値である。
【0041】
少なくとも1つの実施例では、1つ又は複数のAPIは、1つ又は複数のAPIコールへのパラメータとして受信した1つ又は複数の属性識別子によって示される、1つ又は複数のメモリ・ブロック、領域、及び/又はプールの1つ又は複数の属性を決定する。少なくとも1つの実施例では、1つ又は複数のAPIは、図4と併せて上述したように、1つ又は複数のAPIコールへのパラメータとして示される1つ又は複数のメモリ・セットについての属性情報を計算する706。少なくとも1つの実施例では、属性情報は、1つ又は複数のメモリ・ブロック、領域、及び/又はプールについて、1つ又は複数の使用状況値を示すためのデータを含む。少なくとも1つの実施例では、属性情報は、本明細書でさらに説明される1つ又は複数のメモリ・ブロック、領域、及び/又はプールのあらゆる他の属性を示すためのデータを含む。
【0042】
少なくとも1つの実施例では、1つ又は複数のAPIコールに応答して、1つ又は複数のAPIは、図4と併せて上述したように、1つ又は複数のAPI応答を通じて属性情報を返す708。少なくとも1つの実施例では、1つ又は複数のAPIが、1つ又は複数のAPIコールの結果として、属性情報を返す708ために1つ又は複数のAPI応答を実行すると、1つ又は複数のAPIへの1つ又は複数のコールに応答して、1つ又は複数のコンピューティング・デバイスによって使用されることになる1つ又は複数のメモリ・ブロックの1つ又は複数の属性を決定するためのプロセス700は、終了する712。
【0043】
以下の説明では、少なくとも1つの実施例のより完全な理解を提供するために、多数の具体的な詳細が記載される。ただし、発明概念はこれらの具体的な詳細のうちの1つ又は複数なしに実施され得ることが当業者には明らかであろう。
【0044】
データ・センタ
図8は、少なくとも1つの実施例による、例示的なデータ・センタ800を示す。少なくとも1つの実施例では、データ・センタ800は、限定はしないが、データ・センタ・インフラストラクチャ層810と、フレームワーク層820と、ソフトウェア層830と、アプリケーション層840とを含む。少なくとも1つの実施例では、ソフトウェア層830及び/又はアプリケーション層840は、実行されたとき、プロセッサに、少なくとも部分的に、図1図7と併せて上記で説明された様々な構成要素及び/又は動作を実施させる命令を含む。
【0045】
少なくとも1つの実施例では、図8に示されているように、データ・センタ・インフラストラクチャ層810は、リソース・オーケストレータ812と、グループ化されたコンピューティング・リソース814と、ノード・コンピューティング・リソース(「ノードC.R.」:node computing resource)816(1)~816(N)とを含み得、ここで、「N」は、任意のすべての正の整数を表す。少なくとも1つの実施例では、ノードC.R.816(1)~816(N)は、限定はしないが、任意の数の中央処理ユニット(「CPU」)又は(アクセラレータ、フィールド・プログラマブル・ゲート・アレイ(FPGA)、ネットワーク・デバイス中のデータ処理ユニット(「DPU」:data processing unit)、グラフィックス・プロセッサなどを含む)他のプロセッサ、メモリ・デバイス(たとえば、動的読取り専用メモリ)、ストレージ・デバイス(たとえば、ソリッド・ステート又はディスク・ドライブ)、ネットワーク入力/出力(「NW I/O」:network input/output)デバイス、ネットワーク・スイッチ、仮想機械(「VM」:virtual machine)、電力モジュール、及び冷却モジュールなどを含み得る。少なくとも1つの実施例では、ノードC.R.816(1)~816(N)の中からの1つ又は複数のノードC.R.は、上述のコンピューティング・リソースのうちの1つ又は複数を有するサーバであり得る。
【0046】
少なくとも1つの実施例では、グループ化されたコンピューティング・リソース814は、1つ又は複数のラック(図示せず)内に格納されたノードC.R.の別個のグループ化、又は様々な地理的ロケーション(同じく図示せず)においてデータ・センタ中に格納された多くのラックを含み得る。グループ化されたコンピューティング・リソース814内のノードC.R.の別個のグループ化は、1つ又は複数のワークロードをサポートするように構成されるか又は割り振られ得る、グループ化されたコンピュート・リソース、ネットワーク・リソース、メモリ・リソース、又はストレージ・リソースを含み得る。少なくとも1つの実施例では、CPU又はプロセッサを含むいくつかのノードC.R.は、1つ又は複数のワークロードをサポートするためのコンピュート・リソースを提供するために1つ又は複数のラック内でグループ化され得る。少なくとも1つの実施例では、1つ又は複数のラックはまた、任意の数の電力モジュール、冷却モジュール、及びネットワーク・スイッチを、任意の組合せで含み得る。
【0047】
少なくとも1つの実施例では、リソース・オーケストレータ812は、1つ又は複数のノードC.R.816(1)~816(N)及び/又はグループ化されたコンピューティング・リソース814を構成するか、又はさもなければ、制御し得る。少なくとも1つの実施例では、リソース・オーケストレータ812は、データ・センタ800のためのソフトウェア設計インフラストラクチャ(「SDI」:software design infrastructure)管理エンティティを含み得る。少なくとも1つの実施例では、リソース・オーケストレータ812は、ハードウェア、ソフトウェア、又はそれらの何らかの組合せを含み得る。
【0048】
少なくとも1つの実施例では、図8に示されているように、フレームワーク層820は、限定はしないが、ジョブ・スケジューラ832と、構成マネージャ834と、リソース・マネージャ836と、分散型ファイル・システム838とを含む。少なくとも1つの実施例では、フレームワーク層820は、ソフトウェア層830のソフトウェア852、及び/又はアプリケーション層840の1つ又は複数のアプリケーション842をサポートするためのフレームワークを含み得る。少なくとも1つの実施例では、ソフトウェア852又は(1つ又は複数の)アプリケーション842は、それぞれ、アマゾン・ウェブ・サービス、Google Cloud、及びMicrosoft Azureによって提供されるものなど、ウェブ・ベースのサービス・ソフトウェア又はアプリケーションを含み得る。少なくとも1つの実施例では、フレームワーク層820は、限定はしないが、大規模データ処理(たとえば、「ビック・データ」)のために分散型ファイル・システム838を利用し得るApache Spark(商標)(以下「Spark」)など、無料でオープンソースのソフトウェア・ウェブ・アプリケーション・フレームワークのタイプであり得る。少なくとも1つの実施例では、ジョブ・スケジューラ832は、データ・センタ800の様々な層によってサポートされるワークロードのスケジューリングを容易にするために、Sparkドライバを含み得る。少なくとも1つの実施例では、構成マネージャ834は、ソフトウェア層830、並びに大規模データ処理をサポートするためのSpark及び分散型ファイル・システム838を含むフレームワーク層820など、異なる層を構成することが可能であり得る。少なくとも1つの実施例では、リソース・マネージャ836は、分散型ファイル・システム838及びジョブ・スケジューラ832をサポートするようにマッピングされたか又は割り振られた、クラスタ化された又はグループ化されたコンピューティング・リソースを管理することが可能であり得る。少なくとも1つの実施例では、クラスタ化された又はグループ化されたコンピューティング・リソースは、データ・センタ・インフラストラクチャ層810において、グループ化されたコンピューティング・リソース814を含み得る。少なくとも1つの実施例では、リソース・マネージャ836は、リソース・オーケストレータ812と協調して、これらのマッピングされた又は割り振られたコンピューティング・リソースを管理し得る。
【0049】
少なくとも1つの実施例では、ソフトウェア層830中に含まれるソフトウェア852は、ノードC.R.816(1)~816(N)、グループ化されたコンピューティング・リソース814、及び/又はフレームワーク層820の分散型ファイル・システム838の少なくとも部分によって使用されるソフトウェアを含み得る。1つ又は複数のタイプのソフトウェアは、限定はしないが、インターネット・ウェブ・ページ検索ソフトウェアと、電子メール・ウイルス・スキャン・ソフトウェアと、データベース・ソフトウェアと、ストリーミング・ビデオ・コンテンツ・ソフトウェアとを含み得る。
【0050】
少なくとも1つの実施例では、アプリケーション層840中に含まれる(1つ又は複数の)アプリケーション842は、ノードC.R.816(1)~816(N)、グループ化されたコンピューティング・リソース814、及び/又はフレームワーク層820の分散型ファイル・システム838の少なくとも部分によって使用される1つ又は複数のタイプのアプリケーションを含み得る。少なくとも1つ又は複数のタイプのアプリケーションでは、限定はしないが、CUDAアプリケーションを含み得る。
【0051】
少なくとも1つの実施例では、構成マネージャ834、リソース・マネージャ836、及びリソース・オーケストレータ812のいずれかが、任意の技術的に実現可能な様式で獲得された任意の量及びタイプのデータに基づいて、任意の数及びタイプの自己修正アクションを実装し得る。少なくとも1つの実施例では、自己修正アクションは、データ・センタ800のデータ・センタ・オペレータを、不良の恐れのある構成を判定し、十分に利用されていない及び/又は性能の低いデータ・センタの部分を場合によっては回避することから解放し得る。
【0052】
コンピュータ・ベースのシステム
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的なコンピュータ・ベースのシステムを記載する。
【0053】
図9は、少なくとも1つの実施例による、処理システム900を示す。少なくとも1つの実施例では、処理システム900は、1つ又は複数のプロセッサ902と1つ又は複数のグラフィックス・プロセッサ908とを含み、単一プロセッサ・デスクトップ・システム、マルチプロセッサ・ワークステーション・システム、或いは多数のプロセッサ902又はプロセッサ・コア907を有するサーバ・システムであり得る。少なくとも1つの実施例では、処理システム900は、モバイル・デバイス、ハンドヘルド・デバイス、又は組み込みデバイスにおいて使用するためのシステム・オン・チップ(「SoC」:system-on-a-chip)集積回路内に組み込まれた処理プラットフォームである。少なくとも1つの実施例では、プロセッサ900は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェアを含む。少なくとも1つの実施例では、プロセッサ900は、実行されたとき、プロセッサ900に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0054】
少なくとも1つの実施例では、処理システム900は、サーバ・ベースのゲーミング・プラットフォーム、ゲーム・コンソール、メディア・コンソール、モバイル・ゲーミング・コンソール、ハンドヘルド・ゲーム・コンソール、又はオンライン・ゲーム・コンソールを含むことができるか、或いはそれらの内部に組み込まれ得る。少なくとも1つの実施例では、処理システム900は、モバイル・フォン、スマート・フォン、タブレット・コンピューティング・デバイス又はモバイル・インターネット・デバイスである。少なくとも1つの実施例では、処理システム900はまた、スマート・ウォッチ・ウェアラブル・デバイス、スマート・アイウェア・デバイス、拡張現実デバイス、又は仮想現実デバイスなどのウェアラブル・デバイスを含むことができるか、それらと結合することができるか、又はそれらの内部に組み込まれ得る。少なくとも1つの実施例では、処理システム900は、1つ又は複数のプロセッサ902と、1つ又は複数のグラフィックス・プロセッサ908によって生成されるグラフィカル・インターフェースとを有するテレビ又はセット・トップ・ボックス・デバイスである。
【0055】
少なくとも1つの実施例では、1つ又は複数のプロセッサ902は、各々、実行されたときにシステム及びユーザ・ソフトウェアのための動作を実施する命令を処理するための1つ又は複数のプロセッサ・コア907を含む。少なくとも1つの実施例では、1つ又は複数のプロセッサ・コア907の各々は、特定の命令セット909を処理するように構成される。少なくとも1つの実施例では、命令セット909は、複合命令セット・コンピューティング(「CISC」:Complex Instruction Set Computing)、縮小命令セット・コンピューティング(「RISC」:Reduced Instruction Set Computing)、又は超長命令語(「VLIW」:Very Long Instruction Word)を介したコンピューティングを容易にし得る。少なくとも1つの実施例では、プロセッサ・コア907は、各々、異なる命令セット909を処理し得、命令セット909は、他の命令セットのエミュレーションを容易にするための命令を含み得る。少なくとも1つの実施例では、プロセッサ・コア907はまた、デジタル信号プロセッサ(「DSP」:digital signal processor)などの他の処理デバイスを含み得る。
【0056】
少なくとも1つの実施例では、プロセッサ902はキャッシュ・メモリ(「キャッシュ」)904を含む。少なくとも1つの実施例では、プロセッサ902は、単一の内部キャッシュ又は複数のレベルの内部キャッシュを有することができる。少なくとも1つの実施例では、キャッシュ・メモリは、プロセッサ902の様々な構成要素の間で共有される。少なくとも1つの実施例では、プロセッサ902はまた、外部キャッシュ(たとえば、レベル3(「L3」)キャッシュ又はラスト・レベル・キャッシュ(「LLC」:Last Level Cache))(図示せず)を使用し、外部キャッシュは、知られているキャッシュ・コヒーレンシ技法を使用してプロセッサ・コア907の間で共有され得る。少なくとも1つの実施例では、追加として、レジスタ・ファイル906がプロセッサ902中に含まれ、レジスタ・ファイル906は、異なるタイプのデータを記憶するための異なるタイプのレジスタ(たとえば、整数レジスタ、浮動小数点レジスタ、ステータス・レジスタ、及び命令ポインタ・レジスタ)を含み得る。少なくとも1つの実施例では、レジスタ・ファイル906は、汎用レジスタ又は他のレジスタを含み得る。
【0057】
少なくとも1つの実施例では、1つ又は複数のプロセッサ902は、アドレス、データ、又は制御信号などの通信信号を、プロセッサ902と処理システム900中の他の構成要素との間で送信するために、1つ又は複数のインターフェース・バス910と結合される。少なくとも1つの実施例では、1つの実施例におけるインターフェース・バス910は、ダイレクト・メディア・インターフェース(「DMI」:Direct Media Interface)バスのバージョンなどのプロセッサ・バスであり得る。少なくとも1つの実施例では、インターフェース・バス910は、DMIバスに限定されず、1つ又は複数の周辺構成要素相互接続バス(たとえば、「PCI」:Peripheral Component Interconnect、PCI Express(「PCIe」))、メモリ・バス、又は他のタイプのインターフェース・バスを含み得る。少なくとも1つの実施例では、(1つ又は複数の)プロセッサ902は、統合されたメモリ・コントローラ916と、プラットフォーム・コントローラ・ハブ930とを含む。少なくとも1つの実施例では、メモリ・コントローラ916は、メモリ・デバイスと処理システム900の他の構成要素との間の通信を容易にし、プラットフォーム・コントローラ・ハブ(「PCH」:platform controller hub)930は、ローカル入力/出力(「I/O」:Input/Output)バスを介してI/Oデバイスへの接続を提供する。
【0058】
少なくとも1つの実施例では、メモリ・デバイス920は、ダイナミック・ランダム・アクセス・メモリ(「DRAM」:dynamic random access memory)デバイス、スタティック・ランダム・アクセス・メモリ(「SRAM」:static random access memory)デバイス、フラッシュ・メモリ・デバイス、相変化メモリ・デバイス、又はプロセッサ・メモリとして働くのに好適な性能を有する何らかの他のメモリ・デバイスであり得る。少なくとも1つの実施例では、メモリ・デバイス920は、1つ又は複数のプロセッサ902がアプリケーション又はプロセスを実行するときの使用のためのデータ922及び命令921を記憶するために、処理システム900のためのシステム・メモリとして動作することができる。少なくとも1つの実施例では、メモリ・コントローラ916はまた、随意の外部グラフィックス・プロセッサ912と結合し、外部グラフィックス・プロセッサ912は、グラフィックス動作及びメディア動作を実施するために、プロセッサ902中の1つ又は複数のグラフィックス・プロセッサ908と通信し得る。少なくとも1つの実施例では、ディスプレイ・デバイス911は、(1つ又は複数の)プロセッサ902に接続することができる。少なくとも1つの実施例では、ディスプレイ・デバイス911は、モバイル電子デバイス又はラップトップ・デバイスの場合のような内部ディスプレイ・デバイス、或いは、ディスプレイ・インターフェース(たとえば、DisplayPortなど)を介して取り付けられた外部ディスプレイ・デバイスのうちの1つ又は複数を含むことができる。少なくとも1つの実施例では、ディスプレイ・デバイス911は、仮想現実(「VR」:virtual reality)アプリケーション又は拡張現実(「AR」:augmented reality)アプリケーションにおいて使用するための立体ディスプレイ・デバイスなどの頭部装着型ディスプレイ(「HMD」:head mounted display)を含むことができる。
【0059】
少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ930は、周辺機器が高速I/Oバスを介してメモリ・デバイス920及びプロセッサ902に接続することを可能にする。少なくとも1つの実施例では、I/O周辺機器は、限定はしないが、オーディオ・コントローラ946と、ネットワーク・コントローラ934と、ファームウェア・インターフェース928と、ワイヤレス・トランシーバ926と、タッチ・センサ925と、データ・ストレージ・デバイス924(たとえば、ハード・ディスク・ドライブ、フラッシュ・メモリなど)とを含む。少なくとも1つの実施例では、データ・ストレージ・デバイス924は、ストレージ・インターフェース(たとえば、SATA)を介して、或いはPCI又はPCIeなどの周辺バスを介して、接続することができる。少なくとも1つの実施例では、タッチ・センサ925は、タッチ・スクリーン・センサ、圧力センサ、又は指紋センサを含むことができる。少なくとも1つの実施例では、ワイヤレス・トランシーバ926は、Wi-Fiトランシーバ、Bluetoothトランシーバ、或いは3G、4G、又はロング・ターム・エボリューション(「LTE」:Long Term Evolution)トランシーバなどのモバイル・ネットワーク・トランシーバであり得る。少なくとも1つの実施例では、ファームウェア・インターフェース928は、システム・ファームウェアとの通信を可能にし、たとえば、ユニファイド・エクステンシブル・ファームウェア・インターフェース(「UEFI」:unified extensible firmware interface)であり得る。少なくとも1つの実施例では、ネットワーク・コントローラ934は、ワイヤード・ネットワークへのネットワーク接続を可能にすることができる。少なくとも1つの実施例では、高性能ネットワーク・コントローラ(図示せず)は、インターフェース・バス910と結合する。少なくとも1つの実施例では、オーディオ・コントローラ946は、マルチチャネル高精細度オーディオ・コントローラである。少なくとも1つの実施例では、処理システム900は、レガシー(たとえば、パーソナル・システム2(「PS/2」:Personal System 2))デバイスを処理システム900に結合するための随意のレガシーI/Oコントローラ940を含む。少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ930は、キーボードとマウス943との組合せ、カメラ944、又は他のUSB入力デバイスなど、1つ又は複数のユニバーサル・シリアル・バス(「USB」:Universal Serial Bus)コントローラ942接続入力デバイスにも接続することができる。
【0060】
少なくとも1つの実施例では、メモリ・コントローラ916及びプラットフォーム・コントローラ・ハブ930のインスタンスが、外部グラフィックス・プロセッサ912などの慎重な外部グラフィックス・プロセッサに組み込まれ得る。少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ930及び/又はメモリ・コントローラ916は、1つ又は複数のプロセッサ902の外部にあり得る。たとえば、少なくとも1つの実施例では、処理システム900は、外部のメモリ・コントローラ916とプラットフォーム・コントローラ・ハブ930とを含むことができ、それらは、(1つ又は複数の)プロセッサ902と通信しているシステム・チップセット内のメモリ・コントローラ・ハブ及び周辺コントローラ・ハブとして構成され得る。
【0061】
図10は、少なくとも1つの実施例による、コンピュータ・システム1000を示す。少なくとも1つの実施例では、コンピュータ・システム1000は、相互接続されたデバイス及び構成要素をもつシステム、SOC、又は何らかの組合せであり得る。少なくとも1つの実施例では、コンピュータ・システム1000は、命令を実行するための実行ユニットを含み得るプロセッサ1002とともに形成される。少なくとも1つの実施例では、コンピュータ・システム1000は、限定はしないが、データを処理するためのアルゴリズムを実施するための論理を含む実行ユニットを採用するための、プロセッサ1002などの構成要素を含み得る。少なくとも1つの実施例では、コンピュータ・システム1000は、カリフォルニア州サンタクララのIntel Corporationから入手可能なPENTIUM(登録商標)プロセッサ・ファミリー、Xeon(商標)、Itanium(登録商標)、XScale(商標)及び/又はStrongARM(商標)、Intel(登録商標)Core(商標)、又はIntel(登録商標)Nervana(商標)マイクロプロセッサなどのプロセッサを含み得るが、(他のマイクロプロセッサ、エンジニアリング・ワークステーション、セット・トップ・ボックスなどを有するPCを含む)他のシステムも使用され得る。少なくとも1つの実施例では、コンピュータ・システム1000は、ワシントン州レドモンドのMicrosoft Corporationから入手可能なWINDOWS(登録商標)オペレーティング・システムのあるバージョンを実行し得るが、他のオペレーティング・システム(たとえば、UNIX(登録商標)及びLinux(登録商標))、組み込みソフトウェア、及び/又はグラフィカル・ユーザ・インターフェースも使用され得る。少なくとも1つの実施例では、コンピュータ・システム1000は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェアを含む。少なくとも1つの実施例では、コンピュータ・システム1000は、実行されたとき、コンピュータ・システム1000に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0062】
少なくとも1つの実施例では、コンピュータ・システム1000は、ハンドヘルド・デバイス及び組み込みアプリケーションなど、他のデバイスにおいて使用され得る。ハンドヘルド・デバイスのいくつかの実例は、セルラー・フォン、インターネット・プロトコル・デバイス、デジタル・カメラ、パーソナル・デジタル・アシスタント(「PDA」:personal digital assistant)、及びハンドヘルドPCを含む。少なくとも1つの実施例では、組み込みアプリケーションは、マイクロコントローラ、デジタル信号プロセッサ(DSP:digital signal processor)、SoC、ネットワーク・コンピュータ(「NetPC」:network computer)、セット・トップ・ボックス、ネットワーク・ハブ、ワイド・エリア・ネットワーク(「WAN」:wide area network)スイッチ、又は1つ又は複数の命令を実施し得る任意の他のシステムを含み得る。
【0063】
少なくとも1つの実施例では、コンピュータ・システム1000は、限定はしないが、プロセッサ1002を含み得、プロセッサ1002は、限定はしないが、コンピュート・ユニファイド・デバイス・アーキテクチャ(「CUDA」:Compute Unified Device Architecture)(CUDA(登録商標)は、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される)プログラムを実行するように構成され得る、1つ又は複数の実行ユニット1008を含み得る。少なくとも1つの実施例では、CUDAプログラムは、CUDAプログラミング言語で書かれたソフトウェア・アプリケーションの少なくとも一部分である。少なくとも1つの実施例では、コンピュータ・システム1000は、シングル・プロセッサ・デスクトップ又はサーバ・システムである。少なくとも1つの実施例では、コンピュータ・システム1000は、マルチプロセッサ・システムであり得る。少なくとも1つの実施例では、プロセッサ1002は、限定はしないが、CISCマイクロプロセッサ、RISCマイクロプロセッサ、VLIWマイクロプロセッサ、命令セットの組合せを実装するプロセッサ、又は、たとえばデジタル信号プロセッサなど、任意の他のプロセッサ・デバイスを含み得る。少なくとも1つの実施例では、プロセッサ1002は、プロセッサ・バス1010に結合され得、プロセッサ・バス1010は、プロセッサ1002とコンピュータ・システム1000中の他の構成要素との間でデータ信号を送信し得る。
【0064】
少なくとも1つの実施例では、プロセッサ1002は、限定はしないが、レベル1(「L1」)の内部キャッシュ・メモリ(「キャッシュ」)1004を含み得る。少なくとも1つの実施例では、プロセッサ1002は、単一の内部キャッシュ又は複数のレベルの内部キャッシュを有し得る。少なくとも1つの実施例では、キャッシュ・メモリは、プロセッサ1002の外部に存在し得る。少なくとも1つの実施例では、プロセッサ1002は、内部キャッシュと外部キャッシュの両方の組合せをも含み得る。少なくとも1つの実施例では、レジスタ・ファイル1006は、限定はしないが、整数レジスタ、浮動小数点レジスタ、ステータス・レジスタ、及び命令ポインタ・レジスタを含む様々なレジスタに、異なるタイプのデータを記憶し得る。
【0065】
少なくとも1つの実施例では、限定はしないが、整数演算及び浮動小数点演算を実施するための論理を含む実行ユニット1008も、プロセッサ1002中に存在し得る。プロセッサ1002は、いくつかのマクロ命令のためのマイクロコードを記憶するマイクロコード(「uコード」)読取り専用メモリ(「ROM」:read only memory)をも含み得る。少なくとも1つの実施例では、実行ユニット1008は、パック命令セット1009に対処するための論理を含み得る。少なくとも1つの実施例では、パック命令セット1009を、命令を実行するための関連する回路要素とともに汎用プロセッサ1002の命令セットに含めることによって、多くのマルチメディア・アプリケーションによって使用される演算が、汎用プロセッサ1002中のパック・データを使用して実施され得る。少なくとも1つの実施例では、多くのマルチメディア・アプリケーションが、パック・データの演算を実施するためにプロセッサのデータ・バスの全幅を使用することによって加速され、より効率的に実行され得、これは、一度に1つのデータ要素ずつ1つ又は複数の演算を実施するために、プロセッサのデータ・バスにわたってより小さい単位のデータを転送する必要をなくし得る。
【0066】
少なくとも1つの実施例では、実行ユニット1008はまた、マイクロコントローラ、組み込みプロセッサ、グラフィックス・デバイス、DSP、及び他のタイプの論理回路において使用され得る。少なくとも1つの実施例では、コンピュータ・システム1000は、限定はしないが、メモリ1020を含み得る。少なくとも1つの実施例では、メモリ1020は、DRAMデバイス、SRAMデバイス、フラッシュ・メモリ・デバイス、又は他のメモリ・デバイスとして実装され得る。メモリ1020は、プロセッサ1002によって実行され得るデータ信号によって表される(1つ又は複数の)命令1019及び/又はデータ1021を記憶し得る。
【0067】
少なくとも1つの実施例では、システム論理チップが、プロセッサ・バス1010及びメモリ1020に結合され得る。少なくとも1つの実施例では、システム論理チップは、限定はしないが、メモリ・コントローラ・ハブ(「MCH」:memory controller hub)1016を含み得、プロセッサ1002は、プロセッサ・バス1010を介してMCH1016と通信し得る。少なくとも1つの実施例では、MCH1016は、命令及びデータ・ストレージのための、並びにグラフィックス・コマンド、データ及びテクスチャのストレージのための、高帯域幅メモリ経路1018をメモリ1020に提供し得る。少なくとも1つの実施例では、MCH1016は、プロセッサ1002と、メモリ1020と、コンピュータ・システム1000中の他の構成要素との間でデータ信号をダイレクトし、プロセッサ・バス1010と、メモリ1020と、システムI/O1022との間でデータ信号をブリッジし得る。少なくとも1つの実施例では、システム論理チップは、グラフィックス・コントローラに結合するためのグラフィックス・ポートを提供し得る。少なくとも1つの実施例では、MCH1016は、高帯域幅メモリ経路1018を通してメモリ1020に結合され得、グラフィックス/ビデオ・カード1012は、アクセラレーテッド・グラフィックス・ポート(「AGP」:Accelerated Graphics Port)相互接続1014を介してMCH1016に結合され得る。
【0068】
少なくとも1つの実施例では、コンピュータ・システム1000は、MCH1016をI/Oコントローラ・ハブ(「ICH」)1030に結合するためのプロプライエタリ・ハブ・インターフェース・バスである、システムI/O1022を使用し得る。少なくとも1つの実施例では、ICH1030は、ローカルI/Oバスを介していくつかのI/Oデバイスに直接接続を提供し得る。少なくとも1つの実施例では、ローカルI/Oバスは、限定はしないが、周辺機器をメモリ1020、チップセット、及びプロセッサ1002に接続するための高速I/Oバスを含み得る。実例は、限定はしないが、オーディオ・コントローラ1029と、ファームウェア・ハブ(「フラッシュBIOS」)1028と、ワイヤレス・トランシーバ1026と、データ・ストレージ1024と、ユーザ入力インターフェース1025及びキーボード・インターフェースを含んでいるレガシーI/Oコントローラ1023と、USBなどのシリアル拡張ポート1027と、ネットワーク・コントローラ1034とを含み得る。データ・ストレージ1024は、ハード・ディスク・ドライブ、フロッピー(登録商標)・ディスク・ドライブ、CD-ROMデバイス、フラッシュ・メモリ・デバイス、又は他の大容量ストレージ・デバイスを備え得る。
【0069】
少なくとも1つの実施例では、図10は、相互接続されたハードウェア・デバイス又は「チップ」を含むシステムを示す。少なくとも1つの実施例では、図10は、例示的なSoCを示し得る。少なくとも1つの実施例では、図10に示されているデバイスは、プロプライエタリ相互接続、標準相互接続(たとえば、PCIe)、又はそれらの何らかの組合せで相互接続され得る。少なくとも1つの実施例では、システム1000の1つ又は複数の構成要素は、コンピュート・エクスプレス・リンク(「CXL」:compute express link)相互接続を使用して相互接続される。
【0070】
図11は、少なくとも1つの実施例による、システム1100を示す。少なくとも1つの実施例では、システム1100は、プロセッサ1110を利用する電子デバイスである。少なくとも1つの実施例では、システム1100は、たとえば、限定はしないが、ノートブック、タワー・サーバ、ラック・サーバ、ブレード・サーバ、1つ又は複数のオンプレミス又はクラウド・サービス・プロバイダに通信可能に結合されたエッジ・デバイス、ラップトップ、デスクトップ、タブレット、モバイル・デバイス、電話、組み込みコンピュータ、又は任意の他の好適な電子デバイスであり得る。
【0071】
少なくとも1つの実施例では、システム1100は、限定はしないが、任意の好適な数又は種類の構成要素、周辺機器、モジュール、又はデバイスに通信可能に結合されたプロセッサ1110を含み得る。少なくとも1つの実施例では、プロセッサ1110は、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つの実施例では、図11は、相互接続されたハードウェア・デバイス又は「チップ」を含むシステムを示す。少なくとも1つの実施例では、図11は、例示的なSoCを示し得る。少なくとも1つの実施例では、図11に示されているデバイスは、プロプライエタリ相互接続、標準相互接続(たとえば、PCIe)又はそれらの何らかの組合せで相互接続され得る。少なくとも1つの実施例では、図11の1つ又は複数の構成要素は、CXL相互接続を使用して相互接続される。少なくとも1つの実施例では、システム1100は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェアを含む。少なくとも1つの実施例では、システム1100は、実行されたとき、システム1100に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0072】
少なくとも1つの実施例では、図11は、ディスプレイ1124、タッチ・スクリーン1125、タッチ・パッド1130、ニア・フィールド通信ユニット(「NFC」:Near Field Communication)1145、センサ・ハブ1140、熱センサ1146、エクスプレス・チップセット(「EC」:Express Chipset)1135、トラステッド・プラットフォーム・モジュール(「TPM」:Trusted Platform Module)1138、BIOS/ファームウェア/フラッシュ・メモリ(「BIOS、FWフラッシュ」:BIOS/firmware/flash memory)1122、DSP1160、ソリッド・ステート・ディスク(「SSD」:Solid State Disk)又はハード・ディスク・ドライブ(「HDD」:Hard Disk Drive)1120、ワイヤレス・ローカル・エリア・ネットワーク・ユニット(「WLAN」:wireless local area network)1150、Bluetoothユニット1152、ワイヤレス・ワイド・エリア・ネットワーク・ユニット(「WWAN」:Wireless Wide Area Network)1156、全地球測位システム(「GPS」:Global Positioning System)1155、USB3.0カメラなどのカメラ(「USB3.0カメラ」)1154、或いは、たとえばLPDDR3規格において実装された低電力ダブル・データ・レート(「LPDDR」:Low Power Double Data Rate)メモリ・ユニット(「LPDDR3」)1115を含み得る。これらの構成要素は、各々、任意の好適な様式で実装され得る。
【0073】
少なくとも1つの実施例では、上記で説明された構成要素を通して、他の構成要素がプロセッサ1110に通信可能に結合され得る。少なくとも1つの実施例では、加速度計1141と、周囲光センサ(「ALS」:Ambient Light Sensor)1142と、コンパス1143と、ジャイロスコープ1144とが、センサ・ハブ1140に通信可能に結合され得る。少なくとも1つの実施例では、熱センサ1139と、ファン1137と、キーボード1136と、タッチ・パッド1130とが、EC1135に通信可能に結合され得る。少なくとも1つの実施例では、スピーカー1163と、ヘッドフォン1164と、マイクロフォン(「mic」)1165とが、オーディオ・ユニット(「オーディオ・コーデック及びクラスdアンプ」)1162に通信可能に結合され得、オーディオ・ユニット1162は、DSP1160に通信可能に結合され得る。少なくとも1つの実施例では、オーディオ・ユニット1162は、たとえば、限定はしないが、オーディオ・コーダ/デコーダ(「コーデック」)及びクラスD増幅器を含み得る。少なくとも1つの実施例では、SIMカード(「SIM」)1157は、WWANユニット1156に通信可能に結合され得る。少なくとも1つの実施例では、WLANユニット1150及びBluetoothユニット1152などの構成要素、並びにWWANユニット1156は、次世代フォーム・ファクタ(「NGFF」:Next Generation Form Factor)において実装され得る。
【0074】
図12は、少なくとも1つの実施例による、例示的な集積回路1200を示す。少なくとも1つの実施例では、例示的な集積回路1200は、1つ又は複数のIPコアを使用して作製され得るSoCである。少なくとも1つの実施例では、集積回路1200は、1つ又は複数のアプリケーション・プロセッサ1205(たとえば、CPU、DPU)、少なくとも1つのグラフィックス・プロセッサ1210を含み、追加として、画像プロセッサ1215及び/又はビデオ・プロセッサ1220を含み得、それらのいずれも、モジュール式IPコアであり得る。少なくとも1つの実施例では、集積回路1200は、USBコントローラ1225、UARTコントローラ1230、SPI/SDIOコントローラ1235、及びIS/ICコントローラ1240を含む周辺機器又はバス論理を含む。少なくとも1つの実施例では、集積回路1200は、高精細度マルチメディア・インターフェース(「HDMI(登録商標)」:high-definition multimedia interface)コントローラ1250及びモバイル・インダストリ・プロセッサ・インターフェース(「MIPI」:mobile industry processor interface)ディスプレイ・インターフェース1255のうちの1つ又は複数に結合されたディスプレイ・デバイス1245を含むことができる。少なくとも1つの実施例では、フラッシュ・メモリとフラッシュ・メモリ・コントローラとを含むフラッシュ・メモリ・サブシステム1260によって、ストレージが提供され得る。少なくとも1つの実施例では、SDRAM又はSRAMメモリ・デバイスへのアクセスのために、メモリ・コントローラ1265を介してメモリ・インターフェースが提供され得る。少なくとも1つの実施例では、いくつかの集積回路は、追加として、組み込みセキュリティ・エンジン1270を含む。少なくとも1つの実施例では、例示的な集積回路1200は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、1つ又は複数の回路を含む。少なくとも1つの実施例では、例示的な集積回路1200は、実行されたとき、例示的な集積回路1200に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するための1つ又は複数の回路を含む。
【0075】
図13は、少なくとも1つの実施例による、コンピューティング・システム1300を示す。少なくとも1つの実施例では、コンピューティング・システム1300は、メモリ・ハブ1305を含み得る相互接続経路を介して通信する1つ又は複数のプロセッサ1302とシステム・メモリ1304とを有する処理サブシステム1301を含む。少なくとも1つの実施例では、メモリ・ハブ1305は、チップセット構成要素内の別個の構成要素であり得るか、又は1つ又は複数のプロセッサ1302内に組み込まれ得る。少なくとも1つの実施例では、メモリ・ハブ1305は、通信リンク1306を介してI/Oサブシステム1311と結合する。少なくとも1つの実施例では、I/Oサブシステム1311は、コンピューティング・システム1300が1つ又は複数の入力デバイス1308からの入力を受信することを可能にすることができるI/Oハブ1307を含む。少なくとも1つの実施例では、I/Oハブ1307は、1つ又は複数のプロセッサ1302中に含まれ得るディスプレイ・コントローラが、1つ又は複数のディスプレイ・デバイス1310Aに出力を提供することを可能にすることができる。少なくとも1つの実施例では、I/Oハブ1307と結合された1つ又は複数のディスプレイ・デバイス1310Aは、ローカルの、内部の、又は組み込まれたディスプレイ・デバイスを含むことができる。少なくとも1つの実施例では、コンピューティング・システム1300は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、コンピューティング・システム1300は、実行されたとき、コンピューティング・システム1300に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0076】
少なくとも1つの実施例では、処理サブシステム1301は、バス又は他の通信リンク1313を介してメモリ・ハブ1305に結合された1つ又は複数の並列プロセッサ1312を含む。少なくとも1つの実施例では、通信リンク1313は、限定はしないがPCIeなど、任意の数の規格ベースの通信リンク技術又はプロトコルのうちの1つであり得るか、或いはベンダー固有の通信インターフェース又は通信ファブリックであり得る。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1312は、メニー・インテグレーテッド・コア・プロセッサなど、多数の処理コア及び/又は処理クラスタを含むことができる、算出に集中した並列又はベクトル処理システムを形成する。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1312は、グラフィックス処理サブシステムを形成し、グラフィックス処理サブシステムは、I/Oハブ1307を介して結合された1つ又は複数のディスプレイ・デバイス1310Aのうちの1つにピクセルを出力することができる。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1312はまた、ディスプレイ・コントローラと、1つ又は複数のディスプレイ・デバイス1310Bへの直接接続を可能にするためのディスプレイ・インターフェース(図示せず)とを含むことができる。
【0077】
少なくとも1つの実施例では、システム・ストレージ・ユニット1314は、I/Oハブ1307に接続して、コンピューティング・システム1300のためのストレージ機構を提供することができる。少なくとも1つの実施例では、I/Oハブ1307と、プラットフォームに組み込まれ得るネットワーク・アダプタ1318及び/又はワイヤレス・ネットワーク・アダプタ1319などの他の構成要素、並びに1つ又は複数のアドイン・デバイス1320を介して追加され得る様々な他のデバイスとの間の接続を可能にするためのインターフェース機構を提供するために、I/Oスイッチ1316が使用され得る。少なくとも1つの実施例では、ネットワーク・アダプタ1318は、イーサネット(登録商標)・アダプタ又は別のワイヤード・ネットワーク・アダプタであり得る。少なくとも1つの実施例では、ワイヤレス・ネットワーク・アダプタ1319は、Wi-Fi、Bluetooth、NFC、又は1つ又は複数のワイヤレス無線を含む他のネットワーク・デバイスのうちの1つ又は複数を含むことができる。
【0078】
少なくとも1つの実施例では、コンピューティング・システム1300は、USB又は他のポート接続、光学ストレージ・ドライブ、ビデオ・キャプチャ・デバイスなどを含む、I/Oハブ1307にも接続され得る、明示的に示されていない他の構成要素を含むことができる。少なくとも1つの実施例では、図13中の様々な構成要素を相互接続する通信経路が、PCIベースのプロトコル(たとえば、PCIe)などの任意の好適なプロトコル、或いはNVLink高速相互接続などの他のバス又はポイントツーポイント通信インターフェース及び/又は(1つ又は複数の)プロトコル、或いは相互接続プロトコルを使用して、実装され得る。
【0079】
少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1312は、たとえばビデオ出力回路要素を含むグラフィックス及びビデオ処理のために最適化された回路要素を組み込み、グラフィックス処理ユニット(「GPU」:graphics processing unit)を構成する。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1312は、汎用処理のために最適化された回路要素を組み込む。少なくとも実施例では、コンピューティング・システム1300の構成要素は、単一の集積回路上の1つ又は複数の他のシステム要素と統合され得る。たとえば、少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1312、メモリ・ハブ1305、(1つ又は複数の)プロセッサ1302、及びI/Oハブ1307は、SoC集積回路に組み込まれ得る。少なくとも1つの実施例では、コンピューティング・システム1300の構成要素は、システム・イン・パッケージ(「SIP」:system in package)構成を形成するために、単一のパッケージに組み込まれ得る。少なくとも1つの実施例では、コンピューティング・システム1300の構成要素の少なくとも一部分は、マルチチップ・モジュール(「MCM」:multi-chip module)に組み込まれ得、マルチチップ・モジュールは、他のマルチチップ・モジュールと相互接続されてモジュール式コンピューティング・システムにすることができる。少なくとも1つの実施例では、I/Oサブシステム1311及びディスプレイ・デバイス1310Bは、コンピューティング・システム1300から省略される。
【0080】
処理システム
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的な処理システムを記載する。
【0081】
図14は、少なくとも1つの実施例による、加速処理ユニット(「APU」:accelerated processing unit)1400を示す。少なくとも1つの実施例では、APU1400は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、APU1400は、CUDAプログラムなど、アプリケーション・プログラムを実行するように構成され得る。少なくとも1つの実施例では、APU1400は、限定はしないが、コア複合体1410と、グラフィックス複合体1440と、ファブリック1460と、I/Oインターフェース1470と、メモリ・コントローラ1480と、ディスプレイ・コントローラ1492と、マルチメディア・エンジン1494とを含む。少なくとも1つの実施例では、APU1400は、限定はしないが、任意の数のコア複合体1410と、任意の数のグラフィックス複合体1450と、任意の数のディスプレイ・コントローラ1492と、任意の数のマルチメディア・エンジン1494とを、任意の組合せで含み得る。説明目的のために、同様のオブジェクトの複数のインスタンスは、オブジェクトを識別する参照番号と、必要な場合にインスタンスを識別する括弧付きの番号とともに、本明細書で示される。少なくとも1つの実施例では、APU1400は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、APU1400は、実行されたとき、APU1400に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0082】
少なくとも1つの実施例では、コア複合体1410はCPUであり、グラフィックス複合体1440はGPUであり、APU1400は、限定はしないが、単一のチップ上に1410及び1440を組み込む処理ユニットである。少なくとも1つの実施例では、いくつかのタスクは、コア複合体1410に割り当てられ得、他のタスクは、グラフィックス複合体1440に割り当てられ得る。少なくとも1つの実施例では、コア複合体1410は、オペレーティング・システムなど、APU1400に関連するメイン制御ソフトウェアを実行するように構成される。少なくとも1つの実施例では、コア複合体1410は、APU1400のマスタ・プロセッサであり、他のプロセッサの動作を制御し、協調させる。少なくとも1つの実施例では、コア複合体1410は、グラフィックス複合体1440の動作を制御するコマンドを発行する。少なくとも1つの実施例では、コア複合体1410は、CUDAソース・コードから導出されたホスト実行可能コードを実行するように構成され得、グラフィックス複合体1440は、CUDAソース・コードから導出されたデバイス実行可能コードを実行するように構成され得る。
【0083】
少なくとも1つの実施例では、コア複合体1410は、限定はしないが、コア1420(1)~1420(4)と、L3キャッシュ1430とを含む。少なくとも1つの実施例では、コア複合体1410は、限定はしないが、任意の数のコア1420と、任意の数及びタイプのキャッシュとを、任意の組合せで含み得る。少なくとも1つの実施例では、コア1420は、特定の命令セット・アーキテクチャ(「ISA」:instruction set architecture)の命令を実行するように構成される。少なくとも1つの実施例では、各コア1420はCPUコアである。
【0084】
少なくとも1つの実施例では、各コア1420は、限定はしないが、フェッチ/復号ユニット1422と、整数実行エンジン1424と、浮動小数点実行エンジン1426と、L2キャッシュ1428とを含む。少なくとも1つの実施例では、フェッチ/復号ユニット1422は、命令をフェッチし、そのような命令を復号し、マイクロ・オペレーションを生成し、整数実行エンジン1424と浮動小数点実行エンジン1426とに別個のマイクロ命令をディスパッチする。少なくとも1つの実施例では、フェッチ/復号ユニット1422は、同時に、あるマイクロ命令を整数実行エンジン1424にディスパッチし、別のマイクロ命令を浮動小数点実行エンジン1426にディスパッチすることができる。少なくとも1つの実施例では、整数実行エンジン1424は、限定はしないが、整数及びメモリ演算を実行する。少なくとも1つの実施例では、浮動小数点エンジン1426は、限定はしないが、浮動小数点及びベクトル演算を実行する。少なくとも1つの実施例では、フェッチ復号ユニット1422は、整数実行エンジン1424と浮動小数点実行エンジン1426の両方を置き換える単一の実行エンジンに、マイクロ命令をディスパッチする。
【0085】
少なくとも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は、限定はしないが、任意の数のスライスを含み得る。
【0086】
少なくとも1つの実施例では、グラフィックス複合体1440は、高度並列様式でコンピュート動作を実施するように構成され得る。少なくとも1つの実施例では、グラフィックス複合体1440は、描画コマンド、ピクセル動作、幾何学的算出、及びディスプレイに画像をレンダリングすることに関連する他の動作など、グラフィックス・パイプライン動作を実行するように構成される。少なくとも1つの実施例では、グラフィックス複合体1440は、グラフィックに関係しない動作を実行するように構成される。少なくとも1つの実施例では、グラフィックス複合体1440は、グラフィックに関係する動作とグラフィックに関係しない動作の両方を実行するように構成される。
【0087】
少なくとも1つの実施例では、グラフィックス複合体1440は、限定はしないが、任意の数のコンピュート・ユニット1450と、L2キャッシュ1442とを含む。少なくとも1つの実施例では、コンピュート・ユニット1450は、L2キャッシュ1442を共有する。少なくとも1つの実施例では、L2キャッシュ1442は区分けされる。少なくとも1つの実施例では、グラフィックス複合体1440は、限定はしないが、任意の数のコンピュート・ユニット1450と、(ゼロを含む)任意の数及びタイプのキャッシュとを含む。少なくとも1つの実施例では、グラフィックス複合体1440は、限定はしないが、任意の量の専用グラフィックス・ハードウェアを含む。
【0088】
少なくとも1つの実施例では、各コンピュート・ユニット1450は、限定はしないが、任意の数のSIMDユニット1452と、共有メモリ1454とを含む。少なくとも1つの実施例では、各SIMDユニット1452は、SIMDアーキテクチャを実装し、動作を並列に実施するように構成され得る。少なくとも1つの実施例では、各コンピュート・ユニット1450は、任意の数のスレッド・ブロックを実行し得るが、各スレッド・ブロックは、単一のコンピュート・ユニット1450上で実行する。少なくとも1つの実施例では、スレッド・ブロックは、限定はしないが、任意の数の実行のスレッドを含む。少なくとも1つの実施例では、ワークグループは、スレッド・ブロックである。少なくとも1つの実施例では、各SIMDユニット1452は、異なるワープを実行する。少なくとも1つの実施例では、ワープは、スレッドのグループ(たとえば、16個のスレッド)であり、ここで、ワープ中の各スレッドは、単一のスレッド・ブロックに属し、命令の単一のセットに基づいて、データの異なるセットを処理するように構成される。少なくとも1つの実施例では、ワープ中の1つ又は複数のスレッドを無効にするために、プレディケーションが使用され得る。少なくとも1つの実施例では、レーンはスレッドである。少なくとも1つの実施例では、ワーク・アイテムはスレッドである。少なくとも1つの実施例では、ウェーブフロントはワープである。少なくとも1つの実施例では、スレッド・ブロック中の異なるウェーブフロントは、互いに同期し、共有メモリ1454を介して通信し得る。
【0089】
少なくとも1つの実施例では、ファブリック1460は、コア複合体1410、グラフィックス複合体1440、I/Oインターフェース1470、メモリ・コントローラ1480、ディスプレイ・コントローラ1492、及びマルチメディア・エンジン1494にわたるデータ及び制御送信を容易にするシステム相互接続である。少なくとも1つの実施例では、APU1400は、限定はしないが、ファブリック1460に加えて又はそれの代わりに、任意の量及びタイプのシステム相互接続を含み得、それは、APU1400の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする。少なくとも1つの実施例では、I/Oインターフェース1470は、任意の数及びタイプのI/Oインターフェース(たとえば、PCI、PCI-Extended(「PCI-X」)、PCIe、ギガビット・イーサネット(登録商標)(「GBE」:gigabit Ethernet(登録商標))、USBなど)を表す。少なくとも1つの実施例では、様々なタイプの周辺デバイスが、I/Oインターフェース1470に結合される。少なくとも1つの実施例では、I/Oインターフェース1470に結合される周辺デバイスは、限定はしないが、キーボード、マウス、プリンタ、スキャナ、ジョイスティック又は他のタイプのゲーム・コントローラ、メディア記録デバイス、外部ストレージ・デバイス、ネットワーク・インターフェース・カードなどを含み得る。
【0090】
少なくとも1つの実施例では、ディスプレイ・コントローラAMD92は、液晶ディスプレイ(「LCD」:liquid crystal display)デバイスなど、1つ又は複数のディスプレイ・デバイス上に画像を表示する。少なくとも1つの実施例では、マルチメディア・エンジン1494は、限定はしないが、ビデオ・デコーダ、ビデオ・エンコーダ、画像信号プロセッサなど、マルチメディアに関係する任意の量及びタイプの回路要素を含む。少なくとも1つの実施例では、メモリ・コントローラ1480は、APU1400と統一システム・メモリ1490との間のデータ転送を容易にする。少なくとも1つの実施例では、コア複合体1410とグラフィックス複合体1440とは、統一システム・メモリ1490を共有する。
【0091】
少なくとも1つの実施例では、APU1400は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ1480及びメモリ・デバイス(たとえば、共有メモリ1454)を含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、APU1400は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ1528、L3キャッシュ1430、及びL2キャッシュ1442)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、コア1420、コア複合体1410、SIMDユニット1452、コンピュート・ユニット1450、及びグラフィックス複合体1440)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
【0092】
図15は、少なくとも1つの実施例による、CPU1500を示す。少なくとも1つの実施例では、CPU1500は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、CPU1500は、アプリケーション・プログラムを実行するように構成され得る。少なくとも1つの実施例では、CPU1500は、オペレーティング・システムなど、メイン制御ソフトウェアを実行するように構成される。少なくとも1つの実施例では、CPU1500は、外部GPU(図示せず)の動作を制御するコマンドを発行する。少なくとも1つの実施例では、CPU1500は、CUDAソース・コードから導出されたホスト実行可能コードを実行するように構成され得、外部GPUは、そのようなCUDAソース・コードから導出されたデバイス実行可能コードを実行するように構成され得る。少なくとも1つの実施例では、CPU1500は、限定はしないが、任意の数のコア複合体1510と、ファブリック1560と、I/Oインターフェース1570と、メモリ・コントローラ1580とを含む。少なくとも1つの実施例では、CPU1500は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、CPU1500は、実行されたとき、CPU1500に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0093】
少なくとも1つの実施例では、コア複合体1510は、限定はしないが、コア1520(1)~1520(4)と、L3キャッシュ1530とを含む。少なくとも1つの実施例では、コア複合体1510は、限定はしないが、任意の数のコア1520と、任意の数及びタイプのキャッシュとを、任意の組合せで含み得る。少なくとも1つの実施例では、コア1520は、特定のISAの命令を実行するように構成される。少なくとも1つの実施例では、各コア1520はCPUコアである。
【0094】
少なくとも1つの実施例では、各コア1520は、限定はしないが、フェッチ/復号ユニット1522と、整数実行エンジン1524と、浮動小数点実行エンジン1526と、L2キャッシュ1528とを含む。少なくとも1つの実施例では、フェッチ/復号ユニット1522は、命令をフェッチし、そのような命令を復号し、マイクロ・オペレーションを生成し、整数実行エンジン1524と浮動小数点実行エンジン1526とに別個のマイクロ命令をディスパッチする。少なくとも1つの実施例では、フェッチ/復号ユニット1522は、同時に、あるマイクロ命令を整数実行エンジン1524にディスパッチし、別のマイクロ命令を浮動小数点実行エンジン1526にディスパッチすることができる。少なくとも1つの実施例では、整数実行エンジン1524は、限定はしないが、整数及びメモリ演算を実行する。少なくとも1つの実施例では、浮動小数点エンジン1526は、限定はしないが、浮動小数点及びベクトル演算を実行する。少なくとも1つの実施例では、フェッチ復号ユニット1522は、整数実行エンジン1524と浮動小数点実行エンジン1526の両方を置き換える単一の実行エンジンに、マイクロ命令をディスパッチする。
【0095】
少なくとも1つの実施例では、iがコア1520の特定のインスタンスを表す整数である、各コア1520(i)は、コア1520(i)中に含まれるL2キャッシュ1528(i)にアクセスし得る。少なくとも1つの実施例では、jがコア複合体1510の特定のインスタンスを表す整数である、コア複合体1510(j)中に含まれる各コア1520は、コア複合体1510(j)中に含まれるL3キャッシュ1530(j)を介して、コア複合体1510(j)中の他のコア1520に接続される。少なくとも1つの実施例では、jがコア複合体1510の特定のインスタンスを表す整数である、コア複合体1510(j)中に含まれるコア1520は、コア複合体1510(j)中に含まれるL3キャッシュ1530(j)のすべてにアクセスすることができる。少なくとも1つの実施例では、L3キャッシュ1530は、限定はしないが、任意の数のスライスを含み得る。
【0096】
少なくとも1つの実施例では、ファブリック1560は、コア複合体1510(1)~1510(N)(ここで、Nは0よりも大きい整数である)、I/Oインターフェース1570、及びメモリ・コントローラ1580にわたるデータ及び制御送信を容易にするシステム相互接続である。少なくとも1つの実施例では、CPU1500は、限定はしないが、ファブリック1560に加えて又はそれの代わりに、任意の量及びタイプのシステム相互接続を含み得、それは、CPU1500の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする。少なくとも1つの実施例では、I/Oインターフェース1570は、任意の数及びタイプのI/Oインターフェース(たとえば、PCI、PCI-X、PCIe、GBE、USBなど)を表す。少なくとも1つの実施例では、様々なタイプの周辺デバイスが、I/Oインターフェース1570に結合される。少なくとも1つの実施例では、I/Oインターフェース1570に結合される周辺デバイスは、限定はしないが、ディスプレイ、キーボード、マウス、プリンタ、スキャナ、ジョイスティック又は他のタイプのゲーム・コントローラ、メディア記録デバイス、外部ストレージ・デバイス、ネットワーク・インターフェース・カードなどを含み得る。
【0097】
少なくとも1つの実施例では、メモリ・コントローラ1580は、CPU1500とシステム・メモリ1590との間のデータ転送を容易にする。少なくとも1つの実施例では、コア複合体1510とグラフィックス複合体1540とは、システム・メモリ1590を共有する。少なくとも1つの実施例では、CPU1500は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ1580及びメモリ・デバイスを含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、CPU1500は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ1528及びL3キャッシュ1530)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、コア1520及びコア複合体1510)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
【0098】
図16は、少なくとも1つの実施例による、例示的なアクセラレータ統合スライス1690を示す。本明細書で使用される「スライス」は、アクセラレータ統合回路の処理リソースの指定部分を備える。少なくとも1つの実施例では、アクセラレータ統合回路は、グラフィックス加速モジュール中に含まれる複数のグラフィックス処理エンジンの代わりに、キャッシュ管理、メモリ・アクセス、コンテキスト管理、及び割込み管理サービスを提供する。グラフィックス処理エンジンは、各々、別個のGPUを備え得る。代替的に、グラフィックス処理エンジンは、GPU内に、グラフィックス実行ユニット、メディア処理エンジン(たとえば、ビデオ・エンコーダ/デコーダ)、サンプラ、及びblitエンジンなど、異なるタイプのグラフィックス処理エンジンを備え得る。少なくとも1つの実施例では、グラフィックス加速モジュールは、複数のグラフィックス処理エンジンをもつGPUであり得る。少なくとも1つの実施例では、グラフィックス処理エンジンは、共通のパッケージ、ライン・カード、又はチップ上に組み込まれた個々のGPUであり得る。少なくとも1つの実施例では、アクセラレータ統合スライス1690は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、アクセラレータ統合スライス1690は、実行されたとき、アクセラレータ統合スライス1690に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0099】
システム・メモリ1614内のアプリケーション実効アドレス空間1682は、プロセス要素1683を記憶する。一実施例では、プロセス要素1683は、プロセッサ1607上で実行されるアプリケーション1680からのGPU呼出し1681に応答して、記憶される。プロセス要素1683は、対応するアプリケーション1680のプロセス状態を含んでいる。プロセス要素1683に含まれているワーク記述子(「WD」:work descriptor)1684は、アプリケーションによって要求される単一のジョブであり得るか、又はジョブのキューに対するポインタを含んでいることがある。少なくとも1つの実施例では、WD1684は、アプリケーション実効アドレス空間1682におけるジョブ要求キューに対するポインタである。
【0100】
グラフィックス加速モジュール1646及び/又は個々のグラフィックス処理エンジンは、システム中のプロセスのすべて又はサブセットによって共有され得る。少なくとも1つの実施例では、プロセス状態を設定し、WD1684をグラフィックス加速モジュール1646に送出して、仮想化環境中でジョブを開始するためのインフラストラクチャが、含められ得る。
【0101】
少なくとも1つの実施例では、専用プロセス・プログラミング・モデルは、実装固有である。このモデルでは、単一のプロセスが、グラフィックス加速モジュール1646又は個々のグラフィックス処理エンジンを所有する。グラフィックス加速モジュール1646が単一のプロセスによって所有されるので、ハイパーバイザは、所有パーティションについてアクセラレータ統合回路を初期化し、グラフィックス加速モジュール1646が割り当てられたとき、オペレーティング・システムは、所有プロセスについてアクセラレータ統合回路を初期化する。
【0102】
動作時、アクセラレータ統合スライス1690中のWDフェッチ・ユニット1691は、グラフィックス加速モジュール1646の1つ又は複数のグラフィックス処理エンジンによって行われるべきであるワークの指示を含む、次のWD1684をフェッチする。示されているように、WD1684からのデータは、レジスタ1645に記憶され、メモリ管理ユニット(「MMU」:memory management unit)1639、割込み管理回路1647、及び/又はコンテキスト管理回路1648によって使用され得る。たとえば、MMU1639の一実施例は、OS仮想アドレス空間1685内のセグメント/ページ・テーブル1686にアクセスするためのセグメント/ページ・ウォーク回路要素を含む。割込み管理回路1647は、グラフィックス加速モジュール1646から受信された割込みイベント(「INT」:interrupt)1692を処理し得る。グラフィックス動作を実施するとき、グラフィックス処理エンジンによって生成された実効アドレス1693は、MMU1639によって実アドレスにトランスレートされる。
【0103】
一実施例では、レジスタ1645の同じセットが、各グラフィックス処理エンジン、及び/又はグラフィックス加速モジュール1646について複製され、ハイパーバイザ又はオペレーティング・システムによって初期化され得る。これらの複製されたレジスタの各々は、アクセラレータ統合スライス1690中に含められ得る。ハイパーバイザによって初期化され得る例示的なレジスタが、表1に示されている。
【表1】
【0104】
オペレーティング・システムによって初期化され得る例示的なレジスタが、表2に示されている。
【表2】
【0105】
一実施例では、各WD1684は、特定のグラフィックス加速モジュール1646及び/又は特定のグラフィックス処理エンジンに固有である。WD1684は、ワークを行うためにグラフィックス処理エンジンによって必要とされるすべての情報を含んでいるか、又は、WD1684は、完了されるべきワークのコマンド・キューをアプリケーションが設定したメモリ・ロケーションに対するポインタであり得る。
【0106】
図17A図17Bは、少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す。少なくとも1つの実施例では、例示的なグラフィックス・プロセッサのうちのいずれかは、1つ又は複数のIPコアを使用して作製され得る。示されているものに加えて、少なくとも1つの実施例では、追加のグラフィックス・プロセッサ/コア、周辺インターフェース・コントローラ、又は汎用プロセッサ・コアを含む他の論理及び回路が含まれ得る。少なくとも1つの実施例では、例示的なグラフィックス・プロセッサは、SoC内での使用のためのものである。
【0107】
図17Aは、少なくとも1つの実施例による、1つ又は複数のIPコアを使用して作製され得るSoC集積回路の例示的なグラフィックス・プロセッサ1710を示す。図17Bは、少なくとも1つの実施例による、1つ又は複数のIPコアを使用して作製され得るSoC集積回路の追加の例示的なグラフィックス・プロセッサ1740を示す。少なくとも1つの実施例では、図17Aのグラフィックス・プロセッサ1710は、低電力グラフィックス・プロセッサ・コアである。少なくとも1つの実施例では、図17Bのグラフィックス・プロセッサ1740は、より高性能のグラフィックス・プロセッサ・コアである。少なくとも1つの実施例では、グラフィックス・プロセッサ1710、1740の各々は、図12のグラフィックス・プロセッサ1210の変形態であり得る。少なくとも1つの実施例では、グラフィックス・プロセッサ1710は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1710は、実行されたとき、グラフィックス・プロセッサ1710に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0108】
少なくとも1つの実施例では、グラフィックス・プロセッサ1710は、頂点プロセッサ1705と、1つ又は複数のフラグメント・プロセッサ1715A~1715N(たとえば、1715A、1715B、1715C、1715D~1715N-1、及び1715N)とを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1710は、別個の論理を介して異なるシェーダ・プログラムを実行することができ、それにより、頂点プロセッサ1705は、頂点シェーダ・プログラムのための動作を実行するように最適化され、1つ又は複数のフラグメント・プロセッサ1715A~1715Nは、フラグメント又はピクセル・シェーダ・プログラムのためのフラグメント(たとえば、ピクセル)シェーディング動作を実行する。少なくとも1つの実施例では、頂点プロセッサ1705は、3Dグラフィックス・パイプラインの頂点処理段階を実施し、プリミティブ及び頂点データを生成する。少なくとも1つの実施例では、(1つ又は複数の)フラグメント・プロセッサ1715A~1715Nは、頂点プロセッサ1705によって生成されたプリミティブ及び頂点データを使用して、ディスプレイ・デバイス上に表示されるフレームバッファを作り出す。少なくとも1つの実施例では、(1つ又は複数の)フラグメント・プロセッサ1715A~1715Nは、OpenGL APIにおいて提供されるようなフラグメント・シェーダ・プログラムを実行するように最適化され、OpenGL APIは、Direct 3D APIにおいて提供されるようなピクセル・シェーダ・プログラムと同様の動作を実施するために使用され得る。
【0109】
少なくとも1つの実施例では、グラフィックス・プロセッサ1710は、追加として、1つ又は複数のMMU1720A~1720Bと、(1つ又は複数の)キャッシュ1725A~1725Bと、(1つ又は複数の)回路相互接続1730A~1730Bとを含む。少なくとも1つの実施例では、1つ又は複数のMMU1720A~1720Bは、頂点プロセッサ1705及び/又は(1つ又は複数の)フラグメント・プロセッサ1715A~1715Nを含む、グラフィックス・プロセッサ1710のための仮想-物理アドレス・マッピングを提供し、それらは、1つ又は複数のキャッシュ1725A~1725Bに記憶された頂点又は画像/テクスチャ・データに加えて、メモリに記憶された頂点又は画像/テクスチャ・データを参照し得る。少なくとも1つの実施例では、1つ又は複数のMMU1720A~1720Bは、図12の1つ又は複数のアプリケーション・プロセッサ1205、画像プロセッサ1215、及び/又はビデオ・プロセッサ1220に関連付けられた1つ又は複数のMMUを含む、システム内の他のMMUと同期され得、それにより、各プロセッサ1205~1220は、共有又は統一仮想メモリ・システムに参加することができる。少なくとも1つの実施例では、1つ又は複数の回路相互接続1730A~1730Bは、グラフィックス・プロセッサ1710が、SoCの内部バスを介して又は直接接続を介してのいずれかで、SoC内の他のIPコアとインターフェースすることを可能にする。
【0110】
少なくとも1つの実施例では、グラフィックス・プロセッサ1740は、図17Aのグラフィックス・プロセッサ1710の1つ又は複数のMMU1720A~1720Bと、キャッシュ1725A~1725Bと、回路相互接続1730A~1730Bとを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1740は、1つ又は複数のシェーダ・コア1755A~1755N(たとえば、1755A、1755B、1755C、1755D、1755E、1755F~1755N-1、及び1755N)を含み、1つ又は複数のシェーダ・コア1755A~1755Nは、単一のコア、又はタイプ、又はコアが、頂点シェーダ、フラグメント・シェーダ、及び/又はコンピュート・シェーダを実装するためのシェーダ・プログラム・コードを含むすべてのタイプのプログラマブル・シェーダ・コードを実行することができる統一シェーダ・コア・アーキテクチャを提供する。少なくとも1つの実施例では、シェーダ・コアの数は変動することができる。少なくとも1つの実施例では、グラフィックス・プロセッサ1740は、1つ又は複数のシェーダ・コア1755A~1755Nに実行スレッドをディスパッチするためのスレッド・ディスパッチャとして作用するコア間タスク・マネージャ1745と、たとえばシーン内のローカル空間コヒーレンスを利用するため、又は内部キャッシュの使用を最適化するために、シーンについてのレンダリング動作が画像空間において細分化される、タイル・ベースのレンダリングのためのタイリング動作を加速するためのタイリング・ユニット1758とを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1740は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1740は、実行されたとき、グラフィックス・プロセッサ1740に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0111】
図18Aは、少なくとも1つの実施例による、グラフィックス・コア1800を示す。少なくとも1つの実施例では、グラフィックス・コア1800は、図12のグラフィックス・プロセッサ1210内に含まれ得る。少なくとも1つの実施例では、グラフィックス・コア1800は、図17Bの場合のような統一シェーダ・コア1755A~1755Nであり得る。少なくとも1つの実施例では、グラフィックス・コア1800は、共有命令キャッシュ1802と、テクスチャ・ユニット1818と、キャッシュ/共有メモリ1820とを含み、それらは、グラフィックス・コア1800内の実行リソースに共通である。少なくとも1つの実施例では、グラフィックス・コア1800は、複数のスライス1801A~1801N、又は各コアについてのパーティションを含むことができ、グラフィックス・プロセッサは、グラフィックス・コア1800の複数のインスタンスを含むことができる。スライス1801A~1801Nは、ローカル命令キャッシュ1804A~1804Nと、スレッド・スケジューラ1806A~1806Nと、スレッド・ディスパッチャ1808A~1808Nと、レジスタのセット1810A~1810Nとを含むサポート論理を含むことができる。少なくとも1つの実施例では、スライス1801A~1801Nは、追加機能ユニット(「AFU」:additional function unit)1812A~1812N、浮動小数点ユニット(「FPU」:floating-point unit)1814A~1814N、整数算術論理ユニット(「ALU」:integer arithmetic logic unit)1816~1816N、アドレス算出ユニット(「ACU」:address computational unit)1813A~1813N、倍精度浮動小数点ユニット(「DPFPU」:double-precision floating-point unit)1815A~1815N、及び行列処理ユニット(「MPU」:matrix processing unit)1817A~1817Nのセットを含むことができる。少なくとも1つの実施例では、グラフィックス・コア1800は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、グラフィックス・コア1800は、実行されたとき、グラフィックス・コア1800に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0112】
少なくとも1つの実施例では、FPU1814A~1814Nは、単精度(32ビット)及び半精度(16ビット)の浮動小数点演算を実施することができ、DPFPU1815A~1815Nは、倍精度(64ビット)の浮動小数点演算を実施する。少なくとも1つの実施例では、ALU1816A~1816Nは、8ビット、16ビット、及び32ビットの精度で可変精度整数演算を実施することができ、混合精度演算のために構成され得る。少なくとも1つの実施例では、MPU1817A~1817Nも、半精度浮動小数点演算と8ビット整数演算とを含む、混合精度行列演算のために構成され得る。少なくとも1つの実施例では、MPU1817~1817Nは、加速汎用行列-行列乗算(「GEMM」:general matrix to matrix multiplication)のサポートを可能にすることを含む、CUDAプログラムを加速するための様々な行列演算を実施することができる。少なくとも1つの実施例では、AFU1812A~1812Nは、三角関数演算(たとえば、サイン、コサインなど)を含む、浮動小数点ユニット又は整数ユニットによってサポートされていない追加の論理演算を実施することができる。
【0113】
図18Bは、少なくとも1つの実施例による、汎用グラフィックス処理ユニット(「GPGPU」:general-purpose graphics processing unit)1830を示す。少なくとも1つの実施例では、GPGPU1830は、高度並列であり、マルチチップ・モジュール上での導入に好適である。少なくとも1つの実施例では、GPGPU1830は、高度並列コンピュート動作がGPUのアレイによって実施されることを可能にするように構成され得る。少なくとも1つの実施例では、GPGPU1830は、CUDAプログラムのための実行時間を改善するためにマルチGPUクラスタを作成するために、GPGPU1830の他のインスタンスに直接リンクされ得る。少なくとも1つの実施例では、GPGPU1830は、ホスト・プロセッサとの接続を可能にするためのホスト・インターフェース1832を含む。少なくとも1つの実施例では、ホスト・インターフェース1832は、PCIeインターフェースである。少なくとも1つの実施例では、ホスト・インターフェース1832は、ベンダー固有の通信インターフェース又は通信ファブリックであり得る。少なくとも1つの実施例では、GPGPU1830は、ホスト・プロセッサからコマンドを受信し、グローバル・スケジューラ1834を使用して、それらのコマンドに関連付けられた実行スレッドを、コンピュート・クラスタ1836A~1836Hのセットに分散させる。少なくとも1つの実施例では、コンピュート・クラスタ1836A~1836Hは、キャッシュ・メモリ1838を共有する。少なくとも1つの実施例では、キャッシュ・メモリ1838は、コンピュート・クラスタ1836A~1836H内のキャッシュ・メモリのためのより高レベルのキャッシュとして働くことができる。少なくとも1つの実施例では、GPGPU1830は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、GPGPU1830は、実行されたとき、GPGPU1830に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0114】
少なくとも1つの実施例では、GPGPU1830は、メモリ・コントローラ1842A~1842Bのセットを介してコンピュート・クラスタ1836A~1836Hと結合されたメモリ1844A~1844Bを含む。少なくとも1つの実施例では、メモリ1844A~1844Bは、DRAM、又は、グラフィックス・ダブル・データ・レート(「GDDR」:graphics double data rate)メモリを含む同期グラフィックス・ランダム・アクセス・メモリ(「SGRAM」:synchronous graphics random access memory)などのグラフィックス・ランダム・アクセス・メモリを含む、様々なタイプのメモリ・デバイスを含むことができる。
【0115】
少なくとも1つの実施例では、コンピュート・クラスタ1836A~1836Hは、各々、図18Aのグラフィックス・コア1800などのグラフィックス・コアのセットを含み、グラフィックス・コアのセットは、CUDAプログラムに関連する算出に適したものを含む、様々な精度で算出動作を実施することができる複数のタイプの整数及び浮動小数点論理ユニットを含むことができる。たとえば、少なくとも1つの実施例では、コンピュート・クラスタ1836A~1836Hの各々における浮動小数点ユニットの少なくともサブセットは、16ビット又は32ビットの浮動小数点演算を実施するように構成され得、浮動小数点ユニットの異なるサブセットは、64ビットの浮動小数点演算を実施するように構成され得る。
【0116】
少なくとも1つの実施例では、GPGPU1830の複数のインスタンスは、コンピュート・クラスタとして動作するように構成され得る。コンピュート・クラスタ1836A~1836Hは、同期及びデータ交換のための任意の技術的に実現可能な通信技法を実装し得る。少なくとも1つの実施例では、GPGPU1830の複数のインスタンスは、ホスト・インターフェース1832を介して通信する。少なくとも1つの実施例では、GPGPU1830は、I/Oハブ1839を含み、I/Oハブ1839は、GPGPU1830を、GPGPU1830の他のインスタンスへの直接接続を可能にするGPUリンク1840と結合する。少なくとも1つの実施例では、GPUリンク1840は、GPGPU1830の複数のインスタンス間での通信及び同期を可能にする専用GPU-GPUブリッジに結合される。少なくとも1つの実施例では、GPUリンク1840は、他のGPGPU1830又は並列プロセッサにデータを送信及び受信するために高速相互接続と結合される。少なくとも1つの実施例では、GPGPU1830の複数のインスタンスは、別個のデータ処理システムに位置し、ホスト・インターフェース1832を介してアクセス可能であるネットワーク・デバイスを介して通信する。少なくとも1つの実施例では、GPUリンク1840は、ホスト・インターフェース1832に加えて、又はその代替として、ホスト・プロセッサへの接続を可能にするように構成され得る。少なくとも1つの実施例では、GPGPU1830は、CUDAプログラムを実行するように構成され得る。
【0117】
図19Aは、少なくとも1つの実施例による、並列プロセッサ1900を示す。少なくとも1つの実施例では、並列プロセッサ1900の様々な構成要素は、プログラマブル・プロセッサ、特定用途向け集積回路(「ASIC」:application specific integrated circuit)、又はFPGAなど、1つ又は複数の集積回路デバイスを使用して実装され得る。
【0118】
少なくとも1つの実施例では、並列プロセッサ1900は並列処理ユニット1902を含む。少なくとも1つの実施例では、並列処理ユニット1902は、並列処理ユニット1902の他のインスタンスを含む、他のデバイスとの通信を可能にするI/Oユニット1904を含む。少なくとも1つの実施例では、I/Oユニット1904は、他のデバイスに直接接続され得る。少なくとも1つの実施例では、I/Oユニット1904は、メモリ・ハブ1905など、ハブ又はスイッチ・インターフェースの使用を介して他のデバイスと接続する。少なくとも1つの実施例では、メモリ・ハブ1905とI/Oユニット1904との間の接続は、通信リンクを形成する。少なくとも1つの実施例では、I/Oユニット1904は、ホスト・インターフェース1906及びメモリ・クロスバー1916と接続し、ホスト・インターフェース1906は、処理動作を実施することを対象とするコマンドを受信し、メモリ・クロスバー1916は、メモリ動作を実施することを対象とするコマンドを受信する。少なくとも1つの実施例では、並列プロセッサ1900は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、並列プロセッサ1900は、実行されたとき、並列プロセッサ1900に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0119】
少なくとも1つの実施例では、ホスト・インターフェース1906が、I/Oユニット1904を介してコマンド・バッファを受信したとき、ホスト・インターフェース1906は、それらのコマンドを実施するためのワーク動作をフロント・エンド1908に向けることができる。少なくとも1つの実施例では、フロント・エンド1908はスケジューラ1910と結合し、スケジューラ1910は、コマンド又は他のワーク・アイテムを処理アレイ1912に分散させるように構成される。少なくとも1つの実施例では、スケジューラ1910は、処理アレイ1912にタスクが分散される前に、処理アレイ1912が適切に構成され、有効な状態にあることを確実にする。少なくとも1つの実施例では、スケジューラ1910は、マイクロコントローラ上で実行しているファームウェア論理を介して実装される。少なくとも1つの実施例では、マイクロコントローラ実装スケジューラ1910は、複雑なスケジューリング及びワーク分散動作を、粗い粒度及び細かい粒度において実施するように構成可能であり、処理アレイ1912上で実行しているスレッドの迅速なプリエンプション及びコンテキスト切替えを可能にする。少なくとも1つの実施例では、ホスト・ソフトウェアは、処理アレイ1912上でのスケジューリングのためのワークロードを、複数のグラフィックス処理ドアベルのうちの1つを介して証明することができる。少なくとも1つの実施例では、ワークロードは、次いで、スケジューラ1910を含むマイクロコントローラ内のスケジューラ1910論理によって、処理アレイ1912にわたって自動的に分散され得る。
【0120】
少なくとも1つの実施例では、処理アレイ1912は、最高「N」個のクラスタ(たとえば、クラスタ1914A、クラスタ1914B~クラスタ1914N)を含むことができる。少なくとも1つの実施例では、処理アレイ1912の各クラスタ1914A~1914Nは、多数の同時スレッドを実行することができる。少なくとも1つの実施例では、スケジューラ1910は、様々なスケジューリング及び/又はワーク分散アルゴリズムを使用して処理アレイ1912のクラスタ1914A~1914Nにワークを割り振ることができ、それらのアルゴリズムは、プログラム又は算出の各タイプについて生じるワークロードに応じて変動し得る。少なくとも1つの実施例では、スケジューリングは、スケジューラ1910によって動的に対処され得るか、又は処理アレイ1912による実行のために構成されたプログラム論理のコンパイル中に、コンパイラ論理によって部分的に支援され得る。少なくとも1つの実施例では、処理アレイ1912の異なるクラスタ1914A~1914Nは、異なるタイプのプログラムを処理するために、又は異なるタイプの算出を実施するために割り振られ得る。
【0121】
少なくとも1つの実施例では、処理アレイ1912は、様々なタイプの並列処理動作を実施するように構成され得る。少なくとも1つの実施例では、処理アレイ1912は、汎用並列コンピュート動作を実施するように構成される。たとえば、少なくとも1つの実施例では、処理アレイ1912は、ビデオ及び/又はオーディオ・データをフィルタリングすること、物理動作を含むモデリング動作を実施すること、及びデータ変換を実施することを含む処理タスクを実行するための論理を含むことができる。
【0122】
少なくとも1つの実施例では、処理アレイ1912は、並列グラフィックス処理動作を実施するように構成される。少なくとも1つの実施例では、処理アレイ1912は、限定はしないが、テクスチャ動作を実施するためのテクスチャ・サンプリング論理、並びにテッセレーション論理及び他の頂点処理論理を含む、そのようなグラフィックス処理動作の実行をサポートするための追加の論理を含むことができる。少なくとも1つの実施例では、処理アレイ1912は、限定はしないが、頂点シェーダ、テッセレーション・シェーダ、ジオメトリ・シェーダ、及びピクセル・シェーダなど、グラフィックス処理関係シェーダ・プログラムを実行するように構成され得る。少なくとも1つの実施例では、並列処理ユニット1902は、処理のためにI/Oユニット1904を介してシステム・メモリからデータを転送することができる。少なくとも1つの実施例では、処理中に、転送されたデータは、処理中にオンチップ・メモリ(たとえば、並列プロセッサ・メモリ1922)に記憶され、次いでシステム・メモリに書き戻され得る。
【0123】
少なくとも1つの実施例では、並列処理ユニット1902がグラフィックス処理を実施するために使用されるとき、スケジューラ1910は、処理アレイ1912の複数のクラスタ1914A~1914Nへのグラフィックス処理動作の分散をより良く可能にするために、処理ワークロードをほぼ等しいサイズのタスクに分割するように構成され得る。少なくとも1つの実施例では、処理アレイ1912の部分は、異なるタイプの処理を実施するように構成され得る。たとえば、少なくとも1つの実施例では、表示のために、レンダリングされた画像を作り出すために、第1の部分は、頂点シェーディング及びトポロジ生成を実施するように構成され得、第2の部分は、テッセレーション及びジオメトリ・シェーディングを実施するように構成され得、第3の部分は、ピクセル・シェーディング又は他のスクリーン空間動作を実施するように構成され得る。少なくとも1つの実施例では、クラスタ1914A~1914Nのうちの1つ又は複数によって作り出された中間データは、中間データがさらなる処理のためにクラスタ1914A~1914N間で送信されることを可能にするために、バッファに記憶され得る。
【0124】
少なくとも1つの実施例では、処理アレイ1912は、実行されるべき処理タスクをスケジューラ1910を介して受信することができ、スケジューラ1910は、処理タスクを定義するコマンドをフロント・エンド1908から受信する。少なくとも1つの実施例では、処理タスクは、処理されるべきデータのインデックス、たとえば、表面(パッチ)データ、プリミティブ・データ、頂点データ、及び/又はピクセル・データ、並びに、データがどのように処理されるべきであるか(たとえば、どのプログラムが実行されるべきであるか)を定義する状態パラメータ及びコマンドを含むことができる。少なくとも1つの実施例では、スケジューラ1910は、タスクに対応するインデックスをフェッチするように構成され得るか、又はフロント・エンド1908からインデックスを受信し得る。少なくとも1つの実施例では、フロント・エンド1908は、入って来るコマンド・バッファ(たとえば、バッチ・バッファ、プッシュ・バッファなど)によって指定されるワークロードが始動される前に、処理アレイ1912が有効な状態に構成されることを確実にするように構成され得る。
【0125】
少なくとも1つの実施例では、並列処理ユニット1902の1つ又は複数のインスタンスの各々は、並列プロセッサ・メモリ1922と結合することができる。少なくとも1つの実施例では、並列プロセッサ・メモリ1922は、メモリ・クロスバー1916を介してアクセスされ得、メモリ・クロスバー1916は、処理アレイ1912並びにI/Oユニット1904からメモリ要求を受信することができる。少なくとも1つの実施例では、メモリ・クロスバー1916は、メモリ・インターフェース1918を介して並列プロセッサ・メモリ1922にアクセスすることができる。少なくとも1つの実施例では、メモリ・インターフェース1918は、複数のパーティション・ユニット(たとえば、パーティション・ユニット1920A、パーティション・ユニット1920B~パーティション・ユニット1920N)を含むことができ、複数のパーティション・ユニットは、各々、並列プロセッサ・メモリ1922の一部分(たとえば、メモリ・ユニット)に結合することができる。少なくとも1つの実施例では、パーティション・ユニット1920A~1920Nの数は、メモリ・ユニットの数に等しくなるように構成され、それにより、第1のパーティション・ユニット1920Aは、対応する第1のメモリ・ユニット1924Aを有し、第2のパーティション・ユニット1920Bは、対応するメモリ・ユニット1924Bを有し、第Nのパーティション・ユニット1920Nは、対応する第Nのメモリ・ユニット1924Nを有する。少なくとも1つの実施例では、パーティション・ユニット1920A~1920Nの数は、メモリ・デバイスの数に等しくないことがある。
【0126】
少なくとも1つの実施例では、メモリ・ユニット1924A~1924Nは、GDDRメモリを含むSGRAMなど、DRAM又はグラフィックス・ランダム・アクセス・メモリを含む、様々なタイプのメモリ・デバイスを含むことができる。少なくとも1つの実施例では、メモリ・ユニット1924A~1924Nは、限定はしないが高帯域幅メモリ(「HBM」:high bandwidth memory)を含む、3D積層メモリをも含み得る。少なくとも1つの実施例では、並列プロセッサ・メモリ1922の利用可能な帯域幅を効率的に使用するために、フレーム・バッファ又はテクスチャ・マップなどのレンダー・ターゲットが、メモリ・ユニット1924A~1924Nにわたって記憶されて、パーティション・ユニット1920A~1920Nが、各レンダー・ターゲットの部分を並列に書き込むことを可能にし得る。少なくとも1つの実施例では、ローカル・キャッシュ・メモリと併せてシステム・メモリを利用する統一メモリ設計に有利なように、並列プロセッサ・メモリ1922のローカル・インスタンスが除外され得る。
【0127】
少なくとも1つの実施例では、処理アレイ1912のクラスタ1914A~1914Nのうちのいずれか1つは、並列プロセッサ・メモリ1922内のメモリ・ユニット1924A~1924Nのいずれかに書き込まれることになるデータを処理することができる。少なくとも1つの実施例では、メモリ・クロスバー1916は、各クラスタ1914A~1914Nの出力を、出力に対して追加の処理動作を実施することができる任意のパーティション・ユニット1920A~1920Nに転送するか、又は別のクラスタ1914A~1914Nに転送するように構成され得る。少なくとも1つの実施例では、各クラスタ1914A~1914Nは、様々な外部メモリ・デバイスから読み取るか、又はそれに書き込むために、メモリ・クロスバー1916を通してメモリ・インターフェース1918と通信することができる。少なくとも1つの実施例では、メモリ・クロスバー1916は、I/Oユニット1904と通信するためのメモリ・インターフェース1918への接続、並びに、並列プロセッサ・メモリ1922のローカル・インスタンスへの接続を有し、これは、異なるクラスタ1914A~1914N内の処理ユニットが、システム・メモリ、又は並列処理ユニット1902にローカルでない他のメモリと通信することを可能にする。少なくとも1つの実施例では、メモリ・クロスバー1916は、クラスタ1914A~1914Nとパーティション・ユニット1920A~1920Nとの間でトラフィック・ストリームを分離するために、仮想チャネルを使用することができる。
【0128】
少なくとも1つの実施例では、並列処理ユニット1902の複数のインスタンスは、単一のアドイン・カード上で提供され得るか、又は複数のアドイン・カードが相互接続され得る。少なくとも1つの実施例では、並列処理ユニット1902の異なるインスタンスは、異なるインスタンスが異なる数の処理コア、異なる量のローカル並列プロセッサ・メモリ、及び/又は他の構成の差を有する場合でも、相互動作するように構成され得る。たとえば、少なくとも1つの実施例では、並列処理ユニット1902のいくつかのインスタンスは、他のインスタンスに対してより高い精度の浮動小数点ユニットを含むことができる。少なくとも1つの実施例では、並列処理ユニット1902又は並列プロセッサ1900の1つ又は複数のインスタンスを組み込んだシステムは、限定はしないが、デスクトップ、ラップトップ、又はハンドヘルド・パーソナル・コンピュータ、サーバ、ワークステーション、ゲーム・コンソール、及び/又は組み込みシステムを含む、様々な構成及びフォーム・ファクタにおいて実装され得る。
【0129】
図19Bは、少なくとも1つの実施例による、処理クラスタ1994を示す。少なくとも1つの実施例では、処理クラスタ1994は、並列処理ユニット内に含まれる。少なくとも1つの実施例では、処理クラスタ1994は、図19の処理クラスタ1914A~1914Nのうちの1つである。少なくとも1つの実施例では、処理クラスタ1994は、多くのスレッドを並列で実行するように構成され得、「スレッド」という用語は、入力データの特定のセットに対して実行している特定のプログラムのインスタンスを指す。少なくとも1つの実施例では、複数の独立した命令ユニットを提供することなしに多数のスレッドの並列実行をサポートするために、単一命令複数データ(「SIMD」:single instruction,multiple data)命令発行技法が使用される。少なくとも1つの実施例では、各処理クラスタ1994内の処理エンジンのセットに命令を発行するように構成された共通の命令ユニットを使用して、全体的に同期された多数のスレッドの並列実行をサポートするために、単一命令複数スレッド(「SIMT」:single instruction,multiple thread)技法が使用される。少なくとも1つの実施例では、処理クラスタ1994は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、処理クラスタ1994は、実行されたとき、処理クラスタ1994に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0130】
少なくとも1つの実施例では、処理クラスタ1994の動作は、SIMT並列プロセッサに処理タスクを分散させるパイプライン・マネージャ1932を介して制御され得る。少なくとも1つの実施例では、パイプライン・マネージャ1932は、図19のスケジューラ1910から命令を受信し、グラフィックス・マルチプロセッサ1934及び/又はテクスチャ・ユニット1936を介してそれらの命令の実行を管理する。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1934は、SIMT並列プロセッサの例示的なインスタンスである。しかしながら、少なくとも1つの実施例では、異なるアーキテクチャの様々なタイプのSIMT並列プロセッサが、処理クラスタ1994内に含められ得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1934の1つ又は複数のインスタンスは、処理クラスタ1994内に含められ得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1934はデータを処理することができ、処理されたデータを、他のシェーダ・ユニットを含む複数の可能な宛先のうちの1つに分散させるために、データ・クロスバー1940が使用され得る。少なくとも1つの実施例では、パイプライン・マネージャ1932は、データ・クロスバー1940を介して分散されることになる処理されたデータのための宛先を指定することによって、処理されたデータの分散を容易にすることができる。
【0131】
少なくとも1つの実施例では、処理クラスタ1994内の各グラフィックス・マルチプロセッサ1934は、関数実行論理(たとえば、算術論理ユニット、ロード/ストア・ユニット(「LSU」:load/store unit)など)の同一のセットを含むことができる。少なくとも1つの実施例では、関数実行論理は、前の命令が完了する前に新しい命令が発行され得るパイプライン様式で構成され得る。少なくとも1つの実施例では、関数実行論理は、整数及び浮動小数点算術、比較演算、ブール演算、ビット・シフト、及び様々な代数関数の算出を含む様々な演算をサポートする。少なくとも1つの実施例では、異なる演算を実施するために同じ関数ユニット・ハードウェアが活用され得、関数ユニットの任意の組合せが存在し得る。
【0132】
少なくとも1つの実施例では、処理クラスタ1994に送信される命令がスレッドを構成する。少なくとも1つの実施例では、並列処理エンジンのセットにわたって実行しているスレッドのセットが、スレッド・グループである。少なくとも1つの実施例では、スレッド・グループは、異なる入力データに対してプログラムを実行する。少なくとも1つの実施例では、スレッド・グループ内の各スレッドは、グラフィックス・マルチプロセッサ1934内の異なる処理エンジンに割り当てられ得る。少なくとも1つの実施例では、スレッド・グループは、グラフィックス・マルチプロセッサ1934内の処理エンジンの数よりも少ないスレッドを含み得る。少なくとも1つの実施例では、スレッド・グループが処理エンジンの数よりも少ないスレッドを含むとき、処理エンジンのうちの1つ又は複数は、そのスレッド・グループが処理されているサイクル中にアイドルであり得る。少なくとも1つの実施例では、スレッド・グループはまた、グラフィックス・マルチプロセッサ1934内の処理エンジンの数よりも多いスレッドを含み得る。少なくとも1つの実施例では、スレッド・グループがグラフィックス・マルチプロセッサ1934内の処理エンジンの数よりも多くのスレッドを含むとき、連続するクロック・サイクルにわたって処理が実施され得る。少なくとも1つの実施例では、複数のスレッド・グループが、グラフィックス・マルチプロセッサ1934上で同時に実行され得る。
【0133】
少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1934は、ロード動作及びストア動作を実施するための内部キャッシュ・メモリを含む。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1934は、内部キャッシュをやめ、処理クラスタ1994内のキャッシュ・メモリ(たとえば、L1キャッシュ1948)を使用することができる。少なくとも1つの実施例では、各グラフィックス・マルチプロセッサ1934はまた、パーティション・ユニット(たとえば、図19Aのパーティション・ユニット1920A~1920N)内のレベル2(「L2」)キャッシュへのアクセスをも有し、それらのL2キャッシュは、すべての処理クラスタ1994の間で共有され、スレッド間でデータを転送するために使用され得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1934はまた、オフチップ・グローバル・メモリにアクセスし得、オフチップ・グローバル・メモリは、ローカル並列プロセッサ・メモリ及び/又はシステム・メモリのうちの1つ又は複数を含むことができる。少なくとも1つの実施例では、並列処理ユニット1902の外部の任意のメモリが、グローバル・メモリとして使用され得る。少なくとも1つの実施例では、処理クラスタ1994は、グラフィックス・マルチプロセッサ1934の複数のインスタンスを含み、グラフィックス・マルチプロセッサ1934は、共通の命令及びデータを共有することができ、共通の命令及びデータは、L1キャッシュ1948に記憶され得る。
【0134】
少なくとも1つの実施例では、各処理クラスタ1994は、仮想アドレスを物理アドレスにマッピングするように構成されたMMU1945を含み得る。少なくとも1つの実施例では、MMU1945の1つ又は複数のインスタンスは、図19のメモリ・インターフェース1918内に存在し得る。少なくとも1つの実施例では、MMU1945は、仮想アドレスを、タイル及び随意にキャッシュ・ライン・インデックスの物理アドレスにマッピングするために使用されるページ・テーブル・エントリ(「PTE」:page table entry)のセットを含む。少なくとも1つの実施例では、MMU1945は、アドレス・トランスレーション・ルックアサイド・バッファ(「TLB」:translation lookaside buffer)又はキャッシュを含み得、これらは、グラフィックス・マルチプロセッサ1934又はL1キャッシュ1948或いは処理クラスタ1994内に存在し得る。少なくとも1つの実施例では、物理アドレスが、表面データ・アクセス・ローカリティを分散させて、パーティション・ユニットの間での効率的な要求インターリーブを可能にするために処理される。少なくとも1つの実施例では、キャッシュ・ライン・インデックスが、キャッシュ・ラインについての要求がヒットであるのかミスであるのかを決定するために使用され得る。
【0135】
少なくとも1つの実施例では、処理クラスタ1994は、各グラフィックス・マルチプロセッサ1934が、テクスチャ・マッピング動作、たとえば、テクスチャ・サンプル位置を決定すること、テクスチャ・データを読み取ること、及びテクスチャ・データをフィルタリングすることを実施するためのテクスチャ・ユニット1936に結合されるように、構成され得る。少なくとも1つの実施例では、テクスチャ・データは、内部テクスチャL1キャッシュ(図示せず)から又はグラフィックス・マルチプロセッサ1934内のL1キャッシュから読み取られ、必要に応じて、L2キャッシュ、ローカル並列プロセッサ・メモリ、又はシステム・メモリからフェッチされる。少なくとも1つの実施例では、各グラフィックス・マルチプロセッサ1934は、処理されたタスクをデータ・クロスバー1940に出力して、処理されたタスクを、さらなる処理のために別の処理クラスタ1994に提供するか、或いは、処理されたタスクを、メモリ・クロスバー1916を介してL2キャッシュ、ローカル並列プロセッサ・メモリ、又はシステム・メモリに記憶する。少なくとも1つの実施例では、プレ・ラスタ演算ユニット(「プレROP」:pre-raster operation)1942は、グラフィックス・マルチプロセッサ1934からデータを受信し、データをROPユニットにダイレクトするように構成され、ROPユニットは、本明細書で説明されるようなパーティション・ユニット(たとえば、図19のパーティション・ユニット1920A~1920N)とともに位置し得る。少なくとも1つの実施例では、プレROP1942は、色ブレンディングのための最適化を実施し、ピクセル色データを組織化し、アドレス・トランスレーションを実施することができる。
【0136】
図19Cは、少なくとも1つの実施例による、グラフィックス・マルチプロセッサ1996を示す。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1996は、図19Bのグラフィックス・マルチプロセッサ1934である。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1996は、処理クラスタ1994のパイプライン・マネージャ1932と結合する。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1996は、限定はしないが、命令キャッシュ1952と、命令ユニット1954と、アドレス・マッピング・ユニット1956と、レジスタ・ファイル1958と、1つ又は複数のGPGPUコア1962と、1つ又は複数のLSU1966とを含む実行パイプラインを有する。GPGPUコア1962及びLSU1966は、メモリ及びキャッシュ相互接続1968を介してキャッシュ・メモリ1972及び共有メモリ1970と結合される。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1996は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1996は、実行されたとき、グラフィックス・マルチプロセッサ1996に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0137】
少なくとも1つの実施例では、命令キャッシュ1952は、実行すべき命令のストリームをパイプライン・マネージャ1932から受信する。少なくとも1つの実施例では、命令は、命令キャッシュ1952においてキャッシュされ、命令ユニット1954による実行のためにディスパッチされる。少なくとも1つの実施例では、命令ユニット1954は、命令をスレッド・グループ(たとえば、ワープ)としてディスパッチすることができ、スレッド・グループの各スレッドは、GPGPUコア1962内の異なる実行ユニットに割り当てられる。少なくとも1つの実施例では、命令は、統一アドレス空間内のアドレスを指定することによって、ローカル、共有、又はグローバルのアドレス空間のいずれかにアクセスすることができる。少なくとも1つの実施例では、アドレス・マッピング・ユニット1956は、統一アドレス空間中のアドレスを、LSU1966によってアクセスされ得る個別メモリ・アドレスにトランスレートするために使用され得る。
【0138】
少なくとも1つの実施例では、レジスタ・ファイル1958は、グラフィックス・マルチプロセッサ1996の機能ユニットにレジスタのセットを提供する。少なくとも1つの実施例では、レジスタ・ファイル1958は、グラフィックス・マルチプロセッサ1996の機能ユニット(たとえば、GPGPUコア1962、LSU1966)のデータ経路に接続された、オペランドのための一時的ストレージを提供する。少なくとも1つの実施例では、レジスタ・ファイル1958は、各機能ユニットがレジスタ・ファイル1958の専用部分を割り振られるように、機能ユニットの各々の間で分割される。少なくとも1つの実施例では、レジスタ・ファイル1958は、グラフィックス・マルチプロセッサ1996によって実行されている異なるスレッド・グループ間で分割される。
【0139】
少なくとも1つの実施例では、GPGPUコア1962は、各々、グラフィックス・マルチプロセッサ1996の命令を実行するために使用されるFPU及び/又は整数ALUを含むことができる。GPGPUコア1962は、同様のアーキテクチャであることも異なるアーキテクチャであることもある。少なくとも1つの実施例では、GPGPUコア1962の第1の部分は、単精度FPU及び整数ALUを含み、GPGPUコア1962の第2の部分は、倍精度FPUを含む。少なくとも1つの実施例では、FPUは、浮動小数点算術のためのIEEE754-2008規格を実装することができるか、又は、可変精度の浮動小数点算術を有効にすることができる。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ1996は、追加として、矩形コピー動作又はピクセル・ブレンディング動作などの特定の機能を実施するための1つ又は複数の固定機能ユニット又は特別機能ユニットを含むことができる。少なくとも1つの実施例では、GPGPUコア1962のうちの1つ又は複数は、固定又は特別機能論理をも含むことができる。
【0140】
少なくとも1つの実施例では、GPGPUコア1962は、複数のデータ・セットに対して単一の命令を実施することが可能なSIMD論理を含む。少なくとも1つの実施例では、GPGPUコア1962は、SIMD4、SIMD8、及びSIMD16命令を物理的に実行し、SIMD1、SIMD2、及びSIMD32命令を論理的に実行することができる。少なくとも1つの実施例では、GPGPUコア1962のためのSIMD命令は、シェーダ・コンパイラによるコンパイル時に生成されるか、或いは、単一プログラム複数データ(「SPMD」:single program multiple data)又はSIMTアーキテクチャのために書かれ、コンパイルされたプログラムを実行しているときに自動的に生成され得る。少なくとも1つの実施例では、SIMT実行モデルのために構成されたプログラムの複数のスレッドは、単一のSIMD命令を介して実行され得る。たとえば、少なくとも1つの実施例では、同じ又は同様の動作を実施する8つのSIMTスレッドが、単一のSIMD8論理ユニットを介して並列に実行され得る。
【0141】
少なくとも1つの実施例では、メモリ及びキャッシュ相互接続1968は、グラフィックス・マルチプロセッサ1996の各機能ユニットをレジスタ・ファイル1958及び共有メモリ1970に接続する相互接続ネットワークである。少なくとも1つの実施例では、メモリ及びキャッシュ相互接続1968は、LSU1966が、共有メモリ1970とレジスタ・ファイル1958との間でロード動作及びストア動作を実装することを可能にするクロスバー相互接続である。少なくとも1つの実施例では、レジスタ・ファイル1958は、GPGPUコア1962と同じ周波数において動作することができ、したがって、GPGPUコア1962とレジスタ・ファイル1958との間のデータ転送は、非常に低いレイテンシである。少なくとも1つの実施例では、共有メモリ1970は、グラフィックス・マルチプロセッサ1996内の機能ユニット上で実行するスレッド間の通信を可能にするために使用され得る。少なくとも1つの実施例では、キャッシュ・メモリ1972は、たとえば、機能ユニットとテクスチャ・ユニット1936との間で通信されるテクスチャ・データをキャッシュするために、データ・キャッシュとして使用され得る。少なくとも1つの実施例では、共有メモリ1970は、キャッシュされる管理されるプログラムとしても使用され得る。少なくとも1つの実施例では、GPGPUコア1962上で実行しているスレッドは、キャッシュ・メモリ1972内に記憶される自動的にキャッシュされるデータに加えて、データを共有メモリ内にプログラム的に記憶することができる。
【0142】
少なくとも1つの実施例では、本明細書で説明されるような並列プロセッサ又はGPGPUは、グラフィックス動作、機械学習動作、パターン分析動作、及び様々な汎用GPU(GPGPU)機能を加速するために、ホスト/プロセッサ・コアに通信可能に結合される。少なくとも1つの実施例では、GPUは、バス又は他の相互接続(たとえば、PCIe又はNVLinkなどの高速相互接続)を介してホスト・プロセッサ/コアに通信可能に結合され得る。少なくとも1つの実施例では、GPUは、コアとして同じパッケージ又はチップに集積され、パッケージ又はチップの内部にあるプロセッサ・バス/相互接続を介してコアに通信可能に結合され得る。少なくとも1つの実施例では、GPUが接続される様式にかかわらず、プロセッサ・コアは、WD中に含まれているコマンド/命令のシーケンスの形態で、ワークをGPUに割り振り得る。少なくとも1つの実施例では、GPUは、次いで、これらのコマンド/命令を効率的に処理するための専用回路要素/論理を使用する。
【0143】
図20は、少なくとも1つの実施例による、グラフィックス・プロセッサ2000を示す。少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、リング相互接続2002と、パイプライン・フロント・エンド2004と、メディア・エンジン2037と、グラフィックス・コア2080A~2080Nとを含む。少なくとも1つの実施例では、リング相互接続2002は、グラフィックス・プロセッサ2000を、他のグラフィックス・プロセッサ又は1つ又は複数の汎用プロセッサ・コアを含む他の処理ユニットに結合する。少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、マルチコア処理システム内に組み込まれた多くのプロセッサのうちの1つである。少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、実行されたとき、グラフィックス・プロセッサ2000に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0144】
少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、リング相互接続2002を介してコマンドのバッチを受信する。少なくとも1つの実施例では、入って来るコマンドは、パイプライン・フロント・エンド2004中のコマンド・ストリーマ2003によって解釈される。少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、(1つ又は複数の)グラフィックス・コア2080A~2080Nを介して3Dジオメトリ処理及びメディア処理を実施するためのスケーラブル実行論理を含む。少なくとも1つの実施例では、3Dジオメトリ処理コマンドについて、コマンド・ストリーマ2003は、コマンドをジオメトリ・パイプライン2036に供給する。少なくとも1つの実施例では、少なくともいくつかのメディア処理コマンドについて、コマンド・ストリーマ2003は、コマンドをビデオ・フロント・エンド2034に供給し、ビデオ・フロント・エンド2034はメディア・エンジン2037と結合する。少なくとも1つの実施例では、メディア・エンジン2037は、ビデオ及び画像後処理のためのビデオ品質エンジン(「VQE」:Video Quality Engine)2030と、ハードウェア加速メディア・データ・エンコード及びデコードを提供するためのマルチ・フォーマット・エンコード/デコード(「MFX」:multi-format encode/decode)エンジン2033とを含む。少なくとも1つの実施例では、ジオメトリ・パイプライン2036及びメディア・エンジン2037は、各々、少なくとも1つのグラフィックス・コア2080Aによって提供されるスレッド実行リソースのための実行スレッドを生成する。
【0145】
少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、各々が(コア・サブ・スライスと呼ばれることもある)複数のサブ・コア2050A~550N、2060A~2060Nを有する、(コア・スライスと呼ばれることもある)モジュール式グラフィックス・コア2080A~2080Nを特徴とするスケーラブル・スレッド実行リソースを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、任意の数のグラフィックス・コア2080A~2080Nを有することができる。少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、少なくとも第1のサブ・コア2050A及び第2のサブ・コア2060Aを有するグラフィックス・コア2080Aを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、単一のサブ・コア(たとえば、サブ・コア2050A)をもつ低電力プロセッサである。少なくとも1つの実施例では、グラフィックス・プロセッサ2000は、各々が第1のサブ・コア2050A~2050Nのセットと第2のサブ・コア2060A~2060Nのセットとを含む、複数のグラフィックス・コア2080A~2080Nを含む。少なくとも1つの実施例では、第1のサブ・コア2050A~2050N中の各サブ・コアは、少なくとも、実行ユニット(「EU」:execution unit)2052A~2052N及びメディア/テクスチャ・サンプラ2054A~2054Nの第1のセットを含む。少なくとも1つの実施例では、第2のサブ・コア2060A~2060N中の各サブ・コアは、少なくとも、実行ユニット2062A~2062N及びサンプラ2064A~2064Nの第2のセットを含む。少なくとも1つの実施例では、各サブ・コア2050A~2050N、2060A~2060Nは、共有リソース2070A~2070Nのセットを共有する。少なくとも1つの実施例では、共有リソース2070は、共有キャッシュ・メモリ及びピクセル動作論理を含む。
【0146】
図21は、少なくとも1つの実施例による、プロセッサ2100を示す。少なくとも1つの実施例では、プロセッサ2100は、限定はしないが、命令を実施するための論理回路を含み得る。少なくとも1つの実施例では、プロセッサ2100は、x86命令、ARM命令、ASICのための特別命令などを含む命令を実施し得る。少なくとも1つの実施例では、プロセッサ2110は、カリフォルニア州サンタクララのIntel Corporationからの、MMX(商標)技術で可能にされたマイクロプロセッサ中の64ビット幅MMXレジスタなど、パック・データを記憶するためのレジスタを含み得る。少なくとも1つの実施例では、整数形式と浮動小数点形式の両方で利用可能なMMXレジスタは、SIMD及びストリーミングSIMD拡張(「SSE」:streaming SIMD extension)命令を伴うパック・データ要素で動作し得る。少なくとも1つの実施例では、SSE2、SSE3、SSE4、AVX、又はそれ以上(総称して「SSEx」と呼ばれる)技術に関係する128ビット幅XMMレジスタは、そのようなパック・データ・オペランドを保持し得る。少なくとも1つの実施例では、プロセッサ2110は、CUDAプログラムを加速するための命令を実施し得る。少なくとも1つの実施例では、プロセッサ2100は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、プロセッサ2100は、実行されたとき、プロセッサ2100に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0147】
少なくとも1つの実施例では、プロセッサ2100は、実行されるべき命令をフェッチし、プロセッサ・パイプラインにおいて後で使用されるべき命令を準備するためのイン・オーダー・フロント・エンド(「フロント・エンド」)2101を含む。少なくとも1つの実施例では、フロント・エンド2101は、いくつかのユニットを含み得る。少なくとも1つの実施例では、命令プリフェッチャ2126が、メモリから命令をフェッチし、命令を命令デコーダ2128にフィードし、命令デコーダ2128が命令を復号又は解釈する。たとえば、少なくとも1つの実施例では、命令デコーダ2128は、受信された命令を、実行のために「マイクロ命令」又は「マイクロ・オペレーション」と呼ばれる(「マイクロ・オプ」又は「uop」とも呼ばれる)1つ又は複数のオペレーションに復号する。少なくとも1つの実施例では、命令デコーダ2128は、命令を、動作を実施するためにマイクロアーキテクチャによって使用され得るオプコード及び対応するデータ並びに制御フィールドに構文解析する。少なくとも1つの実施例では、トレース・キャッシュ2130は、復号されたuopを、実行のためにuopキュー2134においてプログラム順のシーケンス又はトレースにアセンブルし得る。少なくとも1つの実施例では、トレース・キャッシュ2130が複雑な命令に遭遇したとき、マイクロコードROM2132が、動作を完了するために必要なuopを提供する。
【0148】
少なくとも1つの実施例では、単一のマイクロ・オプにコンバートされ得る命令もあれば、全動作を完了するためにいくつかのマイクロ・オプを必要とする命令もある。少なくとも1つの実施例では、命令を完了するために5つ以上のマイクロ・オプが必要とされる場合、命令デコーダ2128は、マイクロコードROM2132にアクセスして命令を実施し得る。少なくとも1つの実施例では、命令は、命令デコーダ2128における処理のために少数のマイクロ・オプに復号され得る。少なくとも1つの実施例では、命令は、動作を達成するためにいくつかのマイクロ・オプが必要とされる場合、マイクロコードROM2132内に記憶され得る。少なくとも1つの実施例では、トレース・キャッシュ2130は、マイクロコードROM2132からの1つ又は複数の命令を完了するために、エントリ・ポイント・プログラマブル論理アレイ(「PLA」:programmable logic array)を参照して、マイクロコード・シーケンスを読み取るための正しいマイクロ命令ポインタを決定する。少なくとも1つの実施例では、マイクロコードROM2132が命令のためにマイクロ・オプのシーケンシングを終えた後、機械のフロント・エンド2101は、トレース・キャッシュ2130からマイクロ・オプをフェッチすることを再開し得る。
【0149】
少なくとも1つの実施例では、アウト・オブ・オーダー実行エンジン(「アウト・オブ・オーダー・エンジン」)2103は、実行のために命令を準備し得る。少なくとも1つの実施例では、アウト・オブ・オーダー実行論理は、命令がパイプラインを下り、実行のためにスケジューリングされるときの性能を最適化するために、命令のフローを滑らかにし、それを並べ替えるためのいくつかのバッファを有する。アウト・オブ・オーダー実行エンジン2103は、限定はしないが、アロケータ/レジスタ・リネーマ2140と、メモリuopキュー2142と、整数/浮動小数点uopキュー2144と、メモリ・スケジューラ2146と、高速スケジューラ2102と、低速/汎用浮動小数点スケジューラ(「低速/汎用FP(floating point)スケジューラ」)2104と、単純浮動小数点スケジューラ(「単純FPスケジューラ」)2106とを含む。少なくとも1つの実施例では、高速スケジューラ2102、低速/汎用浮動小数点スケジューラ2104、及び単純浮動小数点スケジューラ2106は、総称して本明細書では「uopスケジューラ2102、2104、2106」とも呼ばれる。アロケータ/レジスタ・リネーマ2140は、実行するために各uopが必要とする機械バッファ及びリソースを割り振る。少なくとも1つの実施例では、アロケータ/レジスタ・リネーマ2140は、レジスタ・ファイルへのエントリ時に論理レジスタをリネームする。少なくとも1つの実施例では、アロケータ/レジスタ・リネーマ2140はまた、メモリ・スケジューラ2146及びuopスケジューラ2102、2104、2106の前の、2つのuopキュー、すなわちメモリ動作のためのメモリuopキュー2142及び非メモリ動作のための整数/浮動小数点uopキュー2144のうちの1つにおいて、各uopのためのエントリを割り振る。少なくとも1つの実施例では、uopスケジューラ2102、2104、2106は、uopがいつ実行する準備ができるかを、それらの従属入力レジスタ・オペランド・ソースが準備されていることと、それらの動作を完了するためにuopが必要とする実行リソースの利用可能性とに基づいて、決定する。少なくとも1つの実施例では、少なくとも1つの実施例の高速スケジューラ2102は、メイン・クロック・サイクルの半分ごとにスケジューリングし得、低速/汎用浮動小数点スケジューラ2104及び単純浮動小数点スケジューラ2106は、メイン・プロセッサ・クロック・サイクル当たりに1回スケジューリングし得る。少なくとも1つの実施例では、uopスケジューラ2102、2104、2106は、実行のためにuopをスケジューリングするためにディスパッチ・ポートを調停する。
【0150】
少なくとも1つの実施例では、実行ブロック2111は、限定はしないが、整数レジスタ・ファイル/バイパス・ネットワーク2108と、浮動小数点レジスタ・ファイル/バイパス・ネットワーク(「FPレジスタ・ファイル/バイパス・ネットワーク」)2110と、アドレス生成ユニット(「AGU」:address generation unit)2112及び2114と、高速ALU2116及び2118と、低速ALU2120と、浮動小数点ALU(「FP」)2122と、浮動小数点移動ユニット(「FP移動」)2124とを含む。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2108及び浮動小数点レジスタ・ファイル/バイパス・ネットワーク2110は、本明細書では「レジスタ・ファイル2108、2110」とも呼ばれる。少なくとも1つの実施例では、AGU2112及び2114、高速ALU2116及び2118、低速ALU2120、浮動小数点ALU2122、及び浮動小数点移動ユニット2124は、本明細書では「実行ユニット2112、2114、2116、2118、2120、2122、及び2124」とも呼ばれる。少なくとも1つの実施例では、実行ブロックは、限定はしないが、(ゼロを含む)任意の数及びタイプのレジスタ・ファイル、バイパス・ネットワーク、アドレス生成ユニット、及び実行ユニットを、任意の組合せで含み得る。
【0151】
少なくとも1つの実施例では、レジスタ・ファイル2108、2110は、uopスケジューラ2102、2104、2106と、実行ユニット2112、2114、2116、2118、2120、2122、及び2124との間に配置され得る。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2108は、整数演算を実施する。少なくとも1つの実施例では、浮動小数点レジスタ・ファイル/バイパス・ネットワーク2110は、浮動小数点演算を実施する。少なくとも1つの実施例では、レジスタ・ファイル2108、2110の各々は、限定はしないが、バイパス・ネットワークを含み得、バイパス・ネットワークは、レジスタ・ファイルにまだ書き込まれていない完了したばかりの結果を、新しい従属uopにバイパス又はフォワーディングし得る。少なくとも1つの実施例では、レジスタ・ファイル2108、2110は、互いにデータを通信し得る。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2108は、限定はしないが、2つの別個のレジスタ・ファイル、すなわち低次32ビットのデータのための1つのレジスタ・ファイル及び高次32ビットのデータのための第2のレジスタ・ファイルを含み得る。少なくとも1つの実施例では、浮動小数点命令は、通常、64~128ビット幅のオペランドを有するので、浮動小数点レジスタ・ファイル/バイパス・ネットワーク2110は、限定はしないが、128ビット幅のエントリを含み得る。
【0152】
少なくとも1つの実施例では、実行ユニット2112、2114、2116、2118、2120、2122、2124は、命令を実行し得る。少なくとも1つの実施例では、レジスタ・ファイル2108、2110は、マイクロ命令が実行する必要がある整数及び浮動小数点データ・オペランド値を記憶する。少なくとも1つの実施例では、プロセッサ2100は、限定はしないが、任意の数及び組合せの実行ユニット2112、2114、2116、2118、2120、2122、2124を含み得る。少なくとも1つの実施例では、浮動小数点ALU2122及び浮動小数点移動ユニット2124は、浮動小数点、MMX、SIMD、AVX及びSSE、又は他の演算を実行し得る。少なくとも1つの実施例では、浮動小数点ALU2122は、限定はしないが、除算、平方根、及び剰余マイクロ・オプを実行するための64ビットずつの浮動小数点デバイダを含み得る。少なくとも1つの実施例では、浮動小数点値を伴う命令は、浮動小数点ハードウェアで対処され得る。少なくとも1つの実施例では、ALU演算は、高速ALU2116、2118に渡され得る。少なくとも1つの実施例では、高速ALU2116、2118は、クロック・サイクルの半分の実効レイテンシを伴う高速演算を実行し得る。少なくとも1つの実施例では、低速ALU2120は、限定はしないが、乗数、シフト、フラグ論理、及びブランチ処理などの長レイテンシ・タイプの演算のための整数実行ハードウェアを含み得るので、ほとんどの複雑な整数演算は低速ALU2120に進む。少なくとも1つの実施例では、メモリ・ロード/ストア動作は、AGU2112、2114によって実行され得る。少なくとも1つの実施例では、高速ALU2116、高速ALU2118、及び低速ALU2120は、64ビット・データ・オペランドで整数演算を実施し得る。少なくとも1つの実施例では、高速ALU2116、高速ALU2118、及び低速ALU2120は、16、32、128、256などを含む様々なデータ・ビット・サイズをサポートするために実装され得る。少なくとも1つの実施例では、浮動小数点ALU2122及び浮動小数点移動ユニット2124は、様々なビット幅を有する様々なオペランドをサポートするために実装され得る。少なくとも1つの実施例では、浮動小数点ALU2122及び浮動小数点移動ユニット2124は、SIMD及びマルチメディア命令と併せた128ビット幅のパック・データ・オペランドで動作し得る。
【0153】
少なくとも1つの実施例では、uopスケジューラ2102、2104、2106は、親ロードが実行し終える前に従属演算をディスパッチする。少なくとも1つの実施例では、uopは、プロセッサ2100において投機的にスケジューリング及び実行され得るので、プロセッサ2100は、メモリ・ミスに対処するための論理をも含み得る。少なくとも1つの実施例では、データ・キャッシュにおいてデータ・ロードがミスした場合、一時的に不正確なデータをもつスケジューラを通り過ぎたパイプラインにおいて、進行中の従属演算があり得る。少なくとも1つの実施例では、リプレイ機構が、不正確なデータを使用する命令を追跡及び再実行する。少なくとも1つの実施例では、従属演算は、リプレイされる必要があり得、独立した演算は、完了することを可能にされ得る。少なくとも1つの実施例では、プロセッサの少なくとも1つの実施例のスケジューラ及びリプレイ機構はまた、テキスト・ストリング比較演算のための命令シーケンスを捕捉するように設計され得る。
【0154】
少なくとも1つの実施例では、「レジスタ」という用語は、オペランドを識別するための命令の一部として使用され得るオンボード・プロセッサ・ストレージ・ロケーションを指し得る。少なくとも1つの実施例では、レジスタは、(プログラマの視点から見て)プロセッサの外部から使用可能であり得るものであり得る。少なくとも1つの実施例では、レジスタは、特定のタイプの回路に限定されないことがある。むしろ、少なくとも1つの実施例では、レジスタは、データを記憶し、データを提供し、本明細書で説明される機能を実施し得る。少なくとも1つの実施例では、本明細書で説明されるレジスタは、専用物理レジスタ、レジスタ・リネーミングを使用して動的に割り振られる物理レジスタ、専用物理レジスタと動的に割り振られる物理レジスタとの組合せなど、任意の数の異なる技法を使用して、プロセッサ内の回路要素によって実装され得る。少なくとも1つの実施例では、整数レジスタは、32ビット整数データを記憶する。少なくとも1つの実施例のレジスタ・ファイルは、パック・データのための8つのマルチメディアSIMDレジスタをも含んでいる。
【0155】
図22は、少なくとも1つの実施例による、プロセッサ2200を示す。少なくとも1つの実施例では、プロセッサ2200は、限定はしないが、1つ又は複数のプロセッサ・コア(「コア」)2202A~2202Nと、統合されたメモリ・コントローラ2214と、統合されたグラフィックス・プロセッサ2208とを含む。少なくとも1つの実施例では、プロセッサ2200は、破線ボックスによって表される追加プロセッサ・コア2202Nまでの追加コアを含むことができる。少なくとも1つの実施例では、プロセッサ・コア2202A~2202Nの各々は、1つ又は複数の内部キャッシュ・ユニット2204A~2204Nを含む。少なくとも1つの実施例では、各プロセッサ・コアはまた、1つ又は複数の共有キャッシュ・ユニット2206へのアクセスを有する。少なくとも1つの実施例では、プロセッサ2200は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、プロセッサ2200は、実行されたとき、プロセッサ2200に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0156】
少なくとも1つの実施例では、内部キャッシュ・ユニット2204A~2204Nと共有キャッシュ・ユニット2206とは、プロセッサ2200内のキャッシュ・メモリ階層を表す。少なくとも1つの実施例では、キャッシュ・メモリ・ユニット2204A~2204Nは、各プロセッサ・コア内の命令及びデータ・キャッシュの少なくとも1つのレベル、及びL2、L3、レベル4(「L4」)などの共有中間レベル・キャッシュの1つ又は複数のレベル、又はキャッシュの他のレベルを含み得、ここで、外部メモリの前の最高レベルのキャッシュは、LLCとして分類される。少なくとも1つの実施例では、キャッシュ・コヒーレンシ論理は、様々なキャッシュ・ユニット2206及び2204A~2204N間でコヒーレンシを維持する。
【0157】
少なくとも1つの実施例では、プロセッサ2200は、1つ又は複数のバス・コントローラ・ユニット2216とシステム・エージェント・コア2210とのセットをも含み得る。少なくとも1つの実施例では、1つ又は複数のバス・コントローラ・ユニット2216は、1つ又は複数のPCI又はPCIエクスプレス・バスなどの周辺バスのセットを管理する。少なくとも1つの実施例では、システム・エージェント・コア2210は、様々なプロセッサ構成要素のための管理機能性を提供する。少なくとも1つの実施例では、システム・エージェント・コア2210は、様々な外部メモリ・デバイス(図示せず)へのアクセスを管理するための1つ又は複数の統合されたメモリ・コントローラ2214を含む。
【0158】
少なくとも1つの実施例では、プロセッサ・コア2202A~2202Nのうちの1つ又は複数は、同時マルチスレッディングのサポートを含む。少なくとも1つの実施例では、システム・エージェント・コア2210は、マルチスレッド処理中にプロセッサ・コア2202A~2202Nを協調させ、動作させるための構成要素を含む。少なくとも1つの実施例では、システム・エージェント・コア2210は、追加として、電力制御ユニット(「PCU」:power control unit)を含み得、PCUは、プロセッサ・コア2202A~2202N及びグラフィックス・プロセッサ2208の1つ又は複数の電力状態を調節するための論理及び構成要素を含む。
【0159】
少なくとも1つの実施例では、プロセッサ2200は、追加として、グラフィックス処理動作を実行するためのグラフィックス・プロセッサ2208を含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2208は、共有キャッシュ・ユニット2206、及び1つ又は複数の統合されたメモリ・コントローラ2214を含むシステム・エージェント・コア2210と結合する。少なくとも1つの実施例では、システム・エージェント・コア2210は、1つ又は複数の結合されたディスプレイへのグラフィックス・プロセッサ出力を駆動するためのディスプレイ・コントローラ2211をも含む。少なくとも1つの実施例では、ディスプレイ・コントローラ2211はまた、少なくとも1つの相互接続を介してグラフィックス・プロセッサ2208と結合された別個のモジュールであり得るか、又はグラフィックス・プロセッサ2208内に組み込まれ得る。
【0160】
少なくとも1つの実施例では、プロセッサ2200の内部構成要素を結合するために、リング・ベースの相互接続ユニット2212が使用される。少なくとも1つの実施例では、ポイントツーポイント相互接続、切替え相互接続、又は他の技法などの代替相互接続ユニットが使用され得る。少なくとも1つの実施例では、グラフィックス・プロセッサ2208は、I/Oリンク2213を介してリング相互接続2212と結合する。
【0161】
少なくとも1つの実施例では、I/Oリンク2213は、様々なプロセッサ構成要素と、eDRAMモジュールなどの高性能組み込みメモリ・モジュール2218との間の通信を容易にするオンパッケージI/O相互接続を含む、複数の種類のI/O相互接続のうちの少なくとも1つを表す。少なくとも1つの実施例では、プロセッサ・コア2202A~2202Nの各々と、グラフィックス・プロセッサ2208とは、共有LLCとして組み込みメモリ・モジュール2218を使用する。
【0162】
少なくとも1つの実施例では、プロセッサ・コア2202A~2202Nは、共通の命令セット・アーキテクチャを実行する同種のコアである。少なくとも1つの実施例では、プロセッサ・コア2202A~2202Nは、ISAという観点から異種であり、ここで、プロセッサ・コア2202A~2202Nのうちの1つ又は複数は、共通の命令セットを実行し、プロセッサ・コア2202A~22-02Nのうちの1つ又は複数の他のコアは、共通の命令セットのサブセット、又は異なる命令セットを実行する。少なくとも1つの実施例では、プロセッサ・コア2202A~2202Nは、マイクロアーキテクチャという観点から異種であり、ここで、電力消費量が比較的高い1つ又は複数のコアは、電力消費量がより低い1つ又は複数のコアと結合する。少なくとも1つの実施例では、プロセッサ2200は、1つ又は複数のチップ上に、又はSoC集積回路として実装され得る。
【0163】
図23は、説明される少なくとも1つの実施例による、グラフィックス・プロセッサ・コア2300を示す。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2300は、グラフィックス・コア・アレイ内に含まれる。少なくとも1つの実施例では、コア・スライスと呼ばれることもあるグラフィックス・プロセッサ・コア2300は、モジュール式グラフィックス・プロセッサ内の1つ又は複数のグラフィックス・コアであり得る。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2300は、1つのグラフィックス・コア・スライスの例示であり、本明細書で説明されるグラフィックス・プロセッサは、ターゲット電力及び性能エンベロープに基づいて、複数のグラフィックス・コア・スライスを含み得る。少なくとも1つの実施例では、各グラフィックス・コア2300は、汎用及び固定機能論理のモジュール式ブロックを含む、サブ・スライスとも呼ばれる複数のサブ・コア2301A~2301Fと結合された固定機能ブロック2330を含むことができる。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2300は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2300は、実行されたとき、グラフィックス・プロセッサ・コア2300に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0164】
少なくとも1つの実施例では、固定機能ブロック2330は、たとえば、より低い性能及び/又はより低い電力のグラフィックス・プロセッサ実装形態において、グラフィックス・プロセッサ2300中のすべてのサブ・コアによって共有され得るジオメトリ/固定機能パイプライン2336を含む。少なくとも1つの実施例では、ジオメトリ/固定機能パイプライン2336は、3D固定機能パイプラインと、ビデオ・フロント・エンド・ユニットと、スレッド・スポーナ(spawner)及びスレッド・ディスパッチャと、統一リターン・バッファを管理する統一リターン・バッファ・マネージャとを含む。
【0165】
少なくとも1つの実施例では、固定機能ブロック2330はまた、グラフィックスSoCインターフェース2337と、グラフィックス・マイクロコントローラ2338と、メディア・パイプライン2339とを含む。グラフィックスSoCインターフェース2337は、グラフィックス・コア2300と、SoC集積回路内の他のプロセッサ・コアとの間のインターフェースを提供する。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2338は、スレッド・ディスパッチと、スケジューリングと、プリエンプションとを含む、グラフィックス・プロセッサ2300の様々な機能を管理するように構成可能であるプログラマブル・サブ・プロセッサである。少なくとも1つの実施例では、メディア・パイプライン2339は、画像及びビデオ・データを含むマルチメディア・データの復号、符号化、前処理、及び/又は後処理を容易にするための論理を含む。少なくとも1つの実施例では、メディア・パイプライン2339は、サブ・コア2301~2301F内のコンピュート論理又はサンプリング論理への要求を介して、メディア動作を実装する。
【0166】
少なくとも1つの実施例では、SoCインターフェース2337は、グラフィックス・コア2300が汎用アプリケーション・プロセッサ・コア(たとえば、CPU)及び/又はSoC内の他の構成要素と通信することを可能にし、SoC内の他の構成要素は、共有LLCメモリ、システムRAM、及び/或いは組み込みオンチップ又はオンパッケージDRAMなどのメモリ階層要素を含む。少なくとも1つの実施例では、SoCインターフェース2337はまた、カメラ撮像パイプラインなど、SoC内の固定機能デバイスとの通信を可能にすることができ、グラフィックス・コア2300とSoC内のCPUとの間で共有され得るグローバル・メモリ・アトミックの使用を可能にし、及び/又はそれを実装する。少なくとも1つの実施例では、SoCインターフェース2337はまた、グラフィックス・コア2300のための電力管理制御を実装し、グラフィック・コア2300のクロック・ドメインとSoC内の他のクロック・ドメインとの間のインターフェースを可能にすることができる。少なくとも1つの実施例では、SoCインターフェース2337は、グラフィックス・プロセッサ内の1つ又は複数のグラフィックス・コアの各々にコマンド及び命令を提供するように構成されたコマンド・ストリーマ及びグローバル・スレッド・ディスパッチャからのコマンド・バッファの受信を可能にする。少なくとも1つの実施例では、コマンド及び命令は、メディア動作が実施されるべきであるときにメディア・パイプライン2339にディスパッチされ得るか、又は、グラフィックス処理動作が実施されるべきであるときにジオメトリ及び固定機能パイプライン(たとえば、ジオメトリ及び固定機能パイプライン2336、ジオメトリ及び固定機能パイプライン2314)にディスパッチされ得る。
【0167】
少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2338は、グラフィックス・コア2300のための様々なスケジューリング及び管理タスクを実施するように構成され得る。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2338は、サブ・コア2301A~2301F内の実行ユニット(EU)アレイ2302A~2302F、2304A~2304F内の様々なグラフィックス並列エンジンに対して、グラフィックスを実施し、及び/又はワークロード・スケジューリングを算出することができる。少なくとも1つの実施例では、グラフィックス・コア2300を含むSoCのCPUコア上で実行しているホスト・ソフトウェアは、複数のグラフィック・プロセッサ・ドアベルのうちの1つにワークロードをサブミットすることができ、このドアベルが、適切なグラフィックス・エンジンに対するスケジューリング動作を呼び出す。少なくとも1つの実施例では、スケジューリング動作は、どのワークロードを次に稼働すべきかを決定することと、ワークロードをコマンド・ストリーマにサブミットすることと、エンジン上で稼働している既存のワークロードをプリエンプトすることと、ワークロードの進行を監視することと、ワークロードが完了したときにホスト・ソフトウェアに通知することとを含む。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2338はまた、グラフィックス・コア2300のための低電力又はアイドル状態を促進して、オペレーティング・システム及び/又はシステム上のグラフィックス・ドライバ・ソフトウェアとは無関係に、低電力状態移行にわたってグラフィックス・コア2300内のレジスタを保存及び復元するアビリティをグラフィックス・コア2300に提供することができる。
【0168】
少なくとも1つの実施例では、グラフィックス・コア2300は、示されているサブ・コア2301A~2301Fよりも多い又はそれよりも少ない、N個までのモジュール式サブ・コアを有し得る。N個のサブ・コアの各セットについて、少なくとも1つの実施例では、グラフィックス・コア2300はまた、共有機能論理2310、共有及び/又はキャッシュ・メモリ2312、ジオメトリ/固定機能パイプライン2314、並びに様々なグラフィックスを加速し、処理動作を算出するための追加の固定機能論理2316を含むことができる。少なくとも1つの実施例では、共有機能論理2310は、グラフィックス・コア2300内の各N個のサブ・コアによって共有され得る論理ユニット(たとえば、サンプラ、数理、及び/又はスレッド間通信論理)を含むことができる。共有及び/又はキャッシュ・メモリ2312は、グラフィックス・コア2300内のN個のサブ・コア2301A~2301FのためのLLCであり得、また、複数のサブ・コアによってアクセス可能である共有メモリとして働き得る。少なくとも1つの実施例では、ジオメトリ/固定機能パイプライン2314は、固定機能ブロック2330内のジオメトリ/固定機能パイプライン2336の代わりに含まれ得、同じ又は同様の論理ユニットを含むことができる。
【0169】
少なくとも1つの実施例では、グラフィックス・コア2300は、グラフィックス・コア2300による使用のための様々な固定機能加速論理を含むことができる追加の固定機能論理2316を含む。少なくとも1つの実施例では、追加の固定機能論理2316は、位置限定シェーディング(position only shading)において使用するための追加のジオメトリ・パイプラインを含む。位置限定シェーディングでは、少なくとも2つのジオメトリ・パイプラインが存在するが、ジオメトリ/固定機能パイプライン2316、2336内の完全ジオメトリ・パイプライン、並びに選別パイプライン(cull pipeline)においてであり、選別パイプラインは、追加の固定機能論理2316内に含まれ得る追加のジオメトリ・パイプラインである。少なくとも1つの実施例では、選別パイプラインは、完全ジオメトリ・パイプラインの縮小版である。少なくとも1つの実施例では、完全パイプライン及び選別パイプラインは、アプリケーションの異なるインスタンスを実行することができ、各インスタンスは別個のコンテキストを有する。少なくとも1つの実施例では、位置限定シェーディングは、切り捨てられた三角形の長い選別ランを隠すことができ、これは、いくつかのインスタンスにおいてシェーディングがより早く完了することを可能にする。たとえば、少なくとも1つの実施例では、選別パイプラインは、ピクセルの、フレーム・バッファへのラスタ化及びレンダリングを実施することなしに、頂点の位置属性をフェッチし、シェーディングするので、追加の固定機能論理2316内の選別パイプライン論理は、メイン・アプリケーションと並列で位置シェーダを実行することができ、全体的に完全パイプラインよりも速く臨界結果(critical result)を生成する。少なくとも1つの実施例では、選別パイプラインは、生成された臨界結果を使用して、すべての三角形について、それらの三角形が選別されているかどうかにかかわらず、可視性情報を算出することができる。少なくとも1つの実施例では、(このインスタンスではリプレイ・パイプラインと呼ばれることがある)完全パイプラインは、可視性情報を消費して、選別された三角形を飛ばして可視三角形のみをシェーディングすることができ、可視三角形は、最終的にラスタ化フェーズに渡される。
【0170】
少なくとも1つの実施例では、追加の固定機能論理2316はまた、CUDAプログラムを加速するために、固定機能行列乗算論理など、汎用処理加速論理を含むことができる。
【0171】
少なくとも1つの実施例では、各グラフィックス・サブ・コア2301A~2301Fは、実行リソースのセットを含み、実行リソースのセットは、グラフィックス・パイプライン、メディア・パイプライン、又はシェーダ・プログラムによる要求に応答して、グラフィックス動作、メディア動作、及びコンピュート動作を実施するために使用され得る。少なくとも1つの実施例では、グラフィックス・サブ・コア2301A~2301Fは、複数のEUアレイ2302A~2302F、2304A~2304Fと、スレッド・ディスパッチ及びスレッド間通信(「TD/IC」:thread dispatch and inter-thread communication)論理2303A~2303Fと、3D(たとえば、テクスチャ)サンプラ2305A~2305Fと、メディア・サンプラ2306A~2306Fと、シェーダ・プロセッサ2307A~2307Fと、共有ローカル・メモリ(「SLM」:shared local memory)2308A~2308Fとを含む。EUアレイ2302A~2302F、2304A~2304Fは、各々、複数の実行ユニットを含み、複数の実行ユニットは、グラフィックス、メディア、又はコンピュート・シェーダ・プログラムを含むグラフィックス動作、メディア動作、又はコンピュート動作のサービスにおいて浮動小数点及び整数/固定小数点論理演算を実施することが可能なGPGPUである。少なくとも1つの実施例では、TD/IC論理2303A~2303Fは、サブ・コア内の実行ユニットのためのローカル・スレッド・ディスパッチ及びスレッド制御動作を実施し、サブ・コアの実行ユニット上で実行しているスレッド間の通信を容易にする。少なくとも1つの実施例では、3Dサンプラ2305A~2305Fは、テクスチャ又は他の3Dグラフィックス関係データをメモリに読み取ることができる。少なくとも1つの実施例では、3Dサンプラは、所与のテクスチャに関連する、構成されたサンプル状態及びテクスチャ・フォーマットに基づいて、テクスチャ・データを異なるやり方で読み取ることができる。少なくとも1つの実施例では、メディア・サンプラ2306A~2306Fは、メディア・データに関連するタイプ及びフォーマットに基づいて、同様の読取り動作を実施することができる。少なくとも1つの実施例では、各グラフィックス・サブ・コア2301A~2301Fは、代替的に統一3D及びメディア・サンプラを含むことができる。少なくとも1つの実施例では、サブ・コア2301A~2301Fの各々内の実行ユニット上で実行しているスレッドは、スレッド・グループ内で実行しているスレッドがオンチップ・メモリの共通のプールを使用して実行することを可能にするために、各サブ・コア内の共有ローカル・メモリ2308A~2308Fを利用することができる。
【0172】
図24は、少なくとも1つの実施例による、並列処理ユニット(「PPU」:parallel processing unit)2400を示す。少なくとも1つの実施例では、PPU2400は、PPU2400によって実行された場合、PPU2400に、本明細書で説明されるプロセス及び技法のいくつか又はすべてを実施させる機械可読コードで構成される。少なくとも1つの実施例では、PPU2400はマルチスレッド・プロセッサであり、マルチスレッド・プロセッサは、1つ又は複数の集積回路デバイス上で実装され、(機械可読命令又は単に命令とも呼ばれる)コンピュータ可読命令を複数のスレッド上で並列に処理するように設計されたレイテンシ隠蔽技法としてマルチスレッディングを利用する。少なくとも1つの実施例では、スレッドは、実行のスレッドを指し、PPU2400によって実行されるように構成された命令のセットのインスタンス化である。少なくとも1つの実施例では、PPU2400は、LCDデバイスなどのディスプレイ・デバイス上での表示のための2次元(「2D」)画像データを生成するために3次元(「3D」)グラフィックス・データを処理するためのグラフィックス・レンダリング・パイプラインを実装するように構成されたGPUである。少なくとも1つの実施例では、PPU2400は、線形代数演算及び機械学習演算などの算出を実施するために利用される。図24は、単に例示を目的とした例示的な並列プロセッサを示し、少なくとも1つの実施例において実装され得るプロセッサ・アーキテクチャの非限定的な実例として解釈されるべきである。少なくとも1つの実施例では、PPU2400は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、PPU2400は、実行されたとき、PPU2400に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0173】
少なくとも1つの実施例では、1つ又は複数のPPU2400は、高性能コンピューティング(「HPC」:High Performance Computing)、データ・センタ、及び機械学習アプリケーションを加速するように構成される。少なくとも1つの実施例では、1つ又は複数のPPU2400は、CUDAプログラムを加速するように構成される。少なくとも1つの実施例では、PPU2400は、限定はしないが、I/Oユニット2406と、フロント・エンド・ユニット2410と、スケジューラ・ユニット2412と、ワーク分散ユニット2414と、ハブ2416と、クロスバー(「Xバー」:crossbar)2420と、1つ又は複数の汎用処理クラスタ(「GPC」:general processing cluster)2418と、1つ又は複数のパーティション・ユニット(「メモリ・パーティション・ユニット」)2422とを含む。少なくとも1つの実施例では、PPU2400は、1つ又は複数の高速GPU相互接続(「GPU相互接続」)2408を介してホスト・プロセッサ又は他のPPU2400に接続される。少なくとも1つの実施例では、PPU2400は、システム・バス又は相互接続2402を介してホスト・プロセッサ又は他の周辺デバイスに接続される。少なくとも1つの実施例では、PPU2400は、1つ又は複数のメモリ・デバイス(「メモリ」)2404を備えるローカル・メモリに接続される。少なくとも1つの実施例では、メモリ・デバイス2404は、限定はしないが、1つ又は複数のダイナミック・ランダム・アクセス・メモリ(DRAM)デバイスを含む。少なくとも1つの実施例では、1つ又は複数のDRAMデバイスは、複数のDRAMダイが各デバイス内で積層された高帯域幅メモリ(「HBM」:high-bandwidth memory)サブシステムとして構成され、及び/又は構成可能である。
【0174】
少なくとも1つの実施例では、高速GPU相互接続2408は、ワイヤ・ベースのマルチ・レーン通信リンクを指し得、ワイヤ・ベースのマルチ・レーン通信リンクは、1つ又は複数のCPUと組み合わせられた1つ又は複数のPPU2400をスケーリングし、含めるために、システムによって使用され、PPU2400とCPUとの間のキャッシュ・コヒーレンス、及びCPUマスタリングをサポートする。少なくとも1つの実施例では、データ及び/又はコマンドは、高速GPU相互接続2408によって、ハブ2416を通して、1つ又は複数のコピー・エンジン、ビデオ・エンコーダ、ビデオ・デコーダ、電力管理ユニット、及び図24に明示的に示されていないこともある他の構成要素など、PPU2400の他のユニットに/から送信される。
【0175】
少なくとも1つの実施例では、I/Oユニット2406は、システム・バス2402を介して(図24に示されていない)ホスト・プロセッサから通信(たとえば、コマンド、データ)を送受信するように構成される。少なくとも1つの実施例では、I/Oユニット2406は、システム・バス2402を介して直接、又は、メモリ・ブリッジなどの1つ又は複数の中間デバイスを通して、ホスト・プロセッサと通信する。少なくとも1つの実施例では、I/Oユニット2406は、システム・バス2402を介してPPU2400のうちの1つ又は複数などの1つ又は複数の他のプロセッサと通信し得る。少なくとも1つの実施例では、I/Oユニット2406は、PCIeインターフェースを、PCIeバスを介した通信のために実装する。少なくとも1つの実施例では、I/Oユニット2406は、外部デバイスと通信するためのインターフェースを実装する。
【0176】
少なくとも1つの実施例では、I/Oユニット2406は、システム・バス2402を介して受信されたパケットを復号する。少なくとも1つの実施例では、少なくともいくつかのパケットは、PPU2400に様々な動作を実施させるように構成されたコマンドを表す。少なくとも1つの実施例では、I/Oユニット2406は、復号されたコマンドを、コマンドによって指定されるPPU2400の様々な他のユニットに送信する。少なくとも1つの実施例では、コマンドは、フロント・エンド・ユニット2410に送信され、及び/或いは、ハブ2416、又は(図24に明示的に示されていない)1つ又は複数のコピー・エンジン、ビデオ・エンコーダ、ビデオ・デコーダ、電力管理ユニットなど、PPU2400の他のユニットに送信される。少なくとも1つの実施例では、I/Oユニット2406はPPU2400の様々な論理ユニット間で及びそれらの間で通信をルーティングするように構成される。
【0177】
少なくとも1つの実施例では、ホスト・プロセッサによって実行されるプログラムは、処理のためにワークロードをPPU2400に提供するバッファにおいて、コマンド・ストリームを符号化する。少なくとも1つの実施例では、ワークロードは、命令と、それらの命令によって処理されるべきデータとを含む。少なくとも1つの実施例では、バッファは、ホスト・プロセッサとPPU2400の両方によってアクセス(たとえば、書込み/読取り)可能であるメモリ中の領域であり、ホスト・インターフェース・ユニットは、I/Oユニット2406によってシステム・バス2402を介して送信されるメモリ要求を介して、システム・バス2402に接続されたシステム・メモリ中のバッファにアクセスするように構成され得る。少なくとも1つの実施例では、ホスト・プロセッサは、バッファにコマンド・ストリームを書き込み、次いでコマンド・ストリームの開始に対するポインタをPPU2400に送信し、それにより、フロント・エンド・ユニット2410は、1つ又は複数のコマンド・ストリームに対するポインタを受信し、1つ又は複数のコマンド・ストリームを管理して、コマンド・ストリームからコマンドを読み取り、コマンドをPPU2400の様々なユニットにフォワーディングする。
【0178】
少なくとも1つの実施例では、フロント・エンド・ユニット2410は、1つ又は複数のコマンド・ストリームによって定義されるタスクを処理するように様々なGPC2418を構成するスケジューラ・ユニット2412に結合される。少なくとも1つの実施例では、スケジューラ・ユニット2412は、スケジューラ・ユニット2412によって管理される様々なタスクに関係する状態情報を追跡するように構成され、状態情報は、GPC2418のうちのどれにタスクが割り当てられるか、タスクがアクティブであるのか非アクティブであるのか、タスクに関連する優先レベルなどを示し得る。少なくとも1つの実施例では、スケジューラ・ユニット2412は、GPC2418のうちの1つ又は複数上での複数のタスクの実行を管理する。
【0179】
少なくとも1つの実施例では、スケジューラ・ユニット2412は、GPC2418上での実行のためのタスクをディスパッチするように構成されたワーク分散ユニット2414に結合される。少なくとも1つの実施例では、ワーク分散ユニット2414は、スケジューラ・ユニット2412から受信された、スケジューリングされたタスクの数を追跡し、ワーク分散ユニット2414は、GPC2418の各々について、ペンディング・タスク・プール及びアクティブ・タスク・プールを管理する。少なくとも1つの実施例では、ペンディング・タスク・プールは、特定のGPC2418によって処理されるように割り当てられたタスクを含んでいるいくつかのスロット(たとえば、32個のスロット)を備え、アクティブ・タスク・プールは、GPC2418によってアクティブに処理されているタスクのためのいくつかのスロット(たとえば、4つのスロット)を備え得、それにより、GPC2418のうちの1つがタスクの実行を完了したとき、GPC2418のためのアクティブ・タスク・プールからそのタスクが排除され、ペンディング・タスク・プールからの他のタスクのうちの1つが選択され、GPC2418上での実行のためにスケジューリングされる。少なくとも1つの実施例では、データ依存性が解決されるのを待っている間など、アクティブ・タスクがGPC2418上でアイドルである場合、アクティブ・タスクがGPC2418から排除され、ペンディング・タスク・プールに戻され、その間に、ペンディング・タスク・プール中の別のタスクが選択され、GPC2418上での実行のためにスケジューリングされる。
【0180】
少なくとも1つの実施例では、ワーク分散ユニット2414は、Xバー2420を介して1つ又は複数のGPC2418と通信する。少なくとも1つの実施例では、Xバー2420は、PPU2400の多くのユニットをPPU2400の他のユニットに結合する相互接続ネットワークであり、ワーク分散ユニット2414を特定のGPC2418に結合するように構成され得る。少なくとも1つの実施例では、PPU2400の1つ又は複数の他のユニットも、ハブ2416を介してXバー2420に接続され得る。
【0181】
少なくとも1つの実施例では、タスクはスケジューラ・ユニット2412によって管理され、ワーク分散ユニット2414によってGPC2418のうちの1つにディスパッチされる。GPC2418は、タスクを処理し、結果を生成するように構成される。少なくとも1つの実施例では、結果は、GPC2418内の他のタスクによって消費されるか、Xバー2420を介して異なるGPC2418にルーティングされるか、又はメモリ2404に記憶され得る。少なくとも1つの実施例では、結果は、パーティション・ユニット2422を介してメモリ2404に書き込まれ得、パーティション・ユニット2422は、メモリ2404への/からのデータの読取り及び書込みを行うためのメモリ・インターフェースを実装する。少なくとも1つの実施例では、結果は、高速GPU相互接続2408を介して別のPPU2404又はCPUに送信され得る。少なくとも1つの実施例では、PPU2400は、限定はしないが、PPU2400に結合された別個の個別メモリ・デバイス2404の数に等しいU個のパーティション・ユニット2422を含む。
【0182】
少なくとも1つの実施例では、ホスト・プロセッサはドライバ・カーネルを実行し、ドライバ・カーネルは、ホスト・プロセッサ上で実行している1つ又は複数のアプリケーションがPPU2400上での実行のために動作をスケジューリングすることを可能にするアプリケーション・プログラミング・インターフェース(「API」:application programming interface)を実装する。少なくとも1つの実施例では、複数のコンピュート・アプリケーションが、PPU2400によって同時に実行され、PPU2400は、複数のコンピュート・アプリケーションに対して、隔離、サービス品質(「QoS」:quality of service)、及び独立したアドレス空間を提供する。少なくとも1つの実施例では、アプリケーションは、PPU2400による実行のための1つ又は複数のタスクをドライバ・カーネルに生成させる(たとえば、APIコールの形態の)命令を生成し、ドライバ・カーネルは、PPU2400によって処理されている1つ又は複数のストリームにタスクを出力する。少なくとも1つの実施例では、各タスクは、ワープと呼ばれることがある関係スレッドの1つ又は複数のグループを備える。少なくとも1つの実施例では、ワープは、並列に実行され得る複数の関係スレッド(たとえば、32個のスレッド)を備える。少なくとも1つの実施例では、連動スレッドは、タスクを実施するための命令を含み、共有メモリを通してデータを交換する、複数のスレッドを指すことができる。
【0183】
図25は、少なくとも1つの実施例による、GPC2500を示す。少なくとも1つの実施例では、GPC2500は、図24のGPC2418である。少なくとも1つの実施例では、各GPC2500は、限定はしないが、タスクを処理するためのいくつかのハードウェア・ユニットを含み、各GPC2500は、限定はしないが、パイプライン・マネージャ2502、プレ・ラスタ演算ユニット(「PROP」:pre-raster operation)2504、ラスタ・エンジン2508、ワーク分散クロスバー(「WDX」:work distribution crossbar)2516、MMU2518、1つ又は複数のデータ処理クラスタ(「DPC」:Data Processing Cluster)2506、及びパーツの任意の好適な組合せを含む。少なくとも1つの実施例では、GPC2500は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、GPC2500は、実行されたとき、GPC2500に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0184】
少なくとも1つの実施例では、GPC2500の動作は、パイプライン・マネージャ2502によって制御される。少なくとも1つの実施例では、パイプライン・マネージャ2502は、GPC2500に割り振られたタスクを処理するための1つ又は複数のDPC2506の構成を管理する。少なくとも1つの実施例では、パイプライン・マネージャ2502は、グラフィックス・レンダリング・パイプラインの少なくとも一部分を実装するように、1つ又は複数のDPC2506のうちの少なくとも1つを構成する。少なくとも1つの実施例では、DPC2506は、プログラマブル・ストリーミング・マルチプロセッサ(「SM」:streaming multiprocessor)2514上で頂点シェーダ・プログラムを実行するように構成される。少なくとも1つの実施例では、パイプライン・マネージャ2502は、ワーク分散ユニットから受信されたパケットを、GPC2500内の適切な論理ユニットにルーティングするように構成され、少なくとも1つの実施例では、いくつかのパケットは、PROP2504中の固定機能ハードウェア・ユニット及び/又はラスタ・エンジン2508にルーティングされ得、他のパケットは、プリミティブ・エンジン2512又はSM2514による処理のためにDPC2506にルーティングされ得る。少なくとも1つの実施例では、パイプライン・マネージャ2502は、コンピューティング・パイプラインを実装するように、DPC2506のうちの少なくとも1つを構成する。少なくとも1つの実施例では、パイプライン・マネージャ2502は、CUDAプログラムの少なくとも一部分を実行するように、DPC2506のうちの少なくとも1つを構成する。
【0185】
少なくとも1つの実施例では、PROPユニット2504は、ラスタ・エンジン2508及びDPC2506によって生成されたデータを、図24と併せて上記でより詳細に説明されたメモリ・パーティション・ユニット2422など、パーティション・ユニット中のラスタ演算(「ROP」:Raster Operation)ユニットにルーティングするように構成される。少なくとも1つの実施例では、PROPユニット2504は、色ブレンディングのための最適化を実施すること、ピクセル・データを組織化すること、アドレス・トランスレーションを実施することなどを行うように構成される。少なくとも1つの実施例では、ラスタ・エンジン2508は、限定はしないが、様々なラスタ演算を実施するように構成されたいくつかの固定機能ハードウェア・ユニットを含み、少なくとも1つの実施例では、ラスタ・エンジン2508は、限定はしないが、セットアップ・エンジン、粗いラスタ・エンジン、選別エンジン、クリッピング・エンジン、細かいラスタ・エンジン、タイル合体エンジン、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、セットアップ・エンジンは、変換された頂点を受信し、頂点によって定義された幾何学的プリミティブに関連する平面方程式を生成し、平面方程式は、プリミティブについてのカバレージ情報(たとえば、タイルのためのx、yカバレージ・マスク)を生成するために粗いラスタ・エンジンに送信され、粗いラスタ・エンジンの出力は選別エンジンに送信され、zテストに落ちたプリミティブに関連するフラグメントが選別され、クリッピング・エンジンに送信され、視錐台の外側にあるフラグメントがクリップされる。少なくとも1つの実施例では、クリッピング及び選別を通過したフラグメントは、セットアップ・エンジンによって生成された平面方程式に基づいてピクセル・フラグメントについての属性を生成するために、細かいラスタ・エンジンに渡される。少なくとも1つの実施例では、ラスタ・エンジン2508の出力は、DPC2506内に実装されたフラグメント・シェーダによってなど、任意の好適なエンティティによって処理されるべきフラグメントを含む。
【0186】
少なくとも1つの実施例では、GPC2500中に含まれる各DPC2506は、限定はしないが、Mパイプ・コントローラ(「MPC」:M-Pipe Controller)2510、プリミティブ・エンジン2512、1つ又は複数のSM2514、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、MPC2510は、DPC2506の動作を制御して、パイプライン・マネージャ2502から受信されたパケットを、DPC2506中の適切なユニットにルーティングする。少なくとも1つの実施例では、頂点に関連するパケットは、頂点に関連する頂点属性をメモリからフェッチするように構成されたプリミティブ・エンジン2512にルーティングされ、対照的に、シェーダ・プログラムに関連するパケットは、SM2514に送信され得る。
【0187】
少なくとも1つの実施例では、SM2514は、限定はしないが、いくつかのスレッドによって表されたタスクを処理するように構成されたプログラマブル・ストリーミング・プロセッサを含む。少なくとも1つの実施例では、SM2514はマルチスレッド化され、スレッドの特定のグループからの複数のスレッド(たとえば、32個のスレッド)を同時に実行するように構成され、SIMDアーキテクチャを実装し、スレッドのグループ(たとえば、ワープ)中の各スレッドは、命令の同じセットに基づいてデータの異なるセットを処理するように構成される。少なくとも1つの実施例では、スレッドのグループ中のすべてのスレッドが同じ命令を実行する。少なくとも1つの実施例では、SM2514は、SIMTアーキテクチャを実装し、スレッドのグループ中の各スレッドは、命令の同じセットに基づいて、データの異なるセットを処理するように構成されるが、スレッドのグループ中の個々のスレッドは、実行中に発散することを可能にされる。少なくとも1つの実施例では、プログラム・カウンタ、コール・スタック、及び実行状態が、各ワープについて維持されて、ワープ内のスレッドが発散するときのワープ間の同時処理及びワープ内の直列実行を可能にする。別の実施例では、プログラム・カウンタ、コール・スタック、及び実行状態が、各個々のスレッドについて維持されて、すべてのスレッド間、ワープ内及びワープ間での等しい同時処理を可能にする。少なくとも1つの実施例では、実行状態が、各個々のスレッドについて維持され、同じ命令を実行しているスレッドが、より良い効率性のために収束され、並列に実行され得る。SM2514の少なくとも1つの実施例は、図26と併せてさらに詳細に説明される。
【0188】
少なくとも1つの実施例では、MMU2518は、GPC2500とメモリ・パーティション・ユニット(たとえば、図24のパーティション・ユニット2422)との間のインターフェースを提供し、MMU2518は、仮想アドレスから物理アドレスへのトランスレーションと、メモリ保護と、メモリ要求の調停とを提供する。少なくとも1つの実施例では、MMU2518は、仮想アドレスからメモリ中の物理アドレスへのトランスレーションを実施するための1つ又は複数のトランスレーション・ルックアサイド・バッファ(TLB)を提供する。
【0189】
図26は、少なくとも1つの実施例による、ストリーミング・マルチプロセッサ(「SM」)2600を示す。少なくとも1つの実施例では、SM2600は、図25のSM2514である。少なくとも1つの実施例では、SM2600は、限定はしないが、命令キャッシュ2602、1つ又は複数のスケジューラ・ユニット2604、レジスタ・ファイル2608、1つ又は複数の処理コア(「コア」)2610、1つ又は複数の特殊機能ユニット(「SFU」:special function unit)2612、1つ又は複数のLSU2614、相互接続ネットワーク2616、共有メモリ/L1キャッシュ2618、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、ワーク分散ユニットは、並列処理ユニット(PPU)のGPC上での実行のためにタスクをディスパッチし、各タスクは、GPC内の特定のデータ処理クラスタ(DPC)に割り振られ、タスクがシェーダ・プログラムに関連する場合、タスクはSM2600のうちの1つに割り振られる。少なくとも1つの実施例では、スケジューラ・ユニット2604は、ワーク分散ユニットからタスクを受信し、SM2600に割り当てられた1つ又は複数のスレッド・ブロックについて命令スケジューリングを管理する。少なくとも1つの実施例では、スケジューラ・ユニット2604は、並列スレッドのワープとしての実行のためにスレッド・ブロックをスケジューリングし、各スレッド・ブロックは、少なくとも1つのワープを割り振られる。少なくとも1つの実施例では、各ワープは、スレッドを実行する。少なくとも1つの実施例では、スケジューラ・ユニット2604は、複数の異なるスレッド・ブロックを管理して、異なるスレッド・ブロックにワープを割り振り、次いで、複数の異なる連動グループからの命令を、各クロック・サイクル中に様々な機能ユニット(たとえば、処理コア2610、SFU2612、及びLSU2614)にディスパッチする。少なくとも1つの実施例では、SM2600は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、ハードウェア構成要素を含む。少なくとも1つの実施例では、SM2600は、実行されたとき、SM2600に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を実行するためのハードウェアを含む。
【0190】
少なくとも1つの実施例では、「連動グループ」は、通信するスレッドのグループを組織化するためのプログラミング・モデルを指し得、プログラミング・モデルは、スレッドが通信している粒度を開発者が表現することを可能にして、より豊富でより効率的な並列分解の表現を可能にする。少なくとも1つの実施例では、連動起動APIは、並列アルゴリズムの実行のためにスレッド・ブロックの間の同期をサポートする。少なくとも1つの実施例では、従来のプログラミング・モデルのAPIは、連動スレッドを同期するための単一の簡単な構築物、すなわちスレッド・ブロックのすべてのスレッドにわたるバリア(たとえば、syncthreads()関数)を提供する。しかしながら、少なくとも1つの実施例では、プログラマは、スレッド・ブロックよりも小さい粒度においてスレッドのグループを定義し、定義されたグループ内で同期して、集合的なグループ全般にわたる機能インターフェースの形態で、より高い性能、設計のフレキシビリティ、及びソフトウェア再利用を可能にし得る。少なくとも1つの実施例では、連動グループは、プログラマが、サブ・ブロック粒度及びマルチ・ブロック粒度において、スレッドのグループを明示的に定義し、連動グループ中のスレッドに対する同期などの集合的な動作を実施することを可能にする。少なくとも1つの実施例では、サブ・ブロック粒度は、単一スレッドと同じくらい小さい。少なくとも1つの実施例では、プログラミング・モデルは、ソフトウェア境界にわたるクリーンな合成をサポートし、それにより、ライブラリ及びユーティリティ関数が、収束に関して仮定する必要なしにそれらのローカル・コンテキスト内で安全に同期することができる。少なくとも1つの実施例では、連動グループ・プリミティブは、限定はしないが、プロデューサ-コンシューマ並列性、日和見並列性(opportunistic parallelism)、及びスレッド・ブロックのグリッド全体にわたるグローバルな同期を含む、新しいパターンの連動並列性を可能にする。
【0191】
少なくとも1つの実施例では、ディスパッチ・ユニット2606は、機能ユニットのうちの1つ又は複数に命令を送信するように構成され、スケジューラ・ユニット2604は、限定はしないが、同じワープからの2つの異なる命令が各クロック・サイクル中にディスパッチされることを可能にする2つのディスパッチ・ユニット2606を含む。少なくとも1つの実施例では、各スケジューラ・ユニット2604は、単一のディスパッチ・ユニット2606又は追加のディスパッチ・ユニット2606を含む。
【0192】
少なくとも1つの実施例では、各SM2600は、少なくとも1つの実施例では、限定はしないが、SM2600の機能ユニットにレジスタのセットを提供するレジスタ・ファイル2608を含む。少なくとも1つの実施例では、レジスタ・ファイル2608は、各機能ユニットがレジスタ・ファイル2608の専用部分を割り振られるように、機能ユニットの各々の間で分割される。少なくとも1つの実施例では、レジスタ・ファイル2608は、SM2600によって実行されている異なるワープ間で分割され、レジスタ・ファイル2608は、機能ユニットのデータ経路に接続されたオペランドのための一時的ストレージを提供する。少なくとも1つの実施例では、各SM2600は、限定はしないが、複数のL個の処理コア2610を含む。少なくとも1つの実施例では、SM2600は、限定はしないが、多数の(たとえば、128個以上の)個別の処理コア2610を含む。少なくとも1つの実施例では、各処理コア2610は、限定はしないが、完全にパイプライン化された、単精度の、倍精度の、及び/又は混合精度の処理ユニットを含み、これは、限定はしないが、浮動小数点算術論理ユニット及び整数算術論理ユニットを含む。少なくとも1つの実施例では、浮動小数点算術論理ユニットは、浮動小数点算術のためのIEEE754-2008規格を実装する。少なくとも1つの実施例では、処理コア2610は、限定はしないが、64個の単精度(32ビット)浮動小数点コアと、64個の整数コアと、32個の倍精度(64ビット)浮動小数点コアと、8つのテンソル・コアとを含む。
【0193】
少なくとも1つの実施例では、テンソル・コアは、行列演算を実施するように構成される。少なくとも1つの実施例では、1つ又は複数のテンソル・コアは、処理コア2610中に含まれる。少なくとも1つの実施例では、テンソル・コアは、ニューラル・ネットワーク訓練及び推論のための畳み込み演算など、深層学習行列算術を実施するように構成される。少なくとも1つの実施例では、各テンソル・コアは、4×4の行列で動作し、行列の積和演算(matrix multiply and accumulate operation)D=A×B+Cを実施し、ここで、A、B、C、及びDは4×4の行列である。
【0194】
少なくとも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サイズの行列を仮定する。
【0195】
少なくとも1つの実施例では、各SM2600は、限定はしないが、特殊関数(たとえば、属性評価、逆数平方根など)を実施するM個のSFU2612を含む。少なくとも1つの実施例では、SFU2612は、限定はしないが、階層ツリー・データ構造をトラバースするように構成されたツリー・トラバーサル・ユニットを含む。少なくとも1つの実施例では、SFU2612は、限定はしないが、テクスチャ・マップ・フィルタリング動作を実施するように構成されたテクスチャ・ユニットを含む。少なくとも1つの実施例では、テクスチャ・ユニットは、メモリ及びサンプル・テクスチャ・マップからテクスチャ・マップ(たとえば、テクセルの2Dアレイ)をロードして、SM2600によって実行されるシェーダ・プログラムにおける使用のためのサンプリングされたテクスチャ値を作り出すように構成される。少なくとも1つの実施例では、テクスチャ・マップは、共有メモリ/L1キャッシュ2618に記憶される。少なくとも1つの実施例では、テクスチャ・ユニットは、ミップ・マップ(たとえば、詳細のレベルが異なるテクスチャ・マップ)を使用したフィルタリング動作などのテクスチャ動作を実装する。少なくとも1つの実施例では、各SM2600は、限定はしないが、2つのテクスチャ・ユニットを含む。
【0196】
少なくとも1つの実施例では、各SM2600は、限定はしないが、共有メモリ/L1キャッシュ2618とレジスタ・ファイル2608との間でロード及びストア動作を実装するN個のLSU2614を含む。少なくとも1つの実施例では、各SM2600は、限定はしないが、相互接続ネットワーク2616を含み、相互接続ネットワーク2616は、機能ユニットの各々をレジスタ・ファイル2608に接続し、LSU2614をレジスタ・ファイル2608及び共有メモリ/L1キャッシュ2618に接続する。少なくとも1つの実施例では、相互接続ネットワーク2616はクロスバーであり、クロスバーは、機能ユニットのうちのいずれかをレジスタ・ファイル2608中のレジスタのうちのいずれかに接続し、LSU2614をレジスタ・ファイル2608と共有メモリ/L1キャッシュ2618中のメモリ・ロケーションとに接続するように構成され得る。
【0197】
少なくとも1つの実施例では、共有メモリ/L1キャッシュ2618は、SM2600とプリミティブ・エンジンとの間及びSM2600中のスレッド間でのデータ・ストレージ及び通信を可能にするオンチップ・メモリのアレイである。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2618は、限定はしないが、128KBのストレージ容量を備え、SM2600からパーティション・ユニットへの経路中にある。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2618は、読取り及び書込みをキャッシュするために使用される。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2618、L2キャッシュ、及びメモリのうちの1つ又は複数は、補助ストアである。
【0198】
少なくとも1つの実施例では、データ・キャッシュと共有メモリ機能性とを単一のメモリ・ブロックに組み合わせることは、両方のタイプのメモリ・アクセスについて改善された性能を提供する。少なくとも1つの実施例では、容量は、共有メモリが容量の半分を使用するように構成され、テクスチャ及びロード/ストア動作が残りの容量を使用することができる場合など、共有メモリを使用しないプログラムによってキャッシュとして使用されるか、又は使用可能である。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2618内の統合は、共有メモリ/L1キャッシュ2618が、データをストリーミングするための高スループット管として機能しながら、同時に高帯域幅及び低レイテンシのアクセスを、頻繁に再使用されるデータに提供することを可能にする。少なくとも1つの実施例では、汎用並列算出のために構成されたとき、グラフィックス処理と比較してより簡単な構成が使用され得る。少なくとも1つの実施例では、固定機能GPUがバイパスされて、はるかに簡単なプログラミング・モデルを作成する。少なくとも1つの実施例では及び汎用並列算出構成では、ワーク分散ユニットは、スレッドのブロックをDPCに直接割り当て、分散させる。少なくとも1つの実施例では、ブロック中のスレッドは、各スレッドが一意の結果を生成することを確実にするように、計算において一意のスレッドIDを使用して、同じプログラムを実行し、SM2600を使用してプログラムを実行し、計算を実施し、共有メモリ/L1キャッシュ2618を使用してスレッド間で通信し、LSU2614を使用して、共有メモリ/L1キャッシュ2618及びメモリ・パーティション・ユニットを通してグローバル・メモリを読み取り、書き込む。少なくとも1つの実施例では、汎用並列算出のために構成されたとき、SM2600は、DPC上で新しいワークを起動するためにスケジューラ・ユニット2604が使用することができるコマンドを書き込む。
【0199】
少なくとも1つの実施例では、PPUは、デスクトップ・コンピュータ、ラップトップ・コンピュータ、タブレット・コンピュータ、サーバ、スーパーコンピュータ、スマート・フォン(たとえば、ワイヤレス・ハンドヘルド・デバイス)、PDA、デジタル・カメラ、車両、頭部装着型ディスプレイ、ハンドヘルド電子デバイスなどに含まれるか、又はそれらに結合される。少なくとも1つの実施例では、PPUは、単一の半導体基板上で具体化される。少なくとも1つの実施例では、PPUは、追加のPPU、メモリ、RISC CPU、MMU、デジタル-アナログ変換器(「DAC」:digital-to-analog converter)などの1つ又は複数の他のデバイスとともにSoC中に含まれる。
【0200】
少なくとも1つの実施例では、PPUは、1つ又は複数のメモリ・デバイスを含むグラフィックス・カード上に含まれ得る。少なくとも1つの実施例では、グラフィックス・カードは、デスクトップ・コンピュータのマザーボード上のPCIeスロットとインターフェースするように構成され得る。少なくとも1つの実施例では、PPUは、マザーボードのチップセット中に含まれる統合されたGPU(「iGPU」:integrated GPU)であり得る。
【0201】
汎用コンピューティングのためのソフトウェア構築物
以下の図は、限定はしないが、少なくとも1つの実施例を実装するための例示的なソフトウェア構築物を記載する。
【0202】
図27は、少なくとも1つの実施例による、プログラミング・プラットフォームのソフトウェア・スタックを示す。少なくとも1つの実施例では、プログラミング・プラットフォームは、算出タスクを加速するために、コンピューティング・システム上のハードウェアを活用するためのプラットフォームである。少なくとも1つの実施例では、プログラミング・プラットフォームは、ライブラリ、コンパイラ指令、及び/又はプログラミング言語への拡張を通して、ソフトウェア開発者にとってアクセス可能であり得る。少なくとも1つの実施例では、プログラミング・プラットフォームは、限定はしないが、CUDA、Radeonオープン・コンピュート・プラットフォーム(「ROCm」:Radeon Open Compute Platform)、OpenCL(OpenCL(商標)はクロノス・グループ(Khronos group)によって開発される)、SYCL、又はIntel One APIであり得る。少なくとも1つの実施例では、ソフトウェア・スタック2700は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、命令を含む。少なくとも1つの実施例では、ソフトウェア・スタック2700は、実行されたとき、1つ又は複数のプロセッサ及び/又は集積回路に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を含む。
【0203】
少なくとも1つの実施例では、プログラミング・プラットフォームのソフトウェア・スタック2700は、アプリケーション2701のための実行環境を提供する。少なくとも1つの実施例では、アプリケーション2701は、ソフトウェア・スタック2700上で起動されることが可能な任意のコンピュータ・ソフトウェアを含み得る。少なくとも1つの実施例では、アプリケーション2701は、限定はしないが、人工知能(「AI」:artificial intelligence)/機械学習(「ML」:machine learning)アプリケーション、高性能コンピューティング(「HPC」)アプリケーション、仮想デスクトップ・インフラストラクチャ(「VDI」:virtual desktop infrastructure)、又はデータ・センタ・ワークロードを含み得る。
【0204】
少なくとも1つの実施例では、アプリケーション2701及びソフトウェア・スタック2700は、ハードウェア2707上で稼働し得る。少なくとも1つの実施例では、ハードウェア2707は、1つ又は複数のGPU、CPU、FPGA、AIエンジン、及び/又はプログラミング・プラットフォームをサポートする他のタイプのコンピュート・デバイスを含み得る。CUDAの場合など、少なくとも1つの実施例では、ソフトウェア・スタック2700は、ベンダー固有であり、(1つ又は複数の)特定のベンダーからのデバイスのみと互換性があり得る。OpenCLの場合など、少なくとも1つの実施例では、ソフトウェア・スタック2700は、異なるベンダーからのデバイスで使用され得る。少なくとも1つの実施例では、ハードウェア2707は、アプリケーション・プログラミング・インターフェース(「API」)コールを介して算出タスクを実施するためにアクセスされ得るもう1つのデバイスに接続されたホストを含む。少なくとも1つの実施例では、限定はしないが、CPU(ただし、コンピュート・デバイスをも含み得る)及びそのメモリを含み得る、ハードウェア2707内のホストとは対照的に、ハードウェア2707内のデバイスは、限定はしないが、GPU、FPGA、AIエンジン、又は他のコンピュート・デバイス(ただし、CPUをも含み得る)及びそのメモリを含み得る。
【0205】
少なくとも1つの実施例では、プログラミング・プラットフォームのソフトウェア・スタック2700は、限定はしないが、いくつかのライブラリ2703と、ランタイム2705と、デバイス・カーネル・ドライバ2706とを含む。少なくとも1つの実施例では、ライブラリ2703の各々は、コンピュータ・プログラムによって使用され、ソフトウェア開発中に活用され得る、データ及びプログラミング・コードを含み得る。少なくとも1つの実施例では、ライブラリ2703は、限定はしないが、事前に書かれたコード及びサブルーチン、クラス、値、タイプ仕様、構成データ、ドキュメンテーション、ヘルプ・データ、並びに/又はメッセージ・テンプレートを含み得る。少なくとも1つの実施例では、ライブラリ2703は、1つ又は複数のタイプのデバイス上での実行のために最適化される機能を含む。少なくとも1つの実施例では、ライブラリ2703は、限定はしないが、デバイス上で数学、深層学習、及び/又は他のタイプの動作を実施するための機能を含み得る。少なくとも1つの実施例では、ライブラリ2703は、ライブラリ2703において実装される機能を公開する、1つ又は複数のAPIを含み得る、対応するAPI2702に関連する。
【0206】
少なくとも1つの実施例では、アプリケーション2701は、図32図34と併せて以下でより詳細に説明されるように、実行可能コードにコンパイルされるソース・コードとして書かれる。少なくとも1つの実施例では、アプリケーション2701の実行可能コードは、少なくとも部分的に、ソフトウェア・スタック2700によって提供される実行環境上で稼働し得る。少なくとも1つの実施例では、アプリケーション2701の実行中に、ホストとは対照的な、デバイス上で稼働する必要があるコードに達し得る。少なくとも1つの実施例では、そのような場合、デバイス上で必須のコードをロード及び起動するために、ランタイム2705がコールされ得る。少なくとも1つの実施例では、ランタイム2705は、アプリケーションS01の実行をサポートすることが可能である、任意の技術的に実現可能なランタイム・システムを含み得る。
【0207】
少なくとも1つの実施例では、ランタイム2705は、(1つ又は複数の)API2704として示されている、対応するAPIに関連する、1つ又は複数のランタイム・ライブラリとして実装される。少なくとも1つの実施例では、そのようなランタイム・ライブラリのうちの1つ又は複数は、限定はしないが、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、及び/又は同期のための機能を含み得る。少なくとも1つの実施例では、メモリ管理機能は、限定はしないが、デバイス・メモリを割り振り、割振り解除し、コピーし、並びにホスト・メモリとデバイス・メモリとの間でデータを転送するための機能を含み得る。少なくとも1つの実施例では、実行制御機能は、限定はしないが、デバイス上で機能(機能がホストからコール可能なグローバル機能であるとき、「カーネル」と呼ばれることがある)を起動し、デバイス上で実行されるべき所与の機能のためのランタイム・ライブラリによって維持されるバッファ中に属性値をセットするための機能を含み得る。
【0208】
少なくとも1つの実施例では、ランタイム・ライブラリ及び対応する(1つ又は複数の)API2704は、任意の技術的に実現可能な様式で実装され得る。少なくとも1つの実施例では、ある(又は任意の数の)APIは、デバイスのきめ細かい制御のための機能の低レベルのセットを公開し得るが、別の(又は任意の数の)APIは、そのような機能のより高いレベルのセットを公開し得る。少なくとも1つの実施例では、高レベル・ランタイムAPIは、低レベルAPIの上に築かれ得る。少なくとも1つの実施例では、ランタイムAPIのうちの1つ又は複数は、言語依存しないランタイムAPIの上に階層化された言語固有APIであり得る。
【0209】
少なくとも1つの実施例では、デバイス・カーネル・ドライバ2706は、基礎をなすデバイスとの通信を容易にするように構成される。少なくとも1つの実施例では、デバイス・カーネル・ドライバ2706は、(1つ又は複数の)API2704などのAPI及び/又は他のソフトウェアが依拠する、低レベル機能性を提供し得る。少なくとも1つの実施例では、デバイス・カーネル・ドライバ2706は、ランタイムにおいて中間表現(「IR」:intermediate representation)コードをバイナリ・コードにコンパイルするように構成され得る。少なくとも1つの実施例では、CUDAの場合、デバイス・カーネル・ドライバ2706は、ハードウェア固有でない並列スレッド実行(「PTX」:Parallel Thread Execution)IRコードを、(コンパイルされたバイナリ・コードのキャッシングを伴って)ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにコンパイルし得、これは、コードを「ファイナライズする」(finalizing)と呼ばれることもある。少なくとも1つの実施例では、そうすることは、ファイナライズされたコードがターゲット・デバイス上で稼働することを許し得、これは、ソース・コードが最初にPTXコードにコンパイルされたとき、存在していないことがある。代替的に、少なくとも1つの実施例では、デバイス・ソース・コードは、デバイス・カーネル・ドライバ2706がランタイムにおいてIRコードをコンパイルすることを必要とすることなしに、オフラインでバイナリ・コードにコンパイルされ得る。
【0210】
図28は、少なくとも1つの実施例による、図27のソフトウェア・スタック2700のCUDA実装形態を示す。少なくとも1つの実施例では、アプリケーション2801が起動され得るCUDAソフトウェア・スタック2800は、CUDAライブラリ2803と、CUDAランタイム2805と、CUDAドライバ2807と、デバイス・カーネル・ドライバ2808とを含む。少なくとも1つの実施例では、CUDAソフトウェア・スタック2800は、ハードウェア2809上で実行し、ハードウェア2809はGPUを含み得、GPUは、CUDAをサポートし、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される。少なくとも1つの実施例では、CUDAソフトウェア・スタック2800は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、命令を含む。少なくとも1つの実施例では、CUDAソフトウェア・スタック2800は、実行されたとき、本明細書で説明される1つ又は複数のプロセッサ及び/又は集積回路に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を含む。
【0211】
少なくとも1つの実施例では、アプリケーション2801、CUDAランタイム2805、及びデバイス・カーネル・ドライバ2808は、それぞれ、図27と併せて上記で説明された、アプリケーション2701、ランタイム2705、及びデバイス・カーネル・ドライバ2706と同様の機能性を実施し得る。少なくとも1つの実施例では、CUDAドライバ2807は、CUDAドライバAPI2806を実装するライブラリ(libcuda.so)を含む。少なくとも1つの実施例では、CUDAランタイム・ライブラリ(cudart)によって実装されるCUDAランタイムAPI2804と同様に、CUDAドライバAPI2806は、限定はしないが、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、同期、及び/又はグラフィックス相互運用性のための機能を公開し得る。少なくとも1つの実施例では、CUDAドライバAPI2806は、CUDAランタイムAPI2804が、暗黙的な初期化、(プロセスに類似する)コンテキスト管理、及び(動的にロードされたライブラリに類似する)モジュール管理を提供することによって、デバイス・コード管理を簡略化するという点で、CUDAランタイムAPI2804とは異なる。少なくとも1つの実施例では、高レベルCUDAランタイムAPI2804とは対照的に、CUDAドライバAPI2806は、特にコンテキスト及びモジュール・ローディングに関して、デバイスのよりきめ細かい制御を提供する低レベルAPIである。少なくとも1つの実施例では、CUDAドライバAPI2806は、CUDAランタイムAPI2804によって公開されないコンテキスト管理のための機能を公開し得る。少なくとも1つの実施例では、CUDAドライバAPI2806はまた、言語依存せず、たとえば、CUDAランタイムAPI2804に加えて、OpenCLをサポートする。さらに、少なくとも1つの実施例では、CUDAランタイム2805を含む開発ライブラリは、ユーザモードCUDAドライバ2807と(「ディスプレイ」ドライバと呼ばれることもある)カーネルモード・デバイス・ドライバ2808とを含むドライバ構成要素とは別個のものと見なされ得る。
【0212】
少なくとも1つの実施例では、CUDAライブラリ2803は、限定はしないが、数学ライブラリ、深層学習ライブラリ、並列アルゴリズム・ライブラリ、及び/又は信号/画像/ビデオ処理ライブラリを含み得、それらをアプリケーション2801などの並列コンピューティング・アプリケーションが利用し得る。少なくとも1つの実施例では、CUDAライブラリ2803は、とりわけ、線形代数演算を実施するための基本線形代数サブプログラム(「BLAS」:Basic Linear Algebra Subprograms)の実装であるcuBLASライブラリ、高速フーリエ変換(「FFT」:fast Fourier transform)を算出するためのcuFFTライブラリ、及び乱数を生成するためのcuRANDライブラリなど、数学ライブラリを含み得る。少なくとも1つの実施例では、CUDAライブラリ2803は、とりわけ、深層ニューラル・ネットワークのためのプリミティブのcuDNNライブラリ及び高性能深層学習推論のためのTensorRTプラットフォームなど、深層学習ライブラリを含み得る。
【0213】
図29は、少なくとも1つの実施例による、図27のソフトウェア・スタック2700のROCm実装形態を示す。少なくとも1つの実施例では、アプリケーション2901が起動され得るROCmソフトウェア・スタック2900は、言語ランタイム2903と、システム・ランタイム2905と、サンク(thunk)2907と、ROCmカーネル・ドライバ2908とを含む。少なくとも1つの実施例では、ROCmソフトウェア・スタック2900は、ハードウェア2909上で実行し、ハードウェア2909はGPUを含み得、GPUは、ROCmをサポートし、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、ROCmソフトウェア・スタック2900は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、命令を含む。少なくとも1つの実施例では、ROCmソフトウェア・スタック2900は、実行されたとき、本明細書で説明されるものなどの1つ又は複数のプロセッサ及び/又は集積回路、並びにあらゆる他のプロセッサ及び/又は集積回路に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を含む。
【0214】
少なくとも1つの実施例では、アプリケーション2901は、図27と併せて上記で説明されたアプリケーション2701と同様の機能性を実施し得る。少なくとも1つの実施例では、さらに、言語ランタイム2903及びシステム・ランタイム2905は、図27と併せて上記で説明されたランタイム2705と同様の機能性を実施し得る。少なくとも1つの実施例では、言語ランタイム2903とシステム・ランタイム2905とは、システム・ランタイム2905が、ROCrシステム・ランタイムAPI2904を実装し、異種システム・アーキテクチャ(「HSA」:Heterogeneous System Architecture)ランタイムAPIを利用する、言語依存しないランタイムであるという点で、異なる。少なくとも1つの実施例では、HSAランタイムAPIは、とりわけ、メモリ管理、カーネルの設計されたディスパッチを介した実行制御、エラー対処、システム及びエージェント情報、並びにランタイム初期化及び停止(shutdown)のための機能を含む、AMD GPUにアクセスし、それと対話するためのインターフェースを公開する、シン(thin)・ユーザモードAPIである。少なくとも1つの実施例では、システム・ランタイム2905とは対照的に、言語ランタイム2903は、ROCrシステム・ランタイムAPI2904の上に階層化された言語固有ランタイムAPI2902の実装である。少なくとも1つの実施例では、言語ランタイムAPIは、限定はしないが、とりわけ、ポータビリティのための異種コンピュート・インターフェース(「HIP」:Heterogeneous compute Interface for Portability)言語ランタイムAPI、異種コンピュート・コンパイラ(「HCC」:Heterogeneous Compute Compiler)言語ランタイムAPI、又はOpenCL APIを含み得る。特にHIP言語は、機能的に同様のバージョンのCUDA機構をもつC++プログラミング言語の拡張であり、少なくとも1つの実施例では、HIP言語ランタイムAPIは、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、及び同期のための機能など、図28と併せて上記で説明されたCUDAランタイムAPI2804の機能と同様である機能を含む。
【0215】
少なくとも1つの実施例では、サンク(ROCt)2907は、基礎をなすROCmドライバ2908と対話するために使用され得るインターフェース2906である。少なくとも1つの実施例では、ROCmドライバ2908は、AMDGPUドライバとHSAカーネル・ドライバ(amdkfd)との組合せである、ROCkドライバである。少なくとも1つの実施例では、AMDGPUドライバは、図27と併せて上記で説明されたデバイス・カーネル・ドライバ2706と同様の機能性を実施する、AMDによって開発されたGPUのためのデバイス・カーネル・ドライバである。少なくとも1つの実施例では、HSAカーネル・ドライバは、異なるタイプのプロセッサがハードウェア特徴を介してより効果的にシステム・リソースを共有することを許すドライバである。
【0216】
少なくとも1つの実施例では、様々なライブラリ(図示せず)が、言語ランタイム2903より上にROCmソフトウェア・スタック2900中に含まれ、図28と併せて上記で説明されたCUDAライブラリ2803に対する機能性の類似性を提供し得る。少なくとも1つの実施例では、様々なライブラリは、限定はしないが、とりわけ、CUDA cuBLASの機能と同様の機能を実装するhipBLASライブラリ、CUDA cuFFTと同様であるFFTを算出するためのrocFFTライブラリなど、数学、深層学習、及び/又は他のライブラリを含み得る。
【0217】
図30は、少なくとも1つの実施例による、図27のソフトウェア・スタック2700のOpenCL実装形態を示す。少なくとも1つの実施例では、アプリケーション3001が起動され得るOpenCLソフトウェア・スタック3000は、OpenCLフレームワーク3010と、OpenCLランタイム3006と、ドライバ3007とを含む。少なくとも1つの実施例では、OpenCLソフトウェア・スタック3000は、ベンダー固有でないハードウェア2809上で実行する。少なくとも1つの実施例では、OpenCLは、異なるベンダーによって開発されたデバイスによってサポートされるので、そのようなベンダーからのハードウェアと相互動作するために、特定のOpenCLドライバが必要とされ得る。
【0218】
少なくとも1つの実施例では、アプリケーション3001、OpenCLランタイム3006、デバイス・カーネル・ドライバ3007、及びハードウェア3008は、それぞれ、図27と併せて上記で説明された、アプリケーション2701、ランタイム2705、デバイス・カーネル・ドライバ2706、及びハードウェア2707と同様の機能性を実施し得る。少なくとも1つの実施例では、アプリケーション3001は、デバイス上で実行されるべきであるコードをもつOpenCLカーネル3002をさらに含む。少なくとも1つの実施例では、OpenCLソフトウェア・スタック3000は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、命令を含む。少なくとも1つの実施例では、OpenCLソフトウェア・スタック3000は、実行されたとき、本明細書で説明されるものなどの1つ又は複数のプロセッサ及び/又は集積回路、並びにあらゆる他のプロセッサ及び/又は集積回路に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を含む。
【0219】
少なくとも1つの実施例では、OpenCLは、ホストに接続されたデバイスをホストが制御することを可能にする「プラットフォーム」を定義する。少なくとも1つの実施例では、OpenCLフレームワークは、プラットフォームAPI3003及びランタイムAPI3005として示されている、プラットフォーム層API及びランタイムAPIを提供する。少なくとも1つの実施例では、ランタイムAPI3005は、デバイス上でのカーネルの実行を管理するためにコンテキストを使用する。少なくとも1つの実施例では、各識別されたデバイスは、それぞれのコンテキストに関連し得、ランタイムAPI3005は、それぞれのコンテキストを使用して、そのデバイスのために、とりわけ、コマンド・キュー、プログラム・オブジェクト、及びカーネル・オブジェクトを管理し、メモリ・オブジェクトを共有し得る。少なくとも1つの実施例では、プラットフォームAPI3003は、とりわけ、デバイスを選択及び初期化し、コマンド・キューを介してデバイスにワークをサブミットし、デバイスとの間でのデータ転送を可能にするために、デバイス・コンテキストが使用されることを許す機能を公開する。少なくとも1つの実施例では、さらに、OpenCLフレームワークは、とりわけ、数学関数とリレーショナル関数と画像処理関数とを含む、様々な組み込み関数(図示せず)を提供する。
【0220】
少なくとも1つの実施例では、コンパイラ3004も、OpenCLフレームワーク3010中に含まれる。少なくとも1つの実施例では、ソース・コードは、アプリケーションを実行するより前にオフラインでコンパイルされるか、又はアプリケーションの実行中にオンラインでコンパイルされ得る。CUDA及びROCmとは対照的に、少なくとも1つの実施例におけるOpenCLアプリケーションは、コンパイラ3004によってオンラインでコンパイルされ得、コンパイラ3304は、標準ポータブル中間表現(「SPIR-V」:Standard Portable Intermediate Representation)コードなど、ソース・コード及び/又はIRコードをバイナリ・コードにコンパイルするために使用され得る、任意の数のコンパイラを表すために含まれる。代替的に、少なくとも1つの実施例では、OpenCLアプリケーションは、そのようなアプリケーションの実行より前に、オフラインでコンパイルされ得る。
【0221】
図31は、少なくとも1つの実施例による、プログラミング・プラットフォームによってサポートされるソフトウェアを示す。少なくとも1つの実施例では、プログラミング・プラットフォーム3104は、アプリケーション3100が依拠し得る、様々なプログラミング・モデル3103、ミドルウェア及び/又はライブラリ3102、並びにフレームワーク3101をサポートするように構成される。少なくとも1つの実施例では、アプリケーション3100は、たとえば、MXNet、PyTorch、又はTensorFlowなど、深層学習フレームワークを使用して実装される、AI/MLアプリケーションであり得、これは、基礎をなすハードウェア上で加速コンピューティングを提供するために、cuDNN、NVIDIA集合通信ライブラリ(「NCCL」:NVIDIA Collective Communications Library)、及び/又はNVIDAディベロッパ・データ・ローディング・ライブラリ(「DALI(登録商標)」:NVIDA Developer Data Loading Library)CUDAライブラリなど、ライブラリに依拠し得る。少なくとも1つの実施例では、プログラミング・プラットフォーム3104は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、命令を含む。少なくとも1つの実施例では、プログラミング・プラットフォーム3104は、実行されたとき、本明細書で説明されるものなどの1つ又は複数のプロセッサ及び/又は集積回路、並びにあらゆる他のプロセッサ及び/又は集積回路に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を含む。
【0222】
少なくとも1つの実施例では、プログラミング・プラットフォーム3104は、それぞれ、図28図29、及び図30と併せて上記で説明された、CUDA、ROCm、又はOpenCLプラットフォームのうちの1つであり得る。少なくとも1つの実施例では、プログラミング・プラットフォーム3104は、アルゴリズム及びデータ構造の表現を許す基礎をなすコンピューティング・システムの抽象化である、複数のプログラミング・モデル3103をサポートする。少なくとも1つの実施例では、プログラミング・モデル3103は、性能を改善するために、基礎をなすハードウェアの特徴を公開し得る。少なくとも1つの実施例では、プログラミング・モデル3103は、限定はしないが、CUDA、HIP、OpenCL、C++加速超並列処理(「C++AMP」:C++ Accelerated Massive Parallelism)、オープン・マルチプロセシング(「OpenMP」:Open Multi-Processing)、オープン・アクセラレータ(「OpenACC」:Open Accelerators)、及び/又はVulcanコンピュート(Vulcan Compute)を含み得る。
【0223】
少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3102は、プログラミング・モデル3104の抽象化の実装を提供する。少なくとも1つの実施例では、そのようなライブラリは、コンピュータ・プログラムによって使用され、ソフトウェア開発中に活用され得る、データ及びプログラミング・コードを含む。少なくとも1つの実施例では、そのようなミドルウェアは、プログラミング・プラットフォーム3104から利用可能なソフトウェア以外にアプリケーションにサービスを提供するソフトウェアを含む。少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3102は、限定はしないが、cuBLAS、cuFFT、cuRAND、及び他のCUDAライブラリ、又は、rocBLAS、rocFFT、rocRAND、及び他のROCmライブラリを含み得る。さらに、少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3102は、GPUのための通信ルーチンを提供するNCCL及びROCm通信集合ライブラリ(「RCCL」:ROCm Communication Collectives Library)のライブラリ、深層学習加速のためのMIOpenライブラリ、並びに/又は、線形代数、行列及びベクトル演算、幾何学的変換、数値ソルバー、及び関係するアルゴリズムのための固有(Eigen)ライブラリを含み得る。
【0224】
少なくとも1つの実施例では、アプリケーション・フレームワーク3101は、ライブラリ及び/又はミドルウェア3102に依存する。少なくとも1つの実施例では、アプリケーション・フレームワーク3101の各々は、アプリケーション・ソフトウェアの標準構造を実装するために使用されるソフトウェア・フレームワークである。少なくとも1つの実施例では、上記で説明されたAI/ML実例に戻ると、AI/MLアプリケーションは、Caffe、Caffe2、TensorFlow、Keras、PyTorch、又はMxNet深層学習フレームワークなど、フレームワークを使用して実装され得る。
【0225】
図32は、少なくとも1つの実施例による、図27図30のプログラミング・プラットフォームのうちの1つの上で実行するためのコードをコンパイルすることを示す。少なくとも1つの実施例では、コンパイラ3201は、ホスト・コード並びにデバイス・コードの両方を含むソース・コード3200を受信する。少なくとも1つの実施例では、コンパイラ3201は、ソース・コード3200を、ホスト上での実行のためのホスト実行可能コード3202及びデバイス上での実行のためのデバイス実行可能コード3203にコンバートするように構成される。少なくとも1つの実施例では、ソース・コード3200は、アプリケーションの実行より前にオフラインでコンパイルされるか、又はアプリケーションの実行中にオンラインでコンパイルされるかのいずれかであり得る。
【0226】
少なくとも1つの実施例では、ソース・コード3200は、C++、C、Fortranなど、コンパイラ3201によってサポートされる任意のプログラミング言語のコードを含み得る。少なくとも1つの実施例では、ソース・コード3200は、ホスト・コードとデバイス・コードとの混合物を有する単一ソース・ファイル中に含まれ得、その中にデバイス・コードのロケーションが示されている。少なくとも1つの実施例では、単一ソース・ファイルは、CUDAコードを含む.cuファイル、又はHIPコードを含む.hip.cppファイルであり得る。代替的に、少なくとも1つの実施例では、ソース・コード3200は、その中でホスト・コードとデバイス・コードとが分離される単一ソース・ファイルではなく、複数のソース・コード・ファイルを含み得る。
【0227】
少なくとも1つの実施例では、コンパイラ3201は、ソース・コード3200を、ホスト上での実行のためのホスト実行可能コード3202及びデバイス上での実行のためのデバイス実行可能コード3203にコンパイルするように構成される。少なくとも1つの実施例では、コンパイラ3201は、ソース・コード3200を抽象システム・ツリー(AST:abstract system tree)に構文解析することと、最適化を実施することと、実行可能コードを生成することとを含む、動作を実施する。ソース・コード3200が単一ソース・ファイルを含む、少なくとも1つの実施例では、コンパイラ3201は、図33に関して以下でより詳細に説明されるように、そのような単一ソース・ファイル中でデバイス・コードをホスト・コードから分離し、デバイス・コード及びホスト・コードを、それぞれ、デバイス実行可能コード3203及びホスト実行可能コード3202にコンパイルし、デバイス実行可能コード3203とホスト実行可能コード3202とを単一のファイルにおいて互いにリンクし得る。
【0228】
少なくとも1つの実施例では、ホスト実行可能コード3202及びデバイス実行可能コード3203は、バイナリ・コード及び/又はIRコードなど、任意の好適なフォーマットのものであり得る。少なくとも1つの実施例では、CUDAの場合、ホスト実行可能コード3202は、ネイティブ・オブジェクト・コードを含み得、デバイス実行可能コード3203は、PTX中間表現のコードを含み得る。少なくとも1つの実施例では、ROCmの場合、ホスト実行可能コード3202とデバイス実行可能コード3203の両方は、ターゲット・バイナリ・コードを含み得る。
【0229】
図33は、少なくとも1つの実施例による、図27図30のプログラミング・プラットフォームのうちの1つの上で実行するためのコードをコンパイルすることのより詳細な図である。少なくとも1つの実施例では、コンパイラ3301は、ソース・コード3300を受信し、ソース・コード3300をコンパイルし、実行可能ファイル3310を出力するように構成される。少なくとも1つの実施例では、ソース・コード3300は、ホスト・コードとデバイス・コードの両方を含む、.cuファイル、.hip.cppファイル、又は別のフォーマットのファイルなど、単一ソース・ファイルである。少なくとも1つの実施例では、コンパイラ3301は、限定はしないが、.cuファイル中のCUDAコードをコンパイルするためのNVIDIA CUDAコンパイラ(「NVCC」:NVIDIA CUDA compiler)、又は.hip.cppファイル中のHIPコードをコンパイルするためのHCCコンパイラであり得る。
【0230】
少なくとも1つの実施例では、コンパイラ3301は、コンパイラ・フロント・エンド3302と、ホスト・コンパイラ3305と、デバイス・コンパイラ3306と、リンカ3309とを含む。少なくとも1つの実施例では、コンパイラ・フロント・エンド3302は、ソース・コード3300中でデバイス・コード3304をホスト・コード3303から分離するように構成される。少なくとも1つの実施例では、デバイス・コード3304は、デバイス・コンパイラ3306によってデバイス実行可能コード3308にコンパイルされ、デバイス実行可能コード3308は、説明されたように、バイナリ・コード又はIRコードを含み得る。少なくとも1つの実施例では、別個に、ホスト・コード3303は、ホスト・コンパイラ3305によってホスト実行可能コード3307にコンパイルされる。少なくとも1つの実施例では、NVCCの場合、ホスト・コンパイラ3305は、限定はしないが、ネイティブ・オブジェクト・コードを出力する汎用C/C++コンパイラであり得るが、デバイス・コンパイラ3306は、限定はしないが、LLVMコンパイラ・インフラストラクチャをフォークし、PTXコード又はバイナリ・コードを出力する、低レベル仮想機械(「LLVM」:Low Level Virtual Machine)ベースのコンパイラであり得る。少なくとも1つの実施例では、HCCの場合、ホスト・コンパイラ3305とデバイス・コンパイラ3306の両方は、限定はしないが、ターゲット・バイナリ・コードを出力するLLVMベースのコンパイラであり得る。
【0231】
少なくとも1つの実施例では、ソース・コード3300をホスト実行可能コード3307及びデバイス実行可能コード3308にコンパイルした後に、リンカ3309は、ホスト実行可能コード3307とデバイス実行可能コード3308とを実行可能ファイル3310において互いにリンクする。少なくとも1つの実施例では、ホストのためのネイティブ・オブジェクト・コードと、デバイスのためのPTX又はバイナリ・コードとは、オブジェクト・コードを記憶するために使用されるコンテナ・フォーマットである、実行可能及びリンク可能フォーマット(「ELF」:Executable and Linkable Format)ファイルにおいて互いにリンクされ得る。
【0232】
図34は、少なくとも1つの実施例による、ソース・コードをコンパイルするより前にソース・コードをトランスレートすることを示す。少なくとも1つの実施例では、ソース・コード3400は、トランスレーション・ツール3401を通して渡され、トランスレーション・ツール3401は、ソース・コード3400を、トランスレートされたソース・コード3402にトランスレートする。少なくとも1つの実施例では、コンパイラ3403は、図32と併せて上記で説明されたように、ホスト実行可能コード3202及びデバイス実行可能3203へのコンパイラ3201によるソース・コード3200のコンパイルと同様であるプロセスにおいて、トランスレートされたソース・コード3402をホスト実行可能コード3404及びデバイス実行可能コード3405にコンパイルするために使用される。
【0233】
少なくとも1つの実施例では、トランスレーション・ツール3401によって実施されるトランスレーションは、稼働することが最初に意図された環境とは異なる環境における実行のためにソース3400を移植するために使用される。少なくとも1つの実施例では、トランスレーション・ツール3401は、限定はしないが、CUDAプラットフォームを対象とするCUDAコードを、ROCmプラットフォーム上でコンパイル及び実行され得るHIPコードに「hipify」するために使用される、HIPトランスレータを含み得る。少なくとも1つの実施例では、ソース・コード3400のトランスレーションは、図35A図36と併せて以下でより詳細に説明されるように、ソース・コード3400を構文解析することと、あるプログラミング・モデル(たとえば、CUDA)によって提供される(1つ又は複数の)APIへのコールを、別のプログラミング・モデル(たとえば、HIP)によって提供される(1つ又は複数の)APIへの対応するコールにコンバートすることとを含み得る。少なくとも1つの実施例では、CUDAコードをhipifyすることの実例に戻ると、CUDAランタイムAPI、CUDAドライバAPI、及び/又はCUDAライブラリへのコールは、対応するHIP APIコールにコンバートされ得る。少なくとも1つの実施例では、トランスレーション・ツール3401によって実施される自動トランスレーションは、時々、不完全であり、ソース・コード3400を完全に移植するために追加の手動の労力を必要とし得る。
【0234】
汎用コンピューティングのためのGPUを構成すること
以下の図は、限定はしないが、少なくとも1つの実施例による、コンピュート・ソース・コードをコンパイル及び実行するための例示的なアーキテクチャを記載する。
【0235】
図35Aは、少なくとも1つの実施例による、異なるタイプの処理ユニットを使用してCUDAソース・コード3510をコンパイル及び実行するように構成されたシステム35A00を示す。少なくとも1つの実施例では、システム35A00は、限定はしないが、CUDAソース・コード3510と、CUDAコンパイラ3550と、ホスト実行可能コード3570(1)と、ホスト実行可能コード3570(2)と、CUDAデバイス実行可能コード3584と、CPU3590と、CUDA対応GPU3594と、GPU3592と、CUDAからHIPへのトランスレーション・ツール3520と、HIPソース・コード3530と、HIPコンパイラ・ドライバ3540と、HCC3560と、HCCデバイス実行可能コード3582とを含む。少なくとも1つの実施例では、システム35A00は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、命令を含む。少なくとも1つの実施例では、システム35A00は、実行されたとき、本明細書で説明されるものなどの1つ又は複数のプロセッサ及び/又は集積回路、並びにあらゆる他のプロセッサ及び/又は集積回路に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を含む。
【0236】
少なくとも1つの実施例では、CUDAソース・コード3510は、CUDAプログラミング言語の人間が読み取れるコードの集合である。少なくとも1つの実施例では、CUDAコードは、CUDAプログラミング言語の人間が読み取れるコードである。少なくとも1つの実施例では、CUDAプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、デバイス・コードは、コンパイルの後にデバイス上で並列に実行可能であるソース・コードである。少なくとも1つの実施例では、デバイスは、CUDA対応GPU3590、GPU35192、又は別のGPGPUなど、並列命令処理のために最適化されるプロセッサであり得る。少なくとも1つの実施例では、ホスト・コードは、コンパイルの後にホスト上で実行可能であるソース・コードである。少なくとも1つの実施例では、ホストは、CPU3590など、連続命令処理のために最適化されるプロセッサである。
【0237】
少なくとも1つの実施例では、CUDAソース・コード3510は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3512と、(ゼロを含む)任意の数のデバイス機能3514と、(ゼロを含む)任意の数のホスト機能3516と、(ゼロを含む)任意の数のホスト/デバイス機能3518とを含む。少なくとも1つの実施例では、グローバル機能3512と、デバイス機能3514と、ホスト機能3516と、ホスト/デバイス機能3518とは、CUDAソース・コード3510中で混合され得る。少なくとも1つの実施例では、グローバル機能3512の各々は、デバイス上で実行可能であり、ホストからコール可能である。少なくとも1つの実施例では、グローバル機能3512のうちの1つ又は複数は、したがって、デバイスへのエントリ・ポイントとして働き得る。少なくとも1つの実施例では、グローバル機能3512の各々はカーネルである。少なくとも1つの実施例では、及び動的並列処理として知られる技法では、グローバル機能3512のうちの1つ又は複数は、カーネルを定義し、カーネルは、デバイス上で実行可能であり、そのようなデバイスからコール可能である。少なくとも1つの実施例では、カーネルは、実行中にデバイス上のN(ここで、Nは任意の正の整数である)個の異なるスレッドによって並列にN回実行される。
【0238】
少なくとも1つの実施例では、デバイス機能3514の各々は、デバイス上で実行され、そのようなデバイスからのみコール可能である。少なくとも1つの実施例では、ホスト機能3516の各々は、ホスト上で実行され、そのようなホストからのみコール可能である。少なくとも1つの実施例では、ホスト/デバイス機能3516の各々は、ホスト上で実行可能であり、そのようなホストからのみコール可能であるホスト・バージョンの機能と、デバイス上で実行可能であり、そのようなデバイスからのみコール可能であるデバイス・バージョンの機能の両方を定義する。
【0239】
少なくとも1つの実施例では、CUDAソース・コード3510は、限定はしないが、CUDAランタイムAPI3502を介して定義される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、CUDAランタイムAPI3502は、限定はしないが、デバイス・メモリを割り振り、割振り解除し、ホスト・メモリとデバイス・メモリとの間でデータを転送し、複数のデバイスをもつシステムを管理するなどのためにホスト上で実行する、任意の数の機能を含み得る。少なくとも1つの実施例では、CUDAソース・コード3510は、任意の数の他のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、CUDA APIは、CUDAコードによる使用のために設計される任意のAPIであり得る。少なくとも1つの実施例では、CUDA APIは、限定はしないが、CUDAランタイムAPI3502、CUDAドライバAPI、任意の数のCUDAライブラリのためのAPIなどを含む。少なくとも1つの実施例では、及びCUDAランタイムAPI3502に対して、CUDAドライバAPIは、より低いレベルのAPIであるが、デバイスのよりきめ細かい制御を提供する。少なくとも1つの実施例では、CUDAライブラリの実例は、限定はしないが、cuBLAS、cuFFT、cuRAND、cuDNNなどを含む。
【0240】
少なくとも1つの実施例では、CUDAコンパイラ3550は、ホスト実行可能コード3570(1)及びCUDAデバイス実行可能コード3584を生成するために、入力CUDAコード(たとえば、CUDAソース・コード3510)をコンパイルする。少なくとも1つの実施例では、CUDAコンパイラ3550はNVCCである。少なくとも1つの実施例では、ホスト実行可能コード3570(1)は、CPU3590上で実行可能である、入力ソース・コード中に含まれるホスト・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、CPU3590は、連続命令処理のために最適化される任意のプロセッサであり得る。
【0241】
少なくとも1つの実施例では、CUDAデバイス実行可能コード3584は、CUDA対応GPU3594上で実行可能である、入力ソース・コード中に含まれるデバイス・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、CUDAデバイス実行可能コード3584は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3584は、限定はしないが、PTXコードなどのIRコードを含み、これは、デバイス・ドライバによって、特定のターゲット・デバイス(たとえば、CUDA対応GPU3594)のためのバイナリ・コードに、ランタイムにおいてさらにコンパイルされる。少なくとも1つの実施例では、CUDA対応GPU3594は、並列命令処理のために最適化され、CUDAをサポートする、任意のプロセッサであり得る。少なくとも1つの実施例では、CUDA対応GPU3594は、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される。
【0242】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510を機能的に同様のHIPソース・コード3530にトランスレートするように構成される。少なくとも1つの実施例では、HIPソース・コード3530は、HIPプログラミング言語の人間が読み取れるコードの集合である。少なくとも1つの実施例では、HIPコードは、HIPプログラミング言語の人間が読み取れるコードである。少なくとも1つの実施例では、HIPプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための、機能的に同様のバージョンのCUDA機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、HIPプログラミング言語は、CUDAプログラミング言語の機能性のサブセットを含み得る。少なくとも1つの実施例では、たとえば、HIPプログラミング言語は、限定はしないが、グローバル機能3512を定義するための(1つ又は複数の)機構を含むが、そのようなHIPプログラミング言語は、動的並列処理のサポートがないことがあり、したがって、HIPコードにおいて定義されたグローバル機能3512は、ホストからのみコール可能であり得る。
【0243】
少なくとも1つの実施例では、HIPソース・コード3530は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3512と、(ゼロを含む)任意の数のデバイス機能3514と、(ゼロを含む)任意の数のホスト機能3516と、(ゼロを含む)任意の数のホスト/デバイス機能3518とを含む。少なくとも1つの実施例では、HIPソース・コード3530は、HIPランタイムAPI3532において指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、HIPランタイムAPI3532は、限定はしないが、CUDAランタイムAPI3502中に含まれる機能のサブセットの機能的に同様のバージョンを含む。少なくとも1つの実施例では、HIPソース・コード3530は、任意の数の他のHIP APIにおいて指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、HIP APIは、HIPコード及び/又はROCmによる使用のために設計される任意のAPIであり得る。少なくとも1つの実施例では、HIP APIは、限定はしないが、HIPランタイムAPI3532、HIPドライバAPI、任意の数のHIPライブラリのためのAPI、任意の数のROCmライブラリのためのAPIなどを含む。
【0244】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3520は、CUDAコード中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、CUDAコード中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。少なくとも1つの実施例では、CUDAコールは、CUDA APIにおいて指定された機能へのコールであり、HIPコールは、HIP APIにおいて指定された機能へのコールである。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3520は、CUDAランタイムAPI3502において指定された機能への任意の数のコールを、HIPランタイムAPI3532において指定された機能への任意の数のコールにコンバートする。
【0245】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3520は、テキスト・ベースのトランスレーション・プロセスを実行するhipify-perlとして知られるツールである。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3520は、hipify-clangとして知られるツールであり、これは、hipify-perlに対して、clang(コンパイラ・フロント・エンド)を使用してCUDAコードを構文解析することと、次いで、得られたシンボルをトランスレートすることとを伴う、より複雑でよりロバストなトランスレーション・プロセスを実行する。少なくとも1つの実施例では、CUDAコードをHIPコードに適切にコンバートすることは、CUDAからHIPへのトランスレーション・ツール3520によって実施される修正に加えて、修正(たとえば、手動の編集)を必要とし得る。
【0246】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3540は、ターゲット・デバイス3546を決定し、次いで、ターゲット・デバイス3546と互換性があるコンパイラを、HIPソース・コード3530をコンパイルするように構成する、フロント・エンドである。少なくとも1つの実施例では、ターゲット・デバイス3546は、並列命令処理のために最適化されるプロセッサである。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3540は、任意の技術的に実現可能な様式でターゲット・デバイス3546を決定し得る。
【0247】
少なくとも1つの実施例では、ターゲット・デバイス3546が、CUDA(たとえば、CUDA対応GPU3594)と互換性がある場合、HIPコンパイラ・ドライバ3540は、HIP/NVCCコンパイル・コマンド3542を生成する。少なくとも1つの実施例では、及び図35Bと併せてより詳細に説明されるように、HIP/NVCCコンパイル・コマンド3542は、限定はしないが、HIPからCUDAへのトランスレーション・ヘッダ及びCUDAランタイム・ライブラリを使用してHIPソース・コード3530をコンパイルするようにCUDAコンパイラ3550を構成する。少なくとも1つの実施例では、及びHIP/NVCCコンパイル・コマンド3542に応答して、CUDAコンパイラ3550は、ホスト実行可能コード3570(1)及びCUDAデバイス実行可能コード3584を生成する。
【0248】
少なくとも1つの実施例では、ターゲット・デバイス3546が、CUDAと互換性がない場合、HIPコンパイラ・ドライバ3540は、HIP/HCCコンパイル・コマンド3544を生成する。少なくとも1つの実施例では、及び図35Cと併せてより詳細に説明されるように、HIP/HCCコンパイル・コマンド3544は、限定はしないが、HCCヘッダ及びHIP/HCCランタイム・ライブラリを使用してHIPソース・コード3530をコンパイルするようにHCC3560を構成する。少なくとも1つの実施例では、及びHIP/HCCコンパイル・コマンド3544に応答して、HCC3560は、ホスト実行可能コード3570(2)及びHCCデバイス実行可能コード3582を生成する。少なくとも1つの実施例では、HCCデバイス実行可能コード3582は、GPU3592上で実行可能である、HIPソース・コード3530中に含まれるデバイス・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、GPU3592は、並列命令処理のために最適化され、CUDAと互換性がなく、HCCと互換性がある、任意のプロセッサであり得る。少なくとも1つの実施例では、GPU3592は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、GPU3592は、CUDA非対応GPU3592である。
【0249】
単に説明目的のために、CPU3590及び異なるデバイス上での実行のためにCUDAソース・コード3510をコンパイルするために少なくとも1つの実施例において実装され得る3つの異なるフローが、図35Aに図示されている。少なくとも1つの実施例では、直接的CUDAフローが、CUDAソース・コード3510をHIPソース・コード3530にトランスレートすることなしに、CPU3590及びCUDA対応GPU3594上での実行のためにCUDAソース・コード3510をコンパイルする。少なくとも1つの実施例では、間接的CUDAフローが、CUDAソース・コード3510をHIPソース・コード3530にトランスレートし、次いで、CPU3590及びCUDA対応GPU3594上での実行のためにHIPソース・コード3530をコンパイルする。少なくとも1つの実施例では、CUDA/HCCフローが、CUDAソース・コード3510をHIPソース・コード3530にトランスレートし、次いで、CPU3590及びGPU3592上での実行のためにHIPソース・コード3530をコンパイルする。
【0250】
少なくとも1つの実施例において実装され得る直接的CUDAフローは、破線及びA1~A3とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びA1とアノテーション付けされたバブルで図示されているように、CUDAコンパイラ3550は、CUDAソース・コード3510と、CUDAソース・コード3510をコンパイルするようにCUDAコンパイラ3550を構成するCUDAコンパイル・コマンド3548とを受信する。少なくとも1つの実施例では、直接的CUDAフローにおいて使用されるCUDAソース・コード3510は、C++以外のプログラミング言語(たとえば、C、Fortran、Python、Java(登録商標)など)に基づくCUDAプログラミング言語で書かれる。少なくとも1つの実施例では、及びCUDAコンパイル・コマンド3548に応答して、CUDAコンパイラ3550は、ホスト実行可能コード3570(1)及びCUDAデバイス実行可能コード3584を生成する(A2とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びA3とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3570(1)及びCUDAデバイス実行可能コード3584は、それぞれ、CPU3590及びCUDA対応GPU3594上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3584は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3584は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
【0251】
少なくとも1つの実施例において実装され得る間接的CUDAフローは、点線及びB1~B6とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びB1とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510を受信する。少なくとも1つの実施例では、及びB2とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510をHIPソース・コード3530にトランスレートする。少なくとも1つの実施例では、及びB3とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3540は、HIPソース・コード3530を受信し、ターゲット・デバイス3546がCUDA対応であると決定する。
【0252】
少なくとも1つの実施例では、及びB4とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3540は、HIP/NVCCコンパイル・コマンド3542を生成し、HIP/NVCCコンパイル・コマンド3542とHIPソース・コード3530の両方をCUDAコンパイラ3550に送信する。少なくとも1つの実施例では、及び図35Bと併せてより詳細に説明されるように、HIP/NVCCコンパイル・コマンド3542は、限定はしないが、HIPからCUDAへのトランスレーション・ヘッダ及びCUDAランタイム・ライブラリを使用してHIPソース・コード3530をコンパイルするようにCUDAコンパイラ3550を構成する。少なくとも1つの実施例では、及びHIP/NVCCコンパイル・コマンド3542に応答して、CUDAコンパイラ3550は、ホスト実行可能コード3570(1)及びCUDAデバイス実行可能コード3584を生成する(B5とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びB6とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3570(1)及びCUDAデバイス実行可能コード3584は、それぞれ、CPU3590及びCUDA対応GPU3594上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3584は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3584は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
【0253】
少なくとも1つの実施例において実装され得るCUDA/HCCフローは、実線及びC1~C6とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びC1とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510を受信する。少なくとも1つの実施例では、及びC2とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510をHIPソース・コード3530にトランスレートする。少なくとも1つの実施例では、及びC3とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3540は、HIPソース・コード3530を受信し、ターゲット・デバイス3546がCUDA対応でないと決定する。
【0254】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3540は、HIP/HCCコンパイル・コマンド3544を生成し、HIP/HCCコンパイル・コマンド3544とHIPソース・コード3530の両方をHCC3560に送信する(C4とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及び図35Cと併せてより詳細に説明されるように、HIP/HCCコンパイル・コマンド3544は、限定はしないが、HCCヘッダ及びHIP/HCCランタイム・ライブラリを使用してHIPソース・コード3530をコンパイルするようにHCC3560を構成する。少なくとも1つの実施例では、及びHIP/HCCコンパイル・コマンド3544に応答して、HCC3560は、ホスト実行可能コード3570(2)及びHCCデバイス実行可能コード3582を生成する(C5とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びC6とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3570(2)及びHCCデバイス実行可能コード3582は、それぞれ、CPU3590及びGPU3592上で実行され得る。
【0255】
少なくとも1つの実施例では、CUDAソース・コード3510がHIPソース・コード3530にトランスレートされた後に、HIPコンパイラ・ドライバ3540は、その後、CUDAからHIPへのトランスレーション・ツール3520を再実行することなしに、CUDA対応GPU3594又はGPU3592のいずれかのための実行可能コードを生成するために使用され得る。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510をHIPソース・コード3530にトランスレートし、HIPソース・コード3530は、次いで、メモリに記憶される。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3540は、次いで、HIPソース・コード3530に基づいてホスト実行可能コード3570(2)及びHCCデバイス実行可能コード3582を生成するようにHCC3560を構成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3540は、その後、記憶されたHIPソース・コード3530に基づいてホスト実行可能コード3570(1)及びCUDAデバイス実行可能コード3584を生成するようにCUDAコンパイラ3550を構成する。
【0256】
図35Bは、少なくとも1つの実施例による、CPU3590及びCUDA対応GPU3594を使用して、図35AのCUDAソース・コード3510をコンパイル及び実行するように構成されたシステム3504を示す。少なくとも1つの実施例では、システム3504は、限定はしないが、CUDAソース・コード3510と、CUDAからHIPへのトランスレーション・ツール3520と、HIPソース・コード3530と、HIPコンパイラ・ドライバ3540と、CUDAコンパイラ3550と、ホスト実行可能コード3570(1)と、CUDAデバイス実行可能コード3584と、CPU3590と、CUDA対応GPU3594とを含む。少なくとも1つの実施例では、システム3504は、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、命令を含む。少なくとも1つの実施例では、システム3504は、実行されたとき、本明細書で説明されるものなどの1つ又は複数のプロセッサ及び/又は集積回路、並びにあらゆる他のプロセッサ及び/又は集積回路に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を含む。
【0257】
少なくとも1つの実施例では、及び図35Aと併せて本明細書で前に説明されたように、CUDAソース・コード3510は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3512と、(ゼロを含む)任意の数のデバイス機能3514と、(ゼロを含む)任意の数のホスト機能3516と、(ゼロを含む)任意の数のホスト/デバイス機能3518とを含む。少なくとも1つの実施例では、CUDAソース・コード3510は、限定はしないが、任意の数のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含む。
【0258】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510をHIPソース・コード3530にトランスレートする。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、CUDAソース・コード3510中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。
【0259】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3540は、ターゲット・デバイス3546がCUDA対応であると決定し、HIP/NVCCコンパイル・コマンド3542を生成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3540は、次いで、HIPソース・コード3530をコンパイルするようにHIP/NVCCコンパイル・コマンド3542を介してCUDAコンパイラ3550を構成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3540は、CUDAコンパイラ3550を構成することの一部として、HIPからCUDAへのトランスレーション・ヘッダ3552へのアクセスを提供する。少なくとも1つの実施例では、HIPからCUDAへのトランスレーション・ヘッダ3552は、任意の数のHIP APIにおいて指定された任意の数の機構(たとえば、機能)を、任意の数のCUDA APIにおいて指定された任意の数の機構にトランスレートする。少なくとも1つの実施例では、CUDAコンパイラ3550は、ホスト実行可能コード3570(1)及びCUDAデバイス実行可能コード3584を生成するために、CUDAランタイムAPI3502に対応するCUDAランタイム・ライブラリ3554と併せて、HIPからCUDAへのトランスレーション・ヘッダ3552を使用する。少なくとも1つの実施例では、ホスト実行可能コード3570(1)及びCUDAデバイス実行可能コード3584は、次いで、それぞれ、CPU3590及びCUDA対応GPU3594上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3584は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3584は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
【0260】
図35Cは、少なくとも1つの実施例による、CPU3590及びCUDA非対応GPU3592を使用して、図35AのCUDAソース・コード3510をコンパイル及び実行するように構成されたシステム3506を示す。少なくとも1つの実施例では、システム3506は、限定はしないが、CUDAソース・コード3510と、CUDAからHIPへのトランスレーション・ツール3520と、HIPソース・コード3530と、HIPコンパイラ・ドライバ3540と、HCC3560と、ホスト実行可能コード3570(2)と、HCCデバイス実行可能コード3582と、CPU3590と、GPU3592とを含む。
【0261】
少なくとも1つの実施例では、及び図35Aと併せて本明細書で前に説明されたように、CUDAソース・コード3510は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3512と、(ゼロを含む)任意の数のデバイス機能3514と、(ゼロを含む)任意の数のホスト機能3516と、(ゼロを含む)任意の数のホスト/デバイス機能3518とを含む。少なくとも1つの実施例では、CUDAソース・コード3510は、限定はしないが、任意の数のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含む。
【0262】
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510をHIPソース・コード3530にトランスレートする。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、ソース・コード3510中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。
【0263】
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3540は、その後、ターゲット・デバイス3546がCUDA対応でないと決定し、HIP/HCCコンパイル・コマンド3544を生成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3540は、次いで、HIPソース・コード3530をコンパイルするためにHIP/HCCコンパイル・コマンド3544を実行するようにHCC3560を構成する。少なくとも1つの実施例では、HIP/HCCコンパイル・コマンド3544は、限定はしないが、ホスト実行可能コード3570(2)及びHCCデバイス実行可能コード3582を生成するためにHIP/HCCランタイム・ライブラリ3558及びHCCヘッダ3556を使用するようにHCC3560を構成する。少なくとも1つの実施例では、HIP/HCCランタイム・ライブラリ3558は、HIPランタイムAPI3532に対応する。少なくとも1つの実施例では、HCCヘッダ3556は、限定はしないが、HIP及びHCCのための任意の数及びタイプの相互運用性機構を含む。少なくとも1つの実施例では、ホスト実行可能コード3570(2)及びHCCデバイス実行可能コード3582は、それぞれ、CPU3590及びGPU3592上で実行され得る。
【0264】
図36は、少なくとも1つの実施例による、図35CのCUDAからHIPへのトランスレーション・ツール3520によってトランスレートされた例示的なカーネルを示す。少なくとも1つの実施例では、CUDAソース・コード3510は、所与のカーネルが解くように設計される全体的な問題を、スレッド・ブロックを使用して独立して解かれ得る比較的粗いサブ問題に区分けする。少なくとも1つの実施例では、各スレッド・ブロックは、限定はしないが、任意の数のスレッドを含む。少なくとも1つの実施例では、各サブ問題は、スレッド・ブロック内のスレッドによって並列に連動して解かれ得る比較的細かい部片に区分けされる。少なくとも1つの実施例では、スレッド・ブロック内のスレッドは、共有メモリを通してデータを共有することによって、及びメモリ・アクセスを協調させるために実行を同期させることによって連動することができる。
【0265】
少なくとも1つの実施例では、CUDAソース・コード3510は、所与のカーネルに関連するスレッド・ブロックを、スレッド・ブロックの1次元グリッド、2次元グリッド、又は3次元グリッドに組織化する。少なくとも1つの実施例では、各スレッド・ブロックは、限定はしないが、任意の数のスレッドを含み、グリッドは、限定はしないが、任意の数のスレッド・ブロックを含む。
【0266】
少なくとも1つの実施例では、カーネルは、「__global__」宣言指定子(declaration specifier)を使用して定義されるデバイス・コード中の関数である。少なくとも1つの実施例では、所与のカーネル・コール及び関連するストリームについてカーネルを実行するグリッドの次元は、CUDAカーネル起動シンタックス3610を使用して指定される。少なくとも1つの実施例では、CUDAカーネル起動シンタックス3610は、「KernelName<<<GridSize,BlockSize,SharedMemorySize,Stream>>>(KernelArguments);」として指定される。少なくとも1つの実施例では、実行構成シンタックスは、カーネル名(「KernelName」)とカーネル引数の括弧に入れられたリスト(「KernelArguments」)との間に挿入される「<<<...>>>」構築物である。少なくとも1つの実施例では、CUDAカーネル起動シンタックス3610は、限定はしないが、実行構成シンタックスの代わりにCUDA起動機能シンタックスを含む。
【0267】
少なくとも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を与えられる。
【0268】
少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3610に関して、「SharedMemorySize」は、静的に割り振られたメモリに加えて、所与のカーネル・コールについてスレッド・ブロックごとに動的に割り振られる共有メモリ中のバイトの数を指定する随意の引数である。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3610に関して、SharedMemorySizeは0にデフォルト設定される。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3610に関して、「Stream」は、関連するストリームを指定する随意の引数であり、デフォルト・ストリームを指定するために0にデフォルト設定される。少なくとも1つの実施例では、ストリームは、イン・オーダーで実行する(場合によっては、異なるホスト・スレッドによって発行された)コマンドのシーケンスである。少なくとも1つの実施例では、異なるストリームは、互いに対してアウト・オブ・オーダーで、又は同時に、コマンドを実行し得る。
【0269】
少なくとも1つの実施例では、CUDAソース・コード3510は、限定はしないが、例示的なカーネル「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カーネル起動シンタックス3610通りに、カーネルMatAddは、寸法N/16×N/16を有する、スレッド・ブロックのグリッドを使用して実行され、ここで、各スレッド・ブロックは、16×16の寸法を有する。少なくとも1つの実施例では、各スレッド・ブロックは、256個のスレッドを含み、グリッドは、行列要素ごとに1つのスレッドを有するのに十分なブロックで作成され、そのようなグリッド中の各スレッドは、1つのペアワイズ加算を実施するためにカーネルMatAddを実行する。
【0270】
少なくとも1つの実施例では、CUDAソース・コード3510をHIPソース・コード3530にトランスレートする間、CUDAからHIPへのトランスレーション・ツール3520は、CUDAソース・コード3510中の各カーネル・コールを、CUDAカーネル起動シンタックス3610からHIPカーネル起動シンタックス3620にトランスレートし、ソース・コード3510中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。少なくとも1つの実施例では、HIPカーネル起動シンタックス3620は、「hipLaunchKernelGGL(KernelName,GridSize,BlockSize,SharedMemorySize,Stream,KernelArguments);」として指定される。少なくとも1つの実施例では、KernelName、GridSize、BlockSize、ShareMemorySize、Stream、及びKernelArgumentsの各々は、HIPカーネル起動シンタックス3620において、(本明細書で前に説明された)CUDAカーネル起動シンタックス3610の場合と同じ意味を有する。少なくとも1つの実施例では、引数SharedMemorySize及びStreamは、HIPカーネル起動シンタックス3620では必要とされ、CUDAカーネル起動シンタックス3610では随意である。
【0271】
少なくとも1つの実施例では、図36に図示されたHIPソース・コード3530の一部分は、カーネルMatAddにデバイス上で実行させるカーネル・コールを除いて、図36に図示されたCUDAソース・コード3510の一部分と同一である。少なくとも1つの実施例では、カーネルMatAddは、カーネルMatAddがCUDAソース・コード3510において定義される、同じ「__global__」宣言指定子を用いて、HIPソース・コード3530において定義される。少なくとも1つの実施例では、HIPソース・コード3530中のカーネル・コールは、「hipLaunchKernelGGL(MatAdd,numBlocks,threadsPerBlock,0,0,A,B,C);」であるが、CUDAソース・コード3510中の対応するカーネル・コールは、「MatAdd<<<numBlocks,threadsPerBlock>>>(A,B,C);」である。
【0272】
図37は、少なくとも1つの実施例による、図35CのCUDA非対応GPU3592をより詳細に示す。少なくとも1つの実施例では、GPU3592は、サンタクララのAMD corporationによって開発される。少なくとも1つの実施例では、GPU3592は、高度並列様式でコンピュート動作を実施するように構成され得る。少なくとも1つの実施例では、GPU3592は、描画コマンド、ピクセル動作、幾何学的算出、及びディスプレイに画像をレンダリングすることに関連する他の動作など、グラフィックス・パイプライン動作を実行するように構成される。少なくとも1つの実施例では、GPU3592は、グラフィックに関係しない動作を実行するように構成される。少なくとも1つの実施例では、GPU3592は、グラフィックに関係する動作とグラフィックに関係しない動作の両方を実行するように構成される。少なくとも1つの実施例では、GPU3592は、HIPソース・コード3530中に含まれるデバイス・コードを実行するように構成され得る。
【0273】
少なくとも1つの実施例では、GPU3592は、限定はしないが、任意の数のプログラマブル処理ユニット3720と、コマンド・プロセッサ3710と、L2キャッシュ3722と、メモリ・コントローラ3770と、DMAエンジン3780(1)と、システム・メモリ・コントローラ3782と、DMAエンジン3780(2)と、GPUコントローラ3784とを含む。少なくとも1つの実施例では、各プログラマブル処理ユニット3720は、限定はしないが、ワークロード・マネージャ3730と、任意の数のコンピュート・ユニット3740とを含む。少なくとも1つの実施例では、コマンド・プロセッサ3710は、1つ又は複数のコマンド・キュー(図示せず)からコマンドを読み取り、ワークロード・マネージャ3730にコマンドを分散させる。少なくとも1つの実施例では、各プログラマブル処理ユニット3720について、関連するワークロード・マネージャ3730は、プログラマブル処理ユニット3720中に含まれるコンピュート・ユニット3740にワークを分散させる。少なくとも1つの実施例では、各コンピュート・ユニット3740は、任意の数のスレッド・ブロックを実行し得るが、各スレッド・ブロックは、単一のコンピュート・ユニット3740上で実行する。少なくとも1つの実施例では、ワークグループは、スレッド・ブロックである。
【0274】
少なくとも1つの実施例では、各コンピュート・ユニット3740は、限定はしないが、任意の数のSIMDユニット3750と、共有メモリ3760とを含む。少なくとも1つの実施例では、各SIMDユニット3750は、SIMDアーキテクチャを実装し、動作を並列に実施するように構成され得る。少なくとも1つの実施例では、各SIMDユニット3750は、限定はしないが、ベクトルALU3752とベクトル・レジスタ・ファイル3754とを含む。少なくとも1つの実施例では、各SIMDユニット3750は、異なるワープを実行する。少なくとも1つの実施例では、ワープは、スレッドのグループ(たとえば、16個のスレッド)であり、ここで、ワープ中の各スレッドは、単一のスレッド・ブロックに属し、命令の単一のセットに基づいて、データの異なるセットを処理するように構成される。少なくとも1つの実施例では、ワープ中の1つ又は複数のスレッドを無効にするために、プレディケーションが使用され得る。少なくとも1つの実施例では、レーンはスレッドである。少なくとも1つの実施例では、ワーク・アイテムはスレッドである。少なくとも1つの実施例では、ウェーブフロントはワープである。少なくとも1つの実施例では、スレッド・ブロック中の異なるウェーブフロントは、互いに同期し、共有メモリ3760を介して通信し得る。
【0275】
少なくとも1つの実施例では、プログラマブル処理ユニット3720は、「シェーダ・エンジン」と呼ばれる。少なくとも1つの実施例では、各プログラマブル処理ユニット3720は、限定はしないが、コンピュート・ユニット3740に加えて、任意の量の専用グラフィックス・ハードウェアを含む。少なくとも1つの実施例では、各プログラマブル処理ユニット3720は、限定はしないが、(ゼロを含む)任意の数のジオメトリ・プロセッサと、(ゼロを含む)任意の数のラスターライザと、(ゼロを含む)任意の数のレンダー・バック・エンドと、ワークロード・マネージャ3730と、任意の数のコンピュート・ユニット3740とを含む。
【0276】
少なくとも1つの実施例では、コンピュート・ユニット3740は、L2キャッシュ3722を共有する。少なくとも1つの実施例では、L2キャッシュ3722は区分けされる。少なくとも1つの実施例では、GPUメモリ3790は、GPU3592中のすべてのコンピュート・ユニット3740によってアクセス可能である。少なくとも1つの実施例では、メモリ・コントローラ3770及びシステム・メモリ・コントローラ3782は、GPU3592とホストとの間のデータ転送を容易にし、DMAエンジン3780(1)は、GPU3592とそのようなホストとの間の非同期メモリ転送を可能にする。少なくとも1つの実施例では、メモリ・コントローラ3770及びGPUコントローラ3784は、GPU3592と他のGPU3592との間のデータ転送を容易にし、DMAエンジン3780(2)は、GPU3592と他のGPU3592との間の非同期メモリ転送を可能にする。
【0277】
少なくとも1つの実施例では、GPU3592は、限定はしないが、GPU3592の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする、任意の量及びタイプのシステム相互接続を含む。少なくとも1つの実施例では、GPU3592は、限定はしないが、任意の数及びタイプの周辺デバイスに結合される、任意の数及びタイプのI/Oインターフェース(たとえば、PCIe)を含む。少なくとも1つの実施例では、GPU3592は、限定はしないが、(ゼロを含む)任意の数のディスプレイ・エンジンと、(ゼロを含む)任意の数のマルチメディア・エンジンとを含み得る。少なくとも1つの実施例では、GPU3592は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ(たとえば、メモリ・コントローラ3770及びシステム・メモリ・コントローラ3782)及びメモリ・デバイス(たとえば、共有メモリ3760)を含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、GPU3592は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ3722)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、SIMDユニット3750、コンピュート・ユニット3740、及びプログラマブル処理ユニット3720)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
【0278】
図38は、少なくとも1つの実施例による、例示的なCUDAグリッド3820のスレッドが図37の異なるコンピュート・ユニット3740にどのようにマッピングされるかを示す。少なくとも1つの実施例では、及び単に説明目的のために、グリッド3820は、BX×BY×1のGridSizeと、TX×TY×1のBlockSizeとを有する。少なくとも1つの実施例では、グリッド3820は、したがって、限定はしないが、(BX*BY)個のスレッド・ブロック3830を含み、各スレッド・ブロック3830は、限定はしないが、(TX*TY)個のスレッド3840を含む。スレッド3840は、曲がりくねった矢印(squiggly arrow)として図38に図示されている。
【0279】
少なくとも1つの実施例では、グリッド3820は、限定はしないが、コンピュート・ユニット3740(1)~3740(C)を含むプログラマブル処理ユニット3720(1)にマッピングされる。少なくとも1つの実施例では、及び示されているように、(BJ*BY)個のスレッド・ブロック3830が、コンピュート・ユニット3740(1)にマッピングされ、残りのスレッド・ブロック3830が、コンピュート・ユニット3740(2)にマッピングされる。少なくとも1つの実施例では、各スレッド・ブロック3830は、限定はしないが、任意の数のワープを含み得、各ワープは、図37の異なるSIMDユニット3750にマッピングされる。
【0280】
少なくとも1つの実施例では、所与のスレッド・ブロック3830中のワープは、互いに同期し、関連するコンピュート・ユニット3740中に含まれる共有メモリ3760を通して通信し得る。たとえば、及び少なくとも1つの実施例では、スレッド・ブロック3830(BJ,1)中のワープは、互いに同期し、共有メモリ3760(1)を通して通信することができる。たとえば、及び少なくとも1つの実施例では、スレッド・ブロック3830(BJ+1,1)中のワープは、互いに同期し、共有メモリ3760(2)を通して通信することができる。
【0281】
図39は、少なくとも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加速を使用する複雑なアルゴリズムを構築し、次いで、それらを、異なるタイプのデータに関するそれらのソース・コード全体にわたって再使用することができる、単一ソース開発を可能にし得る。
【0282】
少なくとも1つの実施例では、DPC++コンパイラは、多様なハードウェア・ターゲットにわたって導入され得るDPC++ソース・コードをコンパイルするために使用される。少なくとも1つの実施例では、DPC++コンパイラは、多様なハードウェア・ターゲットにわたって導入され得るDPC++アプリケーションを生成するために使用され、DPC++互換性ツールは、CUDAアプリケーションをDPC++のマルチプラットフォーム・プログラムにマイグレートするために使用され得る。少なくとも1つの実施例では、DPC++ベース・ツール・キットは、多様なハードウェア・ターゲットにわたってアプリケーションを導入するためのDPC++コンパイラと、CPU、GPU、及びFPGAにわたって生産性及び性能を増加させるためのDPC++ライブラリと、CUDAアプリケーションをマルチプラットフォーム・アプリケーションにマイグレートするためのDPC++互換性ツールと、それらの任意の好適な組合せとを含む。
【0283】
少なくとも1つの実施例では、DPC++プログラミング・モデルは、Data Parallel C++と呼ばれるプログラミング言語を用いて並列処理を表現するための現代のC++特徴を使用することによって、単に、CPU及びアクセラレータをプログラムすることに関係する1つ又は複数の態様に対して利用される。DPC++プログラミング言語は、ホスト(たとえば、CPU)及びアクセラレータ(たとえば、GPU又はFPGA)のためのコード再使用に対して利用され、単一のソース言語を使用し、実行及びメモリ依存性が明確に通信され得る。DPC++コード内でのマッピングは、アプリケーションを移行させて、ワークロードを最も良く加速するハードウェア又はハードウェア・デバイスのセット上で稼働するために、使用され得る。利用可能なアクセラレータを有しないプラットフォーム上でも、デバイス・コードの開発及びデバッギングを簡略化するために、ホストが利用可能であり得る。
【0284】
少なくとも1つの実施例では、人間が読み取れるDPC+3904を生成するために、DPC++互換性ツール3902への入力として、CUDAソース・コード3900が提供される。少なくとも1つの実施例では、人間が読み取れるDPC+3904は、DPC++互換性ツール3902によって生成されたインライン・コメントを含み、これは、コーディングと所望の性能への調整とを完了3906するために、DPC++コードをどのように及び/又はどこで修正すべきかに関して開発者をガイドし、それにより、DPC++ソース・コード3908を生成する。
【0285】
少なくとも1つの実施例では、CUDAソース・コード3900は、CUDAプログラミング言語の人間が読み取れるソース・コードの集合であるか、又はその集合を含む。少なくとも1つの実施例では、CUDAソース・コード3900は、CUDAプログラミング言語の人間が読み取れるソース・コードである。少なくとも1つの実施例では、CUDAプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、デバイス・コードは、コンパイルの後に、デバイス(たとえば、GPU又はFPGA)上で実行可能であり、デバイスの1つ又は複数のプロセッサ・コア上で実行され得る、又はより並列化可能なワークフローを含み得る、ソース・コードである。少なくとも1つの実施例では、デバイスは、CUDA対応GPU、GPU、又は別のGPGPUなど、並列命令処理のために最適化されるプロセッサであり得る。少なくとも1つの実施例では、ホスト・コードは、コンパイルの後にホスト上で実行可能であるソース・コードである。少なくとも1つの実施例では、ホスト・コード及びデバイス・コードの一部又は全部は、CPU及びGPU/FPGAにわたって並列に実行され得る。少なくとも1つの実施例では、ホストは、CPUなど、連続命令処理のために最適化されるプロセッサである。図39に関して説明されるCUDAソース・コード3900は、本明細書の他の場所で説明されるCUDAソース・コードに従い得る。
【0286】
少なくとも1つの実施例では、DPC++互換性ツール3902は、DPC++ソース・コード3908へのCUDAソース・コード3900のマイグレーションを容易にするために使用される、実行可能ツール、プログラム、アプリケーション、又は任意の他の好適なタイプのツールを指す。少なくとも1つの実施例では、DPC++互換性ツール3902は、既存のCUDAソースをDPC++に移植するために使用されるDPC++ツール・キットの一部として利用可能なコマンド・ライン・ベースのコード・マイグレーション・ツールである。少なくとも1つの実施例では、DPC++互換性ツール3902は、CUDAアプリケーションの一部又は全部のソース・コードをCUDAからDPC++にコンバートし、人間が読み取れるDPC++3904と呼ばれる、少なくとも部分的にDPC++で書かれる得られたファイルを生成する。少なくとも1つの実施例では、人間が読み取れるDPC++3904は、ユーザ介入がどこで必要であり得るかを示すためにDPC++互換性ツール3902によって生成されるコメントを含む。少なくとも1つの実施例では、ユーザ介入は、CUDAソース・コード3900が、類似するDPC++APIを有しないCUDA APIをコールするとき、必要であり、ユーザ介入が必要とされる他の実例は、後でより詳細に説明される。
【0287】
少なくとも1つの実施例では、CUDAソース・コード3900(たとえば、アプリケーション又はそれの部分)をマイグレートするためのワークフローは、1つ又は複数のコンパイル・データベース・ファイルを作成することと、DPC++互換性ツール3902を使用してCUDAをDPC++にマイグレートすることと、マイグレーションを完了し、正当性を確認し、それにより、DPC++ソース・コード3908を生成することと、DPC++アプリケーションを生成するためにDPC++コンパイラを用いてDPC++ソース・コード3908をコンパイルすることとを含む。少なくとも1つの実施例では、互換性ツールは、Makefileが実行するときに使用されるコマンドをインターセプトし、それらをコンパイル・データベース・ファイルに記憶する、ユーティリティを提供する。少なくとも1つの実施例では、ファイルは、JSONフォーマットで記憶される。少なくとも1つの実施例では、intercept-builtコマンドは、MakefileコマンドをDPC互換性コマンドにコンバートする。
【0288】
少なくとも1つの実施例では、intercept-buildは、ビルド・プロセスをインターセプトして、コンパイル・オプション、マクロ定義(macro defs)、及びインクルード・パス(include paths)をキャプチャし、このデータをコンパイル・データベース・ファイルに書き込む、ユーティリティ・スクリプトである。少なくとも1つの実施例では、コンパイル・データベース・ファイルは、JSONファイルである。少なくとも1つの実施例では、DPC++互換性ツール3902は、コンパイル・データベースを構文解析し、入力ソースをマイグレートするときにオプションを適用する。少なくとも1つの実施例では、intercept-buildの使用は、随意であるが、Make又はCMakeベースの環境について大いに推奨される。少なくとも1つの実施例では、マイグレーション・データベースは、コマンドとディレクトリとファイルとを含み、コマンドは、必要なコンパイル・フラグを含み得、ディレクトリは、ヘッダ・ファイルへのパスを含み得、ファイルは、CUDAファイルへのパスを含み得る。
【0289】
少なくとも1つの実施例では、DPC++互換性ツール3902は、可能な場合はいつでもDPC++を生成することによって、CUDAで書かれたCUDAコード(たとえば、アプリケーション)をDPC++にマイグレートする。少なくとも1つの実施例では、DPC++互換性ツール3902は、ツール・キットの一部として利用可能である。少なくとも1つの実施例では、DPC++ツール・キットは、intercept-buildツールを含む。少なくとも1つの実施例では、intercept-builtツールは、CUDAファイルをマイグレートするためにコンパイル・コマンドをキャプチャするコンパイル・データベースを作成する。少なくとも1つの実施例では、intercept-builtツールによって生成されたコンパイル・データベースは、CUDAコードをDPC++にマイグレートするためにDPC++互換性ツール3902によって使用される。少なくとも1つの実施例では、非CUDA C++コード及びファイルは、そのままマイグレートされる。少なくとも1つの実施例では、DPC++互換性ツール3902は、人間が読み取れるDPC++3904を生成し、これは、DPC++互換性ツール3902によって生成されたとき、DPC++コンパイラによってコンパイルされないことがあり、正しくマイグレートされなかったコードの部分を確認するための追加のプラミング(plumbing)を必要とする、DPC++コードであり得、開発者によってなど、手動の介入を伴い得る。少なくとも1つの実施例では、DPC++互換性ツール3902は、自動的にマイグレートされないことがある追加のコードを開発者が手動でマイグレートするのを助けるために、コード中に埋め込まれたヒント又はツールを提供する。少なくとも1つの実施例では、マイグレーションは、ソース・ファイル、プロジェクト、又はアプリケーションのための1回のアクティビティである。
【0290】
少なくとも1つの実施例では、DPC++互換性ツール39002は、CUDAコードのすべての部分をDPC++に正常にマイグレートすることが可能であり、単に、生成されたDPC++ソース・コードの性能を手動で確認及び調整するための随意のステップがあり得る。少なくとも1つの実施例では、DPC++互換性ツール3902は、DPC++互換性ツール3902によって生成されたDPC++コードを修正するための人間の介入を必要とするか又は利用することなしに、DPC++コンパイラによってコンパイルされるDPC++ソース・コード3908を直接生成する。少なくとも1つの実施例では、DPC++互換性ツールは、コンパイル可能なDPC++コードを生成し、これは、性能、読みやすさ、維持可能性、他の様々な考慮事項、又はそれらの任意の組合せについて、開発者によって随意に調整され得る。
【0291】
少なくとも1つの実施例では、1つ又は複数のCUDAソース・ファイルは、少なくとも部分的にDPC++互換性ツール3902を使用してDPC++ソース・ファイルにマイグレートされる。少なくとも1つの実施例では、CUDAソース・コードは、CUDAヘッダ・ファイルを含み得る1つ又は複数のヘッダ・ファイルを含む。少なくとも1つの実施例では、CUDAソース・ファイルは、<cuda.h>ヘッダ・ファイルと、テキストをプリントするために使用され得る<stdio.h>ヘッダ・ファイルとを含む。少なくとも1つの実施例では、ベクトル加算カーネルCUDAソース・ファイルの一部分は、以下のように書かれるか、又は以下に関係し得る。
【数1-1】

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

【数2-2】

【数2-3】
【0297】
少なくとも1つの実施例では、人間が読み取れるDPC+3904は、DPC++互換性ツール3902によって生成された出力を指し、ある様式又は別の様式で最適化され得る。少なくとも1つの実施例では、DPC++互換性ツール3902によって生成された人間が読み取れるDPC+3904は、それをより維持可能にすること、性能、又は他の考慮事項のために、マイグレーションの後に開発者によって手動で編集され得る。少なくとも1つの実施例では、開示されるDPC++などのDPC++互換性ツール39002によって生成されたDPC++コードは、各malloc_device()コールのためのget_current_device()及び/又はget_default_context()への繰返しコールを削除することによって最適化され得る。少なくとも1つの実施例では、上記で生成されるDPC++コードは、3次元のnd_rangeを使用し、これは、単一次元のみを使用し、それにより、メモリ使用量を低減するために、再ファクタ化され得る。少なくとも1つの実施例では、開発者は、DPC++互換性ツール3902によって生成されたDPC++コードを手動で編集し、統一共有メモリの使用をアクセッサと置き換えることができる。少なくとも1つの実施例では、DPC++互換性ツール3902は、それがCUDAコードをDPC++コードにどのようにマイグレートするかを変更するためのオプションを有する。少なくとも1つの実施例では、DPC++互換性ツール3902は、それが、CUDAコードを、多数の場合について機能するDPC++コードにマイグレートするための一般的なテンプレートを使用しているので、冗長である。
【0298】
少なくとも1つの実施例では、CUDAからDPC++へのマイグレーション・ワークフローは、intercept-buildスクリプトを使用してマイグレーションの準備をするためのステップと、DPC++互換性ツール3902を使用してDPC++へのCUDAプロジェクトのマイグレーションを実施するためのステップと、完了及び正当性のために、マイグレートされたソース・ファイルを手動で検討及び編集するためのステップと、DPC++アプリケーションを生成するために最終DPC++コードをコンパイルするためのステップと含む。少なくとも1つの実施例では、DPC++ソース・コードの手動の検討は、限定はしないが、マイグレートされたAPIがエラー・コードを返さないこと(CUDAコードは、エラー・コードを返すことができ、エラー・コードは、次いで、アプリケーションよって消費され得るが、SYCLは、エラーを報告するために例外を使用し、したがって、エラーを表面化させるためのエラー・コードを使用しない)、CUDAコンピュート能力依存論理がDPC++によってサポートされないこと、ステートメントが削除されないことがあることを含む、1つ又は複数のシナリオにおいて必要とされ得る。少なくとも1つの実施例では、DPC++コードが手動の介入を必要とするシナリオは、限定はしないが、エラー・コード論理が(*,0)コードと置き換えられるか又はコメント・アウトされる、等価なDPC++APIが利用可能でない、CUDAコンピュート能力依存論理、ハードウェア依存API(clock())、欠落した特徴、サポートされていないAPI、実行時間測定論理、組み込みベクトル・タイプ競合に対処すること、cuBLAS APIのマイグレーションなどを含み得る。
【0299】
少なくとも1つの実施例では、本明細書で説明される1つ又は複数の技法は、oneAPIプログラミング・モデルを利用する。少なくとも1つの実施例では、oneAPIプログラミング・モデルとは、様々な計算アクセラレータ・アーキテクチャと対話するためのプログラミング・モデルを称する。少なくとも1つの実施例では、oneAPIとは、様々な計算アクセラレータ・アーキテクチャと対話するように設計されたアプリケーション・プログラミング・インターフェース(API)を称する。少なくとも1つの実施例では、oneAPIプログラミング・モデルは、DPC++プログラミング言語を利用する。少なくとも1つの実施例では、DPC++プログラミング言語とは、data parallelプログラミング生産性のための高次言語を称する。少なくとも1つの実施例では、DPC++プログラミング言語は、少なくとも部分的に、C及び/又はC++プログラミング言語に基づいている。少なくとも1つの実施例では、oneAPIプログラミング・モデルは、カリフォルニア州サンタクララのIntel Corporationにより開発されたモデルなどの、プログラミング・モデルである。
【0300】
少なくとも1つの実施例では、oneAPI及び/又はoneAPIプログラミング・モデルは、様々なアクセラレータ、GPU、プロセッサ、及び/又はその変形形態のアーキテクチャと対話するために利用される。少なくとも1つの実施例では、oneAPIは、様々な機能性を実装するライブラリのセットを含む。少なくとも1つの実施例では、oneAPIは、少なくともoneAPI DPC++ライブラリ、oneAPIマス・カーネル・ライブラリ、oneAPIデータ・アナリティクス・ライブラリ、oneAPIディープ・ニューラル・ネットワーク・ライブラリ、oneAPI集合通信ライブラリ、oneAPIスレッディング・ビルディング・ブロック・ライブラリ、oneAPIビデオ・処理ライブラリ、及び/又はその変形形態を含む。少なくとも1つの実施例では、oneAPI及び/又はoneAPIプログラミング・モデルは、図1図7と併せて上記で説明された様々な構成要素を実装するための、及び/又は様々な動作を実行させるための、命令を含む。少なくとも1つの実施例では、oneAPI及び/又はoneAPIプログラミング・モデルは、実行されたとき、本明細書で説明されるものなどの1つ又は複数のプロセッサ及び/又は集積回路、並びにあらゆる他のプロセッサ及び/又は集積回路に、図1図7と併せて上記で説明された様々な動作を実行させるための、1つ又は複数の命令を含む。
【0301】
少なくとも1つの実施例では、oneDPLとも称されるoneAPI DPC++ライブラリは、DPC++カーネル・プログラミングを加速させるためのアルゴリズム及び関数を実装するライブラリである。少なくとも1つの実施例では、oneDPLは、1つ又は複数の標準テンプレート・ライブラリ(STL)関数を実装する。少なくとも1つの実施例では、oneDPLは、1つ又は複数の並列STL関数を実装する。少なくとも1つの実施例では、oneDPLは、並列アルゴリズム、イテレータ、関数オブジェクト・クラス、範囲ベースAPI、及び/又はその変形形態など、ライブラリ・クラスと関数のセットを提供する。少なくとも1つの実施例では、oneDPLは、C++標準ライブラリの1つ又は複数のクラス及び/又は関数を実装する。少なくとも1つの実施例では、oneDPLは、1つ又は複数の乱数生成器関数を実装する。
【0302】
少なくとも1つの実施例では、oneMKLとも称されるoneAPIマス・カーネル・ライブラリは、様々な数学的関数及び/又は演算向けに、様々な最適化及び並列化されたルーチンを実装するライブラリである。少なくとも1つの実施例では、oneMKLは、1つ又は複数の基本線形代数サブプログラム(BLAS)及び/又は線形代数パッケージ(LAPACK)密線形代数ルーチンを実装する。少なくとも1つの実施例では、oneMKLは、1つ又は複数の疎BLAS線形代数ルーチンを実装する。少なくとも1つの実施例では、oneMKLは、1つ又は複数の乱数生成器(RNG)を実装する。少なくとも1つの実施例では、oneMKLは、ベクトルに対する数学的演算用に、1つ又は複数のベクトル数学(VM)ルーチンを実装する。少なくとも1つの実施例では、oneMKLは、1つ又は複数の高速フーリエ変換(FFT:Fast Fourier Transform)関数を実装する。
【0303】
少なくとも1つの実施例では、oneDALとも称されるoneAPIデータ・アナリティクス・ライブラリは、様々なデータ分析アプリケーション及び分散型の計算を実装するライブラリである。少なくとも1つの実施例では、oneDALは、プリプロセッシング、変換、分析、モデリング、検証、及びデータ分析についての意思決定のための、様々なアルゴリズムを、バッチ、オンライン、及び計算の分散処理モードで、実装する。少なくとも1つの実施例では、oneDALは、様々なC++及び/又はJava(登録商標) API、並びに1つ又は複数のデータ・ソースへの様々なコネクタを実装する。少なくとも1つの実施例では、oneDALは、従来のC++インターフェースに対してDPC++ API拡張を実装し、様々なアルゴリズムのためにGPU使用を可能にする。
【0304】
少なくとも1つの実施例では、oneDNNとも称されるoneAPIディープ・ニューラル・ネットワーク・ライブラリは、様々な深層学習関数を実装するライブラリである。少なくとも1つの実施例では、oneDNNは、様々なニューラル・ネットワーク、機械学習、及び深層学習関数、アルゴリズム、及び/又はその変形形態を実装する。
【0305】
少なくとも1つの実施例では、oneCCLとも称されるoneAPI集合通信ライブラリは、深層学習及び機械学習ワークロードのための、様々なアプリケーションを実装するライブラリである。少なくとも1つの実施例では、oneCCLは、メッセージ・パッシング・インターフェース(MPI:message passing interface)及びlibfabricなどの低レベルの通信ミドルウェアでビルドされる。少なくとも1つの実施例では、oneCCLは、優先度付け、パーシステントな演算、アウト・オブ・オーダー実行、及び/又はその変形形態など、深層学習特有の最適化のセットを可能にする。少なくとも1つの実施例では、oneCCLは、様々なCPU及びGPU関数を実装する。
【0306】
少なくとも1つの実施例では、oneTBBとも称されるoneAPIスレッディング・ビルディング・ブロック・ライブラリは、様々なアプリケーション向けの様々な並列化プロセスを実装するライブラリである。少なくとも1つの実施例では、oneTBBは、タスクベースの、共有された並列プログラミングのためにホスト上で利用される。少なくとも1つの実施例では、oneTBBは、汎用並列アルゴリズムを実装する。少なくとも1つの実施例では、oneTBBは、コンカレント・コンテナを実装する。少なくとも1つの実施例では、oneTBBは、スケーラブルなメモリ・アロケータを実装する。少なくとも1つの実施例では、oneTBBは、work-stealingタスク・スケジューラを実装する。少なくとも1つの実施例では、oneTBBは、低レベルの同期プリミティブを実装する。少なくとも1つの実施例では、oneTBBはコンパイラ独立的であり、GPU、PPU、CPU、及び/又はその変形形態など、様々なプロセッサ上で使用可能である。
【0307】
少なくとも1つの実施例では、oneVPLとも称されるoneAPIビデオ処理ライブラリは、1つ又は複数のアプリケーションにおいてビデオ処理を加速させるために利用されるライブラリである。少なくとも1つの実施例では、oneVPLは、様々なビデオ・デコーディング、エンコーディング、及び処理関数を実装する。少なくとも1つの実施例では、oneVPLは、CPU、GPU、及び他のアクセラレータ上のメディア・パイプラインのための様々な関数を実装する。少なくとも1つの実施例では、oneVPLは、デバイスのディスカバリ、並びにメディア中心及びビデオ・アナリティクスのワークロードにおける選択を実装する。少なくとも1つの実施例では、oneVPLは、ゼロコピーのバッファ共有のためのAPIプリミティブを実装する。
【0308】
少なくとも1つの実施例では、oneAPIプログラミング・モデルは、DPC++プログラミング言語を利用する。少なくとも1つの実施例では、DPC++プログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための、機能的に同様のバージョンのCUDA機構を含む、プログラミング言語である。少なくとも1つの実施例では、DPC++プログラミング言語は、CUDAプログラミング言語の機能性のサブセットを含み得る。少なくとも1つの実施例では、1つ又は複数のCUDAプログラミング・モデル動作は、DPC++プログラミング言語を使用するoneAPIプログラミング・モデルを用いて行われる。
【0309】
本明細書で説明される例示的な実施例は、CUDAプログラミング・モデルに関連し得るが、本明細書で説明される技法は、HIP、oneAPI(たとえば、本明細書で開示される方法を実行又は実装するための、oneAPIベースのプログラミングを使用して)、及び/又はその変形形態などの、あらゆる好適なプログラミング・モデルで利用することが可能であることに留意されたい。
【0310】
少なくとも1つの実施例では、上で開示されるシステム及び/又はプロセッサの1つ又は複数の構成要素は、1つ又は複数のCPU、ASIC、GPU、FPGA、又は他のハードウェア、回路、又は集積回路構成要素と通信することが可能であり、そのような構成要素としては、たとえば、画像をアップスケールするためのアップスケーラ若しくはアップサンプラ、画像をブレンド、混合若しくは足し合わせるための画像ブレンダ若しくは画像ブレンダ構成要素、画像をサンプリングするためのサンプラ(たとえば、DSPの一部として)、画像を(たとえば、低解像度の画像から高解像度の画像へ)アップスケールするためのアップスケーラを実行するように構成されるニューラル・ネットワーク回路、又は画像、フレーム、若しくはビデオを修正若しくは生成してその解像度、サイズ、若しくはピクセルを調節するための他のハードウェアが挙げられる。上で開示されるシステム及び/又はプロセッサの1つ又は複数の構成要素は、本開示で説明される構成要素を使用して、画像を生成又は修正する方法、動作、又は命令を実行することが可能である。
【0311】
本開示の少なくとも1つの実施例は、以下の条項を考慮して説明され得る。
1. アプリケーション・プログラミング・インターフェース(API)を実行して、APIが参照するデータの1つ又は複数のアドレスを示すための、1つ又は複数の回路を備える、プロセッサ。
2. APIが、入力として、メモリ・アドレスを受信し、1つ又は複数のアドレスがメモリ・アドレスを含む結果として、1つ又は複数のアドレスの識別子を提供することによって1つ又は複数のアドレスを示す、条項1に記載のプロセッサ。
3. APIが、APIが参照するデータの1つ又は複数のアドレスが、パラメータとしてAPIに示されるアドレスを含まない場合、ヌル・データ値を示す、条項1又は2に記載のプロセッサ。
4. プロセッサが、APIを実行するためのドライバをさらに実行する、条項1から3までのいずれかに記載のプロセッサ。
5. APIが、1つ又は複数のメモリのブロック内の1つ又は複数のアドレスを含む1つ又は複数のデータ値を示す1つ又は複数のAPIコールに応答して、APIが参照するデータの1つ又は複数のアドレスを示す、条項1から4までのいずれかに記載のプロセッサ。
6. 1つ又は複数のアドレスが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能なメモリのブロックを示す、条項1から5までのいずれかに記載のプロセッサ。
7. APIが参照するデータの1つ又は複数のアドレスが、1つ又は複数のstream ordered memory allocatorを使用して割り振られる1つ又は複数のメモリのブロックを含む1つ又は複数のメモリ・プールを含む、条項1から6までのいずれかに記載のプロセッサ。
8. アプリケーション・プログラミング・インターフェース(API)を実行して、APIが参照するデータの1つ又は複数のアドレスを示すための、1つ又は複数のプロセッサを備える、システム。
9. APIが、1つ又は複数のメモリ・ロケーションを示す1つ又は複数のパラメータを受信し、APIが、APIが参照するデータの1つ又は複数のアドレスを、少なくとも部分的に、1つ又は複数のメモリ・ロケーションを含む1つ又は複数のアドレスに基づいて示す、条項8に記載のシステム。
10. APIが、APIが参照するデータの1つ又は複数のアドレスが、パラメータとしてAPIに示される1つ又は複数のメモリ・ロケーションを含まない場合、ヌル・データ値を示す、条項8又は9に記載のシステム。
11. 1つ又は複数のプロセッサが、1つ又は複数のドライバをさらに実行し、1つ又は複数のドライバが、1つ又は複数のAPIコールに応答してAPIを実行させる、条項8から10までのいずれかに記載のシステム。
12. APIが、1つ又は複数のメモリのブロック内の1つ又は複数のアドレスを含む1つ又は複数のデータ値を示す1つ又は複数のAPIコールに応答して、APIが参照するデータの1つ又は複数のアドレスを示す、条項8から11までのいずれかに記載のシステム。
13. APIが参照するデータの1つ又は複数のアドレスが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能な1つ又は複数のメモリのブロックを示す、条項8から12までのいずれかに記載のシステム。
14. APIが参照するデータの1つ又は複数のアドレスが、1つ又は複数のstream ordered memory allocatorを使用して割振り可能な1つ又は複数のメモリのブロックを示す、条項8から13までのいずれかに記載のシステム。
15. 1つ又は複数のアプリケーション・プログラミング・インターフェース(API)を記憶した機械可読媒体であって、1つ又は複数のAPIが、少なくとも部分的に、1つ又は複数のプロセッサによって実行された場合、1つ又は複数のプロセッサに、少なくとも、
1つ又は複数のAPIが参照するデータの1つ又は複数のアドレスを示すこと
を行わせる、機械可読媒体。
16. 1つ又は複数のAPIが、1つ又は複数のAPIコールの結果として、1つ又は複数のメモリ・ロケーションを示す1つ又は複数のデータ値を受信し、1つ又は複数のプロセッサが、APIが参照するデータの1つ又は複数のアドレスを、少なくとも部分的に、1つ又は複数のメモリ・ロケーションを含む1つ又は複数のアドレスに基づいて示す、条項15に記載の機械可読媒体。
17. 1つ又は複数のプロセッサが、1つ又は複数のAPIが参照するデータの1つ又は複数のアドレスが、1つ又は複数のパラメータとして1つ又は複数のAPIに示される1つ又は複数の他のアドレスを含まない場合、ヌル・データ値を示す、条項15又は16に記載の機械可読媒体。
18. 1つ又は複数のプロセッサによって実行された場合、1つ又は複数のプロセッサに、1つ又は複数のドライバを実行させる命令をさらに含み、1つ又は複数のドライバが、1つ又は複数のAPIへの1つ又は複数のAPIコールに応答して、1つ又は複数のプロセッサに1つ又は複数のアドレスを示させる、条項15から17までのいずれかに記載の機械可読媒体。
19. 1つ又は複数のAPIが、1つ又は複数のAPIへの1つ又は複数のAPIコールに応答して、1つ又は複数のAPIが参照するデータの1つ又は複数のアドレスを示し、1つ又は複数のAPIコールが1つ又は複数のメモリのブロック内の1つ又は複数のアドレスを示すためのデータを含む、条項15から18までのいずれかに記載の機械可読媒体。
20. 1つ又は複数のAPIが参照するデータの1つ又は複数のアドレスが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能な1つ又は複数のメモリの領域を示す、条項15から19までのいずれかに記載の機械可読媒体。
21. 1つ又は複数のAPIが参照するデータの1つ又は複数のアドレスが、1つ又は複数の非同期アロケータを使用して割振り可能な1つ又は複数のメモリの領域を示す、条項15から20までのいずれかに記載の機械可読媒体。
22. アプリケーション・プログラミング・インターフェース(API)によって、APIが参照するデータの1つ又は複数のアドレスを示すことを含む、方法。
23. APIへの1つ又は複数のAPIコールに応答して1つ又は複数のアドレスを示すことをさらに含み、APIコールが、1つ又は複数のメモリ・ロケーションを示すための1つ又は複数のデータ値を含む、条項22に記載の方法。
24. 1つ又は複数のアドレスが1つ又は複数のAPIコールのパラメータとしてAPIに示される1つ又は複数のメモリ・ロケーションを含むことに応答して、1つ又は複数のアドレスを示すことをさらに含む、条項22又は23に記載の方法。
25. APIが参照するデータの1つ又は複数のアドレスが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能な1つ又は複数のメモリのブロックを示す、条項22から24までのいずれかに記載の方法。
26. APIによって、1つ又は複数のAPIコールの結果として、1つ又は複数のメモリ・ロケーションを示す1つ又は複数のデータ値を受信することと、APIが参照するデータの1つ又は複数のアドレスを、少なくとも部分的に、1つ又は複数のメモリ・ロケーションを含む1つ又は複数のアドレスに基づいて示すこととをさらに含む、条項22から25までのいずれかに記載の方法。
27. APIが参照するデータの1つ又は複数のアドレスが、1つ又は複数のパラメータとしてAPIに示される1つ又は複数の他のアドレスを含まない場合、ヌル・データ値を示すことをさらに含む、条項22から26までのいずれかに記載の方法。
28. APIが参照するデータの1つ又は複数のアドレスが、1つ又は複数のstream ordered memory allocatorを使用して割振り可能な1つ又は複数のメモリのプールを示す、条項22から27までのいずれかに記載の方法。
29. 第1のアプリケーション・プログラミング・インターフェース(API)を実行して、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示すための1つ又は複数の回路を備える、プロセッサ。
30. 1つ又は複数のストレージ・ロケーションが、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリ・アドレスのプールを示す、条項29に記載のプロセッサ。
31. 第1のAPIが、1つ又は複数のソフトウェア・モジュールの実行中に、第2のAPIを使用して1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示す、条項29又は30に記載のプロセッサ。
32. 第1のAPIが、1つ又は複数のストレージ・ロケーションを使用するための1つ又は複数のコンピューティング・デバイスを示す1つ又は複数のデータ値を受信する、条項29から31までのいずれかに記載のプロセッサ。
33. 第1のAPIが、1つ又は複数のソフトウェア・モジュールによって1つ又は複数のAPIコールが実行される結果として、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示し、1つ又は複数のAPIコールが1つ又は複数のストレージ・ロケーションを特定する情報を含む、条項29から32までのいずれかに記載のプロセッサ。
34. 1つ又は複数の回路が、第1のAPIを含む1つ又は複数のドライバを実行し、第1のAPIが、1つ又は複数のソフトウェア・モジュールによる1つ又は複数のAPIコールに応答して1つ又は複数の回路によって実行される、条項29から33までのいずれかに記載のプロセッサ。
35. 第1のアプリケーション・プログラミング・インターフェース(API)を実行して、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示すための1つ又は複数のプロセッサを備える、システム。
36. 1つ又は複数のストレージ・ロケーションが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能な1つ又は複数のメモリ・アドレスのプールを示す、条項35に記載のシステム。
37. 第1のAPIが、1つ又は複数のソフトウェア・モジュールの実行中に、第2のAPIを使用して1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示し、第2のAPIが、1つ又は複数のストレージ・ロケーションを共有させる、条項35又は36に記載のシステム。
38. 1つ又は複数のプロセッサが、1つ又は複数のAPIコールに応答して第1のAPIを実行し、1つ又は複数のAPIコールが1つ又は複数のストレージ・ロケーションを示すための1つ又は複数のパラメータを含む、条項35から37までのいずれかに記載のシステム。
39. 第1のAPIが、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを示す1つ又は複数のデータ値を使用して、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示し、1つ又は複数のストレージ・ロケーションを使用するための1つ又は複数のコンピューティング・デバイスが、1つ又は複数のAPIコールへの1つ又は複数のパラメータとして第1のAPIに対して示される、条項35から38までのいずれかに記載のシステム。
40. 第1のAPIが、1つ又は複数のマスク・データ値を使用して、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示す、条項35から39までのいずれかに記載のシステム。
41. 1つ又は複数のアプリケーション・プログラミング・インターフェース(API)を記憶した機械可読媒体であって、1つ又は複数のAPIが、少なくとも部分的に、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、少なくとも、
1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示すこと
を行わせる、機械可読媒体。
42. 1つ又は複数のプロセッサが、他のAPIを使用して、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示し、他のAPIが、1つ又は複数のストレージ・ロケーションを共有するための1つ又は複数の命令を含む、条項41に記載の機械可読媒体。
43. 1つ又は複数のストレージ・ロケーションが、1つ又は複数のAPIへの1つ又は複数のAPIコールに応答して、1つ又は複数のソフトウェア・モジュールの実行中に共有可能な1つ又は複数のメモリ・アドレスのプールを示す、条項41又は42に記載の機械可読媒体。
44. 1つ又は複数のAPIが、1つ又は複数のAPIへの1つ又は複数のAPIコールへの1つ又は複数のパラメータとして1つ又は複数のストレージ・ロケーションを使用するための1つ又は複数のコンピューティング・デバイスを示す1つ又は複数のデータ値を受信する、条項41から43までのいずれかに記載の機械可読媒体。
45. 1つ又は複数のプロセッサが、1つ又は複数のストレージ・ロケーションについての1つ又は複数のハンドルを含む1つ又は複数のデータ値を示すことによって、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示す、条項41から44までのいずれかに記載の機械可読媒体。
46. 1つ又は複数のプロセッサが、1つ又は複数のマスクを含む1つ又は複数のデータ値を示すことによって、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示す、条項41から45までのいずれかに記載の機械可読媒体。
47. 1つ又は複数のプロセッサによって実行された場合、1つ又は複数のプロセッサに、1つ又は複数のドライバを実行させる1つ又は複数の命令をさらに含み、1つ又は複数のドライバが、1つ又は複数のAPIコールの結果として1つ又は複数のAPIを呼び出すための1つ又は複数のインターフェースを含む、条項41から46までのいずれかに記載の機械可読媒体。
48. 第1のアプリケーション・プログラミング・インターフェース(API)を実行して、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示すことを含む、方法。
49. 1つ又は複数のドライバを実行するための命令の1つ又は複数のセットをさらに含み、1つ又は複数のドライバが、第1のAPIに、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示させる、条項48に記載の方法。
50. 第1のAPIが、1つ又は複数のストレージ・ロケーションについての1つ又は複数のハンドルを含む1つ又は複数のデータ値を示すことによって、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示す、条項48又は49に記載の方法。
51. 第1のAPIが、1つ又は複数のストレージ・ロケーションについての1つ又は複数のマスクを含む1つ又は複数のデータ値を示すことによって、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを示す、条項48から50までのいずれかに記載の方法。
52. 第1のAPIによって、1つ又は複数のストレージ・ロケーションを使用するための1つ又は複数のコンピューティング・デバイスを示す1つ又は複数のデータ値を受信することをさらに含む、条項48から51までのいずれかに記載の方法。
53. 第1のAPIによって、1つ又は複数ソフトウェア・モジュールによって使用可能な1つ又は複数の第2のAPIを使用して、1つ又は複数のソフトウェア・モジュールの実行中に、1つ又は複数のストレージ・ロケーションを共有することが可能かどうかを判定することをさらに含む、条項48から52までのいずれかに記載の方法。
54. 1つ又は複数のストレージ・ロケーションが、1つ又は複数のコンピューティング・デバイスによって使用される1つ又は複数のメモリのプールを示すための情報を含む、条項48から53までのいずれかに記載の方法。
55. アプリケーション・プログラミング・インターフェース(API)を実行して、APIが参照する1つ又は複数のストレージ・ロケーションについての情報を示すための、1つ又は複数の回路を備える、プロセッサ。
56. APIが参照する1つ又は複数のストレージ・ロケーションが、1つ又は複数のstream ordered memory allocatorを使用して割り振られる1つ又は複数のメモリのブロックを含む1つ又は複数のメモリ・プールを含む、条項55に記載のプロセッサ。
57. 情報が、1つ又は複数のストレージ・ロケーションについての1つ又は複数の現在の使用状況メトリクスを示すための1つ又は複数のデータ値を含む、条項55又は56に記載のプロセッサ。
58. 情報が、1つ又は複数のストレージ・ロケーションについての1つ又は複数の履歴的な使用状況メトリクスを示すための1つ又は複数のデータ値を含む、条項55から57までのいずれかに記載のプロセッサ。
59. 1つ又は複数のストレージ・ロケーションが、1つ又は複数のパラメータ・データ値によってAPIに対して示され、1つ又は複数のパラメータ・データ値が、1つ又は複数のストレージ・ロケーションを含む少なくとも1つのメモリのブロックを示す、条項55から58までのいずれかに記載のプロセッサ。
60. 情報が、1つ又は複数のストレージ・ロケーションの複数の属性のうちの1つを示し、複数の属性のうちの1つが、APIによって、少なくとも部分的にAPIに示される1つ又は複数のパラメータに基づいて選択される、条項55から59までのいずれかに記載のプロセッサ。
61. アプリケーション・プログラミング・インターフェース(API)を実行して、APIが参照する1つ又は複数のストレージ・ロケーションについての情報を示すための、1つ又は複数のプロセッサを備える、システム。
62. APIが、1つ又は複数のAPIコールの結果として1つ又は複数のデータ値を受信し、1つ又は複数のデータ値が1つ又は複数のストレージ・ロケーションについての情報のタイプを示す、条項61に記載のシステム。
63. APIが、1つ又は複数のAPIコールの結果として1つ又は複数のデータ値を受信し、1つ又は複数のデータ値が1つ又は複数のストレージ・ロケーションを示す、条項61又は62に記載のシステム。
64. 1つ又は複数のストレージ・ロケーションが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能な1つ又は複数のメモリのプールを含む、条項61から63までのいずれかに記載のシステム。
65. 情報が、少なくとも部分的に1つ又は複数のストレージ・ロケーションに基づいて計算された、1つ又は複数の現在の使用状況メトリクスを表現する1つ又は複数のデータ値を含む、条項61から64までのいずれかに記載のシステム。
66. 情報が、少なくとも部分的に1つ又は複数のストレージ・ロケーションに基づいて計算された、1つ又は複数の過去の使用状況メトリクスを表現する1つ又は複数のデータ値を含む、条項61から65までのいずれかに記載のシステム。
67. 1つ又は複数のストレージ・ロケーションが、1つ又は複数のstream ordered memory allocatorを使用して割り振られる1つ又は複数のメモリのブロックを含む、条項61から66までのいずれかに記載のシステム。
68. 1つ又は複数のアプリケーション・プログラミング・インターフェース(API)を記憶した機械可読媒体であって、1つ又は複数のAPIが、少なくとも部分的に、1つ又は複数のプロセッサによって実施された場合、1つ又は複数のプロセッサに、少なくとも、
1つ又は複数のAPIが参照する1つ又は複数のストレージ・ロケーションについての情報を示すこと
を行わせる、機械可読媒体。
69. 1つ又は複数のAPIが、1つ又は複数のAPIコールの結果として1つ又は複数のストレージ・ロケーションを示す1つ又は複数のデータ値を受信する、条項68に記載の機械可読媒体。
70. 1つ又は複数のAPIが、1つ又は複数のストレージ・ロケーションについて示される情報のタイプを示す1つ又は複数のデータ値を受信する、条項68又は69に記載の機械可読媒体。
71. 1つ又は複数のAPIが、1つ又は複数のAPI応答を実行して情報を示す、条項68から70までのいずれかに記載の機械可読媒体。
72. 1つ又は複数のストレージ・ロケーションが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能な1つ又は複数のメモリのブロックを含む、条項68から71までのいずれかに記載の機械可読媒体。
73. 情報が、1つ又は複数のAPIによって、少なくとも部分的に1つ又は複数のストレージ・ロケーションに基づいて計算された、1つ又は複数の現在の使用状況メトリクスを表現する1つ又は複数のデータ値を含む、条項68から72までのいずれかに記載の機械可読媒体。
74. 情報が、1つ又は複数のAPIによって、少なくとも部分的に1つ又は複数のストレージ・ロケーションに基づいて計算された、1つ又は複数の履歴的な使用状況メトリクスを表現する1つ又は複数のデータ値を含む、条項68から73までのいずれかに記載の機械可読媒体。
75. 1つ又は複数のストレージ・ロケーションが、1つ又は複数のstream ordered memory allocatorを使用して割り振られる1つ又は複数のメモリのセグメントを含む、条項68から74までのいずれかに記載の機械可読媒体。
76. アプリケーション・プログラミング・インターフェース(API)によって、APIが参照する1つ又は複数のストレージ・ロケーションについての情報を示すことを含む、方法。
77. 1つ又は複数のAPIコールの結果としてAPIによって1つ又は複数のパラメータを受信することをさらに含み、1つ又は複数のパラメータが、どのタイプの情報がAPIによって示されるかを特定するためのデータを含む、条項76に記載の方法。
78. APIによって、1つ又は複数のAPIコールの結果として1つ又は複数のパラメータを受信することをさらに含み、1つ又は複数のパラメータが1つ又は複数のストレージ・ロケーションを特定するためのデータを含む、条項76又は77に記載の方法。
79. 情報が、1つ又は複数のストレージ・ロケーションの1つ又は複数の現在の使用状況メトリクスを表現する1つ又は複数のデータ値を含む、条項76から78までのいずれかに記載の方法。
80. 情報が、1つ又は複数のストレージ・ロケーションの1つ又は複数の過去の使用状況メトリクスを表現する1つ又は複数のデータ値を含む、条項76から79までのいずれかに記載の方法。
81. APIによって、1つ又は複数のAPIコールに応答して1つ又は複数のストレージ・ロケーションの1つ又は複数の使用状況メトリクスを計算することと、少なくとも部分的に1つ又は複数の使用状況メトリクスに基づいて情報を示すこととをさらに含む、条項76から80までのいずれかに記載の方法。
82. APIが参照する1つ又は複数のストレージ・ロケーションが、1つ又は複数のグラフィックス処理ユニット(GPU)によって使用可能な1つ又は複数のメモリのプールを含む、条項76から81までのいずれかに記載の方法。
83. APIが参照する1つ又は複数のストレージ・ロケーションが、stream ordered memory allocatorを使用して割振り可能な1つ又は複数のメモリのブロックを含む、条項76から82までのいずれかに記載の方法。
【0312】
他の変形形態は、本開示の趣旨内にある。したがって、開示される技法は、様々な修正及び代替構築が可能であるが、それらのいくつかの例示的な実施例が図面に示され、上記で詳細に説明された。しかしながら、特定の1つ又は複数の開示された形態に本開示を限定する意図はなく、その反対に、添付の特許請求の範囲において定義されるように、開示の趣旨及び範囲に入るすべての修正形態、代替構築、及び等価物を網羅することを意図していることが理解されるべきである。
【0313】
開示される実施例を説明する文脈において(特に、以下の特許請求の範囲の文脈において)「a」及び「an」及び「the」という用語、並びに同様の指示語を使用することは、本明細書に別段の記載のない限り、又は文脈によって明らかに否定されない限り、単数と複数の両方を網羅すると解釈されるべきであり、用語の定義であると解釈されるべきではない。「含む、備える(comprising)」、「有する(having)」、「含む(including)」、「含んでいる(containing)」という用語は、別段の記載のない限り、オープンエンドの用語(「限定はしないが、~を含む(including, but not limited to,)」を意味する)と解釈されるべきである。「接続される」という用語は、修飾されず、物理的接続を指しているとき、何か介在するものがある場合でも、部分的に又は完全に中に含まれているか、取り付けられるか、又は互いに接合されるものとして解釈されるべきである。本明細書で値の範囲を詳述することは、本明細書に別段の記載のない限り、及び各別個の値が、本明細書に個々に詳述されているかのように明細書に組み込まれていない限り、範囲内に入る各別個の値を個々に参照する簡潔な方法として働くことを単に意図しているにすぎない。「セット」(たとえば、「項目のセット」)又は「サブセット」という用語の使用は、文脈によって別段の記載がないか又は否定されない限り、1つ又は複数の部材を備える空ではない集合として解釈されるべきである。さらに、文脈によって別段の記載がないか又は否定されない限り、対応するセットの「サブセット」という用語は、対応するセットの厳密なサブセットを必ずしも指すとは限らず、サブセットと、対応するセットとは、等しくなり得る。
【0314】
「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つであるが、明示的に、又は文脈によってのいずれかでそのように示されているとき、それよりも多いことがある。さらに、別段の記載がないか又はさもなければ文脈から明らかでない限り、「~に基づいて」という言い回しは、「少なくとも部分的に~に基づいて」を意味し、「~のみに基づいて」を意味しない。
【0315】
本明細書で説明されるプロセスの動作は、本明細書に別段の記載がないか又はさもなければ文脈によって明確に否定されない限り、任意の好適な順序で実施され得る。少なくとも1つの実施例では、本明細書で説明されるプロセス(又はその変形及び/又は組合せ)などのプロセスは、実行可能命令で構成された1つ又は複数のコンピュータ・システムの制御下で実施され、1つ又は複数のプロセッサ上で、ハードウェアによって、又はそれらの組合せによって集合的に実行するコード(たとえば、実行可能命令、1つ又は複数のコンピュータ・プログラム、又は1つ又は複数のアプリケーション)として実装される。少なくとも1つの実施例では、コードは、たとえば、1つ又は複数のプロセッサによって実行可能な複数の命令を備えるコンピュータ・プログラムの形態で、コンピュータ可読記憶媒体に記憶される。少なくとも1つの実施例では、コンピュータ可読記憶媒体は、一時的信号(たとえば、伝搬する一時的な電気又は電磁送信)を除外するが、一時的信号のトランシーバ内の非一時的データ・ストレージ回路要素(たとえば、バッファ、キャッシュ、及びキュー)を含む非一時的コンピュータ可読記憶媒体である。少なくとも1つの実施例では、コード(たとえば、実行可能コード又はソース・コード)は、1つ又は複数の非一時的コンピュータ可読記憶媒体のセットに記憶され、この記憶媒体は、コンピュータ・システムの1つ又は複数のプロセッサによって実行されたときに(たとえば、実行された結果として)、コンピュータ・システムに本明細書で説明される動作を実施させる実行可能命令を記憶している(又は、実行可能命令を記憶するための他のメモリを有する)。非一時的コンピュータ可読記憶媒体のセットは、少なくとも1つの実施例では、複数の非一時的コンピュータ可読記憶媒体を備え、複数の非一時的コンピュータ可読記憶媒体の個々の非一時的記憶媒体のうちの1つ又は複数は、コードのすべてがないが、複数の非一時的コンピュータ可読記憶媒体は、集合的にコードのすべてを記憶している。少なくとも1つの実施例では、実行可能命令は、異なる命令が異なるプロセッサによって実行されるように実行され、たとえば、非一時的コンピュータ可読記憶媒体は命令を記憶し、メイン中央処理ユニット(「CPU」)は命令のいくつかを実行し、グラフィックス処理ユニット(「GPU」)は他の命令を実行する。少なくとも1つの実施例では、コンピュータ・システムの異なる構成要素は、別個のプロセッサを有し、異なるプロセッサが命令の異なるサブセットを実行する。
【0316】
したがって、少なくとも1つの実施例では、コンピュータ・システムは、本明細書で説明されるプロセスの動作を単独で又は集合的に実施する1つ又は複数のサービスを実装するように構成され、そのようなコンピュータ・システムは、動作の実施を可能にする適用可能なハードウェア及び/又はソフトウェアで構成される。さらに、本開示の少なくとも1つの実施例を実装するコンピュータ・システムは、単一のデバイスであり、別の実施例では、分散型コンピュータ・システムが本明細書で説明される動作を実施するように、及び単一のデバイスがすべての動作を実施しないように、異なるやり方で動作する複数のデバイスを備える分散型コンピュータ・システムである。
【0317】
本明細書で提供されるあらゆる実例、又は例示的な言葉(たとえば、「など、などの(such as)」)の使用は、本開示の実施例をより明らかにすることのみを意図しており、別段の主張のない限り、本開示の範囲に制限を加えるものではない。本明細書のいかなる言葉も、特許請求されていない任意の要素を、本開示の実践に不可欠なものとして示すと解釈されるべきではない。
【0318】
本明細書で引用される出版物、特許出願、及び特許を含むすべての参考文献は、各参考文献が参照により組み込まれることが個別に明確に示され、その全体が本明細書に記載されたかのように、それと同程度まで参照により本明細書に組み込まれる。
【0319】
明細書及び特許請求の範囲において、「結合される」及び「接続される」という用語が、その派生語とともに使用され得る。これらの用語は、互いに同義語として意図されていないことがあることが理解されるべきである。むしろ、特定の実例では、「接続される」又は「結合される」は、2つ又はそれ以上の要素が物理的又は電気的に互いに直接又は間接的に接触していることを示すために使用され得る。「結合される」はまた、2つ又はそれ以上の要素が直接互いに接触していないが、それでもなお互いに連動又は対話することを意味し得る。
【0320】
別段の具体的な記載がない限り、明細書全体を通して、「処理する(processing)」、「算出する(computing)」、「計算する(calculating)」、又は「決定する(determining)」などの用語は、コンピューティング・システムのレジスタ及び/又はメモリ内の、電子的などの物理的な量として表されるデータを、コンピューティング・システムのメモリ、レジスタ又は他のそのような情報ストレージ、送信、若しくはディスプレイ・デバイス内の物理的な量として同様に表される他のデータになるように操作及び/又は変換する、コンピュータ又はコンピューティング・システム、或いは同様の電子コンピューティング・デバイスのアクション及び/又はプロセスを指すことが理解され得る。
【0321】
同様に、「プロセッサ」という用語は、レジスタ及び/又はメモリからの電子データを処理し、その電子データを、レジスタ及び/又はメモリに記憶され得る他の電子データに変換する任意のデバイス、又はデバイスの一部分を指し得る。非限定的な実例として、「プロセッサ」は、CPU又はGPUであり得る。「コンピューティング・プラットフォーム」は、1つ又は複数のプロセッサを備え得る。本明細書で使用される「ソフトウェア」プロセスは、たとえば、タスク、スレッド、及び知的エージェントなど、経時的にワークを実施するソフトウェア及び/又はハードウェア・エンティティを含み得る。また、各プロセスは、命令を直列で又は並列で、連続的に又は断続的に行うための複数のプロセスを指し得る。「システム」及び「方法」という用語は、1つ又は複数の方法をシステムが具体化し得、方法がシステムと考えられ得る場合に限り、本明細書において交換可能に使用される。
【0322】
少なくとも1つの実施例では、算術論理ユニットは、結果を作り出すために1つ又は複数の入力をとる組合せ論理回路要素のセットである。少なくとも1つの実施例では、算術論理ユニットは、加算、減算、又は乗算などの数学演算を実装するためにプロセッサによって使用される。少なくとも1つの実施例では、算術論理ユニットは、論理AND/OR又はXORなどの論理演算を実装するために使用される。少なくとも1つの実施例では、算術論理ユニットは、ステートレスであり、論理ゲートを形成するように構成された半導体トランジスタなど、物理的切替え構成要素から作られる。少なくとも1つの実施例では、算術論理ユニットは、関連するクロックをもつステートフル論理回路として、内部で動作し得る。少なくとも1つの実施例では、算術論理ユニットは、関連するレジスタ・セット中で維持されない内部状態をもつ非同期論理回路として構築され得る。少なくとも1つの実施例では、算術論理ユニットは、プロセッサの1つ又は複数のレジスタに記憶されたオペランドを組み合わせ、別のレジスタ又はメモリ・ロケーションにプロセッサによって記憶され得る出力を作り出すために、プロセッサによって使用される。
【0323】
少なくとも1つの実施例では、プロセッサによって取り出された命令を処理した結果として、プロセッサは、1つ又は複数の入力又はオペランドを算術論理ユニットに提示し、算術論理ユニットに、算術論理ユニットの入力に提供された命令コードに少なくとも部分的に基づく結果を作り出させる。少なくとも1つの実施例では、プロセッサによってALUに提供された命令コードは、プロセッサによって実行された命令に少なくとも部分的に基づく。少なくとも1つの実施例では、ALUにおける組合せ論理は、入力を処理し、プロセッサ内のバス上に置かれる出力を作り出す。少なくとも1つの実施例では、プロセッサは、プロセッサをクロック制御することにより、ALUによって作り出された結果が所望のロケーションに送出されるように、宛先レジスタ、メモリ・ロケーション、出力デバイス、又は出力バス上の出力ストレージ・ロケーションを選択する。
【0324】
本明細書では、アナログ・データ又はデジタル・データを取得すること、獲得すること、受信すること、或いはそれらをサブシステム、コンピュータ・システム、又はコンピュータ実装機械に入力することに言及し得る。アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、関数コール、又はアプリケーション・プログラミング・インターフェースへのコールのパラメータとしてデータを受信することによってなど、様々なやり方で実現され得る。いくつかの実装形態では、アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、直列又は並列インターフェースを介してデータを転送することによって実現され得る。別の実装形態では、アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、提供するエンティティから獲得するエンティティにコンピュータ・ネットワークを介してデータを転送することによって実現され得る。アナログ・データ又はデジタル・データを提供すること、出力すること、送信すること、送出すること、又は提示することにも言及し得る。様々な実例では、アナログ・データ又はデジタル・データを提供する、出力する、送信する、送出する、又は提示するプロセスは、関数コールの入力又は出力パラメータ、アプリケーション・プログラミング・インターフェース又はプロセス間通信機構のパラメータとしてデータを転送することによって実現され得る。
【0325】
上記の説明は、説明された技法の例示的な実装形態について述べているが、他のアーキテクチャが、説明された機能性を実装するために使用され得、本開示の範囲内にあることが意図される。さらに、説明を目的として、責任の具体的な分散が定義されるが、様々な機能及び責任は、状況に応じて異なるやり方で分散及び分割され得る。
【0326】
さらに、主題は、構造的特徴及び/又は方法論的行為に特有の言語で説明されたが、添付の特許請求の範囲で特許請求される主題は、説明された特有の特徴又は行為に必ずしも限定されるとは限らないことが理解されるべきである。むしろ、特有の特徴及び行為は、特許請求の範囲を実装する例示的な形態として開示される。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17A
図17B
図18A
図18B
図19A
図19B
図19C
図20
図21
図22
図23
図24
図25
図26
図27
図28
図29
図30
図31
図32
図33
図34
図35A
図35B
図35C
図36
図37
図38
図39
【国際調査報告】