JP2023007422A - 同期バリア - Google Patents

同期バリア Download PDF

Info

Publication number
JP2023007422A
JP2023007422A JP2022090004A JP2022090004A JP2023007422A JP 2023007422 A JP2023007422 A JP 2023007422A JP 2022090004 A JP2022090004 A JP 2022090004A JP 2022090004 A JP2022090004 A JP 2022090004A JP 2023007422 A JP2023007422 A JP 2023007422A
Authority
JP
Japan
Prior art keywords
memory
threads
processor
cuda
graphics
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2022090004A
Other languages
English (en)
Inventor
シオルコツ ピョートル
Ciolkosz Piotr
ペレリギン キリロ
Perelygin Kyrylo
カーター エドワーズ ハロルド
Carter Edwards Harold
マキシー ウェスリー
Maxey Wesley
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nvidia Corp
Original Assignee
Nvidia Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nvidia Corp filed Critical Nvidia Corp
Publication of JP2023007422A publication Critical patent/JP2023007422A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/522Barrier synchronisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/3001Arithmetic instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/30087Synchronisation or serialisation instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3824Operand accessing
    • G06F9/3834Maintaining memory consistency
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3877Concurrent instruction execution, e.g. pipeline or look ahead using a slave processor, e.g. coprocessor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/526Mutual exclusion algorithms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/52Indexing scheme relating to G06F9/52
    • G06F2209/521Atomic

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Multimedia (AREA)
  • Computational Mathematics (AREA)
  • Mathematical Optimization (AREA)
  • Pure & Applied Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Multi Processors (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

【課題】アプリケーションを実行するとき、増加された並列性を可能にすること。【解決手段】バリア演算を実装するための装置、システム、及び技法。少なくとも1つの実施例では、メモリ・バリア演算は、スレッドの複数のグループによるメモリへのアクセスが、メモリ・バリア演算によって指示される順序で発生することを引き起こす。【選択図】図2

Description

本出願は、その内容全体が参照により本明細書に組み込まれる、2021年6月29日に出願された、「SYNCHRONIZTION BARRIER」と題する、米国仮出願第63/216,430号の利益を主張する。
少なくとも1つの実施例は、並列処理を使用するプログラムを実行するために使用される処理リソースに関する。たとえば、少なくとも1つの実施例は、連動スレッド・グループを使用する1つ又は複数のCUDAプログラムを実行するために使用されるプロセッサ又はコンピューティング・システムに関する。
複数の処理リソースを並列に利用するためにアプリケーション・プログラムを構成することが、プログラムの性能を大幅に増加させることができる。たとえば、同時に使用され得る処理コアの数を増加させることによって、プログラムを完了するために必要とされる時間が低減され得る。したがって、より多くの量の並列性(parallelism)を可能にする技法が、開発の重要な分野である。
同期バリアを提供する。
少なくとも1つの実施例による、ワープの一実例を示す図である。 少なくとも1つの実施例による、2つのワープにわたる連動スレッド・グループの一実例を示す図である。 少なくとも1つの実施例による、4つのワープにわたる連動スレッド・グループの一実例を示す図である。 少なくとも1つの実施例による、各グループが4つのワープにわたる、4つのグループをもつ連動スレッド・アレイの一実例を示す図である。 少なくとも1つの実施例による、各グループが8つのワープにわたる、4つのグループをもつ連動スレッド・アレイの一実例を示す図である。 少なくとも1つの実施例による、カウンタに基づくバリア実装形態の一実例を示す図である。 少なくとも1つの実施例による、コンピュータ・システムによって実施された結果として、マルチワープ・グループのバリアを更新するプロセスの一実例を示す図である。 少なくとも1つの実施例による、ビット・フィールドに基づくバリア実装形態の一実例を示す図である。 少なくとも1つの実施例による、コンピュータ・システムによって実施された結果として、マルチワープ・グループのバリアを更新するプロセスの一実例を示す図である。 少なくとも1つの実施例による、例示的なデータ・センタを示す図である。 少なくとも1つの実施例による、処理システムを示す図である。 少なくとも1つの実施例による、コンピュータ・システムを示す図である。 少なくとも1つの実施例による、システムを示す図である。 少なくとも1つの実施例による、例示的な集積回路を示す図である。 少なくとも1つの実施例による、コンピューティング・システムを示す図である。 少なくとも1つの実施例による、APUを示す図である。 少なくとも1つの実施例による、CPUを示す図である。 少なくとも1つの実施例による、例示的なアクセラレータ統合スライス(accelerator integration slice)を示す図である。 少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す図である。 少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す図である。 少なくとも1つの実施例による、グラフィックス・コアを示す図である。 少なくとも1つの実施例による、GPGPUを示す図である。 少なくとも1つの実施例による、並列プロセッサを示す図である。 少なくとも1つの実施例による、処理クラスタを示す図である。 少なくとも1つの実施例による、グラフィックス・マルチプロセッサを示す図である。 少なくとも1つの実施例による、グラフィックス・プロセッサを示す図である。 少なくとも1つの実施例による、プロセッサを示す図である。 少なくとも1つの実施例による、プロセッサを示す図である。 少なくとも1つの実施例による、グラフィックス・プロセッサ・コアを示す図である。 少なくとも1つの実施例による、PPUを示す図である。 少なくとも1つの実施例による、GPCを示す図である。 少なくとも1つの実施例による、ストリーミング・マルチプロセッサを示す図である。 少なくとも1つの実施例による、プログラミング・プラットフォームのソフトウェア・スタックを示す図である。 少なくとも1つの実施例による、図29のソフトウェア・スタックのCUDA実装形態を示す図である。 少なくとも1つの実施例による、図29のソフトウェア・スタックのROCm実装形態を示す図である。 少なくとも1つの実施例による、図29のソフトウェア・スタックのOpenCL実装形態を示す図である。 少なくとも1つの実施例による、プログラミング・プラットフォームによってサポートされるソフトウェアを示す図である。 少なくとも1つの実施例による、図29~図32のプログラミング・プラットフォーム上で実行するためのコードをコンパイルすることを示す図である。 少なくとも1つの実施例による、図29~図32のプログラミング・プラットフォーム上で実行するためのコードをコンパイルすることをより詳細に示す図である。 少なくとも1つの実施例による、ソース・コードをコンパイルするより前にソース・コードをトランスレートすることを示す図である。 少なくとも1つの実施例による、異なるタイプの処理ユニットを使用してCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。 少なくとも1つの実施例による、CPU及びCUDA対応GPUを使用して、図37AのCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。 少なくとも1つの実施例による、CPU及びCUDA非対応(non-CUDA-enabled)GPUを使用して、図37AのCUDAソース・コードをコンパイル及び実行するように構成されたシステムを示す図である。 少なくとも1つの実施例による、図37CのCUDAからHIPへのトランスレーション・ツール(CUDA-to-HIP translation tool)によってトランスレートされた例示的なカーネルを示す図である。 少なくとも1つの実施例による、図37CのCUDA非対応GPUをより詳細に示す図である。 少なくとも1つの実施例による、例示的なCUDAグリッドのスレッドが図39の異なるコンピュート・ユニットにどのようにマッピングされるかを示す図である。 少なくとも1つの実施例による、既存のCUDAコードをData Parallel C++コードにどのようにマイグレートするかを示す図である。
本明細書は、連動スレッド・グループの合成における増加されたフレキシビリティを可能にすることによって、アプリケーションを実行するとき、増加された並列性を可能にするシステム及び方法について説明する。少なくとも1つの実施例では、連動スレッド・グループは、マルチコア・プロセッサ、又はCUDAコアなどの複数のコアをもつグラフィックス処理ユニット(「GPU」:graphics processing unit)上で稼働するスレッドのグループである。少なくとも1つの実施例では、各スレッドは、専用コアに割り当てられ、グループ中の他のスレッドと同時に稼働する。
少なくとも1つの実施例では、連動グループは、連動モデルを実装するライブラリ特徴であり、複数のスレッドが、単一のグループ・ハンドル又は識別子によって指定される。少なくとも1つの実施例では、そのようなハンドルは、グループ中のすべてのスレッドに、動作を集合的に実施するように指示するために使用され得る。少なくとも1つの実施例では、連動グループは、スレッド・ブロックを多くとも32個のスレッドのグループにスプリットするために使用され得る。少なくとも1つの実施例では、この制限は、GPU上のHWワープの最大サイズなど、プロセッサのハードウェア制限によって課される。少なくとも1つの実施例では、そのような制限は、各フラグメントが別個のスレッド・ブロックでない限り、128個又は256個のスレッドのより大きいグループへの問題の分解を表現することを困難にし得る。
少なくとも1つの実施例は、ワープごとに32個のスレッドの制限にもかかわらず、連動グループとして動作するために、サイズ64個、128個、256個、512個、及び1024個のスレッドのスレッド・グループのサポートを追加する。少なくとも1つの実施例では、したがって、64個又はそれ以上のスレッドのグループは、複数のワープにわたる。少なくとも1つの実施例では、そのようなグループを使用して、スレッド・ブロックのフラグメントを使用して同期及び集合的な動作を表現することが可能である。少なくとも1つの実施例では、そのようなフラグメントは独立している。少なくとも1つの実施例では、スレッド・ブロックの異なるフラグメントは、異なるタイプの算出のために特殊化され得る。
少なくとも1つの実施例では、集合的な動作は、reduce、all、any、及びshflのうちの1つ又は複数を含み得る。少なくとも1つの実施例では、メモリの一部分が、これらのグループによって使用される同期バリアのために予約される。少なくとも1つの実施例では、追加のメモリが、集合のために予約される。少なくとも1つの実施例では、マルチワープ・バリアが、到着したワープをカウントし、バリア・フェーズとして最高ビットを使用するためにatomicAddを使用して実装される。少なくとも1つの実施例では、各グループは別個のバリアを使用し、したがって、可能なグループごとに1つのバリアが割り振られる。
少なくとも1つの実施例では、連動グループ中のワープの数がハードウェアによって(32個、64個、又は何らかの他の実装固有の値に)制限されるので、到着するワープをカウントするために整数の全範囲が必要とされない。しかしながら、少なくとも1つの実施例では、ハードウェア・アトミック加算演算が、より小さいデータ型をサポートしないので、より少ないビットをバリアとして使用することは可能でないことがある。
しかしながら、より小さいバリアを使用する代わりに、少なくとも1つの実施例は、32ビット・バリア中の1ビットでグループ中の各ワープを表すことによって、32個のワープの制限を活用する。少なくとも1つの実施例では、到着するワープは、到着を記録するための対応するビットを設定するために、atomic OR演算を使用する。少なくとも1つの実施例では、atomic OR演算によって再調整された古い値がグループ・マスクと比較され、ワープがバリアに到着すべき最後のワープである場合、連動グループのワープを表すすべてのビットをクリアして、上述のバリアからそれらをリリースするために、atomic AND演算が実施される。
少なくとも1つの実施例では、グループが共通のワープを有しない限り、単一のバリアが複数のグループのために使用され得る。少なくとも1つの実施例では、この手法の場合、可能なグループごとに1つのバリアの代わりに、マルチワープ・グループの各可能なサイズのために1つのバリアが必要とされる。
少なくとも1つの実施例のより完全な理解を提供するために、多数の具体的な詳細が記載される。ただし、発明概念はこれらの具体的な詳細のうちの1つ又は複数なしに実施され得ることが当業者には明らかであろう。
少なくとも1つの実施例では、集合的な動作、マルチワープ・グループ、及び他の特徴は、連動グループによって共有される作業空間(メモリ)の割振りを必要とする。少なくとも1つの実施例では、このメモリの寿命は、しばしば、集合的な動作の持続時間に制限され、多くともカーネルの寿命である。
少なくとも1つの実施例では、スレッド・ブロック又はより小さい範囲の場合、連動グループ作業空間は、共有メモリ又はグローバル・メモリ中に存在し得る。少なくとも1つの実施例では、グリッド・ブロック又はより小さい範囲の場合、連動グループ作業空間は、グローバル・メモリ中に存在し得る。少なくとも1つの実施例では、マルチグリッド又はより小さい範囲の場合、連動グループ作業空間は、ユニファイド・メモリ又はシステム・メモリ中に存在し得る。
少なくとも1つの実施例では、共有メモリ中の作業空間は、カーネルの総共有メモリからの切り出しとしてカーネル内でのみ与えられ得る。少なくとも1つの実施例では、グローバル・メモリ中の作業空間は、このコントラクトを用いてカーネル起動において与えられるべきである。少なくとも1つの実施例では、実行中に、カーネルは、グローバル・メモリ作業空間の排他的使用を有し、終了すると、カーネルはグローバル・メモリ作業空間に対する権利を有しない。
少なくとも1つの実施例では、作業空間は、ユーザによって提供されるメモリ切り出しである。少なくとも1つの実施例では、作業空間は、ドライバによって割り振られ、パラメータを介してCGランタイムに渡される。
少なくとも1つの実施例は、is_trivially_copyable制約を満たす任意のオブジェクトが、SoLシャッフル実装形態にアクセスすることを可能にする。少なくとも1つの実施例では、何らかの所与のサイズについて実施が調整されるべきである。たとえば、[1~8]バイトのオブジェクトが、ネイティブ__shfl_xxxイントリンシクス(intrinsics)を使用し、より大きいオブジェクトが、複数のデバイス・シャッフル、又は最終的に、共有メモリ又はグローバル・メモリを用いて加速されたイン・メモリ・シャッフルを使用し得る。
少なくとも1つの実施例では、これは、cg::reduce(...)がカスタム型をシャッフルすることを可能にする。少なくとも1つの実施例では、複素数型及びベクトル型が、APIとともに動作することを可能にされる。
Figure 2023007422000002
少なくとも1つの実施例では、開発者は、デバイス・イントリンシクスが、オーバーロードを通常有しない、行列の型又は他のアブストラクションをしばしば使用する。たとえば、
Figure 2023007422000003
少なくとも1つの実施例では、この使用事例は、オブジェクトがトリビアル(trivial)である場合、連動グループ・ワープ/タイル・インターフェース内でサポートされ、SoLイントリンシクスにアクセスする容易なやり方を提供する。少なくとも1つの実施例では、これはまた、複素数型における効率的なSoL低減を可能にするワープ及びタイルcooperative_groups::reduce(...)を自動的に拡張する。
少なくとも1つの実施例では、ユーザは、トリビアルなオブジェクトをシャッフルすることを試みるとき、以下のフロント・エンドを参照する。
Figure 2023007422000004
少なくとも1つの実施例では、コンパイル・エラーを起こすべきである例示的なオブジェクト。
Figure 2023007422000005
少なくとも1つの実施例では、タイル及びワープ・グループ・シャッフルのためのインターフェースは、所与のオブジェクトについてのストラテジーを自動的に判定するシャッフル・ディスパッチ構造を使用するために修正されることになる。
Figure 2023007422000006
少なくとも1つの実施例では、shuffle_dispatchのためのインターフェースは、所与のオブジェクトをシャッフルすることに最も適したストラテジーを継承する。
Figure 2023007422000007
少なくとも1つの実施例では、シャッフル・ストラテジーのための設計は、以下の通りである。
Figure 2023007422000008
少なくとも1つの実施例では、単一ワープの制限は、より複雑なプロデューサ/コンシューマ・モデルについての共通の苦情である。少なくとも1つの実施例では、単一ワープを作り出す代わりに、ソリューションは、一緒に又はパイプライン化された、2つのワープをコールし、ワープ複数コンシューマの別のセットに等しく作り出し得る。少なくとも1つの実施例では、単一ワープ・プロデューサ・シナリオ中でさえ、ソリューションは、他のコンシューマとは無関係に、プロデューサと同期するために、1つのコンシューマを必要とし得る。少なくとも1つの実施例では、これは、各々64個のスレッドをもつ2つのワープの2つの異なるグループを必要とすることになる。
少なくとも1つの実施例では、連動グループは、スレッド・ブロックが多くとも32個のスレッドのグループ(ハードウェア・ワープのサイズ)に静的にスプリットされることを可能にする。少なくとも1つの実施例では、それは、128個又は256個のスレッドのグループへの問題の分解を表現することを不可能にする。少なくとも1つの実施例では、複数のワープにわたるグループを表すクラスの実装は、ワープ・パーティションが表現される同じやり方で、連動グループを使用してそのような分解を表現することを可能にすることになる。少なくとも1つの実施例では、128個のスレッドのグループの実装は、連動グループが、このようにイントリンシクスをユーザに公開することを可能にすることが必要とされる。
少なくとも1つの実施例は、スレッド・ブロックのより小さいサイズに加えて、64個、128個、256個、及び512個のサイズを可能にするために、thread_block_tileクラスを修正する。少なくとも1つの実施例では、クラスは、グループのサイズに基づいて、異なるインターフェースを公開する。少なくとも1つの実施例では、サイズ≦32の場合、クラスのインターフェースは、単一ワープ内のスレッドを導入し、それにより、それらが並列に実行される。少なくとも1つの実施例では、サイズ>32の場合、クラスは、thread_block_tile中に存在するメソッド、すなわち、sync、thread_rank、size、meta_group_rank、及びmeta_group_sizeのうちのいくつかを公開する。少なくとも1つの実施例では、それは、thread_block_tile中に存在する集合、すなわち、any、all及びshflのうちの数個をも公開するが、shflの場合、すべてのコールするスレッドにおいて同じソース・インデックスをもつコールのみがサポートされる(ブロードキャスト動作)。
少なくとも1つの実施例では、reduceのようなthread_block_tileとmemcpy_asyncとを受け付けるインターフェースは、binary_partition及びlabeled_partition機能を除いて、新しいサイズをもつthread_block_tileをも受け付ける。
少なくとも1つの実施例では、同期及び集合を実装するために、マルチワープthread_block_tilesのメソッドは、共有メモリを使用する。少なくとも1つの実施例では、ユーザは、そのthread_blockを新しいサイズのタイルに区分けすることが可能になるために、block_tile_memory構造を使用して、この共有メモリを新しいthis_thread_blockオーバーロードに提供する。少なくとも1つの実施例では、その構造は、共有メモリ変数として宣言される。少なくとも1つの実施例では、Block_tile_memory構造は、2つのテンプレート・パラメータ、現在ブロックがそれからなり得るスレッドの最大数と、各ワープが集合的な動作のために使用することができるバイト単位のメモリの量とを有する。少なくとも1つの実施例では、これらの引数は、どれくらいの共有メモリが割り振られる必要があるかを決定するために必要とされる。少なくとも1つの実施例では、区分けされたグループが使用される前に、新しいthis_thread_blockオーバーロードが共有メモリを準備するので、それは、今度は、区分けされたグループ中のすべてのスレッドによってコールされる。
Figure 2023007422000009
少なくとも1つの実施例では、マルチワープthread_block_tileは、単一ワープthread_block_tileのメソッドのサブセットであるインターフェースを提供する。少なくとも1つの実施例では、それらのメソッドの実装は、作成されることが可能である各グループが、そのグループの同期中にバリアとして使用される4Bメモリ・ロケーションへの排他的アクセスを有することを必要とする。少なくとも1つの実施例では、2のべき乗であるサイズのグループのみが可能にされ、したがって、連動スレッド・アレイ(「CTA:cooperative thread array」)のパーティションを通して取得され得るすべての可能なグループの数は、そのCTA中のワープの数-2に等しい。
少なくとも1つの実施例では、集合を実装するために、各ワープは、データを交換するための何らかのメモリを使用する。少なくとも1つの実施例では、各ワープがアクセスを有するメモリの量は、block_tile_memoryへのTileCommunicationSizeテンプレート・パラメータを通して構成される。
少なくとも1つの実施例では、各CTAは、共有メモリのT/32*(4+P)バイトを使用し、ここで、Tは、CTA中のスレッドの指定された最大数であり、Pは、集合的な動作のためのワープごとのバイトの指定された数である。少なくとも1つの実施例では、このメモリは、異なるグループ及びそのグループ内のワープに静的に割り当てられ、それにより、グループのそのthread_rank及びサイズからのマルチワープthread_block_tileのメンバーによってどれが使用されるべきであるかが決定される。
少なくとも1つの実施例では、block_tile_memoryの各テンプレート・パラメータは、デフォルト・パラメータを有する。少なくとも1つの実施例では、最大CTAサイズは、CTAサイズについてのハードウェア制限である1024個のスレッドにデフォルト設定される。少なくとも1つの実施例では、デフォルトのワープごとメモリ・サイズは、最も一般的なデータ型を使用して集合の効率的な動作を可能にするために、8Bに設定される。
Figure 2023007422000010
少なくとも1つの実施例では、集合は、集合に応じてわずかな修正を伴って、以下の低減アルゴリズムに従って実装される。
Figure 2023007422000011
少なくとも1つの実施例では、shflの場合、ソース・ワープは、最後のワープが到着する代わりに、他のスレッドをバリアからリリースする。少なくとも1つの実施例では、ワープ・サイズ(低減ロケーションのサイズ)ごとに指定されたよりも大きい型に関して動作する集合の場合、各ワープとリリースするワープとの間で、データ転送の複数のラウンドが実施される。
少なくとも1つの実施例では、thread_rank又はmeta_group_sizeのようなランク/サイズ計算を伴うメソッドは、静的ランク/サイズ計算方式が同じであるので、thread_block_tileの現在の実装から再使用される。
図1は、少なくとも1つの実施例による、ワープの一実例を示す。少なくとも1つの実施例では、アプリケーションは、複数の処理コア上で並列に実施され得る複数のスレッドを定義することによって、並列処理を利用する。少なくとも1つの実施例では、1つのスレッド102が、1つのコア104上で稼働する。少なくとも1つの実施例では、スレッドは、プログラム又はプログラム・セグメントのコピー又はインスタンスであり得る。少なくとも1つの実施例では、カーネルは、複数のコア上で複数回稼働するように指定された機能である。少なくとも1つの実施例では、ワープは、プロセッサ・コアのセット上で並列に稼働するスレッドのグループである。少なくとも1つの実施例では、ワープ106は、多くとも32個のスレッド108を含む。少なくとも1つの実施例では、ワープ中にあり得るスレッドの最大数は、マルチプロセッサの実装形態によって制限される。
少なくとも1つの実施例では、グラフィカル処理ユニット(「GPU」:graphical processing unit)などのマルチプロセッサは、実行されるべき複数のスレッドを定義するコードとともに提供される。少なくとも1つの実施例では、GPUは、スレッドを複数のコアに分散させ、これは、スレッドが並列に稼働されることを可能にする。少なくとも1つの実施例では、スレッドは、32スレッド・ワープに分割され、これは、次いで、スケジューリングされ、一度に1つ又は複数のワープを稼働する。少なくとも1つの実施例では、ワープの最大サイズは、GPUのタイプに基づいて、より大きく又はより小さくなり得る。少なくとも1つの実施例では、ワープは、並列に又は直列に稼働され得る。
少なくとも1つの実施例では、プログラマは、連動グループとして実行されるべきスレッドのグループを指定することができる。少なくとも1つの実施例では、連動グループは、対応する数のコア上で同時に稼働されるべきスレッドのグループである。少なくとも1つの実施例では、連動グループがワープ内に収まる場合、連動グループのスレッドは単一ワープ内に配置され、同時に実行され得る。少なくとも1つの実施例では、連動グループ中のスレッドの数がワープの最大サイズを超える場合、同時に稼働すべきスレッドの2つ又はそれ以上のワープを同期させるための機構が必要とされる。
図2は、少なくとも1つの実施例による、2つのワープにわたる連動スレッド・グループの一実例を示す。少なくとも1つの実施例では、第1のワープ202と第2のワープ204とは、それらが並列に実行するように同期される。少なくとも1つの実施例では、第1のワープ202は、32個のスレッドの第1のトレッド・ブロック206を含み、第2のワープ204は、32個のスレッドの第2のスレッド・ブロック208を含み、合計で、連動スレッド・グループとして動作することが可能である64個のスレッドとなる。少なくとも1つの実施例では、第1のワープ202と第2のワープ204との間の同期は、バリア210を使用して達成される。少なくとも1つの実施例では、バリア210は、第1のワープ202又は第2のワープ204のいずれかにおける任意のスレッドにとってアクセス可能である共有メモリに記憶される。
少なくとも1つの実施例では、バリア210は、32ビット値である。少なくとも1つの実施例では、各ワープが完了したとき、バリア210は、アトミック加算演算を使用して増分される。少なくとも1つの実施例では、バリア210の値が連動スレッド・グループ中のワープの数に達したとき、連動スレッド・ブロック中のすべてのスレッドが同期されたと決定され得る。少なくとも1つの実施例では、バリア210は、第1のワープ202又は第2のワープ204中のブロック・スレッドをリリースするために使用され得る。
図3は、少なくとも1つの実施例による、4つのワープにわたる連動スレッド・グループの一実例を示す。少なくとも1つの実施例では、連動スレッド・グループは、4つのワープ、第1のワープ302と、第2のワープ304と、第3のワープ306と、第4のワープ308とを含む。少なくとも1つの実施例では、各ワープが32個のスレッドを有し、第1のワープ302はスレッドの第1のグループ310を有し、第2のワープ304はスレッドの第2のグループ312を有し、第3のワープ306はスレッドの第3のグループ314を有し、第4のワープ308はスレッドの第4のグループ316を有する。
少なくとも1つの実施例では、第1のワープ302と、第2のワープ304と、第3のワープ306と、第4のワープ308とは、バリア318を使用して同期される。少なくとも1つの実施例では、バリアはカウンタとして実装され、カウンタは、0において開始し、すべてのワープが同期されたことを指示する4にカウンタが達するまで、各ワープが同期されたときに増分する。少なくとも1つの実施例では、バリア318は、すべてのスレッドをブロックし、4ビットが設定されたときにそれらをリリースする。少なくとも1つの実施例では、バリア318は、ビット・フィールドとして実装され、各ビットは異なるワープを表す。少なくとも1つの実施例では、適切に同期されたとき、すべての4つのワープ及びそれらに関連するスレッドが実行され、連動して動作し得る。
図4は、少なくとも1つの実施例による、各グループが4つのワープにわたる、4つのグループをもつ連動スレッド・アレイの一実例を示す。少なくとも1つの実施例では、連動スレッド・アレイ402は、4つの連動スレッド・グループ、第1の連動グループ404と、第2の連動グループ406と、第3の連動グループ408と、第4の連動グループ410とを含む。少なくとも1つの実施例では、各連動グループは、32個のスレッドの4つのワープにわたる。
少なくとも1つの実施例では、第1の連動グループ404と、第2の連動グループ408と、第3の連動グループ410と、第4の連動グループ412とは、各連動グループのためのバリアを使用して同期される。少なくとも1つの実施例では、バリアは共有メモリに記憶された4つのカウンタとして実装され、4つのカウンタは、各々、0において開始し、対応するグループ中のすべてのワープが同期されたことを指示する4にカウンタが達するまで、対応するグループ中の各ワープが同期されたときに増分する。グループ及びワープの異なる内訳が可能であり、必要とされるバリアの数が、グループの数に応じる。
図5は、少なくとも1つの実施例による、各グループが8つのワープにわたる、4つのグループをもつ連動スレッド・アレイの一実例を示す。少なくとも1つの実施例では、連動スレッド・アレイ502は、4つの連動スレッド・グループ、第1の連動グループ504と、第2の連動グループ506とを含む。少なくとも1つの実施例では、各連動グループは、32個のスレッドの8つのワープにわたる。
少なくとも1つの実施例では、第1の連動グループ504と、第2の連動グループ508とは、各連動グループのためのバリアを使用して同期される。少なくとも1つの実施例では、バリアは共有メモリに記憶された2つのカウンタとして実装され、2つのカウンタは、各々、0において開始し、対応するグループ中のすべてのワープが同期されたことを指示する8にカウンタが達するまで、対応するグループ中の各ワープが同期されたときに増分する。
少なくとも1つの実施例では、マルチワープ・バリアが、到着したワープをカウントし、バリア・フェーズとして最高ビットを使用するためにatomicAddなどのアトミック加算演算を使用して実装される。少なくとも1つの実施例では、各グループは別個のバリアを使用し、したがって、可能なグループごとに単一のバリアが割り振られる。少なくとも1つの実施例では、バリアは、グループ合成が知られる前に、共有メモリ中に割り振られ、したがって、すべての可能なバリアが割り振られる。少なくとも1つの実施例では、グループ中のワープの数が32個に制限されるので、到着するワープをカウントするためにintの全範囲は必要とされないが、atomicAddは、バリアとして代わりに使用するためのより小さい型をサポートしない。
少なくとも1つの実施例では、より小さいバリアを使用する代わりに、32ビット・バリア中の1ビットでグループ中の各ワープを表すために32個のワープの制限に依拠する。少なくとも1つの実施例では、到着するワープは、到着したとして、そのビットをマークするためにatomicOrを使用することになる。少なくとも1つの実施例では、atomicOrによって再調整された古い値が、対応するグループ・マスクと比較されることになり、ワープがバリア上に到着すべき最後のワープである場合、それは、グループ中のワープのすべてのビットをクリアしてバリアからそれらをリリースするために、atomicAndを行う。
少なくとも1つの実施例では、これらのグループが共通のワープを有しない限り、単一のバリアが複数のグループのために使用され得る。少なくとも1つの実施例では、可能なグループごとに1つのバリアの代わりに、マルチワープ・グループの各可能なサイズのために1つのバリアが使用される。少なくとも1つの実施例では、バリアのためのメモリ需要が、以下の表に示されているように、著しく低減される。
Figure 2023007422000012

*表中の+1は、thread_block到着及び待機実装のための1つの追加のバリアをカウントし、これは、マルチワープ・グループに関係しない。
少なくとも1つの実施例では、thread_blockにおける到着-待機バリアと同様の可能な将来の使用事例、並びに単純さのためのオプションを残すために、すべての場合において割り振られる8つのバリアを割り振る。少なくとも1つの実施例では、それは、より小さいCTAのために4つに低減され得る。
少なくとも1つの実施例では、このバリア実装は、到着と待機との間のバリア・フェーズを保つためにレジスタを使用せずに、以下で説明される到着-待機機能の実装を可能にする。
少なくとも1つの実施例では、到着待機バリアがCUDAデバイス側APIに追加され、単一ワープよりも大きいCGグループにおける同様の機能性を可能にする。少なくとも1つの実施例では、到着及び待機は集合的であり、thread_block_tile及びthread_blockの場合、ワープ中のすべてのスレッドによって、及びgrid_groupの場合、スレッド・ブロック中のすべてのスレッドによって、コールされなければならない。
少なくとも1つの実施例では、到着は、グループ・バリアに到着したとして、コールするワープ又はスレッド・ブロックをマークする。少なくとも1つの実施例では、待機するためのコールが、すべてのワープ又はスレッド・ブロックが到着をコールするまで、コールするスレッドを止めることになる。
少なくとも1つの実施例では、到着及び待機は、ペアでコールされる必要があり、グループ上で待機機能をコールすることは、マッチする到着コールが、コールするスレッドにおいて同じグループ上で行われない場合、定義されていない挙動を生じる。少なくとも1つの実施例では、それらの間の待機なしに到着を2回コールすることは、定義されていない挙動を生じる。
少なくとも1つの実施例では、グループ同期の現在の実装は、到着及び待機ステップにおいてすでに行われ、これらの新しい機能の実装は、2つの別個のステップとして公開される同じアルゴリズムをただ使用することになる。
少なくとも1つの実施例では、それに対する唯一の例外は、組み込まれたsyncthreads()を使用する、thread_blockグループである。少なくとも1つの実施例では、この場合、到着及び待機機能は、これらの機能のマルチワープ・グループ実装を使用することになる。少なくとも1つの実施例では、マルチワープ・グループは、2のべき乗であるサイズに制限されるが、同期機構は、スレッド・ブロックが2のべき乗である状況に制限されない。
少なくとも1つの実施例では、メモリ・バリアは、membar、メモリ・フェンス又はフェンス命令と呼ばれることがある。少なくとも1つの実施例では、バリアはバリア命令として実装され、バリア命令は、プロセッサに、バリア命令の前及び後に発行されるメモリ演算に関する順序付け制約をエンフォース(enforce)させる。少なくとも1つの実施例では、これは、ハードウェア又はソフトウェアにおいてエンフォースされ得る。少なくとも1つの実施例では、バリアより前に発行される演算は、バリアの後に発行される演算の前に実施されることが保証される。少なくとも1つの実施例では、これは、同期に言及され得る。
少なくとも1つの実施例では、バリアは、複数のデバイス、スレッド、又はプロセスによって共有されるメモリ上で動作する低レベル機械コードを実装するときに使用され得る。少なくとも1つの実施例では、そのようなコードは、マルチプロセッサ・システム、及びコンピュータ・ハードウェアと通信するデバイス・ドライバ上の、同期プリミティブとロックフリー・データ構造とを含む。
図6は、少なくとも1つの実施例による、カウンタに基づくバリア実装形態の一実例を示す。少なくとも1つの実施例では、カウンタは、各可能なグループのためのバリアとして使用される。少なくとも1つの実施例では、CTAは、各グループが識別された数のワープを含む、ワープの様々なグループに分割され得る。少なくとも1つの実施例では、グループは、2のべき乗である、ワープの数に制限される。
少なくとも1つの実施例では、1024スレッドCTAが、各々2つのワープの16個のグループに分割される場合、16個のバリア602が使用される。少なくとも1つの実施例では、16個のバリア602の各々は、32ビット値であり、これは、各ワープがその対応するバリアに到着したときに増分される。少なくとも1つの実施例では、(8ビット・バイトなどの)より小さい値が、そのような値に対して機能するアトミック加算演算が利用可能である場合、バリアとして使用され得る。
少なくとも1つの実施例では、1024スレッドCTAが、各々4つのワープの8つのグループに分割される場合、8つのバリア604が使用される。少なくとも1つの実施例では、8つのバリア604の各々は、32ビット値であり、これは、各ワープがその対応するバリアに到着したときに増分される。少なくとも1つの実施例では、(8ビット・バイトなどの)より小さい値が、そのような値に対して機能するアトミック加算演算が利用可能である場合、バリアとして使用され得る。
少なくとも1つの実施例では、1024スレッドCTAが、各々8つのワープの4つのグループに分割される場合、4つのバリア604が使用される。少なくとも1つの実施例では、4つのバリア606の各々は、32ビット値であり、これは、各ワープがその対応するバリアに到着したときに増分される。少なくとも1つの実施例では、(8ビット・バイトなどの)より小さい値が、そのような値に対して機能するアトミック加算演算が利用可能である場合、バリアとして使用され得る。
少なくとも1つの実施例では、1024スレッドCTAが、各々16個のワープの2つのグループに分割される場合、2つのバリア604が使用される。少なくとも1つの実施例では、2つのバリア608の各々は、32ビット値であり、これは、各ワープがその対応するバリアに到着したときに増分される。少なくとも1つの実施例では、(8ビット・バイトなどの)より小さい値が、そのような値に対して機能するアトミック加算演算が利用可能である場合、バリアとして使用され得る。
少なくとも1つの実施例では、これらのグループのいずれも1024スレッドCTAとともに使用されることを可能にすると、合計で、16+8+4+2個のバリアが必要とされる。
図7は、少なくとも1つの実施例による、コンピュータ・システムによって実施された結果として、マルチワープ・グループのバリアを更新するプロセスの一実例を示す。少なくとも1つの実施例では、ブロック702において、コンピュータ・システムは、連動グループ内のワープが完了したことを通知される。少なくとも1つの実施例では、ワークのステータスは、GPU、マルチコア・プロセッサによって、又はコア内のスレッドの実行を監視するソフトウェアをコーディングするオペレーティング・システムによって、追跡され得る。
少なくとも1つの実施例では、ワープが完了した又は同期状態にあると決定した結果として、実行はブロック704を進ませ、コンピュータ・システムが、そのワープ・グループのためのバリアを増分する。少なくとも1つの実施例では、バリアは、アトミック加算演算を使用して増分される。少なくとも1つの実施例では、判定ブロック706において、コンピュータ・システムは、バリアの値に少なくとも部分的に基づいて、グループのすべてのワープが完了した又は同期されたかどうかを決定する。少なくとも1つの実施例では、連動グループの同期は、バリア値が、前記連動グループ中のワープの数よりも大きいか又はそれに等しいと決定することによって、決定される。
少なくとも1つの実施例では、コンピュータ・システムが、グループ中のすべてのワープが完了しているとは限らないと決定した場合、実行はブロック708を進ませ、コンピュータ・システムが、別のワープが完了するのを待機する。少なくとも1つの実施例では、コンピュータ・システムが、グループ中のすべてのワープが完了同期されたと決定した場合、実行はブロック710に進む。少なくとも1つの実施例では、ブロック712において、連動グループに関連するバリアは0にリセットされ、前記連動グループに関連するすべてのワープがリリースされる。
図8は、少なくとも1つの実施例による、ビット・フィールドに基づくバリア実装形態の一実例を示す。少なくとも1つの実施例では、バリアは、ビット・フィールドとして実装され、ビット・フィールド中の各ビットは、連動スレッド・グループ中の異なるワープを表す。少なくとも1つの実施例では、連動グループの状態は、論理AND演算とともに前記グループに関連するマスクをバリアに適用することによって取得される。少なくとも1つの実施例では、ワープに関連するビットは、論理OR演算とともに前記ワープに関連するマスクをバリアに適用することによって設定される。少なくとも1つの実施例では、グループのためのバリアは、論理andとともに関連するマスクの逆数を前記バリアに適用することによってリセットされ得る。
少なくとも1つの実施例では、1024個のスレッドのCTAは、各々2つのワープの16個のグループに分割される。少なくとも1つの実施例では、単一の32ビット・バリアが、すべての16個のグループのために必要とされる同期データのすべてを表すことができる。少なくとも1つの実施例では、第1のバイト802は、グループ1~4についての同期情報を記憶する。少なくとも1つの実施例では、第2のバイト804は、グループ5~8についての同期情報を記憶する。少なくとも1つの実施例では、第3のバイト806は、グループ9~12についての同期情報を記憶する。少なくとも1つの実施例では、第4のバイト808は、グループ13~16についての同期情報を記憶する。
少なくとも1つの実施例では、1024個のスレッドのCTAは、各々4つのワープの8つのグループに分割される。少なくとも1つの実施例では、単一の32ビット・バリアが、すべての8つのグループのために必要とされる同期データのすべてを表すことができる。少なくとも1つの実施例では、第1のバイト810は、グループ1及び2についての同期情報を記憶する。少なくとも1つの実施例では、第2のバイト812は、グループ3及び4についての同期情報を記憶する。少なくとも1つの実施例では、第3のバイト814は、グループ5及び6についての同期情報を記憶する。少なくとも1つの実施例では、第4のバイト816は、グループ7及び8についての同期情報を記憶する。
少なくとも1つの実施例では、1024個のスレッドのCTAは、各々8つのワープの4つのグループに分割される。少なくとも1つの実施例では、単一の32ビット・バリアが、すべての4つのグループのために必要とされる同期データのすべてを表すことができる。少なくとも1つの実施例では、第1のバイト818は、グループ1についての同期情報を記憶する。少なくとも1つの実施例では、第2のバイト820は、グループ2についての同期情報を記憶する。少なくとも1つの実施例では、第3のバイト822は、グループ3についての同期情報を記憶する。少なくとも1つの実施例では、第4のバイト824は、グループ4についての同期情報を記憶する。
少なくとも1つの実施例では、1024個のスレッドのCTAは、各々16個のワープの2つのグループに分割される。少なくとも1つの実施例では、単一の32ビット・バリアが、両方のグループのために必要とされる同期データのすべてを表すことができる。少なくとも1つの実施例では、第1のバイト826及び第2のバイト828は、グループ1についての同期情報を記憶する。少なくとも1つの実施例では、第3のバイト830及び第4のバイト832は、グループ2についての同期情報を記憶する。
少なくとも1つの実施例では、複数のグループが、単一のバリアを共有することが可能であるので、著しく少ないストレージ空間が必要とされる。少なくとも1つの実施例では、すべての上記の連動グループは、図6に示されている手法を使用する30個の値とは対照的に、4つの32ビット値のみを必要とする。
図9は、少なくとも1つの実施例による、コンピュータ・システムによって実施された結果として、マルチワープ・グループのバリアを更新するプロセスの一実例を示す。少なくとも1つの実施例では、ブロック902において、コンピュータ・システムは、いくつかの実例ではワープと呼ばれる、並列スレッドのグループの完了を検出する。少なくとも1つの実施例では、ブロック904において、ワープが連動グループの一部であるかどうかを決定し、そうである場合、連動グループのバリア中のワープに関連するビットを設定する。少なくとも1つの実施例では、ブロック906において、コンピュータ・システムは、連動グループに関連するビット・マスクを取得する。少なくとも1つの実施例では、マスクは32ビット・フィールドであり、1が、グループのワープに関連するビットを指示する。少なくとも1つの実施例では、マスクは、このグループに関連するバリアに適用されて、908において、このグループのすべてのワープがバリアに到着したかどうかを決定する。
少なくとも1つの実施例では、判定ブロック908において、コンピュータ・システムが、連動グループについてのすべてのビットがまだ設定されないと決定した場合、実行はブロック910にダイレクトされ、コンピュータ・システムが、スレッドの別のワープが完了するのを待機する。少なくとも1つの実施例では、判定ブロック908において、コンピュータ・システムが、連動グループについてのすべてのビットが設定されたと決定した場合、実行はブロック912に進み、連動グループのすべてのワープがバリアにおいて同期されると決定される。少なくとも1つの実施例では、ブロック914において、バリアは、連動グループに関連するビットをクリアすることによってリセットされ、関連するワープをリリースする。
データ・センタ
少なくとも1つの実施例では、上記で説明された技法は、データ・センタ1000など、以下で説明されるようなデータ・センタにおいて実装され得る。少なくとも1つの実施例では、データ・センタにおいて稼働されるアプリケーションが、複数のプロセッサ上で並列に稼働される従属スレッド(dependent thread)に分割され得る。少なくとも1つの実施例では、プロセッサは、以下で説明される任意のプロセッサ・タイプを含み得る。少なくとも1つの実施例では、1つ又は複数の回路は、2つ又はそれ以上の従属スレッドが、2つ又はそれ以上の別個のマルチスレッド・プロセッサ・コアを使用して並列に実施されることを引き起こす。少なくとも1つの実施例では、プロセッサ・コアは、マルチコアCPU中のコア、GPU中のSMPコア、又は記憶可能な命令を実行することが可能な他の回路であり得る。少なくとも1つの実施例では、スレッドの第1のグループが、2つ又はそれ以上のプロセッサ・コアを使用して並列に実施されるべきスレッドの2つ又はそれ以上のサブグループに編成されることを引き起こすための1つ又は複数の回路。少なくとも1つの実施例では、スレッドのグループは、並列に稼働する連動グループであり得る。少なくとも1つの実施例では、連動グループは、GPU上でワープ中に配置された複数のカーネル・スレッドを含む。少なくとも1つの実施例では、スレッド間の同期動作は、バリアの使用によって可能にされ得る。少なくとも1つの実施例では、1つ又は複数の回路は、メモリ・バリア演算を実施して、スレッドの複数のグループによるメモリへのアクセスが、メモリ・バリア演算によって指示される順序で発生することを引き起こす。少なくとも1つの実施例では、バリア演算は、ビット単位論理演算(たとえば、AND、OR、XOR)などのアトミック演算、或いはアトミック加算又は減算などの数学演算であり得る。
図10は、少なくとも1つの実施例による、例示的なデータ・センタ1000を示す。少なくとも1つの実施例では、データ・センタ1000は、限定はしないが、データ・センタ・インフラストラクチャ層1010と、フレームワーク層1020と、ソフトウェア層1030と、アプリケーション層1040とを含む。
少なくとも1つの実施例では、図10に示されているように、データ・センタ・インフラストラクチャ層1010は、リソース・オーケストレータ1012と、グループ化されたコンピューティング・リソース1014と、ノード・コンピューティング・リソース(「ノードC.R.」:node computing resource)1016(1)~1016(N)とを含み得、ここで、「N」は、任意のすべての正の整数を表す。少なくとも1つの実施例では、ノードC.R.1016(1)~1016(N)は、限定はしないが、任意の数の中央処理ユニット(「CPU:central processing unit」)又は(アクセラレータ、フィールド・プログラマブル・ゲート・アレイ(「FPGA」:field programmable gate array)、ネットワーク・デバイス中のデータ処理ユニット(「DPU」:data processing unit)、グラフィックス・プロセッサなどを含む)他のプロセッサ、メモリ・デバイス(たとえば、動的読取り専用メモリ)、ストレージ・デバイス(たとえば、ソリッド・ステート又はディスク・ドライブ)、ネットワーク入力/出力(「NW I/O」:network input/output)デバイス、ネットワーク・スイッチ、仮想機械(「VM」:virtual machine)、電力モジュール、及び冷却モジュールなどを含み得る。少なくとも1つの実施例では、ノードC.R.1016(1)~1016(N)の中からの1つ又は複数のノードC.R.は、上述のコンピューティング・リソースのうちの1つ又は複数を有するサーバであり得る。
少なくとも1つの実施例では、グループ化されたコンピューティング・リソース1014は、1つ又は複数のラック(図示せず)内に格納されたノードC.R.の別個のグループ化、又は様々な地理的ロケーション(同じく図示せず)においてデータ・センタ中に格納された多くのラックを含み得る。グループ化されたコンピューティング・リソース1014内のノードC.R.の別個のグループ化は、1つ又は複数のワークロードをサポートするように構成されるか又は割り振られ得る、グループ化されたコンピュート・リソース、ネットワーク・リソース、メモリ・リソース、又はストレージ・リソースを含み得る。少なくとも1つの実施例では、CPU又はプロセッサを含むいくつかのノードC.R.は、1つ又は複数のワークロードをサポートするためのコンピュート・リソースを提供するために1つ又は複数のラック内でグループ化され得る。少なくとも1つの実施例では、1つ又は複数のラックはまた、任意の数の電力モジュール、冷却モジュール、及びネットワーク・スイッチを、任意の組合せで含み得る。
少なくとも1つの実施例では、リソース・オーケストレータ1012は、1つ又は複数のノードC.R.1016(1)~1016(N)及び/又はグループ化されたコンピューティング・リソース1014を構成するか、又はさもなければ、制御し得る。少なくとも1つの実施例では、リソース・オーケストレータ1012は、データ・センタ1000のためのソフトウェア設計インフラストラクチャ(「SDI」:software design infrastructure)管理エンティティを含み得る。少なくとも1つの実施例では、リソース・オーケストレータ1012は、ハードウェア、ソフトウェア、又はそれらの何らかの組合せを含み得る。
少なくとも1つの実施例では、図10に示されているように、フレームワーク層1020は、限定はしないが、ジョブ・スケジューラ1032と、構成マネージャ1034と、リソース・マネージャ1036と、分散型ファイル・システム1038とを含む。少なくとも1つの実施例では、フレームワーク層1020は、ソフトウェア層1030のソフトウェア1052、及び/又はアプリケーション層1040の1つ又は複数のアプリケーション1042をサポートするためのフレームワークを含み得る。少なくとも1つの実施例では、ソフトウェア1052又は(1つ又は複数の)アプリケーション1042は、それぞれ、アマゾン・ウェブ・サービス、Google Cloud、及びMicrosoft Azureによって提供されるものなど、ウェブ・ベースのサービス・ソフトウェア又はアプリケーションを含み得る。少なくとも1つの実施例では、フレームワーク層1020は、限定はしないが、大規模データ処理(たとえば、「ビック・データ」)のために分散型ファイル・システム1038を利用し得るApache Spark(商標)(以下「Spark」)など、無料でオープンソースのソフトウェア・ウェブ・アプリケーション・フレームワークのタイプであり得る。少なくとも1つの実施例では、ジョブ・スケジューラ1032は、データ・センタ1000の様々な層によってサポートされるワークロードのスケジューリングを容易にするために、Sparkドライバを含み得る。少なくとも1つの実施例では、構成マネージャ1034は、ソフトウェア層1030、並びに大規模データ処理をサポートするためのSpark及び分散型ファイル・システム1038を含むフレームワーク層1020など、異なる層を構成することが可能であり得る。少なくとも1つの実施例では、リソース・マネージャ1036は、分散型ファイル・システム1038及びジョブ・スケジューラ1032をサポートするようにマッピングされたか又は割り振られた、クラスタ化された又はグループ化されたコンピューティング・リソースを管理することが可能であり得る。少なくとも1つの実施例では、クラスタ化された又はグループ化されたコンピューティング・リソースは、データ・センタ・インフラストラクチャ層1010において、グループ化されたコンピューティング・リソース1014を含み得る。少なくとも1つの実施例では、リソース・マネージャ1036は、リソース・オーケストレータ1012と協調して、これらのマッピングされた又は割り振られたコンピューティング・リソースを管理し得る。
少なくとも1つの実施例では、ソフトウェア層1030中に含まれるソフトウェア1052は、ノードC.R.1016(1)~1016(N)、グループ化されたコンピューティング・リソース1014、及び/又はフレームワーク層1020の分散型ファイル・システム1038の少なくとも部分によって使用されるソフトウェアを含み得る。1つ又は複数のタイプのソフトウェアは、限定はしないが、インターネット・ウェブ・ページ検索ソフトウェアと、電子メール・ウイルス・スキャン・ソフトウェアと、データベース・ソフトウェアと、ストリーミング・ビデオ・コンテンツ・ソフトウェアとを含み得る。
少なくとも1つの実施例では、アプリケーション層1040中に含まれる(1つ又は複数の)アプリケーション1042は、ノードC.R.1016(1)~1016(N)、グループ化されたコンピューティング・リソース1014、及び/又はフレームワーク層1020の分散型ファイル・システム1038の少なくとも部分によって使用される1つ又は複数のタイプのアプリケーションを含み得る。少なくとも1つ又は複数のタイプのアプリケーションでは、限定はしないが、CUDAアプリケーションを含み得る。
少なくとも1つの実施例では、構成マネージャ1034、リソース・マネージャ1036、及びリソース・オーケストレータ1012のいずれかが、任意の技術的に実現可能な様式で獲得された任意の量及びタイプのデータに基づいて、任意の数及びタイプの自己修正アクションを実装し得る。少なくとも1つの実施例では、自己修正アクションは、データ・センタ1000のデータ・センタ・オペレータを、不良の恐れのある構成を判定し、十分に利用されていない及び/又は性能の低いデータ・センタの部分を場合によっては回避することから解放し得る。
コンピュータ・ベースのシステム
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的なコンピュータ・ベースのシステムを記載する。
少なくとも1つの実施例では、上記で説明された技法は、コンピュータ・システム1200又は例示的な集積回路1400など、以下で説明されるようなコンピュータ・システム上で実装され得る。少なくとも1つの実施例では、コンピュータ・システムにおいて稼働されるアプリケーションが、複数のプロセッサ上で並列に稼働される従属スレッドに分割され得る。少なくとも1つの実施例では、プロセッサは、処理システム1100又は処理サブシステム1501を含む、以下で説明される任意のプロセッサ・タイプを含み得る。少なくとも1つの実施例では、1つ又は複数の回路は、2つ又はそれ以上の従属スレッドが、2つ又はそれ以上の別個のマルチスレッド・プロセッサ・コアを使用して並列に実施されることを引き起こす。少なくとも1つの実施例では、プロセッサ・コアは、マルチコアCPU中のコア、GPU中のSMPコア、又は記憶可能な命令を実行することが可能な他の回路であり得る。少なくとも1つの実施例では、スレッドの第1のグループが、2つ又はそれ以上のプロセッサ・コアを使用して並列に実施されるべきスレッドの2つ又はそれ以上のサブグループに編成されることを引き起こすための1つ又は複数の回路。少なくとも1つの実施例では、スレッドのグループは、並列に稼働する連動グループであり得る。少なくとも1つの実施例では、連動グループは、GPU上でワープ中に配置された複数のカーネル・スレッドを含む。少なくとも1つの実施例では、スレッド間の同期動作は、バリアの使用によって可能にされ得る。少なくとも1つの実施例では、1つ又は複数の回路は、メモリ・バリア演算を実施して、スレッドの複数のグループによるメモリへのアクセスが、メモリ・バリア演算によって指示される順序で発生することを引き起こす。少なくとも1つの実施例では、バリア演算は、ビット単位論理演算(たとえば、AND、OR、XOR)などのアトミック演算、或いはアトミック加算又は減算などの数学演算であり得る。
図11は、少なくとも1つの実施例による、処理システム1100を示す。少なくとも1つの実施例では、処理システム1100は、1つ又は複数のプロセッサ1102と1つ又は複数のグラフィックス・プロセッサ1108とを含み、単一プロセッサ・デスクトップ・システム、マルチプロセッサ・ワークステーション・システム、或いは多数のプロセッサ1102又はプロセッサ・コア1107を有するサーバ・システムであり得る。少なくとも1つの実施例では、処理システム1100は、モバイル・デバイス、ハンドヘルド・デバイス、又は組み込みデバイスにおいて使用するためのシステム・オン・チップ(「SoC」:system-on-a-chip)集積回路内に組み込まれた処理プラットフォームである。
少なくとも1つの実施例では、処理システム1100は、サーバ・ベースのゲーミング・プラットフォーム、ゲーム・コンソール、メディア・コンソール、モバイル・ゲーミング・コンソール、ハンドヘルド・ゲーム・コンソール、又はオンライン・ゲーム・コンソールを含むことができるか、或いはそれらの内部に組み込まれ得る。少なくとも1つの実施例では、処理システム1100は、モバイル・フォン、スマート・フォン、タブレット・コンピューティング・デバイス又はモバイル・インターネット・デバイスである。少なくとも1つの実施例では、処理システム1100はまた、スマート・ウォッチ・ウェアラブル・デバイス、スマート・アイウェア・デバイス、拡張現実デバイス、又は仮想現実デバイスなどのウェアラブル・デバイスを含むことができるか、それらと結合することができるか、又はそれらの内部に組み込まれ得る。少なくとも1つの実施例では、処理システム1100は、1つ又は複数のプロセッサ1102と、1つ又は複数のグラフィックス・プロセッサ1108によって生成されるグラフィカル・インターフェースとを有するテレビ又はセット・トップ・ボックス・デバイスである。
少なくとも1つの実施例では、1つ又は複数のプロセッサ1102は、各々、実行されたときにシステム及びユーザ・ソフトウェアのための動作を実施する命令を処理するための1つ又は複数のプロセッサ・コア1107を含む。少なくとも1つの実施例では、1つ又は複数のプロセッサ・コア1107の各々は、特定の命令セット1109を処理するように構成される。少なくとも1つの実施例では、命令セット1109は、複合命令セット・コンピューティング(「CISC」:Complex Instruction Set Computing)、縮小命令セット・コンピューティング(「RISC」:Reduced Instruction Set Computing)、又は超長命令語(「VLIW」:Very Long Instruction Word)を介したコンピューティングを容易にし得る。少なくとも1つの実施例では、プロセッサ・コア1107は、各々、異なる命令セット1109を処理し得、命令セット1109は、他の命令セットのエミュレーションを容易にするための命令を含み得る。少なくとも1つの実施例では、プロセッサ・コア1107はまた、デジタル信号プロセッサ(「DSP」:digital signal processor)などの他の処理デバイスを含み得る。
少なくとも1つの実施例では、プロセッサ1102はキャッシュ・メモリ(「キャッシュ」)1104を含む。少なくとも1つの実施例では、プロセッサ1102は、単一の内部キャッシュ又は複数のレベルの内部キャッシュを有することができる。少なくとも1つの実施例では、キャッシュ・メモリは、プロセッサ1102の様々な構成要素の間で共有される。少なくとも1つの実施例では、プロセッサ1102はまた、外部キャッシュ(たとえば、レベル3(「L3」)キャッシュ又はラスト・レベル・キャッシュ(「LLC」:Last Level Cache))(図示せず)を使用し、外部キャッシュは、知られているキャッシュ・コヒーレンシ技法を使用してプロセッサ・コア1107の間で共有され得る。少なくとも1つの実施例では、追加として、レジスタ・ファイル1106がプロセッサ1102中に含まれ、レジスタ・ファイル1106は、異なるタイプのデータを記憶するための異なるタイプのレジスタ(たとえば、整数レジスタ、浮動小数点レジスタ、ステータス・レジスタ、及び命令ポインタ・レジスタ)を含み得る。少なくとも1つの実施例では、レジスタ・ファイル1106は、汎用レジスタ又は他のレジスタを含み得る。
少なくとも1つの実施例では、1つ又は複数のプロセッサ1102は、アドレス、データ、又は制御信号などの通信信号を、プロセッサ1102と処理システム1100中の他の構成要素との間で送信するために、1つ又は複数のインターフェース・バス1110と結合される。少なくとも1つの実施例では、1つの実施例におけるインターフェース・バス1110は、ダイレクト・メディア・インターフェース(「DMI」:Direct Media Interface)バスのバージョンなどのプロセッサ・バスであり得る。少なくとも1つの実施例では、インターフェース・バス1110は、DMIバスに限定されず、1つ又は複数の周辺構成要素相互接続バス(たとえば、「PCI」:Peripheral Component Interconnect、PCI Express(「PCIe」))、メモリ・バス、又は他のタイプのインターフェース・バスを含み得る。少なくとも1つの実施例では、(1つ又は複数の)プロセッサ1102は、統合されたメモリ・コントローラ1116と、プラットフォーム・コントローラ・ハブ1130とを含む。少なくとも1つの実施例では、メモリ・コントローラ1116は、メモリ・デバイスと処理システム1100の他の構成要素との間の通信を容易にし、プラットフォーム・コントローラ・ハブ(「PCH」:platform controller hub)1130は、ローカル入力/出力(「I/O」:Input/Output)バスを介してI/Oデバイスへの接続を提供する。
少なくとも1つの実施例では、メモリ・デバイス1120は、ダイナミック・ランダム・アクセス・メモリ(「DRAM」:dynamic random access memory)デバイス、スタティック・ランダム・アクセス・メモリ(「SRAM」:static random access memory)デバイス、フラッシュ・メモリ・デバイス、相変化メモリ・デバイス、又はプロセッサ・メモリとして働くのに好適な性能を有する何らかの他のメモリ・デバイスであり得る。少なくとも1つの実施例では、メモリ・デバイス1120は、1つ又は複数のプロセッサ1102がアプリケーション又はプロセスを実行するときの使用のためのデータ1122及び命令1121を記憶するために、処理システム1100のためのシステム・メモリとして動作することができる。少なくとも1つの実施例では、メモリ・コントローラ1116はまた、随意の外部グラフィックス・プロセッサ1112と結合し、外部グラフィックス・プロセッサ1112は、グラフィックス動作及びメディア動作を実施するために、プロセッサ1102中の1つ又は複数のグラフィックス・プロセッサ1108と通信し得る。少なくとも1つの実施例では、ディスプレイ・デバイス1111は、(1つ又は複数の)プロセッサ1102に接続することができる。少なくとも1つの実施例では、ディスプレイ・デバイス1111は、モバイル電子デバイス又はラップトップ・デバイスの場合のような内部ディスプレイ・デバイス、或いは、ディスプレイ・インターフェース(たとえば、DisplayPortなど)を介して取り付けられた外部ディスプレイ・デバイスのうちの1つ又は複数を含むことができる。少なくとも1つの実施例では、ディスプレイ・デバイス1111は、仮想現実(「VR」:virtual reality)アプリケーション又は拡張現実(「AR」:augmented reality)アプリケーションにおいて使用するための立体ディスプレイ・デバイスなどの頭部装着型ディスプレイ(「HMD」:head mounted display)を含むことができる。
少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ1130は、周辺機器が高速I/Oバスを介してメモリ・デバイス1120及びプロセッサ1102に接続することを可能にする。少なくとも1つの実施例では、I/O周辺機器は、限定はしないが、オーディオ・コントローラ1146と、ネットワーク・コントローラ1134と、ファームウェア・インターフェース1128と、ワイヤレス・トランシーバ1126と、タッチ・センサ1125と、データ・ストレージ・デバイス1124(たとえば、ハード・ディスク・ドライブ、フラッシュ・メモリなど)とを含む。少なくとも1つの実施例では、データ・ストレージ・デバイス1124は、ストレージ・インターフェース(たとえば、SATA)を介して、或いはPCI又はPCIeなどの周辺バスを介して、接続することができる。少なくとも1つの実施例では、タッチ・センサ1125は、タッチ・スクリーン・センサ、圧力センサ、又は指紋センサを含むことができる。少なくとも1つの実施例では、ワイヤレス・トランシーバ1126は、Wi-Fiトランシーバ、Bluetoothトランシーバ、或いは3G、4G、又はロング・ターム・エボリューション(「LTE」:Long Term Evolution)トランシーバなどのモバイル・ネットワーク・トランシーバであり得る。少なくとも1つの実施例では、ファームウェア・インターフェース1128は、システム・ファームウェアとの通信を可能にし、たとえば、ユニファイド・エクステンシブル・ファームウェア・インターフェース(「UEFI」:unified extensible firmware interface)であり得る。少なくとも1つの実施例では、ネットワーク・コントローラ1134は、ワイヤード・ネットワークへのネットワーク接続を可能にすることができる。少なくとも1つの実施例では、高性能ネットワーク・コントローラ(図示せず)は、インターフェース・バス1110と結合する。少なくとも1つの実施例では、オーディオ・コントローラ1146は、マルチチャネル高精細度オーディオ・コントローラである。少なくとも1つの実施例では、処理システム1100は、レガシー(たとえば、パーソナル・システム2(「PS/2」:Personal System 2))デバイスを処理システム1100に結合するための随意のレガシーI/Oコントローラ1140を含む。少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ1130は、キーボードとマウス1143との組合せ、カメラ1144、又は他のUSB入力デバイスなど、1つ又は複数のユニバーサル・シリアル・バス(「USB」:Universal Serial Bus)コントローラ1142接続入力デバイスにも接続することができる。
少なくとも1つの実施例では、メモリ・コントローラ1116及びプラットフォーム・コントローラ・ハブ1130のインスタンスが、外部グラフィックス・プロセッサ1112などの慎重な外部グラフィックス・プロセッサに組み込まれ得る。少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ1130及び/又はメモリ・コントローラ1116は、1つ又は複数のプロセッサ1102の外部にあり得る。たとえば、少なくとも1つの実施例では、処理システム1100は、外部のメモリ・コントローラ1116とプラットフォーム・コントローラ・ハブ1130とを含むことができ、それらは、(1つ又は複数の)プロセッサ1102と通信しているシステム・チップセット内のメモリ・コントローラ・ハブ及び周辺コントローラ・ハブとして構成され得る。
図12は、少なくとも1つの実施例による、コンピュータ・システム1200を示す。少なくとも1つの実施例では、コンピュータ・システム1200は、相互接続されたデバイス及び構成要素をもつシステム、SOC、又は何らかの組合せであり得る。少なくとも1つの実施例では、コンピュータ・システム1200は、命令を実行するための実行ユニットを含み得るプロセッサ1202とともに形成される。少なくとも1つの実施例では、コンピュータ・システム1200は、限定はしないが、データを処理するためのアルゴリズムを実施するための論理を含む実行ユニットを採用するための、プロセッサ1202などの構成要素を含み得る。少なくとも1つの実施例では、コンピュータ・システム1200は、カリフォルニア州サンタクララのIntel Corporationから入手可能なPENTIUM(登録商標)プロセッサ・ファミリー、Xeon(商標)、Itanium(登録商標)、XScale(商標)及び/又はStrongARM(商標)、Intel(登録商標)Core(商標)、又はIntel(登録商標)Nervana(商標)マイクロプロセッサなどのプロセッサを含み得るが、(他のマイクロプロセッサ、エンジニアリング・ワークステーション、セット・トップ・ボックスなどを有するPCを含む)他のシステムも使用され得る。少なくとも1つの実施例では、コンピュータ・システム1200は、ワシントン州レドモンドのMicrosoft Corporationから入手可能なWINDOWS(登録商標)オペレーティング・システムのあるバージョンを実行し得るが、他のオペレーティング・システム(たとえば、UNIX(登録商標)及びLinux(登録商標))、組み込みソフトウェア、及び/又はグラフィカル・ユーザ・インターフェースも使用され得る。
少なくとも1つの実施例では、コンピュータ・システム1200は、ハンドヘルド・デバイス及び組み込みアプリケーションなど、他のデバイスにおいて使用され得る。ハンドヘルド・デバイスのいくつかの実例は、セルラー・フォン、インターネット・プロトコル・デバイス、デジタル・カメラ、パーソナル・デジタル・アシスタント(「PDA」:personal digital assistant)、及びハンドヘルドPCを含む。少なくとも1つの実施例では、組み込みアプリケーションは、マイクロコントローラ、デジタル信号プロセッサ(DSP)、SoC、ネットワーク・コンピュータ(「NetPC」:network computer)、セット・トップ・ボックス、ネットワーク・ハブ、ワイド・エリア・ネットワーク(「WAN」:wide area network)スイッチ、又は1つ又は複数の命令を実施し得る任意の他のシステムを含み得る。
少なくとも1つの実施例では、コンピュータ・システム1200は、限定はしないが、プロセッサ1202を含み得、プロセッサ802は、限定はしないが、コンピュート・ユニファイド・デバイス・アーキテクチャ(「CUDA」)(CUDA(登録商標)は、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される)プログラムを実行するように構成され得る、1つ又は複数の実行ユニット1208を含み得る。少なくとも1つの実施例では、CUDAプログラムは、CUDAプログラミング言語で書かれたソフトウェア・アプリケーションの少なくとも一部分である。少なくとも1つの実施例では、コンピュータ・システム1200は、シングル・プロセッサ・デスクトップ又はサーバ・システムである。少なくとも1つの実施例では、コンピュータ・システム1200は、マルチプロセッサ・システムであり得る。少なくとも1つの実施例では、プロセッサ1202は、限定はしないが、CISCマイクロプロセッサ、RISCマイクロプロセッサ、VLIWマイクロプロセッサ、命令セットの組合せを実装するプロセッサ、又は、たとえばデジタル信号プロセッサなど、任意の他のプロセッサ・デバイスを含み得る。少なくとも1つの実施例では、プロセッサ1202は、プロセッサ・バス1210に結合され得、プロセッサ・バス1210は、プロセッサ1202とコンピュータ・システム1200中の他の構成要素との間でデータ信号を送信し得る。
少なくとも1つの実施例では、プロセッサ1202は、限定はしないが、レベル1(「L1」)の内部キャッシュ・メモリ(「キャッシュ」)1204を含み得る。少なくとも1つの実施例では、プロセッサ1202は、単一の内部キャッシュ又は複数のレベルの内部キャッシュを有し得る。少なくとも1つの実施例では、キャッシュ・メモリは、プロセッサ1202の外部に存在し得る。少なくとも1つの実施例では、プロセッサ1202は、内部キャッシュと外部キャッシュの両方の組合せをも含み得る。少なくとも1つの実施例では、レジスタ・ファイル1206は、限定はしないが、整数レジスタ、浮動小数点レジスタ、ステータス・レジスタ、及び命令ポインタ・レジスタを含む様々なレジスタに、異なるタイプのデータを記憶し得る。
少なくとも1つの実施例では、限定はしないが、整数演算及び浮動小数点演算を実施するための論理を含む実行ユニット1208も、プロセッサ1202中に存在し得る。プロセッサ1202は、いくつかのマクロ命令のためのマイクロコードを記憶するマイクロコード(「uコード」)読取り専用メモリ(「ROM」:read only memory)をも含み得る。少なくとも1つの実施例では、実行ユニット1208は、パック命令セット1209に対処するための論理を含み得る。少なくとも1つの実施例では、パック命令セット1209を、命令を実行するための関連する回路要素とともに汎用プロセッサ1202の命令セットに含めることによって、多くのマルチメディア・アプリケーションによって使用される演算が、汎用プロセッサ1202中のパック・データを使用して実施され得る。少なくとも1つの実施例では、多くのマルチメディア・アプリケーションが、パック・データの演算を実施するためにプロセッサのデータ・バスの全幅を使用することによって加速され、より効率的に実行され得、これは、一度に1つのデータ要素ずつ1つ又は複数の演算を実施するために、プロセッサのデータ・バスにわたってより小さい単位のデータを転送する必要をなくし得る。
少なくとも1つの実施例では、実行ユニット1208はまた、マイクロコントローラ、組み込みプロセッサ、グラフィックス・デバイス、DSP、及び他のタイプの論理回路において使用され得る。少なくとも1つの実施例では、コンピュータ・システム1200は、限定はしないが、メモリ1220を含み得る。少なくとも1つの実施例では、メモリ1220は、DRAMデバイス、SRAMデバイス、フラッシュ・メモリ・デバイス、又は他のメモリ・デバイスとして実装され得る。メモリ1220は、プロセッサ1202によって実行され得るデータ信号によって表される(1つ又は複数の)命令1219及び/又はデータ1221を記憶し得る。
少なくとも1つの実施例では、システム論理チップが、プロセッサ・バス1210及びメモリ1220に結合され得る。少なくとも1つの実施例では、システム論理チップは、限定はしないが、メモリ・コントローラ・ハブ(「MCH」:memory controller hub)1216を含み得、プロセッサ1202は、プロセッサ・バス1210を介してMCH1216と通信し得る。少なくとも1つの実施例では、MCH1216は、命令及びデータ・ストレージのための、並びにグラフィックス・コマンド、データ及びテクスチャのストレージのための、高帯域幅メモリ経路1218をメモリ1220に提供し得る。少なくとも1つの実施例では、MCH1216は、プロセッサ1202と、メモリ1220と、コンピュータ・システム1200中の他の構成要素との間でデータ信号をダイレクトし、プロセッサ・バス1210と、メモリ1220と、システムI/O1222との間でデータ信号をブリッジし得る。少なくとも1つの実施例では、システム論理チップは、グラフィックス・コントローラに結合するためのグラフィックス・ポートを提供し得る。少なくとも1つの実施例では、MCH1216は、高帯域幅メモリ経路1218を通してメモリ1220に結合され得、グラフィックス/ビデオ・カード1212は、アクセラレーテッド・グラフィックス・ポート(「AGP」:Accelerated Graphics Port)相互接続1214を介してMCH1216に結合され得る。
少なくとも1つの実施例では、コンピュータ・システム1200は、MCH1216をI/Oコントローラ・ハブ(「ICH」:I/O controller hub)1230に結合するためのプロプライエタリ・ハブ・インターフェース・バスである、システムI/O1222を使用し得る。少なくとも1つの実施例では、ICH1230は、ローカルI/Oバスを介していくつかのI/Oデバイスに直接接続を提供し得る。少なくとも1つの実施例では、ローカルI/Oバスは、限定はしないが、周辺機器をメモリ1220、チップセット、及びプロセッサ1202に接続するための高速I/Oバスを含み得る。実例は、限定はしないが、オーディオ・コントローラ1229と、ファームウェア・ハブ(「フラッシュBIOS」)1228と、ワイヤレス・トランシーバ1226と、データ・ストレージ1224と、ユーザ入力インターフェース1225及びキーボード・インターフェースを含んでいるレガシーI/Oコントローラ1223と、USBなどのシリアル拡張ポート1227と、ネットワーク・コントローラ1234とを含み得る。データ・ストレージ1224は、ハード・ディスク・ドライブ、フロッピー・ディスク・ドライブ、CD-ROMデバイス、フラッシュ・メモリ・デバイス、又は他の大容量ストレージ・デバイスを備え得る。
少なくとも1つの実施例では、図12は、相互接続されたハードウェア・デバイス又は「チップ」を含むシステムを示す。少なくとも1つの実施例では、図12は、例示的なSoCを示し得る。少なくとも1つの実施例では、図12に示されているデバイスは、プロプライエタリ相互接続、標準相互接続(たとえば、PCIe)、又はそれらの何らかの組合せで相互接続され得る。少なくとも1つの実施例では、システム1200の1つ又は複数の構成要素は、コンピュート・エクスプレス・リンク(「CXL」:compute express link)相互接続を使用して相互接続される。
図13は、少なくとも1つの実施例による、システム1300を示す。少なくとも1つの実施例では、システム1300は、プロセッサ1310を利用する電子デバイスである。少なくとも1つの実施例では、システム1300は、たとえば、限定はしないが、ノートブック、タワー・サーバ、ラック・サーバ、ブレード・サーバ、1つ又は複数の構内サービス・プロバイダ又はクラウド・サービス・プロバイダに通信可能に結合されたエッジ・デバイス、ラップトップ、デスクトップ、タブレット、モバイル・デバイス、電話、組み込みコンピュータ、或いは任意の他の好適な電子デバイスであり得る。
少なくとも1つの実施例では、システム1300は、限定はしないが、任意の好適な数又は種類の構成要素、周辺機器、モジュール、又はデバイスに通信可能に結合されたプロセッサ1310を含み得る。少なくとも1つの実施例では、プロセッサ1310は、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つの実施例では、図13は、相互接続されたハードウェア・デバイス又は「チップ」を含むシステムを示す。少なくとも1つの実施例では、図13は、例示的なSoCを示し得る。少なくとも1つの実施例では、図13に示されているデバイスは、プロプライエタリ相互接続、標準相互接続(たとえば、PCIe)又はそれらの何らかの組合せで相互接続され得る。少なくとも1つの実施例では、図13の1つ又は複数の構成要素は、CXL相互接続を使用して相互接続される。
少なくとも1つの実施例では、図13は、ディスプレイ1324、タッチ・スクリーン1325、タッチ・パッド1330、ニア・フィールド通信ユニット(「NFC」:Near Field Communication)1345、センサ・ハブ1340、熱センサ1346、エクスプレス・チップセット(「EC」:Express Chipset)1335、トラステッド・プラットフォーム・モジュール(「TPM」:Trusted Platform Module)1338、BIOS/ファームウェア/フラッシュ・メモリ(「BIOS、FWフラッシュ」:BIOS/firmware/flash memory)1322、DSP1360、ソリッド・ステート・ディスク(「SSD」:Solid State Disk)又はハード・ディスク・ドライブ(「HDD」:Hard Disk Drive)1320、ワイヤレス・ローカル・エリア・ネットワーク・ユニット(「WLAN」:wireless local area network)1350、Bluetoothユニット1352、ワイヤレス・ワイド・エリア・ネットワーク・ユニット(「WWAN」:Wireless Wide Area Network)1356、全地球測位システム(「GPS」:Global Positioning System)1355、USB3.0カメラなどのカメラ(「USB3.0カメラ」)1354、或いは、たとえばLPDDR3規格において実装された低電力ダブル・データ・レート(「LPDDR」:Low Power Double Data Rate)メモリ・ユニット(「LPDDR3」)1315を含み得る。これらの構成要素は、各々、任意の好適な様式で実装され得る。
少なくとも1つの実施例では、上記で説明された構成要素を通して、他の構成要素がプロセッサ1310に通信可能に結合され得る。少なくとも1つの実施例では、加速度計1341と、周囲光センサ(「ALS」:Ambient Light Sensor)1342と、コンパス1343と、ジャイロスコープ1344とが、センサ・ハブ1340に通信可能に結合され得る。少なくとも1つの実施例では、熱センサ1339と、ファン1337と、キーボード1336と、タッチ・パッド1330とが、EC1335に通信可能に結合され得る。少なくとも1つの実施例では、スピーカー1363と、ヘッドフォン1364と、マイクロフォン(「mic」)1365とが、オーディオ・ユニット(「オーディオ・コーデック及びクラスdアンプ」)1362に通信可能に結合され得、オーディオ・ユニット1362は、DSP1360に通信可能に結合され得る。少なくとも1つの実施例では、オーディオ・ユニット1362は、たとえば、限定はしないが、オーディオ・コーダ/デコーダ(「コーデック」)及びクラスD増幅器を含み得る。少なくとも1つの実施例では、SIMカード(「SIM」)1357は、WWANユニット1356に通信可能に結合され得る。少なくとも1つの実施例では、WLANユニット1350及びBluetoothユニット1352などの構成要素、並びにWWANユニット1356は、次世代フォーム・ファクタ(「NGFF」:Next Generation Form Factor)において実装され得る。
図14は、少なくとも1つの実施例による、例示的な集積回路1400を示す。少なくとも1つの実施例では、例示的な集積回路1400は、1つ又は複数のIPコアを使用して作製され得るSoCである。少なくとも1つの実施例では、集積回路1400は、1つ又は複数のアプリケーション・プロセッサ1405(たとえば、CPU、DPU)、少なくとも1つのグラフィックス・プロセッサ1410を含み、追加として、画像プロセッサ1415及び/又はビデオ・プロセッサ1420を含み得、それらのいずれも、モジュール式IPコアであり得る。少なくとも1つの実施例では、集積回路1400は、USBコントローラ1425、UARTコントローラ1430、SPI/SDIOコントローラ1435、及びIS/ICコントローラ1440を含む周辺機器又はバス論理を含む。少なくとも1つの実施例では、集積回路1400は、高精細度マルチメディア・インターフェース(「HDMI(登録商標)」:high-definition multimedia interface)コントローラ1450及びモバイル・インダストリ・プロセッサ・インターフェース(「MIPI」:mobile industry processor interface)ディスプレイ・インターフェース1455のうちの1つ又は複数に結合されたディスプレイ・デバイス1445を含むことができる。少なくとも1つの実施例では、フラッシュ・メモリとフラッシュ・メモリ・コントローラとを含むフラッシュ・メモリ・サブシステム1460によって、ストレージが提供され得る。少なくとも1つの実施例では、SDRAM又はSRAMメモリ・デバイスへのアクセスのために、メモリ・コントローラ1465を介してメモリ・インターフェースが提供され得る。少なくとも1つの実施例では、いくつかの集積回路は、追加として、組み込みセキュリティ・エンジン1470を含む。
図15は、少なくとも1つの実施例による、コンピューティング・システム1500を示す。少なくとも1つの実施例では、コンピューティング・システム1500は、メモリ・ハブ1505を含み得る相互接続経路を介して通信する1つ又は複数のプロセッサ1502とシステム・メモリ1504とを有する処理サブシステム1501を含む。少なくとも1つの実施例では、メモリ・ハブ1505は、チップセット構成要素内の別個の構成要素であり得るか、又は1つ又は複数のプロセッサ1502内に組み込まれ得る。少なくとも1つの実施例では、メモリ・ハブ1505は、通信リンク1506を介してI/Oサブシステム1511と結合する。少なくとも1つの実施例では、I/Oサブシステム1511は、コンピューティング・システム1500が1つ又は複数の入力デバイス1508からの入力を受信することを可能にすることができるI/Oハブ1507を含む。少なくとも1つの実施例では、I/Oハブ1507は、1つ又は複数のプロセッサ1502中に含まれ得るディスプレイ・コントローラが、1つ又は複数のディスプレイ・デバイス1510Aに出力を提供することを可能にすることができる。少なくとも1つの実施例では、I/Oハブ1507と結合された1つ又は複数のディスプレイ・デバイス1510Aは、ローカルの、内部の、又は組み込まれたディスプレイ・デバイスを含むことができる。
少なくとも1つの実施例では、処理サブシステム1501は、バス又は他の通信リンク1513を介してメモリ・ハブ1505に結合された1つ又は複数の並列プロセッサ1512を含む。少なくとも1つの実施例では、通信リンク1513は、限定はしないがPCIeなど、任意の数の規格ベースの通信リンク技術又はプロトコルのうちの1つであり得るか、或いはベンダー固有の通信インターフェース又は通信ファブリックであり得る。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1512は、メニー・インテグレーテッド・コア・プロセッサなど、多数の処理コア及び/又は処理クラスタを含むことができる、算出に集中した並列又はベクトル処理システムを形成する。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1512は、グラフィックス処理サブシステムを形成し、グラフィックス処理サブシステムは、I/Oハブ1507を介して結合された1つ又は複数のディスプレイ・デバイス1510Aのうちの1つにピクセルを出力することができる。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1512はまた、ディスプレイ・コントローラと、1つ又は複数のディスプレイ・デバイス1510Bへの直接接続を可能にするためのディスプレイ・インターフェース(図示せず)とを含むことができる。
少なくとも1つの実施例では、システム・ストレージ・ユニット1514は、I/Oハブ1507に接続して、コンピューティング・システム1500のためのストレージ機構を提供することができる。少なくとも1つの実施例では、I/Oハブ1507と、プラットフォームに組み込まれ得るネットワーク・アダプタ1518及び/又はワイヤレス・ネットワーク・アダプタ1519などの他の構成要素、並びに1つ又は複数のアドイン・デバイス1520を介して追加され得る様々な他のデバイスとの間の接続を可能にするためのインターフェース機構を提供するために、I/Oスイッチ1516が使用され得る。少なくとも1つの実施例では、ネットワーク・アダプタ1518は、イーサネット・アダプタ又は別のワイヤード・ネットワーク・アダプタであり得る。少なくとも1つの実施例では、ワイヤレス・ネットワーク・アダプタ1519は、Wi-Fi、Bluetooth、NFC、又は1つ又は複数のワイヤレス無線を含む他のネットワーク・デバイスのうちの1つ又は複数を含むことができる。
少なくとも1つの実施例では、コンピューティング・システム1500は、USB又は他のポート接続、光学ストレージ・ドライブ、ビデオ・キャプチャ・デバイスなどを含む、I/Oハブ1507にも接続され得る、明示的に示されていない他の構成要素を含むことができる。少なくとも1つの実施例では、図15中の様々な構成要素を相互接続する通信経路が、PCIベースのプロトコル(たとえば、PCIe)などの任意の好適なプロトコル、或いはNVLink高速相互接続などの他のバス又はポイントツーポイント通信インターフェース及び/又は(1つ又は複数の)プロトコル、或いは相互接続プロトコルを使用して、実装され得る。
少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1512は、たとえばビデオ出力回路要素を含むグラフィックス及びビデオ処理のために最適化された回路要素を組み込み、グラフィックス処理ユニット(「GPU」)を構成する。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1512は、汎用処理のために最適化された回路要素を組み込む。少なくとも実施例では、コンピューティング・システム1500の構成要素は、単一の集積回路上の1つ又は複数の他のシステム要素と統合され得る。たとえば、少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1512、メモリ・ハブ1505、(1つ又は複数の)プロセッサ1502、及びI/Oハブ1507は、SoC集積回路に組み込まれ得る。少なくとも1つの実施例では、コンピューティング・システム1500の構成要素は、システム・イン・パッケージ(「SIP」:system in package)構成を形成するために、単一のパッケージに組み込まれ得る。少なくとも1つの実施例では、コンピューティング・システム1500の構成要素の少なくとも一部分は、マルチチップ・モジュール(「MCM」:multi-chip module)に組み込まれ得、マルチチップ・モジュールは、他のマルチチップ・モジュールと相互接続されてモジュール式コンピューティング・システムにすることができる。少なくとも1つの実施例では、I/Oサブシステム1511及びディスプレイ・デバイス1510Bは、コンピューティング・システム1500から省略される。
処理システム
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的な処理システムを記載する。
少なくとも1つの実施例では、ストリーミング・マルチプロセッサ(「SM」:Streaming Multiprocessor)ではなく、ストリーム処理ユニット(「SPU」:Stream Processing Unit)が使用され得る。少なくとも1つの実施例では、単一のSPUが、複数のSPと、ブランチ制御ユニットと、ストレージ・レジスタとを含んでいる。少なくとも1つの実施例では、SPUは、各SPU上でスレッドをスケジューリングするためのスレッド・シーケンサ(又はスケジューラ)を含んでいる、SIMDコアにグループ化される。少なくとも1つの実施例では、各SIMDコアは、SPU間のそれ自体の共有メモリ、並びにテクスチャ・ユニット及びキャッシュのような他の構成要素を含んでいる。少なくとも1つの実施例では、各GPUは、複数のSIMDコア、並びに(ランダム・アクセス・メモリ(「RAM」:random access memory)などの)グローバル・データ・ストレージ及びキャッシュの形態を含んでいる。
少なくとも1つの実施例では、GCN、及び後でRDNAにおいて、SPUは、もはや必要とされない。少なくとも1つの実施例では、SPは、SIMDコアに組み合わせられる。少なくとも1つの実施例では、GCNの場合、SIMDコアは、16個のSPと、共有メモリのためのレジスタとを有する。少なくとも1つの実施例では、RDNAの場合、各SIMDコアは、32個のSPと、より多くの共有メモリとを有する。少なくとも1つの実施例では、複数のSIMDコアは、1つのコンピュート・ユニット(CU)に組み合わせられる。少なくとも1つの実施例では、GCNの場合、単一のCUが、データ及び命令キャッシュ、ブランチ・ユニット、並びに「スカラーALU」とともに、4つのSIMDコアを有する。少なくとも1つの実施例では、スカラーALUは、log、sin/cosなどのような1回限りの数学演算を行うための特殊ALUである。
少なくとも1つの実施例では、RDNAの場合、単一のCUは、各SIMDコアについてのスケジューラ、レジスタ、及びスカラーALUをもつ2つのSIMDコアを有する。少なくとも1つの実施例では、これらのCUは、GCNの場合と同数のSPを有するが、それらはより大きいグループにグループ化される。少なくとも1つの実施例では、これは、以下で説明されるようにスレッドグループ化するときに目的を果たす。少なくとも1つの実施例では、RDNAはまた、2つのCUを、データ及び命令キャッシュがCUにわたって共有されるワーク・グループ・プロセッサ(WGP)にペアリングする。少なくとも1つの実施例では、GPU中のCU/WGPの数は、モデルにわたって変動する。
少なくとも1つの実施例では、ワープの代わりに、ウェーブフロントが使用され得る。少なくとも1つの実施例では、GCNは、ウェーブフロントごとに64個のスレッドを有するが、RDNAは、これをウェーブフロントごとに半分の32個のスレッドにカットする。少なくとも1つの実施例では、これは、簡略化されたスケジューリング及びより速い実行を可能にし、それにより、ウェーブフロント全体が各SIMDコアによって実行され得る。少なくとも1つの実施例では、各CUは4つのウェーブフロント(GCN)を処理することができ、ここで、各SIMDコアは、別個のウェーブフロントに対して機能する。少なくとも1つの実施例では、ハードウェア・スケジューラは、各CU中の各SIMDコアについての独立したスレッド・グループをディスパッチすることに対処する。少なくとも1つの実施例では、各SIMDコアは、それ自体の内部スケジューラを有する。少なくとも1つの実施例では、CUにわたってワークロードをスケジューリングするために、非同期コンピュート・エンジン(ACE:Asynchronous Compute Engine)が使用され得る。少なくとも1つの実施例では、ACEは、リソース割振り、コンテキスト切替えなどに対処し、CUにわたってウェーブフロントをスケジューリングする。
少なくとも1つの実施例では、「実行ユニット」又はEUが、SPの代わりに使用され得る。少なくとも1つの実施例では、EUは、4ワイドSIMD回路の2つのセットをもつ単一のスレッド・ユニットである。少なくとも1つの実施例では、SIMD回路の1つのセットはFPUと整数ALUとを有し、SIMD回路の1つのセットは、FPUと、「拡張数学」(EM:extended math)ユニットと呼ばれることがある、特殊機能ユニット(SFU:special function unit)とを有する。少なくとも1つの実施例では、各EUは、スレッド状態及びデータを追跡するための、スレッド制御ユニットと、レジスタ/メモリとを有する。少なくとも1つの実施例では、これは、「ストリーミング・マルチプロセッサ」中の「コア」又は「ストリーミング・プロセッサ」の代わりに使用され得る。
少なくとも1つの実施例では、EUは、「サブ・スライス」又は「サブスライス」にグループ化され、これは、スレッド・ディスパッチ・ユニット、命令キャッシュ、データ・キャッシュ、テクスチャ・キャッシュ、ロード/ストア・ユニット、及び「サンプラ」と呼ばれることがあるものをもつ16個のEUの集合である。少なくとも1つの実施例では、「サブスライス」は、SM又はSIMDコアの代わりに使用される。少なくとも1つの実施例では、サブスライスは、Xe「スライス」又は「Xslice」にグループ化される。少なくとも1つの実施例では、スライス又はXsliceは、CUの代わりに使用可能である。
少なくとも1つの実施例では、ワープは、ウェーブ、ウェーブフロント、又はスレッドのグループと置き換えられ得る。少なくとも1つの実施例では、「ウェーブ」、「ウェーブフロント」、又は「スレッド」は、少なくとも8つのスレッドからなる。
少なくとも1つの実施例では、上記で説明された技法は、コンピュータ・システム1200又は例示的な集積回路1400など、以下で説明されるようなコンピュータ・システム上で実装され得る。少なくとも1つの実施例では、コンピュータ・システムにおいて稼働されるアプリケーションが、複数のプロセッサ上で並列に稼働される従属スレッドに分割され得る。少なくとも1つの実施例では、プロセッサは、APU1600、CPU1700、グラフィックス・コア2000、グラフィックス・プロセッサ1910、GPGPU2030、並列プロセッサ2100、グラフィックス・マルチプロセッサ2134、グラフィックス・プロセッサ2200、プロセッサ2300、プロセッサ2400、グラフィックス・プロセッサ・コア2500、PPU2600、GPC2700、SM2800、又はアクセラレータ統合スライス1890を含む、以下で説明される任意のプロセッサ・タイプを含み得る。少なくとも1つの実施例では、1つ又は複数の回路は、2つ又はそれ以上の従属スレッドが、2つ又はそれ以上の別個のマルチスレッド・プロセッサ・コアを使用して並列に実施されることを引き起こす。少なくとも1つの実施例では、プロセッサ・コアは、マルチコアCPU中のコア、GPU中のSMPコア、又は記憶可能な命令を実行することが可能な他の回路であり得る。少なくとも1つの実施例では、スレッドの第1のグループが、2つ又はそれ以上のプロセッサ・コアを使用して並列に実施されるべきスレッドの2つ又はそれ以上のサブグループに編成されることを引き起こすための1つ又は複数の回路。少なくとも1つの実施例では、スレッドのグループは、並列に稼働する連動グループであり得る。少なくとも1つの実施例では、連動グループは、GPU上でワープ中に配置された複数のカーネル・スレッドを含む。少なくとも1つの実施例では、スレッド間の同期動作は、バリアの使用によって可能にされ得る。少なくとも1つの実施例では、1つ又は複数の回路は、メモリ・バリア演算を実施して、スレッドの複数のグループによるメモリへのアクセスが、メモリ・バリア演算によって指示される順序で発生することを引き起こす。少なくとも1つの実施例では、バリア演算は、ビット単位論理演算(たとえば、AND、OR、XOR)などのアトミック演算、或いはアトミック加算又は減算などの数学演算であり得る。
図16は、少なくとも1つの実施例による、加速処理ユニット(「APU」:accelerated processing unit)1600を示す。少なくとも1つの実施例では、APU1600は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、APU1600は、CUDAプログラムなど、アプリケーション・プログラムを実行するように構成され得る。少なくとも1つの実施例では、APU1600は、限定はしないが、コア複合体1610と、グラフィックス複合体1640と、ファブリック1660と、I/Oインターフェース1670と、メモリ・コントローラ1680と、ディスプレイ・コントローラ1692と、マルチメディア・エンジン1694とを含む。少なくとも1つの実施例では、APU1600は、限定はしないが、任意の数のコア複合体1610と、任意の数のグラフィックス複合体1650と、任意の数のディスプレイ・コントローラ1692と、任意の数のマルチメディア・エンジン1694とを、任意の組合せで含み得る。説明目的のために、同様のオブジェクトの複数のインスタンスは、オブジェクトを識別する参照番号と、必要な場合にインスタンスを識別する括弧付きの番号とともに、本明細書で示される。
少なくとも1つの実施例では、コア複合体1610はCPUであり、グラフィックス複合体1640はGPUであり、APU1600は、限定はしないが、単一のチップ上に1610及び1640を組み込む処理ユニットである。少なくとも1つの実施例では、いくつかのタスクは、コア複合体1610に割り当てられ得、他のタスクは、グラフィックス複合体1640に割り当てられ得る。少なくとも1つの実施例では、コア複合体1610は、オペレーティング・システムなど、APU1600に関連するメイン制御ソフトウェアを実行するように構成される。少なくとも1つの実施例では、コア複合体1610は、APU1600のマスタ・プロセッサであり、他のプロセッサの動作を制御し、協調させる。少なくとも1つの実施例では、コア複合体1610は、グラフィックス複合体1640の動作を制御するコマンドを発行する。少なくとも1つの実施例では、コア複合体1610は、CUDAソース・コードから導出されたホスト実行可能コードを実行するように構成され得、グラフィックス複合体1640は、CUDAソース・コードから導出されたデバイス実行可能コードを実行するように構成され得る。
少なくとも1つの実施例では、コア複合体1610は、限定はしないが、コア1620(1)~1620(4)と、L3キャッシュ1630とを含む。少なくとも1つの実施例では、コア複合体1610は、限定はしないが、任意の数のコア1620と、任意の数及びタイプのキャッシュとを、任意の組合せで含み得る。少なくとも1つの実施例では、コア1620は、特定の命令セット・アーキテクチャ(「ISA」:instruction set architecture)の命令を実行するように構成される。少なくとも1つの実施例では、各コア1620はCPUコアである。
少なくとも1つの実施例では、各コア1620は、限定はしないが、フェッチ/復号ユニット1622と、整数実行エンジン1624と、浮動小数点実行エンジン1626と、L2キャッシュ1628とを含む。少なくとも1つの実施例では、フェッチ/復号ユニット1622は、命令をフェッチし、そのような命令を復号し、マイクロ・オペレーションを生成し、整数実行エンジン1624と浮動小数点実行エンジン1626とに別個のマイクロ命令をディスパッチする。少なくとも1つの実施例では、フェッチ/復号ユニット1622は、同時に、あるマイクロ命令を整数実行エンジン1624にディスパッチし、別のマイクロ命令を浮動小数点実行エンジン1626にディスパッチすることができる。少なくとも1つの実施例では、整数実行エンジン1624は、限定はしないが、整数及びメモリ演算を実行する。少なくとも1つの実施例では、浮動小数点エンジン1626は、限定はしないが、浮動小数点及びベクトル演算を実行する。少なくとも1つの実施例では、フェッチ復号ユニット1622は、整数実行エンジン1624と浮動小数点実行エンジン1626の両方を置き換える単一の実行エンジンに、マイクロ命令をディスパッチする。
少なくとも1つの実施例では、iがコア1620の特定のインスタンスを表す整数である、各コア1620(i)は、コア1620(i)中に含まれるL2キャッシュ1628(i)にアクセスし得る。少なくとも1つの実施例では、jがコア複合体1610の特定のインスタンスを表す整数である、コア複合体1610(j)中に含まれる各コア1620は、コア複合体1610(j)中に含まれるL3キャッシュ1630(j)を介して、コア複合体1610(j)中に含まれる他のコア1620に接続される。少なくとも1つの実施例では、jがコア複合体1610の特定のインスタンスを表す整数である、コア複合体1610(j)中に含まれるコア1620は、コア複合体1610(j)中に含まれるL3キャッシュ1630(j)のすべてにアクセスすることができる。少なくとも1つの実施例では、L3キャッシュ1630は、限定はしないが、任意の数のスライスを含み得る。
少なくとも1つの実施例では、グラフィックス複合体1640は、高度並列様式でコンピュート動作を実施するように構成され得る。少なくとも1つの実施例では、グラフィックス複合体1640は、描画コマンド、ピクセル動作、幾何学的算出、及びディスプレイに画像をレンダリングすることに関連する他の動作など、グラフィックス・パイプライン動作を実行するように構成される。少なくとも1つの実施例では、グラフィックス複合体1640は、グラフィックに関係しない動作を実行するように構成される。少なくとも1つの実施例では、グラフィックス複合体1640は、グラフィックに関係する動作とグラフィックに関係しない動作の両方を実行するように構成される。
少なくとも1つの実施例では、グラフィックス複合体1640は、限定はしないが、任意の数のコンピュート・ユニット1650と、L2キャッシュ1642とを含む。少なくとも1つの実施例では、コンピュート・ユニット1650は、L2キャッシュ1642を共有する。少なくとも1つの実施例では、L2キャッシュ1642は区分けされる。少なくとも1つの実施例では、グラフィックス複合体1640は、限定はしないが、任意の数のコンピュート・ユニット1650と、(ゼロを含む)任意の数及びタイプのキャッシュとを含む。少なくとも1つの実施例では、グラフィックス複合体1640は、限定はしないが、任意の量の専用グラフィックス・ハードウェアを含む。
少なくとも1つの実施例では、各コンピュート・ユニット1650は、限定はしないが、任意の数のSIMDユニット1652と、共有メモリ1654とを含む。少なくとも1つの実施例では、各SIMDユニット1652は、SIMDアーキテクチャを実装し、動作を並列に実施するように構成され得る。少なくとも1つの実施例では、各コンピュート・ユニット1650は、任意の数のスレッド・ブロックを実行し得るが、各スレッド・ブロックは、単一のコンピュート・ユニット1650上で実行する。少なくとも1つの実施例では、スレッド・ブロックは、限定はしないが、任意の数の実行のスレッドを含む。少なくとも1つの実施例では、ワークグループは、スレッド・ブロックである。少なくとも1つの実施例では、各SIMDユニット1652は、異なるワープを実行する。少なくとも1つの実施例では、ワープは、スレッドのグループ(たとえば、16個のスレッド)であり、ここで、ワープ中の各スレッドは、単一のスレッド・ブロックに属し、命令の単一のセットに基づいて、データの異なるセットを処理するように構成される。少なくとも1つの実施例では、ワープ中の1つ又は複数のスレッドを無効にするために、プレディケーションが使用され得る。少なくとも1つの実施例では、レーンはスレッドである。少なくとも1つの実施例では、ワーク・アイテムはスレッドである。少なくとも1つの実施例では、ウェーブフロントはワープである。少なくとも1つの実施例では、スレッド・ブロック中の異なるウェーブフロントは、互いに同期し、共有メモリ1654を介して通信し得る。
少なくとも1つの実施例では、ファブリック1660は、コア複合体1610、グラフィックス複合体1640、I/Oインターフェース1670、メモリ・コントローラ1680、ディスプレイ・コントローラ1692、及びマルチメディア・エンジン1694にわたるデータ及び制御送信を容易にするシステム相互接続である。少なくとも1つの実施例では、APU1600は、限定はしないが、ファブリック1660に加えて又はそれの代わりに、任意の量及びタイプのシステム相互接続を含み得、それは、APU1600の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする。少なくとも1つの実施例では、I/Oインターフェース1670は、任意の数及びタイプのI/Oインターフェース(たとえば、PCI、PCI-Extended(「PCI-X」)、PCIe、ギガビット・イーサネット(「GBE」:gigabit Ethernet)、USBなど)を表す。少なくとも1つの実施例では、様々なタイプの周辺デバイスが、I/Oインターフェース1670に結合される。少なくとも1つの実施例では、I/Oインターフェース1670に結合される周辺デバイスは、限定はしないが、キーボード、マウス、プリンタ、スキャナ、ジョイスティック又は他のタイプのゲーム・コントローラ、メディア記録デバイス、外部ストレージ・デバイス、ネットワーク・インターフェース・カードなどを含み得る。
少なくとも1つの実施例では、ディスプレイ・コントローラAMD92は、液晶ディスプレイ(「LCD」:liquid crystal display)デバイスなど、1つ又は複数のディスプレイ・デバイス上に画像を表示する。少なくとも1つの実施例では、マルチメディア・エンジン1694は、限定はしないが、ビデオ・デコーダ、ビデオ・エンコーダ、画像信号プロセッサなど、マルチメディアに関係する任意の量及びタイプの回路要素を含む。少なくとも1つの実施例では、メモリ・コントローラ1680は、APU1600と統一システム・メモリ1690との間のデータ転送を容易にする。少なくとも1つの実施例では、コア複合体1610とグラフィックス複合体1640とは、統一システム・メモリ1690を共有する。
少なくとも1つの実施例では、APU1600は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ1680及びメモリ・デバイス(たとえば、共有メモリ1654)を含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、APU1600は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ1728、L3キャッシュ1630、及びL2キャッシュ1642)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、コア1620、コア複合体1610、SIMDユニット1652、コンピュート・ユニット1650、及びグラフィックス複合体1640)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
図17は、少なくとも1つの実施例による、CPU1700を示す。少なくとも1つの実施例では、CPU1700は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、CPU1700は、アプリケーション・プログラムを実行するように構成され得る。少なくとも1つの実施例では、CPU1700は、オペレーティング・システムなど、メイン制御ソフトウェアを実行するように構成される。少なくとも1つの実施例では、CPU1700は、外部GPU(図示せず)の動作を制御するコマンドを発行する。少なくとも1つの実施例では、CPU1700は、CUDAソース・コードから導出されたホスト実行可能コードを実行するように構成され得、外部GPUは、そのようなCUDAソース・コードから導出されたデバイス実行可能コードを実行するように構成され得る。少なくとも1つの実施例では、CPU1700は、限定はしないが、任意の数のコア複合体1710と、ファブリック1760と、I/Oインターフェース1770と、メモリ・コントローラ1780とを含む。
少なくとも1つの実施例では、コア複合体1710は、限定はしないが、コア1720(1)~1720(4)と、L3キャッシュ1730とを含む。少なくとも1つの実施例では、コア複合体1710は、限定はしないが、任意の数のコア1720と、任意の数及びタイプのキャッシュとを、任意の組合せで含み得る。少なくとも1つの実施例では、コア1720は、特定のISAの命令を実行するように構成される。少なくとも1つの実施例では、各コア1720はCPUコアである。
少なくとも1つの実施例では、各コア1720は、限定はしないが、フェッチ/復号ユニット1722と、整数実行エンジン1724と、浮動小数点実行エンジン1726と、L2キャッシュ1728とを含む。少なくとも1つの実施例では、フェッチ/復号ユニット1722は、命令をフェッチし、そのような命令を復号し、マイクロ・オペレーションを生成し、整数実行エンジン1724と浮動小数点実行エンジン1726とに別個のマイクロ命令をディスパッチする。少なくとも1つの実施例では、フェッチ/復号ユニット1722は、同時に、あるマイクロ命令を整数実行エンジン1724にディスパッチし、別のマイクロ命令を浮動小数点実行エンジン1726にディスパッチすることができる。少なくとも1つの実施例では、整数実行エンジン1724は、限定はしないが、整数及びメモリ演算を実行する。少なくとも1つの実施例では、浮動小数点エンジン1726は、限定はしないが、浮動小数点及びベクトル演算を実行する。少なくとも1つの実施例では、フェッチ復号ユニット1722は、整数実行エンジン1724と浮動小数点実行エンジン1726の両方を置き換える単一の実行エンジンに、マイクロ命令をディスパッチする。
少なくとも1つの実施例では、iがコア1720の特定のインスタンスを表す整数である、各コア1720(i)は、コア1720(i)中に含まれるL2キャッシュ1728(i)にアクセスし得る。少なくとも1つの実施例では、jがコア複合体1710の特定のインスタンスを表す整数である、コア複合体1710(j)中に含まれる各コア1720は、コア複合体1710(j)中に含まれるL3キャッシュ1730(j)を介して、コア複合体1710(j)中の他のコア1720に接続される。少なくとも1つの実施例では、jがコア複合体1710の特定のインスタンスを表す整数である、コア複合体1710(j)中に含まれるコア1720は、コア複合体1710(j)中に含まれるL3キャッシュ1730(j)のすべてにアクセスすることができる。少なくとも1つの実施例では、L3キャッシュ1730は、限定はしないが、任意の数のスライスを含み得る。
少なくとも1つの実施例では、ファブリック1760は、コア複合体1710(1)~1710(N)(ここで、Nは0よりも大きい整数である)、I/Oインターフェース1770、及びメモリ・コントローラ1780にわたるデータ及び制御送信を容易にするシステム相互接続である。少なくとも1つの実施例では、CPU1700は、限定はしないが、ファブリック1760に加えて又はそれの代わりに、任意の量及びタイプのシステム相互接続を含み得、それは、CPU1700の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする。少なくとも1つの実施例では、I/Oインターフェース1770は、任意の数及びタイプのI/Oインターフェース(たとえば、PCI、PCI-X、PCIe、GBE、USBなど)を表す。少なくとも1つの実施例では、様々なタイプの周辺デバイスが、I/Oインターフェース1770に結合される。少なくとも1つの実施例では、I/Oインターフェース1770に結合される周辺デバイスは、限定はしないが、ディスプレイ、キーボード、マウス、プリンタ、スキャナ、ジョイスティック又は他のタイプのゲーム・コントローラ、メディア記録デバイス、外部ストレージ・デバイス、ネットワーク・インターフェース・カードなどを含み得る。
少なくとも1つの実施例では、メモリ・コントローラ1780は、CPU1700とシステム・メモリ1790との間のデータ転送を容易にする。少なくとも1つの実施例では、コア複合体1710とグラフィックス複合体1740とは、システム・メモリ1790を共有する。少なくとも1つの実施例では、CPU1700は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ1780及びメモリ・デバイスを含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、CPU1700は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ1728及びL3キャッシュ1730)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、コア1720及びコア複合体1710)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
図18は、少なくとも1つの実施例による、例示的なアクセラレータ統合スライス1890を示す。本明細書で使用される「スライス」は、アクセラレータ統合回路の処理リソースの指定部分を備える。少なくとも1つの実施例では、アクセラレータ統合回路は、グラフィックス加速モジュール中に含まれる複数のグラフィックス処理エンジンの代わりに、キャッシュ管理、メモリ・アクセス、コンテキスト管理、及び割込み管理サービスを提供する。グラフィックス処理エンジンは、各々、別個のGPUを備え得る。代替的に、グラフィックス処理エンジンは、GPU内に、グラフィックス実行ユニット、メディア処理エンジン(たとえば、ビデオ・エンコーダ/デコーダ)、サンプラ、及びblitエンジンなど、異なるタイプのグラフィックス処理エンジンを備え得る。少なくとも1つの実施例では、グラフィックス加速モジュールは、複数のグラフィックス処理エンジンをもつGPUであり得る。少なくとも1つの実施例では、グラフィックス処理エンジンは、共通のパッケージ、ライン・カード、又はチップ上に組み込まれた個々のGPUであり得る。
システム・メモリ1814内のアプリケーション実効アドレス空間1882は、プロセス要素1883を記憶する。一実施例では、プロセス要素1883は、プロセッサ1807上で実行されるアプリケーション1880からのGPU呼出し1881に応答して、記憶される。プロセス要素1883は、対応するアプリケーション1880のプロセス状態を含んでいる。プロセス要素1883に含まれているワーク記述子(「WD」:work descriptor)1884は、アプリケーションによって要求される単一のジョブであり得るか、又はジョブのキューに対するポインタを含んでいることがある。少なくとも1つの実施例では、WD1884は、アプリケーション実効アドレス空間1882におけるジョブ要求キューに対するポインタである。
グラフィックス加速モジュール1846及び/又は個々のグラフィックス処理エンジンは、システム中のプロセスのすべて又はサブセットによって共有され得る。少なくとも1つの実施例では、プロセス状態を設定し、WD1884をグラフィックス加速モジュール1846に送出して、仮想化環境中でジョブを開始するためのインフラストラクチャが、含められ得る。
少なくとも1つの実施例では、専用プロセス・プログラミング・モデルは、実装固有である。このモデルでは、単一のプロセスが、グラフィックス加速モジュール1846又は個々のグラフィックス処理エンジンを所有する。グラフィックス加速モジュール1846が単一のプロセスによって所有されるので、ハイパーバイザは、所有パーティションについてアクセラレータ統合回路を初期化し、グラフィックス加速モジュール1846が割り当てられたとき、オペレーティング・システムは、所有プロセスについてアクセラレータ統合回路を初期化する。
動作時、アクセラレータ統合スライス1890中のWDフェッチ・ユニット1891は、グラフィックス加速モジュール1846の1つ又は複数のグラフィックス処理エンジンによって行われるべきであるワークの指示を含む、次のWD1884をフェッチする。示されているように、WD1884からのデータは、レジスタ1845に記憶され、メモリ管理ユニット(「MMU」:memory management unit)1839、割込み管理回路1847、及び/又はコンテキスト管理回路1848によって使用され得る。たとえば、MMU1839の一実施例は、OS仮想アドレス空間1885内のセグメント/ページ・テーブル1886にアクセスするためのセグメント/ページ・ウォーク回路要素を含む。割込み管理回路1847は、グラフィックス加速モジュール1846から受信された割込みイベント(「INT」:interrupt)1892を処理し得る。グラフィックス動作を実施するとき、グラフィックス処理エンジンによって生成された実効アドレス1893は、MMU1839によって実アドレスにトランスレートされる。
一実施例では、レジスタ1845の同じセットが、各グラフィックス処理エンジン、及び/又はグラフィックス加速モジュール1846について複製され、ハイパーバイザ又はオペレーティング・システムによって初期化され得る。これらの複製されたレジスタの各々は、アクセラレータ統合スライス1890中に含められ得る。ハイパーバイザによって初期化され得る例示的なレジスタが、表1に示されている。
Figure 2023007422000013
オペレーティング・システムによって初期化され得る例示的なレジスタが、表2に示されている。
Figure 2023007422000014
一実施例では、各WD1884は、特定のグラフィックス加速モジュール1846及び/又は特定のグラフィックス処理エンジンに固有である。WD1884は、ワークを行うためにグラフィックス処理エンジンによって必要とされるすべての情報を含んでいるか、又は、WD1884は、完了されるべきワークのコマンド・キューをアプリケーションが設定したメモリ・ロケーションに対するポインタであり得る。
図19A~図19Bは、少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す。少なくとも1つの実施例では、例示的なグラフィックス・プロセッサのうちのいずれかは、1つ又は複数のIPコアを使用して作製され得る。示されているものに加えて、少なくとも1つの実施例では、追加のグラフィックス・プロセッサ/コア、周辺インターフェース・コントローラ、又は汎用プロセッサ・コアを含む他の論理及び回路が含まれ得る。少なくとも1つの実施例では、例示的なグラフィックス・プロセッサは、SoC内での使用のためのものである。
図19Aは、少なくとも1つの実施例による、1つ又は複数のIPコアを使用して作製され得るSoC集積回路の例示的なグラフィックス・プロセッサ1910を示す。図19Bは、少なくとも1つの実施例による、1つ又は複数のIPコアを使用して作製され得るSoC集積回路の追加の例示的なグラフィックス・プロセッサ1940を示す。少なくとも1つの実施例では、図19Aのグラフィックス・プロセッサ1910は、低電力グラフィックス・プロセッサ・コアである。少なくとも1つの実施例では、図19Bのグラフィックス・プロセッサ1940は、より高性能のグラフィックス・プロセッサ・コアである。少なくとも1つの実施例では、グラフィックス・プロセッサ1910、1940の各々は、図14のグラフィックス・プロセッサ1410の変形態であり得る。
少なくとも1つの実施例では、グラフィックス・プロセッサ1910は、頂点プロセッサ1905と、1つ又は複数のフラグメント・プロセッサ1915A~1915N(たとえば、1915A、1915B、1915C、1915D~1915N-1、及び1915N)とを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1910は、別個の論理を介して異なるシェーダ・プログラムを実行することができ、それにより、頂点プロセッサ1905は、頂点シェーダ・プログラムのための動作を実行するように最適化され、1つ又は複数のフラグメント・プロセッサ1915A~1915Nは、フラグメント又はピクセル・シェーダ・プログラムのためのフラグメント(たとえば、ピクセル)シェーディング動作を実行する。少なくとも1つの実施例では、頂点プロセッサ1905は、3Dグラフィックス・パイプラインの頂点処理段階を実施し、プリミティブ及び頂点データを生成する。少なくとも1つの実施例では、(1つ又は複数の)フラグメント・プロセッサ1915A~1915Nは、頂点プロセッサ1905によって生成されたプリミティブ及び頂点データを使用して、ディスプレイ・デバイス上に表示されるフレームバッファを作り出す。少なくとも1つの実施例では、(1つ又は複数の)フラグメント・プロセッサ1915A~1915Nは、OpenGL APIにおいて提供されるようなフラグメント・シェーダ・プログラムを実行するように最適化され、OpenGL APIは、Direct 3D APIにおいて提供されるようなピクセル・シェーダ・プログラムと同様の動作を実施するために使用され得る。
少なくとも1つの実施例では、グラフィックス・プロセッサ1910は、追加として、1つ又は複数のMMU1920A~1920Bと、(1つ又は複数の)キャッシュ1925A~1925Bと、(1つ又は複数の)回路相互接続1930A~1930Bとを含む。少なくとも1つの実施例では、1つ又は複数のMMU1920A~1920Bは、頂点プロセッサ1905及び/又は(1つ又は複数の)フラグメント・プロセッサ1915A~1915Nを含む、グラフィックス・プロセッサ1910のための仮想-物理アドレス・マッピングを提供し、それらは、1つ又は複数のキャッシュ1925A~1925Bに記憶された頂点又は画像/テクスチャ・データに加えて、メモリに記憶された頂点又は画像/テクスチャ・データを参照し得る。少なくとも1つの実施例では、1つ又は複数のMMU1920A~1920Bは、図14の1つ又は複数のアプリケーション・プロセッサ1405、画像プロセッサ1415、及び/又はビデオ・プロセッサ1420に関連する1つ又は複数のMMUを含む、システム内の他のMMUと同期され得、それにより、各プロセッサ1405~1420は、共有又は統一仮想メモリ・システムに参加することができる。少なくとも1つの実施例では、1つ又は複数の回路相互接続1930A~1930Bは、グラフィックス・プロセッサ1910が、SoCの内部バスを介して又は直接接続を介してのいずれかで、SoC内の他のIPコアとインターフェースすることを可能にする。
少なくとも1つの実施例では、グラフィックス・プロセッサ1940は、図19Aのグラフィックス・プロセッサ1910の1つ又は複数のMMU1920A~1920Bと、キャッシュ1925A~1925Bと、回路相互接続1930A~1930Bとを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ1940は、1つ又は複数のシェーダ・コア1955A~1955N(たとえば、1955A、1955B、1955C、1955D、1955E、1955F~1955N-1、及び1955N)を含み、1つ又は複数のシェーダ・コア1955A~1955Nは、単一のコア、又はタイプ、又はコアが、頂点シェーダ、フラグメント・シェーダ、及び/又はコンピュート・シェーダを実装するためのシェーダ・プログラム・コードを含むすべてのタイプのプログラマブル・シェーダ・コードを実行することができる統一シェーダ・コア・アーキテクチャを提供する。少なくとも1つの実施例では、シェーダ・コアの数は変動することができる。少なくとも1つの実施例では、グラフィックス・プロセッサ1940は、1つ又は複数のシェーダ・コア1955A~1955Nに実行スレッドをディスパッチするためのスレッド・ディスパッチャとして作用するコア間タスク・マネージャ1945と、たとえばシーン内のローカル空間コヒーレンスを利用するため、又は内部キャッシュの使用を最適化するために、シーンについてのレンダリング動作が画像空間において下位区分される、タイル・ベースのレンダリングのためのタイリング動作を加速するためのタイリング・ユニット1958とを含む。
図20Aは、少なくとも1つの実施例による、グラフィックス・コア2000を示す。少なくとも1つの実施例では、グラフィックス・コア2000は、図14のグラフィックス・プロセッサ1410内に含まれ得る。少なくとも1つの実施例では、グラフィックス・コア2000は、図19Bの場合のような統一シェーダ・コア1955A~1955Nであり得る。少なくとも1つの実施例では、グラフィックス・コア2000は、共有命令キャッシュ2002と、テクスチャ・ユニット2018と、キャッシュ/共有メモリ2020とを含み、それらは、グラフィックス・コア2000内の実行リソースに共通である。少なくとも1つの実施例では、グラフィックス・コア2000は、複数のスライス2001A~2001N、又は各コアについてのパーティションを含むことができ、グラフィックス・プロセッサは、グラフィックス・コア2000の複数のインスタンスを含むことができる。スライス2001A~2001Nは、ローカル命令キャッシュ2004A~2004Nと、スレッド・スケジューラ2006A~2006Nと、スレッド・ディスパッチャ2008A~2008Nと、レジスタのセット2010A~2010Nとを含むサポート論理を含むことができる。少なくとも1つの実施例では、スライス2001A~2001Nは、追加機能ユニット(「AFU」:additional function unit)2012A~2012N、浮動小数点ユニット(「FPU」:floating-point unit)2014A~2014N、整数算術論理ユニット(「ALU」:integer arithmetic logic unit)2016~2016N、アドレス算出ユニット(「ACU」:address computational unit)2013A~2013N、倍精度浮動小数点ユニット(「DPFPU」:double-precision floating-point unit)2015A~2015N、及び行列処理ユニット(「MPU」:matrix processing unit)2017A~2017Nのセットを含むことができる。
少なくとも1つの実施例では、FPU2014A~2014Nは、単精度(32ビット)及び半精度(16ビット)の浮動小数点演算を実施することができ、DPFPU2015A~2015Nは、倍精度(64ビット)の浮動小数点演算を実施する。少なくとも1つの実施例では、ALU2016A~2016Nは、8ビット、16ビット、及び32ビットの精度で可変精度整数演算を実施することができ、混合精度演算のために構成され得る。少なくとも1つの実施例では、MPU2017A~2017Nも、半精度浮動小数点演算と8ビット整数演算とを含む、混合精度行列演算のために構成され得る。少なくとも1つの実施例では、MPU2017~2017Nは、加速汎用行列-行列乗算(「GEMM」:general matrix to matrix multiplication)のサポートを可能にすることを含む、CUDAプログラムを加速するための様々な行列演算を実施することができる。少なくとも1つの実施例では、AFU2012A~2012Nは、三角関数演算(たとえば、サイン、コサインなど)を含む、浮動小数点ユニット又は整数ユニットによってサポートされていない追加の論理演算を実施することができる。
図20Bは、少なくとも1つの実施例による、汎用グラフィックス処理ユニット(「GPGPU」:general-purpose graphics processing unit)2030を示す。少なくとも1つの実施例では、GPGPU2030は、高度並列であり、マルチチップ・モジュール上での導入に好適である。少なくとも1つの実施例では、GPGPU2030は、高度並列コンピュート動作がGPUのアレイによって実施されることを可能にするように構成され得る。少なくとも1つの実施例では、GPGPU2030は、CUDAプログラムのための実行時間を改善するためにマルチGPUクラスタを作成するために、GPGPU2030の他のインスタンスに直接リンクされ得る。少なくとも1つの実施例では、GPGPU2030は、ホスト・プロセッサとの接続を可能にするためのホスト・インターフェース2032を含む。少なくとも1つの実施例では、ホスト・インターフェース2032は、PCIeインターフェースである。少なくとも1つの実施例では、ホスト・インターフェース2032は、ベンダー固有の通信インターフェース又は通信ファブリックであり得る。少なくとも1つの実施例では、GPGPU2030は、ホスト・プロセッサからコマンドを受信し、グローバル・スケジューラ2034を使用して、それらのコマンドに関連する実行スレッドを、コンピュート・クラスタ2036A~2036Hのセットに分散させる。少なくとも1つの実施例では、コンピュート・クラスタ2036A~2036Hは、キャッシュ・メモリ2038を共有する。少なくとも1つの実施例では、キャッシュ・メモリ2038は、コンピュート・クラスタ2036A~2036H内のキャッシュ・メモリのためのより高レベルのキャッシュとして働くことができる。
少なくとも1つの実施例では、GPGPU2030は、メモリ・コントローラ2042A~1942Bのセットを介してコンピュート・クラスタ2036A~2036Hと結合されたメモリ2044A~2044Bを含む。少なくとも1つの実施例では、メモリ2044A~2044Bは、DRAM、又は、グラフィックス・ダブル・データ・レート(「GDDR」:graphics double data rate)メモリを含む同期グラフィックス・ランダム・アクセス・メモリ(「SGRAM」:synchronous graphics random access memory)などのグラフィックス・ランダム・アクセス・メモリを含む、様々なタイプのメモリ・デバイスを含むことができる。
少なくとも1つの実施例では、コンピュート・クラスタ2036A~2036Hは、各々、図20Aのグラフィックス・コア2000などのグラフィックス・コアのセットを含み、グラフィックス・コアのセットは、CUDAプログラムに関連する算出に適したものを含む、様々な精度で算出動作を実施することができる複数のタイプの整数及び浮動小数点論理ユニットを含むことができる。たとえば、少なくとも1つの実施例では、コンピュート・クラスタ2036A~2036Hの各々における浮動小数点ユニットの少なくともサブセットは、16ビット又は32ビットの浮動小数点演算を実施するように構成され得、浮動小数点ユニットの異なるサブセットは、64ビットの浮動小数点演算を実施するように構成され得る。
少なくとも1つの実施例では、GPGPU2030の複数のインスタンスは、コンピュート・クラスタとして動作するように構成され得る。コンピュート・クラスタ2036A~2036Hは、同期及びデータ交換のための任意の技術的に実現可能な通信技法を実装し得る。少なくとも1つの実施例では、GPGPU2030の複数のインスタンスは、ホスト・インターフェース2032を介して通信する。少なくとも1つの実施例では、GPGPU2030は、I/Oハブ2039を含み、I/Oハブ2039は、GPGPU2030を、GPGPU2030の他のインスタンスへの直接接続を可能にするGPUリンク2040と結合する。少なくとも1つの実施例では、GPUリンク2040は、GPGPU2030の複数のインスタンス間での通信及び同期を可能にする専用GPU-GPUブリッジに結合される。少なくとも1つの実施例では、GPUリンク2040は、他のGPGPU2030又は並列プロセッサにデータを送信及び受信するために高速相互接続と結合される。少なくとも1つの実施例では、GPGPU2030の複数のインスタンスは、別個のデータ処理システムに位置し、ホスト・インターフェース2032を介してアクセス可能であるネットワーク・デバイスを介して通信する。少なくとも1つの実施例では、GPUリンク2040は、ホスト・インターフェース2032に加えて、又はその代替として、ホスト・プロセッサへの接続を可能にするように構成され得る。少なくとも1つの実施例では、GPGPU2030は、CUDAプログラムを実行するように構成され得る。
図21Aは、少なくとも1つの実施例による、並列プロセッサ2100を示す。少なくとも1つの実施例では、並列プロセッサ2100の様々な構成要素は、プログラマブル・プロセッサ、特定用途向け集積回路(「ASIC」:application specific integrated circuit)、又はFPGAなど、1つ又は複数の集積回路デバイスを使用して実装され得る。
少なくとも1つの実施例では、並列プロセッサ2100は並列処理ユニット2102を含む。少なくとも1つの実施例では、並列処理ユニット2102は、並列処理ユニット2102の他のインスタンスを含む、他のデバイスとの通信を可能にするI/Oユニット2104を含む。少なくとも1つの実施例では、I/Oユニット2104は、他のデバイスに直接接続され得る。少なくとも1つの実施例では、I/Oユニット2104は、メモリ・ハブ2105など、ハブ又はスイッチ・インターフェースの使用を介して他のデバイスと接続する。少なくとも1つの実施例では、メモリ・ハブ2105とI/Oユニット2104との間の接続は、通信リンクを形成する。少なくとも1つの実施例では、I/Oユニット2104は、ホスト・インターフェース2106及びメモリ・クロスバー2116と接続し、ホスト・インターフェース2106は、処理動作を実施することを対象とするコマンドを受信し、メモリ・クロスバー2116は、メモリ動作を実施することを対象とするコマンドを受信する。
少なくとも1つの実施例では、ホスト・インターフェース2106が、I/Oユニット2104を介してコマンド・バッファを受信したとき、ホスト・インターフェース2106は、それらのコマンドを実施するためのワーク動作をフロント・エンド2108に向けることができる。少なくとも1つの実施例では、フロント・エンド2108はスケジューラ2110と結合し、スケジューラ2110は、コマンド又は他のワーク・アイテムを処理アレイ2112に分散させるように構成される。少なくとも1つの実施例では、スケジューラ2110は、処理アレイ2112にタスクが分散される前に、処理アレイ2112が適切に構成され、有効な状態にあることを確実にする。少なくとも1つの実施例では、スケジューラ2110は、マイクロコントローラ上で実行しているファームウェア論理を介して実装される。少なくとも1つの実施例では、マイクロコントローラ実装スケジューラ2110は、複雑なスケジューリング及びワーク分散動作を、粗い粒度及び細かい粒度において実施するように構成可能であり、処理アレイ2112上で実行しているスレッドの迅速なプリエンプション及びコンテキスト切替えを可能にする。少なくとも1つの実施例では、ホスト・ソフトウェアは、処理アレイ2112上でのスケジューリングのためのワークロードを、複数のグラフィックス処理ドアベルのうちの1つを介して証明することができる。少なくとも1つの実施例では、ワークロードは、次いで、スケジューラ2110を含むマイクロコントローラ内のスケジューラ2110論理によって、処理アレイ2112にわたって自動的に分散され得る。
少なくとも1つの実施例では、処理アレイ2112は、最高「N」個のクラスタ(たとえば、クラスタ2114A、クラスタ2114B~クラスタ2114N)を含むことができる。少なくとも1つの実施例では、処理アレイ2112の各クラスタ2114A~2114Nは、多数の同時スレッドを実行することができる。少なくとも1つの実施例では、スケジューラ2110は、様々なスケジューリング及び/又はワーク分散アルゴリズムを使用して処理アレイ2112のクラスタ2114A~2114Nにワークを割り振ることができ、それらのアルゴリズムは、プログラム又は算出の各タイプについて生じるワークロードに応じて変動し得る。少なくとも1つの実施例では、スケジューリングは、スケジューラ2110によって動的に対処され得るか、又は処理アレイ2112による実行のために構成されたプログラム論理のコンパイル中に、コンパイラ論理によって部分的に支援され得る。少なくとも1つの実施例では、処理アレイ2112の異なるクラスタ2114A~2114Nは、異なるタイプのプログラムを処理するために、又は異なるタイプの算出を実施するために割り振られ得る。
少なくとも1つの実施例では、処理アレイ2112は、様々なタイプの並列処理動作を実施するように構成され得る。少なくとも1つの実施例では、処理アレイ2112は、汎用並列コンピュート動作を実施するように構成される。たとえば、少なくとも1つの実施例では、処理アレイ2112は、ビデオ及び/又はオーディオ・データをフィルタリングすること、物理動作を含むモデリング動作を実施すること、及びデータ変換を実施することを含む処理タスクを実行するための論理を含むことができる。
少なくとも1つの実施例では、処理アレイ2112は、並列グラフィックス処理動作を実施するように構成される。少なくとも1つの実施例では、処理アレイ2112は、限定はしないが、テクスチャ動作を実施するためのテクスチャ・サンプリング論理、並びにテッセレーション論理及び他の頂点処理論理を含む、そのようなグラフィックス処理動作の実行をサポートするための追加の論理を含むことができる。少なくとも1つの実施例では、処理アレイ2112は、限定はしないが、頂点シェーダ、テッセレーション・シェーダ、ジオメトリ・シェーダ、及びピクセル・シェーダなど、グラフィックス処理関係シェーダ・プログラムを実行するように構成され得る。少なくとも1つの実施例では、並列処理ユニット2102は、処理のためにI/Oユニット2104を介してシステム・メモリからデータを転送することができる。少なくとも1つの実施例では、処理中に、転送されたデータは、処理中にオンチップ・メモリ(たとえば、並列プロセッサ・メモリ2122)に記憶され、次いでシステム・メモリに書き戻され得る。
少なくとも1つの実施例では、並列処理ユニット2102がグラフィックス処理を実施するために使用されるとき、スケジューラ2110は、処理アレイ2112の複数のクラスタ2114A~2114Nへのグラフィックス処理動作の分散をより良く可能にするために、処理ワークロードをほぼ等しいサイズのタスクに分割するように構成され得る。少なくとも1つの実施例では、処理アレイ2112の部分は、異なるタイプの処理を実施するように構成され得る。たとえば、少なくとも1つの実施例では、表示のために、レンダリングされた画像を作り出すために、第1の部分は、頂点シェーディング及びトポロジ生成を実施するように構成され得、第2の部分は、テッセレーション及びジオメトリ・シェーディングを実施するように構成され得、第3の部分は、ピクセル・シェーディング又は他のスクリーン空間動作を実施するように構成され得る。少なくとも1つの実施例では、クラスタ2114A~2114Nのうちの1つ又は複数によって作り出された中間データは、中間データがさらなる処理のためにクラスタ2114A~2114N間で送信されることを可能にするために、バッファに記憶され得る。
少なくとも1つの実施例では、処理アレイ2112は、実行されるべき処理タスクをスケジューラ2110を介して受信することができ、スケジューラ2110は、処理タスクを定義するコマンドをフロント・エンド2108から受信する。少なくとも1つの実施例では、処理タスクは、処理されるべきデータのインデックス、たとえば、表面(パッチ)データ、プリミティブ・データ、頂点データ、及び/又はピクセル・データ、並びに、データがどのように処理されるべきであるか(たとえば、どのプログラムが実行されるべきであるか)を定義する状態パラメータ及びコマンドを含むことができる。少なくとも1つの実施例では、スケジューラ2110は、タスクに対応するインデックスをフェッチするように構成され得るか、又はフロント・エンド2108からインデックスを受信し得る。少なくとも1つの実施例では、フロント・エンド2108は、入って来るコマンド・バッファ(たとえば、バッチ・バッファ、プッシュ・バッファなど)によって指定されるワークロードが始動される前に、処理アレイ2112が有効な状態に構成されることを確実にするように構成され得る。
少なくとも1つの実施例では、並列処理ユニット2102の1つ又は複数のインスタンスの各々は、並列プロセッサ・メモリ2122と結合することができる。少なくとも1つの実施例では、並列プロセッサ・メモリ2122は、メモリ・クロスバー2116を介してアクセスされ得、メモリ・クロスバー1716は、処理アレイ2112並びにI/Oユニット2104からメモリ要求を受信することができる。少なくとも1つの実施例では、メモリ・クロスバー2116は、メモリ・インターフェース2118を介して並列プロセッサ・メモリ2122にアクセスすることができる。少なくとも1つの実施例では、メモリ・インターフェース2118は、複数のパーティション・ユニット(たとえば、パーティション・ユニット2120A、パーティション・ユニット2120B~パーティション・ユニット2120N)を含むことができ、複数のパーティション・ユニットは、各々、並列プロセッサ・メモリ2122の一部分(たとえば、メモリ・ユニット)に結合することができる。少なくとも1つの実施例では、パーティション・ユニット2120A~2120Nの数は、メモリ・ユニットの数に等しくなるように構成され、それにより、第1のパーティション・ユニット2120Aは、対応する第1のメモリ・ユニット2124Aを有し、第2のパーティション・ユニット2120Bは、対応するメモリ・ユニット2124Bを有し、第Nのパーティション・ユニット2120Nは、対応する第Nのメモリ・ユニット2124Nを有する。少なくとも1つの実施例では、パーティション・ユニット2120A~2120Nの数は、メモリ・デバイスの数に等しくないことがある。
少なくとも1つの実施例では、メモリ・ユニット2124A~2124Nは、GDDRメモリを含むSGRAMなど、DRAM又はグラフィックス・ランダム・アクセス・メモリを含む、様々なタイプのメモリ・デバイスを含むことができる。少なくとも1つの実施例では、メモリ・ユニット2124A~2124Nは、限定はしないが高帯域幅メモリ(「HBM」:high bandwidth memory)を含む、3D積層メモリをも含み得る。少なくとも1つの実施例では、並列プロセッサ・メモリ2122の利用可能な帯域幅を効率的に使用するために、フレーム・バッファ又はテクスチャ・マップなどのレンダー・ターゲットが、メモリ・ユニット2124A~2124Nにわたって記憶されて、パーティション・ユニット2120A~2120Nが、各レンダー・ターゲットの部分を並列に書き込むことを可能にし得る。少なくとも1つの実施例では、ローカル・キャッシュ・メモリと併せてシステム・メモリを利用する統一メモリ設計に有利なように、並列プロセッサ・メモリ2122のローカル・インスタンスが除外され得る。
少なくとも1つの実施例では、処理アレイ2112のクラスタ2114A~2114Nのうちのいずれか1つは、並列プロセッサ・メモリ2122内のメモリ・ユニット2124A~2124Nのいずれかに書き込まれることになるデータを処理することができる。少なくとも1つの実施例では、メモリ・クロスバー2116は、各クラスタ2114A~2114Nの出力を、出力に対して追加の処理動作を実施することができる任意のパーティション・ユニット2120A~2120Nに転送するか、又は別のクラスタ2114A~2114Nに転送するように構成され得る。少なくとも1つの実施例では、各クラスタ2114A~2114Nは、様々な外部メモリ・デバイスから読み取るか、又はそれに書き込むために、メモリ・クロスバー2116を通してメモリ・インターフェース2118と通信することができる。少なくとも1つの実施例では、メモリ・クロスバー2116は、I/Oユニット2104と通信するためのメモリ・インターフェース2118への接続、並びに、並列プロセッサ・メモリ2122のローカル・インスタンスへの接続を有し、これは、異なるクラスタ2114A~2114N内の処理ユニットが、システム・メモリ、又は並列処理ユニット2102にローカルでない他のメモリと通信することを可能にする。少なくとも1つの実施例では、メモリ・クロスバー2116は、クラスタ2114A~2114Nとパーティション・ユニット2120A~2120Nとの間でトラフィック・ストリームを分離するために、仮想チャネルを使用することができる。
少なくとも1つの実施例では、並列処理ユニット2102の複数のインスタンスは、単一のアドイン・カード上で提供され得るか、又は複数のアドイン・カードが相互接続され得る。少なくとも1つの実施例では、並列処理ユニット2102の異なるインスタンスは、異なるインスタンスが異なる数の処理コア、異なる量のローカル並列プロセッサ・メモリ、及び/又は他の構成の差を有する場合でも、相互動作するように構成され得る。たとえば、少なくとも1つの実施例では、並列処理ユニット2102のいくつかのインスタンスは、他のインスタンスに対してより高い精度の浮動小数点ユニットを含むことができる。少なくとも1つの実施例では、並列処理ユニット2102又は並列プロセッサ2100の1つ又は複数のインスタンスを組み込んだシステムは、限定はしないが、デスクトップ、ラップトップ、又はハンドヘルド・パーソナル・コンピュータ、サーバ、ワークステーション、ゲーム・コンソール、及び/又は組み込みシステムを含む、様々な構成及びフォーム・ファクタにおいて実装され得る。
図21Bは、少なくとも1つの実施例による、処理クラスタ2194を示す。少なくとも1つの実施例では、処理クラスタ2194は、並列処理ユニット内に含まれる。少なくとも1つの実施例では、処理クラスタ2194は、図21の処理クラスタ2114A~2114Nのうちの1つである。少なくとも1つの実施例では、処理クラスタ2194は、多くのスレッドを並列で実行するように構成され得、「スレッド」という用語は、入力データの特定のセットに対して実行している特定のプログラムのインスタンスを指す。少なくとも1つの実施例では、複数の独立した命令ユニットを提供することなしに多数のスレッドの並列実行をサポートするために、単一命令複数データ(「SIMD」:single instruction,multiple data)命令発行技法が使用される。少なくとも1つの実施例では、各処理クラスタ2194内の処理エンジンのセットに命令を発行するように構成された共通の命令ユニットを使用して、全体的に同期された多数のスレッドの並列実行をサポートするために、単一命令複数スレッド(「SIMT」:single instruction,multiple thread)技法が使用される。
少なくとも1つの実施例では、処理クラスタ2194の動作は、SIMT並列プロセッサに処理タスクを分散させるパイプライン・マネージャ2132を介して制御され得る。少なくとも1つの実施例では、パイプライン・マネージャ2132は、図21のスケジューラ2110から命令を受信し、グラフィックス・マルチプロセッサ2134及び/又はテクスチャ・ユニット2136を介してそれらの命令の実行を管理する。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2134は、SIMT並列プロセッサの例示的なインスタンスである。しかしながら、少なくとも1つの実施例では、異なるアーキテクチャの様々なタイプのSIMT並列プロセッサが、処理クラスタ2194内に含められ得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2134の1つ又は複数のインスタンスは、処理クラスタ2194内に含められ得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2134はデータを処理することができ、処理されたデータを、他のシェーダ・ユニットを含む複数の可能な宛先のうちの1つに分散させるために、データ・クロスバー2140が使用され得る。少なくとも1つの実施例では、パイプライン・マネージャ2132は、データ・クロスバー2140を介して分散されることになる処理されたデータのための宛先を指定することによって、処理されたデータの分散を容易にすることができる。
少なくとも1つの実施例では、処理クラスタ2194内の各グラフィックス・マルチプロセッサ2134は、関数実行論理(たとえば、算術論理ユニット、ロード/ストア・ユニット(「LSU」:load/store unit)など)の同一のセットを含むことができる。少なくとも1つの実施例では、関数実行論理は、前の命令が完了する前に新しい命令が発行され得るパイプライン様式で構成され得る。少なくとも1つの実施例では、関数実行論理は、整数及び浮動小数点算術、比較演算、ブール演算、ビット・シフト、及び様々な代数関数の算出を含む様々な演算をサポートする。少なくとも1つの実施例では、異なる演算を実施するために同じ関数ユニット・ハードウェアが活用され得、関数ユニットの任意の組合せが存在し得る。
少なくとも1つの実施例では、処理クラスタ2194に送信される命令がスレッドを構成する。少なくとも1つの実施例では、並列処理エンジンのセットにわたって実行しているスレッドのセットが、スレッド・グループである。少なくとも1つの実施例では、スレッド・グループは、異なる入力データに対してプログラムを実行する。少なくとも1つの実施例では、スレッド・グループ内の各スレッドは、グラフィックス・マルチプロセッサ2134内の異なる処理エンジンに割り当てられ得る。少なくとも1つの実施例では、スレッド・グループは、グラフィックス・マルチプロセッサ2134内の処理エンジンの数よりも少ないスレッドを含み得る。少なくとも1つの実施例では、スレッド・グループが処理エンジンの数よりも少ないスレッドを含むとき、処理エンジンのうちの1つ又は複数は、そのスレッド・グループが処理されているサイクル中にアイドルであり得る。少なくとも1つの実施例では、スレッド・グループはまた、グラフィックス・マルチプロセッサ2134内の処理エンジンの数よりも多いスレッドを含み得る。少なくとも1つの実施例では、スレッド・グループがグラフィックス・マルチプロセッサ2134内の処理エンジンの数よりも多くのスレッドを含むとき、連続するクロック・サイクルにわたって処理が実施され得る。少なくとも1つの実施例では、複数のスレッド・グループが、グラフィックス・マルチプロセッサ2134上で同時に実行され得る。
少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2134は、ロード動作及びストア動作を実施するための内部キャッシュ・メモリを含む。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2134は、内部キャッシュをやめ、処理クラスタ2194内のキャッシュ・メモリ(たとえば、L1キャッシュ2148)を使用することができる。少なくとも1つの実施例では、各グラフィックス・マルチプロセッサ2134は、パーティション・ユニット(たとえば、図21Aのパーティション・ユニット2120A~2120N)内のレベル2(「L2」)キャッシュへのアクセスをも有し、それらのL2キャッシュは、すべての処理クラスタ2194の間で共有され、スレッド間でデータを転送するために使用され得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2134はまた、オフチップ・グローバル・メモリにアクセスし得、オフチップ・グローバル・メモリは、ローカル並列プロセッサ・メモリ及び/又はシステム・メモリのうちの1つ又は複数を含むことができる。少なくとも1つの実施例では、並列処理ユニット2102の外部の任意のメモリが、グローバル・メモリとして使用され得る。少なくとも1つの実施例では、処理クラスタ2194は、グラフィックス・マルチプロセッサ2134の複数のインスタンスを含み、グラフィックス・マルチプロセッサ2134は、共通の命令及びデータを共有することができ、共通の命令及びデータは、L1キャッシュ2148に記憶され得る。
少なくとも1つの実施例では、各処理クラスタ2194は、仮想アドレスを物理アドレスにマッピングするように構成されたMMU2145を含み得る。少なくとも1つの実施例では、MMU2145の1つ又は複数のインスタンスは、図21のメモリ・インターフェース2118内に存在し得る。少なくとも1つの実施例では、MMU2145は、仮想アドレスを、タイル及び随意にキャッシュ・ライン・インデックスの物理アドレスにマッピングするために使用されるページ・テーブル・エントリ(「PTE」:page table entry)のセットを含む。少なくとも1つの実施例では、MMU2145は、アドレス・トランスレーション・ルックアサイド・バッファ(「TLB」:translation lookaside buffer)又はキャッシュを含み得、これらは、グラフィックス・マルチプロセッサ2134又はL1キャッシュ2148或いは処理クラスタ2194内に存在し得る。少なくとも1つの実施例では、物理アドレスが、表面データ・アクセス・ローカリティを分散させて、パーティション・ユニットの間での効率的な要求インターリーブを可能にするために処理される。少なくとも1つの実施例では、キャッシュ・ライン・インデックスが、キャッシュ・ラインについての要求がヒットであるのかミスであるのかを決定するために使用され得る。
少なくとも1つの実施例では、処理クラスタ2194は、各グラフィックス・マルチプロセッサ2134が、テクスチャ・マッピング動作、たとえば、テクスチャ・サンプル位置を決定すること、テクスチャ・データを読み取ること、及びテクスチャ・データをフィルタリングすることを実施するためのテクスチャ・ユニット2136に結合されるように、構成され得る。少なくとも1つの実施例では、テクスチャ・データは、内部テクスチャL1キャッシュ(図示せず)から又はグラフィックス・マルチプロセッサ2134内のL1キャッシュから読み取られ、必要に応じて、L2キャッシュ、ローカル並列プロセッサ・メモリ、又はシステム・メモリからフェッチされる。少なくとも1つの実施例では、各グラフィックス・マルチプロセッサ2134は、処理されたタスクをデータ・クロスバー2140に出力して、処理されたタスクを、さらなる処理のために別の処理クラスタ2194に提供するか、或いは、処理されたタスクを、メモリ・クロスバー2116を介してL2キャッシュ、ローカル並列プロセッサ・メモリ、又はシステム・メモリに記憶する。少なくとも1つの実施例では、プレ・ラスタ演算ユニット(「プレROP」:pre-raster operation)2142は、グラフィックス・マルチプロセッサ2134からデータを受信し、データをROPユニットにダイレクトするように構成され、ROPユニットは、本明細書で説明されるようなパーティション・ユニット(たとえば、図21のパーティション・ユニット2120A~2120N)とともに位置し得る。少なくとも1つの実施例では、プレROP2142は、色ブレンディングのための最適化を実施し、ピクセル色データを組織化し、アドレス・トランスレーションを実施することができる。
図21Cは、少なくとも1つの実施例による、グラフィックス・マルチプロセッサ2196を示す。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2196は、図21Bのグラフィックス・マルチプロセッサ2134である。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2196は、処理クラスタ2194のパイプライン・マネージャ2132と結合する。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2196は、限定はしないが、命令キャッシュ2152と、命令ユニット2154と、アドレス・マッピング・ユニット2156と、レジスタ・ファイル2158と、1つ又は複数のGPGPUコア2162と、1つ又は複数のLSU2166とを含む実行パイプラインを有する。GPGPUコア2162及びLSU2166は、メモリ及びキャッシュ相互接続2168を介してキャッシュ・メモリ2172及び共有メモリ2170と結合される。
少なくとも1つの実施例では、命令キャッシュ2152は、実行すべき命令のストリームをパイプライン・マネージャ2132から受信する。少なくとも1つの実施例では、命令は、命令キャッシュ2152においてキャッシュされ、命令ユニット2154による実行のためにディスパッチされる。少なくとも1つの実施例では、命令ユニット2154は、命令をスレッド・グループ(たとえば、ワープ)としてディスパッチすることができ、スレッド・グループの各スレッドは、GPGPUコア2162内の異なる実行ユニットに割り当てられる。少なくとも1つの実施例では、命令は、統一アドレス空間内のアドレスを指定することによって、ローカル、共有、又はグローバルのアドレス空間のいずれかにアクセスすることができる。少なくとも1つの実施例では、アドレス・マッピング・ユニット2156は、統一アドレス空間中のアドレスを、LSU2166によってアクセスされ得る個別メモリ・アドレスにトランスレートするために使用され得る。
少なくとも1つの実施例では、レジスタ・ファイル2158は、グラフィックス・マルチプロセッサ2196の機能ユニットにレジスタのセットを提供する。少なくとも1つの実施例では、レジスタ・ファイル2158は、グラフィックス・マルチプロセッサ2196の機能ユニット(たとえば、GPGPUコア2162、LSU2166)のデータ経路に接続された、オペランドのための一時的ストレージを提供する。少なくとも1つの実施例では、レジスタ・ファイル2158は、各機能ユニットがレジスタ・ファイル2158の専用部分を割り振られるように、機能ユニットの各々の間で分割される。少なくとも1つの実施例では、レジスタ・ファイル2158は、グラフィックス・マルチプロセッサ2196によって実行されている異なるスレッド・グループ間で分割される。
少なくとも1つの実施例では、GPGPUコア2162は、各々、グラフィックス・マルチプロセッサ2196の命令を実行するために使用されるFPU及び/又は整数ALUを含むことができる。GPGPUコア2162は、同様のアーキテクチャであることも異なるアーキテクチャであることもある。少なくとも1つの実施例では、GPGPUコア2162の第1の部分は、単精度FPU及び整数ALUを含み、GPGPUコア2162の第2の部分は、倍精度FPUを含む。少なくとも1つの実施例では、FPUは、浮動小数点算術のためのIEEE754-2008規格を実装することができるか、又は、可変精度の浮動小数点算術を有効にすることができる。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2196は、追加として、矩形コピー動作又はピクセル・ブレンディング動作などの特定の機能を実施するための1つ又は複数の固定機能ユニット又は特別機能ユニットを含むことができる。少なくとも1つの実施例では、GPGPUコア2162のうちの1つ又は複数は、固定又は特別機能論理をも含むことができる。
少なくとも1つの実施例では、GPGPUコア2162は、データの複数のセットに対して単一の命令を実施することが可能なSIMD論理を含む。少なくとも1つの実施例では、GPGPUコア2162は、SIMD4、SIMD8、及びSIMD16命令を物理的に実行し、SIMD1、SIMD2、及びSIMD32命令を論理的に実行することができる。少なくとも1つの実施例では、GPGPUコア2162のためのSIMD命令は、シェーダ・コンパイラによるコンパイル時に生成されるか、或いは、単一プログラム複数データ(「SPMD」:single program multiple data)又はSIMTアーキテクチャのために書かれ、コンパイルされたプログラムを実行しているときに自動的に生成され得る。少なくとも1つの実施例では、SIMT実行モデルのために構成されたプログラムの複数のスレッドは、単一のSIMD命令を介して実行され得る。たとえば、少なくとも1つの実施例では、同じ又は同様の動作を実施する8つのSIMTスレッドが、単一のSIMD8論理ユニットを介して並列に実行され得る。
少なくとも1つの実施例では、メモリ及びキャッシュ相互接続2168は、グラフィックス・マルチプロセッサ2196の各機能ユニットをレジスタ・ファイル2158及び共有メモリ2170に接続する相互接続ネットワークである。少なくとも1つの実施例では、メモリ及びキャッシュ相互接続2168は、LSU2166が、共有メモリ2170とレジスタ・ファイル2158との間でロード動作及びストア動作を実装することを可能にするクロスバー相互接続である。少なくとも1つの実施例では、レジスタ・ファイル2158は、GPGPUコア2162と同じ周波数において動作することができ、したがって、GPGPUコア2162とレジスタ・ファイル2158との間のデータ転送は、非常に低いレイテンシである。少なくとも1つの実施例では、共有メモリ2170は、グラフィックス・マルチプロセッサ2196内の機能ユニット上で実行するスレッド間の通信を可能にするために使用され得る。少なくとも1つの実施例では、キャッシュ・メモリ2172は、たとえば、機能ユニットとテクスチャ・ユニット2136との間で通信されるテクスチャ・データをキャッシュするために、データ・キャッシュとして使用され得る。少なくとも1つの実施例では、共有メモリ2170は、キャッシュされる管理されるプログラムとしても使用され得る。少なくとも1つの実施例では、GPGPUコア2162上で実行しているスレッドは、キャッシュ・メモリ2172内に記憶される自動的にキャッシュされるデータに加えて、データを共有メモリ内にプログラム的に記憶することができる。
少なくとも1つの実施例では、本明細書で説明されるような並列プロセッサ又はGPGPUは、グラフィックス動作、機械学習動作、パターン分析動作、及び様々な汎用GPU(GPGPU)機能を加速するために、ホスト/プロセッサ・コアに通信可能に結合される。少なくとも1つの実施例では、GPUは、バス又は他の相互接続(たとえば、PCIe又はNVLinkなどの高速相互接続)を介してホスト・プロセッサ/コアに通信可能に結合され得る。少なくとも1つの実施例では、GPUは、コアとして同じパッケージ又はチップに集積され、パッケージ又はチップの内部にあるプロセッサ・バス/相互接続を介してコアに通信可能に結合され得る。少なくとも1つの実施例では、GPUが接続される様式にかかわらず、プロセッサ・コアは、WD中に含まれているコマンド/命令のシーケンスの形態で、ワークをGPUに割り振り得る。少なくとも1つの実施例では、GPUは、次いで、これらのコマンド/命令を効率的に処理するための専用回路要素/論理を使用する。
図22は、少なくとも1つの実施例による、グラフィックス・プロセッサ2200を示す。少なくとも1つの実施例では、グラフィックス・プロセッサ2200は、リング相互接続2202と、パイプライン・フロント・エンド2204と、メディア・エンジン2237と、グラフィックス・コア2280A~2280Nとを含む。少なくとも1つの実施例では、リング相互接続2202は、グラフィックス・プロセッサ2200を、他のグラフィックス・プロセッサ又は1つ又は複数の汎用プロセッサ・コアを含む他の処理ユニットに結合する。少なくとも1つの実施例では、グラフィックス・プロセッサ2200は、マルチコア処理システム内に組み込まれた多くのプロセッサのうちの1つである。
少なくとも1つの実施例では、グラフィックス・プロセッサ2200は、リング相互接続2202を介してコマンドのバッチを受信する。少なくとも1つの実施例では、入って来るコマンドは、パイプライン・フロント・エンド2204中のコマンド・ストリーマ2203によって解釈される。少なくとも1つの実施例では、グラフィックス・プロセッサ2200は、(1つ又は複数の)グラフィックス・コア2280A~2280Nを介して3Dジオメトリ処理及びメディア処理を実施するためのスケーラブル実行論理を含む。少なくとも1つの実施例では、3Dジオメトリ処理コマンドについて、コマンド・ストリーマ2203は、コマンドをジオメトリ・パイプライン2236に供給する。少なくとも1つの実施例では、少なくともいくつかのメディア処理コマンドについて、コマンド・ストリーマ2203は、コマンドをビデオ・フロント・エンド2234に供給し、ビデオ・フロント・エンド2234はメディア・エンジン2237と結合する。少なくとも1つの実施例では、メディア・エンジン2237は、ビデオ及び画像後処理のためのビデオ品質エンジン(「VQE」:Video Quality Engine)2230と、ハードウェア加速メディア・データ・エンコード及びデコードを提供するためのマルチ・フォーマット・エンコード/デコード(「MFX」:multi-format encode/decode)エンジン2233とを含む。少なくとも1つの実施例では、ジオメトリ・パイプライン2236及びメディア・エンジン2237は、各々、少なくとも1つのグラフィックス・コア2280Aによって提供されるスレッド実行リソースのための実行スレッドを生成する。
少なくとも1つの実施例では、グラフィックス・プロセッサ2200は、各々が(コア・サブ・スライスと呼ばれることがある)複数のサブ・コア2250A~550N、2260A~2260Nを有する、(コア・スライスと呼ばれることがある)モジュール式グラフィックス・コア2280A~2280Nを特徴とするスケーラブル・スレッド実行リソースを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2200は、任意の数のグラフィックス・コア2280A~2280Nを有することができる。少なくとも1つの実施例では、グラフィックス・プロセッサ2200は、少なくとも第1のサブ・コア2250A及び第2のサブ・コア2260Aを有するグラフィックス・コア2280Aを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2200は、単一のサブ・コア(たとえば、サブ・コア2250A)をもつ低電力プロセッサである。少なくとも1つの実施例では、グラフィックス・プロセッサ2200は、各々が第1のサブ・コア2250A~2250Nのセットと第2のサブ・コア2260A~2260Nのセットとを含む、複数のグラフィックス・コア2280A~2280Nを含む。少なくとも1つの実施例では、第1のサブ・コア2250A~2250N中の各サブ・コアは、少なくとも、実行ユニット(「EU」:execution unit)2252A~2252N及びメディア/テクスチャ・サンプラ2254A~2254Nの第1のセットを含む。少なくとも1つの実施例では、第2のサブ・コア2260A~2260N中の各サブ・コアは、少なくとも、実行ユニット2262A~2262N及びサンプラ2264A~2264Nの第2のセットを含む。少なくとも1つの実施例では、各サブ・コア2250A~2250N、2260A~2260Nは、共有リソース2270A~2270Nのセットを共有する。少なくとも1つの実施例では、共有リソース2270は、共有キャッシュ・メモリ及びピクセル動作論理を含む。
図23は、少なくとも1つの実施例による、プロセッサ2300を示す。少なくとも1つの実施例では、プロセッサ2300は、限定はしないが、命令を実施するための論理回路を含み得る。少なくとも1つの実施例では、プロセッサ2300は、x86命令、AMR命令、ASICのための特別命令などを含む命令を実施し得る。少なくとも1つの実施例では、プロセッサ2310は、カリフォルニア州サンタクララのIntel Corporationからの、MMX(商標)技術で可能にされたマイクロプロセッサ中の64ビット幅MMXレジスタなど、パック・データを記憶するためのレジスタを含み得る。少なくとも1つの実施例では、整数形式と浮動小数点形式の両方で利用可能なMMXレジスタは、SIMD及びストリーミングSIMD拡張(「SSE」:streaming SIMD extension)命令を伴うパック・データ要素で動作し得る。少なくとも1つの実施例では、SSE2、SSE3、SSE4、AVX、又はそれ以上(総称して「SSEx」と呼ばれる)技術に関係する128ビット幅XMMレジスタは、そのようなパック・データ・オペランドを保持し得る。少なくとも1つの実施例では、プロセッサ2310は、CUDAプログラムを加速するための命令を実施し得る。
少なくとも1つの実施例では、プロセッサ2300は、実行されるべき命令をフェッチし、プロセッサ・パイプラインにおいて後で使用されるべき命令を準備するためのイン・オーダー・フロント・エンド(「フロント・エンド」)2301を含む。少なくとも1つの実施例では、フロント・エンド2301は、いくつかのユニットを含み得る。少なくとも1つの実施例では、命令プリフェッチャ2326が、メモリから命令をフェッチし、命令を命令デコーダ2328にフィードし、命令デコーダ2328が命令を復号又は解釈する。たとえば、少なくとも1つの実施例では、命令デコーダ2328は、受信された命令を、実行のために「マイクロ命令」又は「マイクロ・オペレーション」と呼ばれる(「マイクロ・オプ」又は「uop」とも呼ばれる)1つ又は複数のオペレーションに復号する。少なくとも1つの実施例では、命令デコーダ2328は、命令を、動作を実施するためにマイクロアーキテクチャによって使用され得るオプコード及び対応するデータ並びに制御フィールドに構文解析する。少なくとも1つの実施例では、トレース・キャッシュ2330は、復号されたuopを、実行のためにuopキュー2334においてプログラム順のシーケンス又はトレースにアセンブルし得る。少なくとも1つの実施例では、トレース・キャッシュ2330が複雑な命令に遭遇したとき、マイクロコードROM2332が、動作を完了するために必要なuopを提供する。
少なくとも1つの実施例では、単一のマイクロ・オプにコンバートされ得る命令もあれば、全動作を完了するためにいくつかのマイクロ・オプを必要とする命令もある。少なくとも1つの実施例では、命令を完了するために5つ以上のマイクロ・オプが必要とされる場合、命令デコーダ2328は、マイクロコードROM2332にアクセスして命令を実施し得る。少なくとも1つの実施例では、命令は、命令デコーダ2328における処理のために少数のマイクロ・オプに復号され得る。少なくとも1つの実施例では、命令は、動作を達成するためにいくつかのマイクロ・オプが必要とされる場合、マイクロコードROM2332内に記憶され得る。少なくとも1つの実施例では、トレース・キャッシュ2330は、マイクロコードROM2332からの1つ又は複数の命令を完了するために、エントリ・ポイント・プログラマブル論理アレイ(「PLA」:programmable logic array)を参照して、マイクロコード・シーケンスを読み取るための正しいマイクロ命令ポインタを決定する。少なくとも1つの実施例では、マイクロコードROM2332が命令のためにマイクロ・オプのシーケンシングを終えた後、機械のフロント・エンド2301は、トレース・キャッシュ2330からマイクロ・オプをフェッチすることを再開し得る。
少なくとも1つの実施例では、アウト・オブ・オーダー実行エンジン(「アウト・オブ・オーダー・エンジン」)2303は、実行のために命令を準備し得る。少なくとも1つの実施例では、アウト・オブ・オーダー実行論理は、命令がパイプラインを下り、実行のためにスケジューリングされるときの性能を最適化するために、命令のフローを滑らかにし、それを並べ替えるためのいくつかのバッファを有する。アウト・オブ・オーダー実行エンジン2303は、限定はしないが、アロケータ/レジスタ・リネーマ2340と、メモリuopキュー2342と、整数/浮動小数点uopキュー2344と、メモリ・スケジューラ2346と、高速スケジューラ2302と、低速/汎用浮動小数点スケジューラ(「低速/汎用FP(floating point)スケジューラ」)2304と、単純浮動小数点スケジューラ(「単純FPスケジューラ」)2306とを含む。少なくとも1つの実施例では、高速スケジューラ2302、低速/汎用浮動小数点スケジューラ2304、及び単純浮動小数点スケジューラ2306は、総称して本明細書では「uopスケジューラ2302、2304、2306」とも呼ばれる。アロケータ/レジスタ・リネーマ2340は、実行するために各uopが必要とする機械バッファ及びリソースを割り振る。少なくとも1つの実施例では、アロケータ/レジスタ・リネーマ2340は、レジスタ・ファイルへのエントリ時に論理レジスタをリネームする。少なくとも1つの実施例では、アロケータ/レジスタ・リネーマ2340はまた、メモリ・スケジューラ2346及びuopスケジューラ2302、2304、2306の前の、2つのuopキュー、すなわちメモリ動作のためのメモリuopキュー2342及び非メモリ動作のための整数/浮動小数点uopキュー2344のうちの1つにおいて、各uopのためのエントリを割り振る。少なくとも1つの実施例では、uopスケジューラ2302、2304、2306は、uopがいつ実行する準備ができるかを、それらの従属入力レジスタ・オペランド・ソースが準備されていることと、それらの動作を完了するためにuopが必要とする実行リソースの利用可能性とに基づいて、決定する。少なくとも1つの実施例では、少なくとも1つの実施例の高速スケジューラ2302は、メイン・クロック・サイクルの半分ごとにスケジューリングし得、低速/汎用浮動小数点スケジューラ2304及び単純浮動小数点スケジューラ2306は、メイン・プロセッサ・クロック・サイクル当たりに1回スケジューリングし得る。少なくとも1つの実施例では、uopスケジューラ2302、2304、2306は、実行のためにuopをスケジューリングするためにディスパッチ・ポートを調停する。
少なくとも1つの実施例では、実行ブロック2311は、限定はしないが、整数レジスタ・ファイル/バイパス・ネットワーク2308と、浮動小数点レジスタ・ファイル/バイパス・ネットワーク(「FPレジスタ・ファイル/バイパス・ネットワーク」)2310と、アドレス生成ユニット(「AGU」:address generation unit)2312及び2314と、高速ALU2316及び2318と、低速ALU2320と、浮動小数点ALU(「FP」)2322と、浮動小数点移動ユニット(「FP移動」)2324とを含む。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2308及び浮動小数点レジスタ・ファイル/バイパス・ネットワーク2310は、本明細書では「レジスタ・ファイル2308、2310」とも呼ばれる。少なくとも1つの実施例では、AGU2312及び2314、高速ALU2316及び2318、低速ALU2320、浮動小数点ALU2322、及び浮動小数点移動ユニット2324は、本明細書では「実行ユニット2312、2314、2316、2318、2320、2322、及び2324」とも呼ばれる。少なくとも1つの実施例では、実行ブロックは、限定はしないが、(ゼロを含む)任意の数及びタイプのレジスタ・ファイル、バイパス・ネットワーク、アドレス生成ユニット、及び実行ユニットを、任意の組合せで含み得る。
少なくとも1つの実施例では、レジスタ・ファイル2308、2310は、uopスケジューラ2302、2304、2306と、実行ユニット2312、2314、2316、2318、2320、2322、及び2324との間に配置され得る。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2308は、整数演算を実施する。少なくとも1つの実施例では、浮動小数点レジスタ・ファイル/バイパス・ネットワーク2310は、浮動小数点演算を実施する。少なくとも1つの実施例では、レジスタ・ファイル2308、2310の各々は、限定はしないが、バイパス・ネットワークを含み得、バイパス・ネットワークは、レジスタ・ファイルにまだ書き込まれていない完了したばかりの結果を、新しい従属uopにバイパス又はフォワーディングし得る。少なくとも1つの実施例では、レジスタ・ファイル2308、2310は、互いにデータを通信し得る。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2308は、限定はしないが、2つの別個のレジスタ・ファイル、すなわち低次32ビットのデータのための1つのレジスタ・ファイル及び高次32ビットのデータのための第2のレジスタ・ファイルを含み得る。少なくとも1つの実施例では、浮動小数点命令は、通常、64~128ビット幅のオペランドを有するので、浮動小数点レジスタ・ファイル/バイパス・ネットワーク2310は、限定はしないが、128ビット幅のエントリを含み得る。
少なくとも1つの実施例では、実行ユニット2312、2314、2316、2318、2320、2322、2324は、命令を実行し得る。少なくとも1つの実施例では、レジスタ・ファイル2308、2310は、マイクロ命令が実行する必要がある整数及び浮動小数点データ・オペランド値を記憶する。少なくとも1つの実施例では、プロセッサ2300は、限定はしないが、任意の数及び組合せの実行ユニット2312、2314、2316、2318、2320、2322、2324を含み得る。少なくとも1つの実施例では、浮動小数点ALU2322及び浮動小数点移動ユニット2324は、浮動小数点、MMX、SIMD、AVX及びSSE、又は他の演算を実行し得る。少なくとも1つの実施例では、浮動小数点ALU2322は、限定はしないが、除算、平方根、及び剰余マイクロ・オプを実行するための64ビットずつの浮動小数点デバイダを含み得る。少なくとも1つの実施例では、浮動小数点値を伴う命令は、浮動小数点ハードウェアで対処され得る。少なくとも1つの実施例では、ALU演算は、高速ALU2316、2318に渡され得る。少なくとも1つの実施例では、高速ALU2316、2318は、クロック・サイクルの半分の実効レイテンシを伴う高速演算を実行し得る。少なくとも1つの実施例では、低速ALU2320は、限定はしないが、乗数、シフト、フラグ論理、及びブランチ処理などの長レイテンシ・タイプの演算のための整数実行ハードウェアを含み得るので、ほとんどの複雑な整数演算は低速ALU2320に進む。少なくとも1つの実施例では、メモリ・ロード/ストア動作は、AGU2312、2314によって実行され得る。少なくとも1つの実施例では、高速ALU2316、高速ALU2318、及び低速ALU2320は、64ビット・データ・オペランドで整数演算を実施し得る。少なくとも1つの実施例では、高速ALU2316、高速ALU2318、及び低速ALU2320は、16、32、128、256などを含む様々なデータ・ビット・サイズをサポートするために実装され得る。少なくとも1つの実施例では、浮動小数点ALU2322及び浮動小数点移動ユニット2324は、様々なビット幅を有する様々なオペランドをサポートするために実装され得る。少なくとも1つの実施例では、浮動小数点ALU2322及び浮動小数点移動ユニット2324は、SIMD及びマルチメディア命令と併せた128ビット幅のパック・データ・オペランドで動作し得る。
少なくとも1つの実施例では、uopスケジューラ2302、2304、2306は、親ロードが実行し終える前に従属演算をディスパッチする。少なくとも1つの実施例では、uopは、プロセッサ2300において投機的にスケジューリング及び実行され得るので、プロセッサ2300は、メモリ・ミスに対処するための論理をも含み得る。少なくとも1つの実施例では、データ・キャッシュにおいてデータ・ロードがミスした場合、一時的に不正確なデータをもつスケジューラを通り過ぎたパイプラインにおいて、進行中の従属演算があり得る。少なくとも1つの実施例では、リプレイ機構が、不正確なデータを使用する命令を追跡及び再実行する。少なくとも1つの実施例では、従属演算は、リプレイされる必要があり得、独立した演算は、完了することを可能にされ得る。少なくとも1つの実施例では、プロセッサの少なくとも1つの実施例のスケジューラ及びリプレイ機構はまた、テキスト・ストリング比較演算のための命令シーケンスを捕捉するように設計され得る。
少なくとも1つの実施例では、「レジスタ」という用語は、オペランドを識別するための命令の一部として使用され得るオンボード・プロセッサ・ストレージ・ロケーションを指し得る。少なくとも1つの実施例では、レジスタは、(プログラマの視点から見て)プロセッサの外部から使用可能であり得るものであり得る。少なくとも1つの実施例では、レジスタは、特定のタイプの回路に限定されないことがある。むしろ、少なくとも1つの実施例では、レジスタは、データを記憶し、データを提供し、本明細書で説明される機能を実施し得る。少なくとも1つの実施例では、本明細書で説明されるレジスタは、専用物理レジスタ、レジスタ・リネーミングを使用して動的に割り振られる物理レジスタ、専用物理レジスタと動的に割り振られる物理レジスタとの組合せなど、任意の数の異なる技法を使用して、プロセッサ内の回路要素によって実装され得る。少なくとも1つの実施例では、整数レジスタは、32ビット整数データを記憶する。少なくとも1つの実施例のレジスタ・ファイルは、パック・データのための8つのマルチメディアSIMDレジスタをも含んでいる。
図24は、少なくとも1つの実施例による、プロセッサ2400を示す。少なくとも1つの実施例では、プロセッサ2400は、限定はしないが、1つ又は複数のプロセッサ・コア(「コア」)2402A~2402Nと、統合されたメモリ・コントローラ2414と、統合されたグラフィックス・プロセッサ2408とを含む。少なくとも1つの実施例では、プロセッサ2400は、破線ボックスによって表される追加プロセッサ・コア2402Nまでの追加コアを含むことができる。少なくとも1つの実施例では、プロセッサ・コア2402A~2402Nの各々は、1つ又は複数の内部キャッシュ・ユニット2404A~2404Nを含む。少なくとも1つの実施例では、各プロセッサ・コアはまた、1つ又は複数の共有キャッシュ・ユニット2406へのアクセスを有する。
少なくとも1つの実施例では、内部キャッシュ・ユニット2404A~2404Nと共有キャッシュ・ユニット2406とは、プロセッサ2400内のキャッシュ・メモリ階層を表す。少なくとも1つの実施例では、キャッシュ・メモリ・ユニット2404A~2404Nは、各プロセッサ・コア内の命令及びデータ・キャッシュの少なくとも1つのレベル、及びL2、L3、レベル4(「L4」)などの共有中間レベル・キャッシュの1つ又は複数のレベル、又はキャッシュの他のレベルを含み得、ここで、外部メモリの前の最高レベルのキャッシュは、LLCとして分類される。少なくとも1つの実施例では、キャッシュ・コヒーレンシ論理は、様々なキャッシュ・ユニット2406及び2404A~2404N間でコヒーレンシを維持する。
少なくとも1つの実施例では、プロセッサ2400は、1つ又は複数のバス・コントローラ・ユニット2416とシステム・エージェント・コア2410とのセットをも含み得る。少なくとも1つの実施例では、1つ又は複数のバス・コントローラ・ユニット2416は、1つ又は複数のPCI又はPCIエクスプレス・バスなどの周辺バスのセットを管理する。少なくとも1つの実施例では、システム・エージェント・コア2410は、様々なプロセッサ構成要素のための管理機能性を提供する。少なくとも1つの実施例では、システム・エージェント・コア2410は、様々な外部メモリ・デバイス(図示せず)へのアクセスを管理するための1つ又は複数の統合されたメモリ・コントローラ2414を含む。
少なくとも1つの実施例では、プロセッサ・コア2402A~2402Nのうちの1つ又は複数は、同時マルチスレッディングのサポートを含む。少なくとも1つの実施例では、システム・エージェント・コア2410は、マルチスレッド処理中にプロセッサ・コア2402A~2402Nを協調させ、動作させるための構成要素を含む。少なくとも1つの実施例では、システム・エージェント・コア2410は、追加として、電力制御ユニット(「PCU」:power control unit)を含み得、PCUは、プロセッサ・コア2402A~2402N及びグラフィックス・プロセッサ2408の1つ又は複数の電力状態を調節するための論理及び構成要素を含む。
少なくとも1つの実施例では、プロセッサ2400は、追加として、グラフィックス処理動作を実行するためのグラフィックス・プロセッサ2408を含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2408は、共有キャッシュ・ユニット2406、及び1つ又は複数の統合されたメモリ・コントローラ2414を含むシステム・エージェント・コア2410と結合する。少なくとも1つの実施例では、システム・エージェント・コア2410は、1つ又は複数の結合されたディスプレイへのグラフィックス・プロセッサ出力を駆動するためのディスプレイ・コントローラ2411をも含む。少なくとも1つの実施例では、ディスプレイ・コントローラ2411はまた、少なくとも1つの相互接続を介してグラフィックス・プロセッサ2408と結合された別個のモジュールであり得るか、又はグラフィックス・プロセッサ2408内に組み込まれ得る。
少なくとも1つの実施例では、プロセッサ2400の内部構成要素を結合するために、リング・ベースの相互接続ユニット2412が使用される。少なくとも1つの実施例では、ポイントツーポイント相互接続、切替え相互接続、又は他の技法などの代替相互接続ユニットが使用され得る。少なくとも1つの実施例では、グラフィックス・プロセッサ2408は、I/Oリンク2413を介してリング相互接続2412と結合する。
少なくとも1つの実施例では、I/Oリンク2413は、様々なプロセッサ構成要素と、eDRAMモジュールなどの高性能組み込みメモリ・モジュール2418との間の通信を容易にするオン・パッケージI/O相互接続を含む、複数の種類のI/O相互接続のうちの少なくとも1つを表す。少なくとも1つの実施例では、プロセッサ・コア2402A~2402Nの各々と、グラフィックス・プロセッサ2408とは、共有LLCとして組み込みメモリ・モジュール2418を使用する。
少なくとも1つの実施例では、プロセッサ・コア2402A~2402Nは、共通の命令セット・アーキテクチャを実行する同種のコアである。少なくとも1つの実施例では、プロセッサ・コア2402A~2402Nは、ISAという観点から異種であり、ここで、プロセッサ・コア2402A~2402Nのうちの1つ又は複数は、共通の命令セットを実行し、プロセッサ・コア2402A~24-02Nのうちの1つ又は複数の他のコアは、共通の命令セットのサブセット、又は異なる命令セットを実行する。少なくとも1つの実施例では、プロセッサ・コア2402A~2402Nは、マイクロアーキテクチャという観点から異種であり、ここで、電力消費量が比較的高い1つ又は複数のコアは、電力消費量がより低い1つ又は複数のコアと結合する。少なくとも1つの実施例では、プロセッサ2400は、1つ又は複数のチップ上に、又はSoC集積回路として実装され得る。
図25は、説明される少なくとも1つの実施例による、グラフィックス・プロセッサ・コア2500を示す。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2500は、グラフィックス・コア・アレイ内に含まれる。少なくとも1つの実施例では、コア・スライスと呼ばれることがあるグラフィックス・プロセッサ・コア2500は、モジュール式グラフィックス・プロセッサ内の1つ又は複数のグラフィックス・コアであり得る。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2500は、1つのグラフィックス・コア・スライスの例示であり、本明細書で説明されるグラフィックス・プロセッサは、ターゲット電力及び性能エンベロープに基づいて、複数のグラフィックス・コア・スライスを含み得る。少なくとも1つの実施例では、各グラフィックス・コア2500は、汎用及び固定機能論理のモジュール式ブロックを含む、サブ・スライスとも呼ばれる複数のサブ・コア2501A~2501Fと結合された固定機能ブロック2530を含むことができる。
少なくとも1つの実施例では、固定機能ブロック2530は、たとえば、より低い性能及び/又はより低い電力のグラフィックス・プロセッサ実装形態において、グラフィックス・プロセッサ2500中のすべてのサブ・コアによって共有され得るジオメトリ/固定機能パイプライン2536を含む。少なくとも1つの実施例では、ジオメトリ/固定機能パイプライン2536は、3D固定機能パイプラインと、ビデオ・フロント・エンド・ユニットと、スレッド・スポーナ(spawner)及びスレッド・ディスパッチャと、統一リターン・バッファを管理する統一リターン・バッファ・マネージャとを含む。
少なくとも1つの実施例では、固定機能ブロック2530はまた、グラフィックスSoCインターフェース2537と、グラフィックス・マイクロコントローラ2538と、メディア・パイプライン2539とを含む。グラフィックスSoCインターフェース2537は、グラフィックス・コア2500と、SoC集積回路内の他のプロセッサ・コアとの間のインターフェースを提供する。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2538は、スレッド・ディスパッチと、スケジューリングと、プリエンプションとを含む、グラフィックス・プロセッサ2500の様々な機能を管理するように構成可能であるプログラマブル・サブ・プロセッサである。少なくとも1つの実施例では、メディア・パイプライン2539は、画像及びビデオ・データを含むマルチメディア・データの復号、符号化、前処理、及び/又は後処理を容易にするための論理を含む。少なくとも1つの実施例では、メディア・パイプライン2539は、サブ・コア2501~2501F内のコンピュート論理又はサンプリング論理への要求を介して、メディア動作を実装する。
少なくとも1つの実施例では、SoCインターフェース2537は、グラフィックス・コア2500が汎用アプリケーション・プロセッサ・コア(たとえば、CPU)及び/又はSoC内の他の構成要素と通信することを可能にし、SoC内の他の構成要素は、共有LLCメモリ、システムRAM、及び/或いは組み込みオンチップ又はオンパッケージDRAMなどのメモリ階層要素を含む。少なくとも1つの実施例では、SoCインターフェース2537はまた、カメラ撮像パイプラインなど、SoC内の固定機能デバイスとの通信を可能にすることができ、グラフィックス・コア2500とSoC内のCPUとの間で共有され得るグローバル・メモリ・アトミックの使用を可能にし、及び/又はそれを実装する。少なくとも1つの実施例では、SoCインターフェース2537はまた、グラフィックス・コア2500のための電力管理制御を実装し、グラフィック・コア2500のクロック・ドメインとSoC内の他のクロック・ドメインとの間のインターフェースを可能にすることができる。少なくとも1つの実施例では、SoCインターフェース2537は、グラフィックス・プロセッサ内の1つ又は複数のグラフィックス・コアの各々にコマンド及び命令を提供するように構成されたコマンド・ストリーマ及びグローバル・スレッド・ディスパッチャからのコマンド・バッファの受信を可能にする。少なくとも1つの実施例では、コマンド及び命令は、メディア動作が実施されるべきであるときにメディア・パイプライン2539にディスパッチされ得るか、又は、グラフィックス処理動作が実施されるべきであるときにジオメトリ及び固定機能パイプライン(たとえば、ジオメトリ及び固定機能パイプライン2536、ジオメトリ及び固定機能パイプライン2514)にディスパッチされ得る。
少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2538は、グラフィックス・コア2500のための様々なスケジューリング及び管理タスクを実施するように構成され得る。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2538は、サブ・コア2501A~2501F内の実行ユニット(EU)アレイ2502A~2502F、2504A~2504F内の様々なグラフィックス並列エンジンに対して、グラフィックスを実施し、及び/又はワークロード・スケジューリングを算出することができる。少なくとも1つの実施例では、グラフィックス・コア2500を含むSoCのCPUコア上で実行しているホスト・ソフトウェアは、複数のグラフィック・プロセッサ・ドアベルのうちの1つにワークロードをサブミットすることができ、このドアベルが、適切なグラフィックス・エンジンに対するスケジューリング動作を呼び出す。少なくとも1つの実施例では、スケジューリング動作は、どのワークロードを次に稼働すべきかを決定することと、ワークロードをコマンド・ストリーマにサブミットすることと、エンジン上で稼働している既存のワークロードをプリエンプトすることと、ワークロードの進行を監視することと、ワークロードが完了したときにホスト・ソフトウェアに通知することとを含む。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2538はまた、グラフィックス・コア2500のための低電力又はアイドル状態を促進して、オペレーティング・システム及び/又はシステム上のグラフィックス・ドライバ・ソフトウェアとは無関係に、低電力状態移行にわたってグラフィックス・コア2500内のレジスタを保存及び復元するアビリティをグラフィックス・コア2500に提供することができる。
少なくとも1つの実施例では、グラフィックス・コア2500は、示されているサブ・コア2501A~2501Fよりも多い又はそれよりも少ない、N個までのモジュール式サブ・コアを有し得る。N個のサブ・コアの各セットについて、少なくとも1つの実施例では、グラフィックス・コア2500はまた、共有機能論理2510、共有及び/又はキャッシュ・メモリ2512、ジオメトリ/固定機能パイプライン2514、並びに様々なグラフィックスを加速し、処理動作を算出するための追加の固定機能論理2516を含むことができる。少なくとも1つの実施例では、共有機能論理2510は、グラフィックス・コア2500内の各N個のサブ・コアによって共有され得る論理ユニット(たとえば、サンプラ、数理、及び/又はスレッド間通信論理)を含むことができる。共有及び/又はキャッシュ・メモリ2512は、グラフィックス・コア2500内のN個のサブ・コア2501A~2501FのためのLLCであり得、また、複数のサブ・コアによってアクセス可能である共有メモリとして働き得る。少なくとも1つの実施例では、ジオメトリ/固定機能パイプライン2514は、固定機能ブロック2530内のジオメトリ/固定機能パイプライン2536の代わりに含まれ得、同じ又は同様の論理ユニットを含むことができる。
少なくとも1つの実施例では、グラフィックス・コア2500は、グラフィックス・コア2500による使用のための様々な固定機能加速論理を含むことができる追加の固定機能論理2516を含む。少なくとも1つの実施例では、追加の固定機能論理2516は、位置限定シェーディング(position only shading)において使用するための追加のジオメトリ・パイプラインを含む。位置限定シェーディングでは、少なくとも2つのジオメトリ・パイプラインが存在するが、ジオメトリ/固定機能パイプライン2516、2536内の完全ジオメトリ・パイプライン、並びに選別パイプライン(cull pipeline)においてであり、選別パイプラインは、追加の固定機能論理2516内に含まれ得る追加のジオメトリ・パイプラインである。少なくとも1つの実施例では、選別パイプラインは、完全ジオメトリ・パイプラインの縮小版である。少なくとも1つの実施例では、完全パイプライン及び選別パイプラインは、アプリケーションの異なるインスタンスを実行することができ、各インスタンスは別個のコンテキストを有する。少なくとも1つの実施例では、位置限定シェーディングは、切り捨てられた三角形の長い選別ランを隠すことができ、これは、いくつかのインスタンスにおいてシェーディングがより早く完了することを可能にする。たとえば、少なくとも1つの実施例では、選別パイプラインは、ピクセルの、フレーム・バッファへのラスタ化及びレンダリングを実施することなしに、頂点の位置属性をフェッチし、シェーディングするので、追加の固定機能論理2516内の選別パイプライン論理は、メイン・アプリケーションと並列で位置シェーダを実行することができ、全体的に完全パイプラインよりも速く臨界結果(critical result)を生成する。少なくとも1つの実施例では、選別パイプラインは、生成された臨界結果を使用して、すべての三角形について、それらの三角形が選別されているかどうかにかかわらず、可視性情報を算出することができる。少なくとも1つの実施例では、(このインスタンスではリプレイ・パイプラインと呼ばれることがある)完全パイプラインは、可視性情報を消費して、選別された三角形を飛ばして可視三角形のみをシェーディングすることができ、可視三角形は、最終的にラスタ化フェーズに渡される。
少なくとも1つの実施例では、追加の固定機能論理2516はまた、CUDAプログラムを加速するために、固定機能行列乗算論理など、汎用処理加速論理を含むことができる。
少なくとも1つの実施例では、各グラフィックス・サブ・コア2501A~2501Fは、実行リソースのセットを含み、実行リソースのセットは、グラフィックス・パイプライン、メディア・パイプライン、又はシェーダ・プログラムによる要求に応答して、グラフィックス動作、メディア動作、及びコンピュート動作を実施するために使用され得る。少なくとも1つの実施例では、グラフィックス・サブ・コア2501A~2501Fは、複数のEUアレイ2502A~2502F、2504A~2504Fと、スレッド・ディスパッチ及びスレッド間通信(「TD/IC」:thread dispatch and inter-thread communication)論理2503A~2503Fと、3D(たとえば、テクスチャ)サンプラ2505A~2505Fと、メディア・サンプラ2506A~2506Fと、シェーダ・プロセッサ2507A~2507Fと、共有ローカル・メモリ(「SLM」:shared local memory)2508A~2508Fとを含む。EUアレイ2502A~2502F、2504A~2504Fは、各々、複数の実行ユニットを含み、複数の実行ユニットは、グラフィックス、メディア、又はコンピュート・シェーダ・プログラムを含むグラフィックス動作、メディア動作、又はコンピュート動作のサービスにおいて浮動小数点及び整数/固定小数点論理演算を実施することが可能なGPGPUである。少なくとも1つの実施例では、TD/IC論理2503A~2503Fは、サブ・コア内の実行ユニットのためのローカル・スレッド・ディスパッチ及びスレッド制御動作を実施し、サブ・コアの実行ユニット上で実行しているスレッド間の通信を容易にする。少なくとも1つの実施例では、3Dサンプラ2505A~2505Fは、テクスチャ又は他の3Dグラフィックス関係データをメモリに読み取ることができる。少なくとも1つの実施例では、3Dサンプラは、所与のテクスチャに関連する、構成されたサンプル状態及びテクスチャ・フォーマットに基づいて、テクスチャ・データを異なるやり方で読み取ることができる。少なくとも1つの実施例では、メディア・サンプラ2506A~2506Fは、メディア・データに関連するタイプ及びフォーマットに基づいて、同様の読取り動作を実施することができる。少なくとも1つの実施例では、各グラフィックス・サブ・コア2501A~2501Fは、代替的に統一3D及びメディア・サンプラを含むことができる。少なくとも1つの実施例では、サブ・コア2501A~2501Fの各々内の実行ユニット上で実行しているスレッドは、スレッド・グループ内で実行しているスレッドがオンチップ・メモリの共通のプールを使用して実行することを可能にするために、各サブ・コア内の共有ローカル・メモリ2508A~2508Fを利用することができる。
図26は、少なくとも1つの実施例による、並列処理ユニット(「PPU」:parallel processing unit)2600を示す。少なくとも1つの実施例では、PPU2600は、PPU2600によって実行された場合、PPU2600に、本明細書で説明されるプロセス及び技法のいくつか又はすべてを実施させる機械可読コードで構成される。少なくとも1つの実施例では、PPU2600はマルチスレッド・プロセッサであり、マルチスレッド・プロセッサは、1つ又は複数の集積回路デバイス上で実装され、(機械可読命令又は単に命令とも呼ばれる)コンピュータ可読命令を複数のスレッド上で並列に処理するように設計されたレイテンシ隠蔽技法としてマルチスレッディングを利用する。少なくとも1つの実施例では、スレッドは、実行のスレッドを指し、PPU2600によって実行されるように構成された命令のセットのインスタンス化である。少なくとも1つの実施例では、PPU2600は、LCDデバイスなどのディスプレイ・デバイス上での表示のための2次元(「2D」)画像データを生成するために3次元(「3D」)グラフィックス・データを処理するためのグラフィックス・レンダリング・パイプラインを実装するように構成されたGPUである。少なくとも1つの実施例では、PPU2600は、線形代数演算及び機械学習演算などの算出を実施するために利用される。図26は、単に例示を目的とした例示的な並列プロセッサを示し、少なくとも1つの実施例において実装され得るプロセッサ・アーキテクチャの非限定的な実例として解釈されるべきである。
少なくとも1つの実施例では、1つ又は複数のPPU2600は、高性能コンピューティング(「HPC」:High Performance Computing)、データ・センタ、及び機械学習アプリケーションを加速するように構成される。少なくとも1つの実施例では、1つ又は複数のPPU2600は、CUDAプログラムを加速するように構成される。少なくとも1つの実施例では、PPU2600は、限定はしないが、I/Oユニット2606と、フロント・エンド・ユニット2610と、スケジューラ・ユニット2612と、ワーク分散ユニット2614と、ハブ2616と、クロスバー(「Xバー」:crossbar)2620と、1つ又は複数の汎用処理クラスタ(「GPC」:general processing cluster)2618と、1つ又は複数のパーティション・ユニット(「メモリ・パーティション・ユニット」)2622とを含む。少なくとも1つの実施例では、PPU2600は、1つ又は複数の高速GPU相互接続(「GPU相互接続」)2608を介してホスト・プロセッサ又は他のPPU2600に接続される。少なくとも1つの実施例では、PPU2600は、システム・バス又は相互接続2602を介してホスト・プロセッサ又は他の周辺デバイスに接続される。少なくとも1つの実施例では、PPU2600は、1つ又は複数のメモリ・デバイス(「メモリ」)2604を備えるローカル・メモリに接続される。少なくとも1つの実施例では、メモリ・デバイス2604は、限定はしないが、1つ又は複数のダイナミック・ランダム・アクセス・メモリ(DRAM)デバイスを含む。少なくとも1つの実施例では、1つ又は複数のDRAMデバイスは、複数のDRAMダイが各デバイス内で積層された高帯域幅メモリ(「HBM」)サブシステムとして構成され、及び/又は構成可能である。
少なくとも1つの実施例では、高速GPU相互接続2608は、ワイヤ・ベースのマルチ・レーン通信リンクを指し得、ワイヤ・ベースのマルチ・レーン通信リンクは、1つ又は複数のCPUと組み合わせられた1つ又は複数のPPU2600をスケーリングし、含めるために、システムによって使用され、PPU2600とCPUとの間のキャッシュ・コヒーレンス、及びCPUマスタリングをサポートする。少なくとも1つの実施例では、データ及び/又はコマンドは、高速GPU相互接続2608によって、ハブ2616を通して、1つ又は複数のコピー・エンジン、ビデオ・エンコーダ、ビデオ・デコーダ、電力管理ユニット、及び図26に明示的に示されていないこともある他の構成要素など、PPU2600の他のユニットに/から送信される。
少なくとも1つの実施例では、I/Oユニット2606は、システム・バス2602を介して(図26に示されていない)ホスト・プロセッサから通信(たとえば、コマンド、データ)を送受信するように構成される。少なくとも1つの実施例では、I/Oユニット2606は、システム・バス2602を介して直接、又は、メモリ・ブリッジなどの1つ又は複数の中間デバイスを通して、ホスト・プロセッサと通信する。少なくとも1つの実施例では、I/Oユニット2606は、システム・バス2602を介してPPU2600のうちの1つ又は複数などの1つ又は複数の他のプロセッサと通信し得る。少なくとも1つの実施例では、I/Oユニット2606は、PCIeインターフェースを、PCIeバスを介した通信のために実装する。少なくとも1つの実施例では、I/Oユニット2606は、外部デバイスと通信するためのインターフェースを実装する。
少なくとも1つの実施例では、I/Oユニット2606は、システム・バス2602を介して受信されたパケットを復号する。少なくとも1つの実施例では、少なくともいくつかのパケットは、PPU2600に様々な動作を実施させるように構成されたコマンドを表す。少なくとも1つの実施例では、I/Oユニット2606は、復号されたコマンドを、コマンドによって指定されるPPU2600の様々な他のユニットに送信する。少なくとも1つの実施例では、コマンドは、フロント・エンド・ユニット2610に送信され、及び/或いは、ハブ2616、又は(図26に明示的に示されていない)1つ又は複数のコピー・エンジン、ビデオ・エンコーダ、ビデオ・デコーダ、電力管理ユニットなど、PPU2600の他のユニットに送信される。少なくとも1つの実施例では、I/Oユニット2606はPPU2600の様々な論理ユニット間で及びそれらの間で通信をルーティングするように構成される。
少なくとも1つの実施例では、ホスト・プロセッサによって実行されるプログラムは、処理のためにワークロードをPPU2600に提供するバッファにおいて、コマンド・ストリームを符号化する。少なくとも1つの実施例では、ワークロードは、命令と、それらの命令によって処理されるべきデータとを含む。少なくとも1つの実施例では、バッファは、ホスト・プロセッサとPPU2600の両方によってアクセス(たとえば、読取り/書込み)可能であるメモリ中の領域であり、ホスト・インターフェース・ユニットは、I/Oユニット2606によってシステム・バス2602を介して送信されるメモリ要求を介して、システム・バス2602に接続されたシステム・メモリ中のバッファにアクセスするように構成され得る。少なくとも1つの実施例では、ホスト・プロセッサは、バッファにコマンド・ストリームを書き込み、次いでコマンド・ストリームの開始に対するポインタをPPU2600に送信し、それにより、フロント・エンド・ユニット2610は、1つ又は複数のコマンド・ストリームに対するポインタを受信し、1つ又は複数のコマンド・ストリームを管理して、コマンド・ストリームからコマンドを読み取り、コマンドをPPU2600の様々なユニットにフォワーディングする。
少なくとも1つの実施例では、フロント・エンド・ユニット2610は、1つ又は複数のコマンド・ストリームによって定義されるタスクを処理するように様々なGPC2618を構成するスケジューラ・ユニット2612に結合される。少なくとも1つの実施例では、スケジューラ・ユニット2612は、スケジューラ・ユニット2612によって管理される様々なタスクに関係する状態情報を追跡するように構成され、状態情報は、GPC2618のうちのどれにタスクが割り当てられるか、タスクがアクティブであるのか非アクティブであるのか、タスクに関連する優先レベルなどを指示し得る。少なくとも1つの実施例では、スケジューラ・ユニット2612は、GPC2618のうちの1つ又は複数上での複数のタスクの実行を管理する。
少なくとも1つの実施例では、スケジューラ・ユニット2612は、GPC2618上での実行のためのタスクをディスパッチするように構成されたワーク分散ユニット2614に結合される。少なくとも1つの実施例では、ワーク分散ユニット2614は、スケジューラ・ユニット2612から受信された、スケジューリングされたタスクの数を追跡し、ワーク分散ユニット2614は、GPC2618の各々について、ペンディング・タスク・プール及びアクティブ・タスク・プールを管理する。少なくとも1つの実施例では、ペンディング・タスク・プールは、特定のGPC2618によって処理されるように割り当てられたタスクを含んでいるいくつかのスロット(たとえば、32個のスロット)を備え、アクティブ・タスク・プールは、GPC2618によってアクティブに処理されているタスクのためのいくつかのスロット(たとえば、4つのスロット)を備え得、それにより、GPC2618のうちの1つがタスクの実行を完了したとき、GPC2618のためのアクティブ・タスク・プールからそのタスクが排除され、ペンディング・タスク・プールからの他のタスクのうちの1つが選択され、GPC2618上での実行のためにスケジューリングされる。少なくとも1つの実施例では、データ依存性が解決されるのを待っている間など、アクティブ・タスクがGPC2618上でアイドルである場合、アクティブ・タスクがGPC2618から排除され、ペンディング・タスク・プールに戻され、その間に、ペンディング・タスク・プール中の別のタスクが選択され、GPC2618上での実行のためにスケジューリングされる。
少なくとも1つの実施例では、ワーク分散ユニット2614は、Xバー2620を介して1つ又は複数のGPC2618と通信する。少なくとも1つの実施例では、Xバー2620は、PPU2600の多くのユニットをPPU2600の他のユニットに結合する相互接続ネットワークであり、ワーク分散ユニット2614を特定のGPC2618に結合するように構成され得る。少なくとも1つの実施例では、PPU2600の1つ又は複数の他のユニットも、ハブ2616を介してXバー2620に接続され得る。
少なくとも1つの実施例では、タスクはスケジューラ・ユニット2612によって管理され、ワーク分散ユニット2614によってGPC2618のうちの1つにディスパッチされる。GPC2618は、タスクを処理し、結果を生成するように構成される。少なくとも1つの実施例では、結果は、GPC2618内の他のタスクによって消費されるか、Xバー2620を介して異なるGPC2618にルーティングされるか、又はメモリ2604に記憶され得る。少なくとも1つの実施例では、結果は、パーティション・ユニット2622を介してメモリ2604に書き込まれ得、パーティション・ユニット2622は、メモリ2604への/からのデータの読取り及び書込みを行うためのメモリ・インターフェースを実装する。少なくとも1つの実施例では、結果は、高速GPU相互接続2608を介して別のPPU2604又はCPUに送信され得る。少なくとも1つの実施例では、PPU2600は、限定はしないが、PPU2600に結合された別個の個別メモリ・デバイス2604の数に等しいU個のパーティション・ユニット2622を含む。
少なくとも1つの実施例では、ホスト・プロセッサはドライバ・カーネルを実行し、ドライバ・カーネルは、ホスト・プロセッサ上で実行している1つ又は複数のアプリケーションがPPU2600上での実行のために動作をスケジューリングすることを可能にするアプリケーション・プログラミング・インターフェース(「API」)を実装する。少なくとも1つの実施例では、複数のコンピュート・アプリケーションが、PPU2600によって同時に実行され、PPU2600は、複数のコンピュート・アプリケーションに対して、隔離、サービス品質(「QoS」:quality of service)、及び独立したアドレス空間を提供する。少なくとも1つの実施例では、アプリケーションは、PPU2600による実行のための1つ又は複数のタスクをドライバ・カーネルに生成させる(たとえば、APIコールの形態の)命令を生成し、ドライバ・カーネルは、PPU2600によって処理されている1つ又は複数のストリームにタスクを出力する。少なくとも1つの実施例では、各タスクは、ワープと呼ばれることがある関係スレッドの1つ又は複数のグループを備える。少なくとも1つの実施例では、ワープは、並列に実行され得る複数の関係スレッド(たとえば、32個のスレッド)を備える。少なくとも1つの実施例では、連動スレッドは、タスクを実施するための命令を含み、共有メモリを通してデータを交換する、複数のスレッドを指すことができる。
図27は、少なくとも1つの実施例による、GPC2700を示す。少なくとも1つの実施例では、GPC2700は、図26のGPC2618である。少なくとも1つの実施例では、各GPC2700は、限定はしないが、タスクを処理するためのいくつかのハードウェア・ユニットを含み、各GPC2700は、限定はしないが、パイプライン・マネージャ2702、プレ・ラスタ演算ユニット(「PROP」:pre-raster operation)2704、ラスタ・エンジン2708、ワーク分散クロスバー(「WDX」:work distribution crossbar)2716、MMU2718、1つ又は複数のデータ処理クラスタ(「DPC」:Data Processing Cluster)2706、及びパーツの任意の好適な組合せを含む。
少なくとも1つの実施例では、GPC2700の動作は、パイプライン・マネージャ2702によって制御される。少なくとも1つの実施例では、パイプライン・マネージャ2702は、GPC2700に割り振られたタスクを処理するための1つ又は複数のDPC2706の構成を管理する。少なくとも1つの実施例では、パイプライン・マネージャ2702は、グラフィックス・レンダリング・パイプラインの少なくとも一部分を実装するように、1つ又は複数のDPC2706のうちの少なくとも1つを構成する。少なくとも1つの実施例では、DPC2706は、プログラマブル・ストリーミング・マルチプロセッサ(「SM」:streaming multiprocessor)2714上で頂点シェーダ・プログラムを実行するように構成される。少なくとも1つの実施例では、パイプライン・マネージャ2702は、ワーク分散ユニットから受信されたパケットを、GPC2700内の適切な論理ユニットにルーティングするように構成され、少なくとも1つの実施例では、いくつかのパケットは、PROP2704中の固定機能ハードウェア・ユニット及び/又はラスタ・エンジン2708にルーティングされ得、他のパケットは、プリミティブ・エンジン2712又はSM2714による処理のためにDPC2706にルーティングされ得る。少なくとも1つの実施例では、パイプライン・マネージャ2702は、コンピューティング・パイプラインを実装するように、DPC2706のうちの少なくとも1つを構成する。少なくとも1つの実施例では、パイプライン・マネージャ2702は、CUDAプログラムの少なくとも一部分を実行するように、DPC2706のうちの少なくとも1つを構成する。
少なくとも1つの実施例では、PROPユニット2704は、ラスタ・エンジン2708及びDPC2706によって生成されたデータを、図26と併せて上記でより詳細に説明されたメモリ・パーティション・ユニット2622など、パーティション・ユニット中のラスタ演算(「ROP」:Raster Operation)ユニットにルーティングするように構成される。少なくとも1つの実施例では、PROPユニット2704は、色ブレンディングのための最適化を実施すること、ピクセル・データを組織化すること、アドレス・トランスレーションを実施することなどを行うように構成される。少なくとも1つの実施例では、ラスタ・エンジン2708は、限定はしないが、様々なラスタ演算を実施するように構成されたいくつかの固定機能ハードウェア・ユニットを含み、少なくとも1つの実施例では、ラスタ・エンジン2708は、限定はしないが、セットアップ・エンジン、粗いラスタ・エンジン、選別エンジン、クリッピング・エンジン、細かいラスタ・エンジン、タイル合体エンジン、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、セットアップ・エンジンは、変換された頂点を受信し、頂点によって定義された幾何学的プリミティブに関連する平面方程式を生成し、平面方程式は、プリミティブについてのカバレージ情報(たとえば、タイルのためのx、yカバレージ・マスク)を生成するために粗いラスタ・エンジンに送信され、粗いラスタ・エンジンの出力は選別エンジンに送信され、zテストに落ちたプリミティブに関連するフラグメントが選別され、クリッピング・エンジンに送信され、視錐台の外側にあるフラグメントがクリップされる。少なくとも1つの実施例では、クリッピング及び選別を通過したフラグメントは、セットアップ・エンジンによって生成された平面方程式に基づいてピクセル・フラグメントについての属性を生成するために、細かいラスタ・エンジンに渡される。少なくとも1つの実施例では、ラスタ・エンジン2708の出力は、DPC2706内に実装されたフラグメント・シェーダによってなど、任意の好適なエンティティによって処理されるべきフラグメントを含む。
少なくとも1つの実施例では、GPC2700中に含まれる各DPC2706は、限定はしないが、Mパイプ・コントローラ(「MPC」:M-Pipe Controller)2710、プリミティブ・エンジン2712、1つ又は複数のSM2714、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、MPC2710は、DPC2706の動作を制御して、パイプライン・マネージャ2702から受信されたパケットを、DPC2706中の適切なユニットにルーティングする。少なくとも1つの実施例では、頂点に関連するパケットは、頂点に関連する頂点属性をメモリからフェッチするように構成されたプリミティブ・エンジン2712にルーティングされ、対照的に、シェーダ・プログラムに関連するパケットは、SM2714に送信され得る。
少なくとも1つの実施例では、SM2714は、限定はしないが、いくつかのスレッドによって表されたタスクを処理するように構成されたプログラマブル・ストリーミング・プロセッサを含む。少なくとも1つの実施例では、SM2714はマルチスレッド化され、スレッドの特定のグループからの複数のスレッド(たとえば、32個のスレッド)を同時に実行するように構成され、SIMDアーキテクチャを実装し、スレッドのグループ(たとえば、ワープ)中の各スレッドは、命令の同じセットに基づいてデータの異なるセットを処理するように構成される。少なくとも1つの実施例では、スレッドのグループ中のすべてのスレッドが同じ命令を実行する。少なくとも1つの実施例では、SM2714は、SIMTアーキテクチャを実装し、スレッドのグループ中の各スレッドは、命令の同じセットに基づいて、データの異なるセットを処理するように構成されるが、スレッドのグループ中の個々のスレッドは、実行中に発散することを可能にされる。少なくとも1つの実施例では、プログラム・カウンタ、コール・スタック、及び実行状態が、各ワープについて維持されて、ワープ内のスレッドが発散するときのワープ間の同時処理及びワープ内の直列実行を可能にする。別の実施例では、プログラム・カウンタ、コール・スタック、及び実行状態が、各個々のスレッドについて維持されて、すべてのスレッド間、ワープ内及びワープ間での等しい同時処理を可能にする。少なくとも1つの実施例では、実行状態が、各個々のスレッドについて維持され、同じ命令を実行しているスレッドが、より良い効率性のために収束され、並列に実行され得る。SM2714の少なくとも1つの実施例は、図28と併せてさらに詳細に説明される。
少なくとも1つの実施例では、MMU2718は、GPC2700とメモリ・パーティション・ユニット(たとえば、図26のパーティション・ユニット2622)との間のインターフェースを提供し、MMU2718は、仮想アドレスから物理アドレスへのトランスレーションと、メモリ保護と、メモリ要求の調停とを提供する。少なくとも1つの実施例では、MMU2718は、仮想アドレスからメモリ中の物理アドレスへのトランスレーションを実施するための1つ又は複数のトランスレーション・ルックアサイド・バッファ(TLB)を提供する。
図28は、少なくとも1つの実施例による、ストリーミング・マルチプロセッサ(「SM」)2800を示す。少なくとも1つの実施例では、SM2800は、図27のSM2714である。少なくとも1つの実施例では、SM2800は、限定はしないが、命令キャッシュ2802、1つ又は複数のスケジューラ・ユニット2804、レジスタ・ファイル2808、1つ又は複数の処理コア(「コア」)2810、1つ又は複数の特殊機能ユニット(「SFU」:special function unit)2812、1つ又は複数のLSU2814、相互接続ネットワーク2816、共有メモリ/L1キャッシュ2818、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、ワーク分散ユニットは、並列処理ユニット(PPU)のGPC上での実行のためにタスクをディスパッチし、各タスクは、GPC内の特定のデータ処理クラスタ(DPC)に割り振られ、タスクがシェーダ・プログラムに関連する場合、タスクはSM2800のうちの1つに割り振られる。少なくとも1つの実施例では、スケジューラ・ユニット2804は、ワーク分散ユニットからタスクを受信し、SM2800に割り当てられた1つ又は複数のスレッド・ブロックについて命令スケジューリングを管理する。少なくとも1つの実施例では、スケジューラ・ユニット2804は、並列スレッドのワープとしての実行のためにスレッド・ブロックをスケジューリングし、各スレッド・ブロックは、少なくとも1つのワープを割り振られる。少なくとも1つの実施例では、各ワープは、スレッドを実行する。少なくとも1つの実施例では、スケジューラ・ユニット2804は、複数の異なるスレッド・ブロックを管理して、異なるスレッド・ブロックにワープを割り振り、次いで、複数の異なる連動グループからの命令を、各クロック・サイクル中に様々な機能ユニット(たとえば、処理コア2810、SFU2812、及びLSU2814)にディスパッチする。
少なくとも1つの実施例では、「連動グループ」は、通信するスレッドのグループを組織化するためのプログラミング・モデルを指し得、プログラミング・モデルは、スレッドが通信している粒度を開発者が表現することを可能にして、より豊富でより効率的な並列分解の表現を可能にする。少なくとも1つの実施例では、連動起動APIは、並列アルゴリズムの実行のためにスレッド・ブロックの間の同期をサポートする。少なくとも1つの実施例では、従来のプログラミング・モデルのAPIは、連動スレッドを同期するための単一の簡単な構築物、すなわちスレッド・ブロックのすべてのスレッドにわたるバリア(たとえば、syncthreads()関数)を提供する。しかしながら、少なくとも1つの実施例では、プログラマは、スレッド・ブロックよりも小さい粒度においてスレッドのグループを定義し、定義されたグループ内で同期して、集合的なグループ全般にわたる機能インターフェースの形態で、より高い性能、設計のフレキシビリティ、及びソフトウェア再使用を可能にし得る。少なくとも1つの実施例では、連動グループは、プログラマが、サブ・ブロック粒度及びマルチ・ブロック粒度において、スレッドのグループを明示的に定義し、連動グループ中のスレッドに対する同期などの集合的な動作を実施することを可能にする。少なくとも1つの実施例では、サブ・ブロック粒度は、単一スレッドと同じくらい小さい。少なくとも1つの実施例では、プログラミング・モデルは、ソフトウェア境界にわたるクリーンな合成をサポートし、それにより、ライブラリ及びユーティリティ関数が、収束に関して仮定する必要なしにそれらのローカル・コンテキスト内で安全に同期することができる。少なくとも1つの実施例では、連動グループ・プリミティブは、限定はしないが、プロデューサ-コンシューマ並列性、日和見並列性(opportunistic parallelism)、及びスレッド・ブロックのグリッド全体にわたるグローバルな同期を含む、新しいパターンの連動並列性を可能にする。
少なくとも1つの実施例では、ディスパッチ・ユニット2806は、機能ユニットのうちの1つ又は複数に命令を送信するように構成され、スケジューラ・ユニット2804は、限定はしないが、同じワープからの2つの異なる命令が各クロック・サイクル中にディスパッチされることを可能にする2つのディスパッチ・ユニット2806を含む。少なくとも1つの実施例では、各スケジューラ・ユニット2804は、単一のディスパッチ・ユニット2806又は追加のディスパッチ・ユニット2806を含む。
少なくとも1つの実施例では、各SM2800は、少なくとも1つの実施例では、限定はしないが、SM2800の機能ユニットにレジスタのセットを提供するレジスタ・ファイル2808を含む。少なくとも1つの実施例では、レジスタ・ファイル2808は、各機能ユニットがレジスタ・ファイル2808の専用部分を割り振られるように、機能ユニットの各々の間で分割される。少なくとも1つの実施例では、レジスタ・ファイル2808は、SM2800によって実行されている異なるワープ間で分割され、レジスタ・ファイル2808は、機能ユニットのデータ経路に接続されたオペランドのための一時的ストレージを提供する。少なくとも1つの実施例では、各SM2800は、限定はしないが、複数のL個の処理コア2810を含む。少なくとも1つの実施例では、SM2800は、限定はしないが、多数の(たとえば、128個以上の)個別の処理コア2810を含む。少なくとも1つの実施例では、各処理コア2810は、限定はしないが、完全にパイプライン化された、単精度の、倍精度の、及び/又は混合精度の処理ユニットを含み、これは、限定はしないが、浮動小数点算術論理ユニット及び整数算術論理ユニットを含む。少なくとも1つの実施例では、浮動小数点算術論理ユニットは、浮動小数点算術のためのIEEE754-2008規格を実装する。少なくとも1つの実施例では、処理コア2810は、限定はしないが、64個の単精度(32ビット)浮動小数点コアと、64個の整数コアと、32個の倍精度(64ビット)浮動小数点コアと、8つのテンソル・コアとを含む。
少なくとも1つの実施例では、テンソル・コアは、行列演算を実施するように構成される。少なくとも1つの実施例では、1つ又は複数のテンソル・コアは、処理コア2810中に含まれる。少なくとも1つの実施例では、テンソル・コアは、ニューラル・ネットワーク訓練及び推論のための畳み込み演算など、深層学習行列算術を実施するように構成される。少なくとも1つの実施例では、各テンソル・コアは、4×4の行列で動作し、行列の積和演算(matrix multiply and accumulate operation)D=A×B+Cを実施し、ここで、A、B、C、及びDは4×4の行列である。
少なくとも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サイズの行列を仮定する。
少なくとも1つの実施例では、各SM2800は、限定はしないが、特殊関数(たとえば、属性評価、逆数平方根など)を実施するM個のSFU2812を含む。少なくとも1つの実施例では、SFU2812は、限定はしないが、階層ツリー・データ構造をトラバースするように構成されたツリー・トラバーサル・ユニットを含む。少なくとも1つの実施例では、SFU2812は、限定はしないが、テクスチャ・マップ・フィルタリング動作を実施するように構成されたテクスチャ・ユニットを含む。少なくとも1つの実施例では、テクスチャ・ユニットは、メモリ及びサンプル・テクスチャ・マップからテクスチャ・マップ(たとえば、テクセルの2Dアレイ)をロードして、SM2800によって実行されるシェーダ・プログラムにおける使用のためのサンプリングされたテクスチャ値を作り出すように構成される。少なくとも1つの実施例では、テクスチャ・マップは、共有メモリ/L1キャッシュ2818に記憶される。少なくとも1つの実施例では、テクスチャ・ユニットは、ミップ・マップ(たとえば、詳細のレベルが異なるテクスチャ・マップ)を使用したフィルタリング動作などのテクスチャ動作を実装する。少なくとも1つの実施例では、各SM2800は、限定はしないが、2つのテクスチャ・ユニットを含む。
少なくとも1つの実施例では、各SM2800は、限定はしないが、共有メモリ/L1キャッシュ2818とレジスタ・ファイル2808との間でロード及びストア動作を実装するN個のLSU2814を含む。少なくとも1つの実施例では、各SM2800は、限定はしないが、相互接続ネットワーク2816を含み、相互接続ネットワーク2816は、機能ユニットの各々をレジスタ・ファイル2808に接続し、LSU2814をレジスタ・ファイル2808及び共有メモリ/L1キャッシュ2818に接続する。少なくとも1つの実施例では、相互接続ネットワーク2816はクロスバーであり、クロスバーは、機能ユニットのうちのいずれかをレジスタ・ファイル2808中のレジスタのうちのいずれかに接続し、LSU2814をレジスタ・ファイル2808と共有メモリ/L1キャッシュ2818中のメモリ・ロケーションとに接続するように構成され得る。
少なくとも1つの実施例では、共有メモリ/L1キャッシュ2818は、SM2800とプリミティブ・エンジンとの間及びSM2800中のスレッド間でのデータ・ストレージ及び通信を可能にするオンチップ・メモリのアレイである。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2818は、限定はしないが、128KBのストレージ容量を備え、SM2800からパーティション・ユニットへの経路中にある。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2818は、読取り及び書込みをキャッシュするために使用される。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2818、L2キャッシュ、及びメモリのうちの1つ又は複数は、補助ストアである。
少なくとも1つの実施例では、データ・キャッシュと共有メモリ機能性とを単一のメモリ・ブロックに組み合わせることは、両方のタイプのメモリ・アクセスについて改善された性能を提供する。少なくとも1つの実施例では、容量は、共有メモリが容量の半分を使用するように構成され、テクスチャ及びロード/ストア動作が残りの容量を使用することができる場合など、共有メモリを使用しないプログラムによってキャッシュとして使用されるか、又は使用可能である。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2818内の統合は、共有メモリ/L1キャッシュ2818が、データをストリーミングするための高スループット管として機能しながら、同時に高帯域幅及び低レイテンシのアクセスを、頻繁に再使用されるデータに提供することを可能にする。少なくとも1つの実施例では、汎用並列算出のために構成されたとき、グラフィックス処理と比較してより簡単な構成が使用され得る。少なくとも1つの実施例では、固定機能GPUがバイパスされて、はるかに簡単なプログラミング・モデルを作成する。少なくとも1つの実施例では及び汎用並列算出構成では、ワーク分散ユニットは、スレッドのブロックをDPCに直接割り当て、分散させる。少なくとも1つの実施例では、ブロック中のスレッドは、各スレッドが一意の結果を生成することを確実にするように、計算において一意のスレッドIDを使用して、同じプログラムを実行し、SM2800を使用してプログラムを実行し、計算を実施し、共有メモリ/L1キャッシュ2818を使用してスレッド間で通信し、LSU2814を使用して、共有メモリ/L1キャッシュ2818及びメモリ・パーティション・ユニットを通してグローバル・メモリを読み取り、書き込む。少なくとも1つの実施例では、汎用並列算出のために構成されたとき、SM2800は、DPC上で新しいワークを起動するためにスケジューラ・ユニット2804が使用することができるコマンドを書き込む。
少なくとも1つの実施例では、PPUは、デスクトップ・コンピュータ、ラップトップ・コンピュータ、タブレット・コンピュータ、サーバ、スーパーコンピュータ、スマート・フォン(たとえば、ワイヤレス・ハンドヘルド・デバイス)、PDA、デジタル・カメラ、車両、頭部装着型ディスプレイ、ハンドヘルド電子デバイスなどに含まれるか、又はそれらに結合される。少なくとも1つの実施例では、PPUは、単一の半導体基板上で具体化される。少なくとも1つの実施例では、PPUは、追加のPPU、メモリ、RISC CPU、MMU、デジタル-アナログ変換器(「DAC」:digital-to-analog converter)などの1つ又は複数の他のデバイスとともにSoC中に含まれる。
少なくとも1つの実施例では、PPUは、1つ又は複数のメモリ・デバイスを含むグラフィックス・カード上に含まれ得る。少なくとも1つの実施例では、グラフィックス・カードは、デスクトップ・コンピュータのマザーボード上のPCIeスロットとインターフェースするように構成され得る。少なくとも1つの実施例では、PPUは、マザーボードのチップセット中に含まれる統合されたGPU(「iGPU」:integrated GPU)であり得る。
汎用コンピューティングのためのソフトウェア構築物
以下の図は、限定はしないが、少なくとも1つの実施例を実装するための例示的なソフトウェア構築物を記載する。
少なくとも1つの実施例では、上記で説明された技法は、ソフトウェア・スタック2900又はプログラミング・プラットフォーム3304など、以下で説明されるようなコンピューティング・サービス上で実装され得る。少なくとも1つの実施例では、コンピュータ・システムにおいて稼働されるアプリケーションが、複数のプロセッサ上で並列に稼働される従属スレッドに分割され得る。少なくとも1つの実施例では、プロセッサは、GPU3792を含む、以下で説明される任意のプロセッサ・タイプを含み得る。少なくとも1つの実施例では、1つ又は複数の回路は、2つ又はそれ以上の従属スレッドが、2つ又はそれ以上の別個のマルチスレッド・プロセッサ・コアを使用して並列に実施されることを引き起こす。少なくとも1つの実施例では、プロセッサ・コアは、マルチコアCPU中のコア、GPU中のSMPコア、又は記憶可能な命令を実行することが可能な他の回路であり得る。少なくとも1つの実施例では、スレッドの第1のグループが、2つ又はそれ以上のプロセッサ・コアを使用して並列に実施されるべきスレッドの2つ又はそれ以上のサブグループに編成されることを引き起こすための1つ又は複数の回路。少なくとも1つの実施例では、スレッドのグループは、並列に稼働する連動グループであり得る。少なくとも1つの実施例では、連動グループは、GPU上でワープ中に配置された複数のカーネル・スレッドを含む。少なくとも1つの実施例では、スレッド間の同期動作は、バリアの使用によって可能にされ得る。少なくとも1つの実施例では、1つ又は複数の回路は、メモリ・バリア演算を実施して、スレッドの複数のグループによるメモリへのアクセスが、メモリ・バリア演算によって指示される順序で発生することを引き起こす。少なくとも1つの実施例では、バリア演算は、ビット単位論理演算(たとえば、AND、OR、XOR)などのアトミック演算、或いはアトミック加算又は減算などの数学演算であり得る。
図29は、少なくとも1つの実施例による、プログラミング・プラットフォームのソフトウェア・スタックを示す。少なくとも1つの実施例では、プログラミング・プラットフォームは、算出タスクを加速するために、コンピューティング・システム上のハードウェアを活用するためのプラットフォームである。少なくとも1つの実施例では、プログラミング・プラットフォームは、ライブラリ、コンパイラ指令、及び/又はプログラミング言語への拡張を通して、ソフトウェア開発者にとってアクセス可能であり得る。少なくとも1つの実施例では、プログラミング・プラットフォームは、限定はしないが、CUDA、Radeonオープン・コンピュート・プラットフォーム(「ROCm」:Radeon Open Compute Platform)、OpenCL(OpenCL(商標)はクロノス・グループ(Khronos group)によって開発される)、SYCL、又はIntel One APIであり得る。
少なくとも1つの実施例では、プログラミング・プラットフォームのソフトウェア・スタック2900は、アプリケーション2901のための実行環境を提供する。少なくとも1つの実施例では、アプリケーション2901は、ソフトウェア・スタック2900上で起動されることが可能な任意のコンピュータ・ソフトウェアを含み得る。少なくとも1つの実施例では、アプリケーション2901は、限定はしないが、人工知能(「AI」:artificial intelligence)/機械学習(「ML」:machine learning)アプリケーション、高性能コンピューティング(「HPC」)アプリケーション、仮想デスクトップ・インフラストラクチャ(「VDI」:virtual desktop infrastructure)、又はデータ・センタ・ワークロードを含み得る。
少なくとも1つの実施例では、アプリケーション2901及びソフトウェア・スタック2900は、ハードウェア2907上で稼働する。少なくとも1つの実施例では、ハードウェア2907は、1つ又は複数のGPU、CPU、FPGA、AIエンジン、及び/又はプログラミング・プラットフォームをサポートする他のタイプのコンピュート・デバイスを含み得る。CUDAの場合など、少なくとも1つの実施例では、ソフトウェア・スタック2900は、ベンダー固有であり、(1つ又は複数の)特定のベンダーからのデバイスのみと互換性があり得る。OpenCLの場合など、少なくとも1つの実施例では、ソフトウェア・スタック2900は、異なるベンダーからのデバイスで使用され得る。少なくとも1つの実施例では、ハードウェア2907は、アプリケーション・プログラミング・インターフェース(「API」)コールを介して算出タスクを実施するためにアクセスされ得るもう1つのデバイスに接続されたホストを含む。少なくとも1つの実施例では、限定はしないが、CPU(ただし、コンピュート・デバイスをも含み得る)及びそのメモリを含み得る、ハードウェア2907内のホストとは対照的に、ハードウェア2907内のデバイスは、限定はしないが、GPU、FPGA、AIエンジン、又は他のコンピュート・デバイス(ただし、CPUをも含み得る)及びそのメモリを含み得る。
少なくとも1つの実施例では、プログラミング・プラットフォームのソフトウェア・スタック2900は、限定はしないが、いくつかのライブラリ2903と、ランタイム2905と、デバイス・カーネル・ドライバ2906とを含む。少なくとも1つの実施例では、ライブラリ2903の各々は、コンピュータ・プログラムによって使用され、ソフトウェア開発中に活用され得る、データ及びプログラミング・コードを含み得る。少なくとも1つの実施例では、ライブラリ2903は、限定はしないが、事前に書かれたコード及びサブルーチン、クラス、値、タイプ仕様、構成データ、ドキュメンテーション、ヘルプ・データ、並びに/又はメッセージ・テンプレートを含み得る。少なくとも1つの実施例では、ライブラリ2903は、1つ又は複数のタイプのデバイス上での実行のために最適化される機能を含む。少なくとも1つの実施例では、ライブラリ2903は、限定はしないが、デバイス上で数学、深層学習、及び/又は他のタイプの動作を実施するための機能を含み得る。少なくとも1つの実施例では、ライブラリ2903は、ライブラリ2903において実装される機能を公開する、1つ又は複数のAPIを含み得る、対応するAPI2902に関連する。
少なくとも1つの実施例では、アプリケーション2901は、図34~図36と併せて以下でより詳細に説明されるように、実行可能コードにコンパイルされるソース・コードとして書かれる。少なくとも1つの実施例では、アプリケーション2901の実行可能コードは、少なくとも部分的に、ソフトウェア・スタック2900によって提供される実行環境上で稼働し得る。少なくとも1つの実施例では、アプリケーション2901の実行中に、ホストとは対照的な、デバイス上で稼働する必要があるコードに達し得る。少なくとも1つの実施例では、そのような場合、デバイス上で必須のコードをロード及び起動するために、ランタイム2905がコールされ得る。少なくとも1つの実施例では、ランタイム2905は、アプリケーションS01の実行をサポートすることが可能である、任意の技術的に実現可能なランタイム・システムを含み得る。
少なくとも1つの実施例では、ランタイム2905は、(1つ又は複数の)API2904として示されている、対応するAPIに関連する、1つ又は複数のランタイム・ライブラリとして実装される。少なくとも1つの実施例では、そのようなランタイム・ライブラリのうちの1つ又は複数は、限定はしないが、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、及び/又は同期のための機能を含み得る。少なくとも1つの実施例では、メモリ管理機能は、限定はしないが、デバイス・メモリを割り振り、割振り解除し、コピーし、並びにホスト・メモリとデバイス・メモリとの間でデータを転送するための機能を含み得る。少なくとも1つの実施例では、実行制御機能は、限定はしないが、デバイス上で機能(機能がホストからコール可能なグローバル機能であるとき、「カーネル」と呼ばれることがある)を起動し、デバイス上で実行されるべき所与の機能のためのランタイム・ライブラリによって維持されるバッファ中に属性値をセットするための機能を含み得る。
少なくとも1つの実施例では、ランタイム・ライブラリ及び対応する(1つ又は複数の)API2904は、任意の技術的に実現可能な様式で実装され得る。少なくとも1つの実施例では、ある(又は任意の数の)APIは、デバイスのきめ細かい制御のための機能の低レベルのセットを公開し得るが、別の(又は任意の数の)APIは、そのような機能のより高いレベルのセットを公開し得る。少なくとも1つの実施例では、高レベル・ランタイムAPIは、低レベルAPIの上に築かれ得る。少なくとも1つの実施例では、ランタイムAPIのうちの1つ又は複数は、言語依存しないランタイムAPIの上に階層化された言語固有APIであり得る。
少なくとも1つの実施例では、デバイス・カーネル・ドライバ2906は、基礎をなすデバイスとの通信を容易にするように構成される。少なくとも1つの実施例では、デバイス・カーネル・ドライバ2906は、(1つ又は複数の)API2904などのAPI及び/又は他のソフトウェアが依拠する、低レベル機能性を提供し得る。少なくとも1つの実施例では、デバイス・カーネル・ドライバ2906は、ランタイムにおいて中間表現(「IR」:intermediate representation)コードをバイナリ・コードにコンパイルするように構成され得る。少なくとも1つの実施例では、CUDAの場合、デバイス・カーネル・ドライバ2906は、ハードウェア固有でない並列スレッド実行(「PTX」:Parallel Thread Execution)IRコードを、(コンパイルされたバイナリ・コードのキャッシングを伴って)ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにコンパイルし得、これは、コードを「ファイナライズする」(finalizing)と呼ばれることもある。少なくとも1つの実施例では、そうすることは、ファイナライズされたコードがターゲット・デバイス上で稼働することを許し得、これは、ソース・コードが最初にPTXコードにコンパイルされたとき、存在していないことがある。代替的に、少なくとも1つの実施例では、デバイス・ソース・コードは、デバイス・カーネル・ドライバ2906がランタイムにおいてIRコードをコンパイルすることを必要とすることなしに、オフラインでバイナリ・コードにコンパイルされ得る。
図30は、少なくとも1つの実施例による、図29のソフトウェア・スタック2900のCUDA実装形態を示す。少なくとも1つの実施例では、アプリケーション3001が起動され得るCUDAソフトウェア・スタック3000は、CUDAライブラリ3003と、CUDAランタイム3005と、CUDAドライバ3007と、デバイス・カーネル・ドライバ3008とを含む。少なくとも1つの実施例では、CUDAソフトウェア・スタック3000は、ハードウェア3009上で実行し、ハードウェア3009はGPUを含み得、GPUは、CUDAをサポートし、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される。
少なくとも1つの実施例では、アプリケーション3001、CUDAランタイム3005、及びデバイス・カーネル・ドライバ3008は、それぞれ、図29と併せて上記で説明された、アプリケーション2901、ランタイム2905、及びデバイス・カーネル・ドライバ2906と同様の機能性を実施し得る。少なくとも1つの実施例では、CUDAドライバ3007は、CUDAドライバAPI3006を実装するライブラリ(libcuda.so)を含む。少なくとも1つの実施例では、CUDAランタイム・ライブラリ(cudart)によって実装されるCUDAランタイムAPI3004と同様に、CUDAドライバAPI3006は、限定はしないが、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、同期、及び/又はグラフィックス相互運用性のための機能を公開し得る。少なくとも1つの実施例では、CUDAドライバAPI3006は、CUDAランタイムAPI3004が、暗黙的な初期化、(プロセスに類似する)コンテキスト管理、及び(動的にロードされたライブラリに類似する)モジュール管理を提供することによって、デバイス・コード管理を簡略化するという点で、CUDAランタイムAPI3004とは異なる。少なくとも1つの実施例では、高レベルCUDAランタイムAPI3004とは対照的に、CUDAドライバAPI3006は、特にコンテキスト及びモジュール・ローディングに関して、デバイスのよりきめ細かい制御を提供する低レベルAPIである。少なくとも1つの実施例では、CUDAドライバAPI3006は、CUDAランタイムAPI3004によって公開されないコンテキスト管理のための機能を公開し得る。少なくとも1つの実施例では、CUDAドライバAPI3006はまた、言語依存せず、たとえば、CUDAランタイムAPI3004に加えて、OpenCLをサポートする。さらに、少なくとも1つの実施例では、CUDAランタイム3005を含む開発ライブラリは、ユーザモードCUDAドライバ3007と(「ディスプレイ」ドライバと呼ばれることもある)カーネルモード・デバイス・ドライバ3008とを含むドライバ構成要素とは別個のものと見なされ得る。
少なくとも1つの実施例では、CUDAライブラリ3003は、限定はしないが、数学ライブラリ、深層学習ライブラリ、並列アルゴリズム・ライブラリ、及び/又は信号/画像/ビデオ処理ライブラリを含み得、それらをアプリケーション3001などの並列コンピューティング・アプリケーションが利用し得る。少なくとも1つの実施例では、CUDAライブラリ3003は、とりわけ、線形代数演算を実施するための基本線形代数サブプログラム(「BLAS」:Basic Linear Algebra Subprograms)の実装であるcuBLASライブラリ、高速フーリエ変換(「FFT」:fast Fourier transform)を算出するためのcuFFTライブラリ、及び乱数を生成するためのcuRANDライブラリなど、数学ライブラリを含み得る。少なくとも1つの実施例では、CUDAライブラリ3003は、とりわけ、深層ニューラル・ネットワークのためのプリミティブのcuDNNライブラリ及び高性能深層学習推論のためのTensorRTプラットフォームなど、深層学習ライブラリを含み得る。
図31は、少なくとも1つの実施例による、図29のソフトウェア・スタック2900のROCm実装形態を示す。少なくとも1つの実施例では、アプリケーション3101が起動され得るROCmソフトウェア・スタック3100は、言語ランタイム3103と、システム・ランタイム3105と、サンク(thunk)3107と、ROCmカーネル・ドライバ3108とを含む。少なくとも1つの実施例では、ROCmソフトウェア・スタック3100は、ハードウェア3109上で実行し、ハードウェア3109はGPUを含み得、GPUは、ROCmをサポートし、カリフォルニア州サンタクララのAMD Corporationによって開発される。
少なくとも1つの実施例では、アプリケーション3101は、図29と併せて上記で説明されたアプリケーション2901と同様の機能性を実施し得る。少なくとも1つの実施例では、さらに、言語ランタイム3103及びシステム・ランタイム3105は、図29と併せて上記で説明されたランタイム2905と同様の機能性を実施し得る。少なくとも1つの実施例では、言語ランタイム3103とシステム・ランタイム3105とは、システム・ランタイム3105が、ROCrシステム・ランタイムAPI3104を実装し、異種システム・アーキテクチャ(「HSA」:Heterogeneous System Architecture)ランタイムAPIを利用する、言語依存しないランタイムであるという点で、異なる。少なくとも1つの実施例では、HSAランタイムAPIは、とりわけ、メモリ管理、カーネルの設計されたディスパッチを介した実行制御、エラー対処、システム及びエージェント情報、並びにランタイム初期化及び停止(shutdown)のための機能を含む、AMD GPUにアクセスし、それと対話するためのインターフェースを公開する、シン(thin)・ユーザモードAPIである。少なくとも1つの実施例では、システム・ランタイム3105とは対照的に、言語ランタイム3103は、ROCrシステム・ランタイムAPI3104の上に階層化された言語固有ランタイムAPI3102の実装である。少なくとも1つの実施例では、言語ランタイムAPIは、限定はしないが、とりわけ、ポータビリティのための異種コンピュート・インターフェース(「HIP」:Heterogeneous compute Interface for Portability)言語ランタイムAPI、異種コンピュート・コンパイラ(「HCC」:Heterogeneous Compute Compiler)言語ランタイムAPI、又はOpenCL APIを含み得る。特にHIP言語は、機能的に同様のバージョンのCUDA機構をもつC++プログラミング言語の拡張であり、少なくとも1つの実施例では、HIP言語ランタイムAPIは、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、及び同期のための機能など、図30と併せて上記で説明されたCUDAランタイムAPI3004の機能と同様である機能を含む。
少なくとも1つの実施例では、サンク(ROCt)3107は、基礎をなすROCmドライバ3108と対話するために使用され得るインターフェース3106である。少なくとも1つの実施例では、ROCmドライバ3108は、AMDGPUドライバとHSAカーネル・ドライバ(amdkfd)との組合せである、ROCkドライバである。少なくとも1つの実施例では、AMDGPUドライバは、図29と併せて上記で説明されたデバイス・カーネル・ドライバ2906と同様の機能性を実施する、AMDによって開発されたGPUのためのデバイス・カーネル・ドライバである。少なくとも1つの実施例では、HSAカーネル・ドライバは、異なるタイプのプロセッサがハードウェア特徴を介してより効果的にシステム・リソースを共有することを許すドライバである。
少なくとも1つの実施例では、様々なライブラリ(図示せず)が、言語ランタイム3103より上にROCmソフトウェア・スタック3100中に含まれ、図30と併せて上記で説明されたCUDAライブラリ3003に対する機能性の類似性を提供し得る。少なくとも1つの実施例では、様々なライブラリは、限定はしないが、とりわけ、CUDA cuBLASの機能と同様の機能を実装するhipBLASライブラリ、CUDA cuFFTと同様であるFFTを算出するためのrocFFTライブラリなど、数学、深層学習、及び/又は他のライブラリを含み得る。
図32は、少なくとも1つの実施例による、図29のソフトウェア・スタック2900のOpenCL実装形態を示す。少なくとも1つの実施例では、アプリケーション3201が起動され得るOpenCLソフトウェア・スタック3200は、OpenCLフレームワーク3210と、OpenCLランタイム3206と、ドライバ3207とを含む。少なくとも1つの実施例では、OpenCLソフトウェア・スタック3200は、ベンダー固有でないハードウェア3009上で実行する。少なくとも1つの実施例では、OpenCLは、異なるベンダーによって開発されたデバイスによってサポートされるので、そのようなベンダーからのハードウェアと相互動作するために、特定のOpenCLドライバが必要とされ得る。
少なくとも1つの実施例では、アプリケーション3201、OpenCLランタイム3206、デバイス・カーネル・ドライバ3207、及びハードウェア3208は、それぞれ、図29と併せて上記で説明された、アプリケーション2901、ランタイム2905、デバイス・カーネル・ドライバ2906、及びハードウェア2907と同様の機能性を実施し得る。少なくとも1つの実施例では、アプリケーション3201は、デバイス上で実行されるべきであるコードをもつOpenCLカーネル3202をさらに含む。
少なくとも1つの実施例では、OpenCLは、ホストに接続されたデバイスをホストが制御することを可能にする「プラットフォーム」を定義する。少なくとも1つの実施例では、OpenCLフレームワークは、プラットフォームAPI3203及びランタイムAPI3205として示されている、プラットフォーム層API及びランタイムAPIを提供する。少なくとも1つの実施例では、ランタイムAPI3205は、デバイス上でのカーネルの実行を管理するためにコンテキストを使用する。少なくとも1つの実施例では、各識別されたデバイスは、それぞれのコンテキストに関連し得、ランタイムAPI3205は、それぞれのコンテキストを使用して、そのデバイスのために、とりわけ、コマンド・キュー、プログラム・オブジェクト、及びカーネル・オブジェクトを管理し、メモリ・オブジェクトを共有し得る。少なくとも1つの実施例では、プラットフォームAPI3203は、とりわけ、デバイスを選択及び初期化し、コマンド・キューを介してデバイスにワークをサブミットし、デバイスとの間でのデータ転送を可能にするために、デバイス・コンテキストが使用されることを許す機能を公開する。少なくとも1つの実施例では、さらに、OpenCLフレームワークは、とりわけ、数学関数とリレーショナル関数と画像処理関数とを含む、様々な組み込み関数(図示せず)を提供する。
少なくとも1つの実施例では、コンパイラ3204も、OpenCLフレームワーク3210中に含まれる。少なくとも1つの実施例では、ソース・コードは、アプリケーションを実行するより前にオフラインでコンパイルされるか、又はアプリケーションの実行中にオンラインでコンパイルされ得る。CUDA及びROCmとは対照的に、少なくとも1つの実施例におけるOpenCLアプリケーションは、コンパイラ3204によってオンラインでコンパイルされ得、コンパイラ2804は、標準ポータブル中間表現(「SPIR-V」:Standard Portable Intermediate Representation)コードなど、ソース・コード及び/又はIRコードをバイナリ・コードにコンパイルするために使用され得る、任意の数のコンパイラを表すために含まれる。代替的に、少なくとも1つの実施例では、OpenCLアプリケーションは、そのようなアプリケーションの実行より前に、オフラインでコンパイルされ得る。
図33は、少なくとも1つの実施例による、プログラミング・プラットフォームによってサポートされるソフトウェアを示す。少なくとも1つの実施例では、プログラミング・プラットフォーム3304は、アプリケーション3300が依拠し得る、様々なプログラミング・モデル3303、ミドルウェア及び/又はライブラリ3302、並びにフレームワーク3301をサポートするように構成される。少なくとも1つの実施例では、アプリケーション3300は、たとえば、MXNet、PyTorch、又はTensorFlowなど、深層学習フレームワークを使用して実装される、AI/MLアプリケーションであり得、これは、基礎をなすハードウェア上で加速コンピューティングを提供するために、cuDNN、NVIDIA集合通信ライブラリ(「NCCL」:NVIDIA Collective Communications Library)、及び/又はNVIDAディベロッパー・データ・ローディング・ライブラリ(「DALI(登録商標)」:NVIDA Developer Data Loading Library)CUDAライブラリなど、ライブラリに依拠し得る。
少なくとも1つの実施例では、プログラミング・プラットフォーム3304は、それぞれ、図30、図31、及び図32と併せて上記で説明された、CUDA、ROCm、又はOpenCLプラットフォームのうちの1つであり得る。少なくとも1つの実施例では、プログラミング・プラットフォーム3304は、アルゴリズム及びデータ構造の表現を許す基礎をなすコンピューティング・システムの抽象化である、複数のプログラミング・モデル3303をサポートする。少なくとも1つの実施例では、プログラミング・モデル3303は、性能を改善するために、基礎をなすハードウェアの特徴を公開し得る。少なくとも1つの実施例では、プログラミング・モデル3303は、限定はしないが、CUDA、HIP、OpenCL、C++加速超並列性(「C++AMP」:C++ Accelerated Massive Parallelism)、オープン・マルチプロセシング(「OpenMP」:Open Multi-Processing)、オープン・アクセラレータ(「OpenACC」:Open Accelerators)、及び/又はVulcanコンピュート(Vulcan Compute)を含み得る。
少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3302は、プログラミング・モデル3304の抽象化の実装を提供する。少なくとも1つの実施例では、そのようなライブラリは、コンピュータ・プログラムによって使用され、ソフトウェア開発中に活用され得る、データ及びプログラミング・コードを含む。少なくとも1つの実施例では、そのようなミドルウェアは、プログラミング・プラットフォーム3304から利用可能なソフトウェア以外にアプリケーションにサービスを提供するソフトウェアを含む。少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3302は、限定はしないが、cuBLAS、cuFFT、cuRAND、及び他のCUDAライブラリ、又は、rocBLAS、rocFFT、rocRAND、及び他のROCmライブラリを含み得る。さらに、少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3302は、GPUのための通信ルーチンを提供するNCCL及びROCm通信集合ライブラリ(「RCCL」:ROCm Communication Collectives Library)のライブラリ、深層学習加速のためのMIOpenライブラリ、並びに/又は、線形代数、行列及びベクトル演算、幾何学的変換、数値ソルバー、及び関係するアルゴリズムのための固有(Eigen)ライブラリを含み得る。
少なくとも1つの実施例では、アプリケーション・フレームワーク3301は、ライブラリ及び/又はミドルウェア3302に依存する。少なくとも1つの実施例では、アプリケーション・フレームワーク3301の各々は、アプリケーション・ソフトウェアの標準構造を実装するために使用されるソフトウェア・フレームワークである。少なくとも1つの実施例では、上記で説明されたAI/ML実例に戻ると、AI/MLアプリケーションは、Caffe、Caffe2、TensorFlow、Keras、PyTorch、又はMxNet深層学習フレームワークなど、フレームワークを使用して実装され得る。
図34は、少なくとも1つの実施例による、図29~図32のプログラミング・プラットフォームのうちの1つの上で実行するためのコードをコンパイルすることを示す。少なくとも1つの実施例では、コンパイラ3401は、ホスト・コード並びにデバイス・コードの両方を含むソース・コード3400を受信する。少なくとも1つの実施例では、コンパイラ3401は、ソース・コード3400を、ホスト上での実行のためのホスト実行可能コード3402及びデバイス上での実行のためのデバイス実行可能コード3403にコンバートするように構成される。少なくとも1つの実施例では、ソース・コード3400は、アプリケーションの実行より前にオフラインでコンパイルされるか、又はアプリケーションの実行中にオンラインでコンパイルされるかのいずれかであり得る。
少なくとも1つの実施例では、ソース・コード3400は、C++、C、Fortranなど、コンパイラ3401によってサポートされる任意のプログラミング言語のコードを含み得る。少なくとも1つの実施例では、ソース・コード3400は、ホスト・コードとデバイス・コードとの混合物を有する単一ソース・ファイル中に含まれ得、その中にデバイス・コードのロケーションが指示されている。少なくとも1つの実施例では、単一ソース・ファイルは、CUDAコードを含む.cuファイル、又はHIPコードを含む.hip.cppファイルであり得る。代替的に、少なくとも1つの実施例では、ソース・コード3400は、その中でホスト・コードとデバイス・コードとが分離される単一ソース・ファイルではなく、複数のソース・コード・ファイルを含み得る。
少なくとも1つの実施例では、コンパイラ3401は、ソース・コード3400を、ホスト上での実行のためのホスト実行可能コード3402及びデバイス上での実行のためのデバイス実行可能コード3403にコンパイルするように構成される。少なくとも1つの実施例では、コンパイラ3401は、ソース・コード3400を抽象システム・ツリー(AST:abstract system tree)に構文解析することと、最適化を実施することと、実行可能コードを生成することとを含む、動作を実施する。ソース・コード3400が単一ソース・ファイルを含む、少なくとも1つの実施例では、コンパイラ3401は、図35に関して以下でより詳細に説明されるように、そのような単一ソース・ファイル中でデバイス・コードをホスト・コードから分離し、デバイス・コード及びホスト・コードを、それぞれ、デバイス実行可能コード3403及びホスト実行可能コード3402にコンパイルし、デバイス実行可能コード3403とホスト実行可能コード3402とを単一のファイルにおいて互いにリンクし得る。
少なくとも1つの実施例では、ホスト実行可能コード3402及びデバイス実行可能コード3403は、バイナリ・コード及び/又はIRコードなど、任意の好適なフォーマットのものであり得る。少なくとも1つの実施例では、CUDAの場合、ホスト実行可能コード3402は、ネイティブ・オブジェクト・コードを含み得、デバイス実行可能コード3403は、PTX中間表現のコードを含み得る。少なくとも1つの実施例では、ROCmの場合、ホスト実行可能コード3402とデバイス実行可能コード3403の両方は、ターゲット・バイナリ・コードを含み得る。
図35は、少なくとも1つの実施例による、図29~図32のプログラミング・プラットフォームのうちの1つの上で実行するためのコードをコンパイルすることのより詳細な図である。少なくとも1つの実施例では、コンパイラ3501は、ソース・コード3500を受信し、ソース・コード3500をコンパイルし、実行可能ファイル3510を出力するように構成される。少なくとも1つの実施例では、ソース・コード3500は、ホスト・コードとデバイス・コードの両方を含む、.cuファイル、.hip.cppファイル、又は別のフォーマットのファイルなど、単一ソース・ファイルである。少なくとも1つの実施例では、コンパイラ3501は、限定はしないが、.cuファイル中のCUDAコードをコンパイルするためのNVIDIA CUDAコンパイラ(「NVCC」:NVIDIA CUDA compiler)、又は.hip.cppファイル中のHIPコードをコンパイルするためのHCCコンパイラであり得る。
少なくとも1つの実施例では、コンパイラ3501は、コンパイラ・フロント・エンド3502と、ホスト・コンパイラ3505と、デバイス・コンパイラ3506と、リンカ3509とを含む。少なくとも1つの実施例では、コンパイラ・フロント・エンド3502は、ソース・コード3500中でデバイス・コード3504をホスト・コード3503から分離するように構成される。少なくとも1つの実施例では、デバイス・コード3504は、デバイス・コンパイラ3506によってデバイス実行可能コード3508にコンパイルされ、デバイス実行可能コード3508は、説明されたように、バイナリ・コード又はIRコードを含み得る。少なくとも1つの実施例では、別個に、ホスト・コード3503は、ホスト・コンパイラ3505によってホスト実行可能コード3507にコンパイルされる。少なくとも1つの実施例では、NVCCの場合、ホスト・コンパイラ3505は、限定はしないが、ネイティブ・オブジェクト・コードを出力する汎用C/C++コンパイラであり得るが、デバイス・コンパイラ3506は、限定はしないが、LLVMコンパイラ・インフラストラクチャをフォークし、PTXコード又はバイナリ・コードを出力する、低レベル仮想機械(「LLVM」:Low Level Virtual Machine)ベースのコンパイラであり得る。少なくとも1つの実施例では、HCCの場合、ホスト・コンパイラ3505とデバイス・コンパイラ3506の両方は、限定はしないが、ターゲット・バイナリ・コードを出力するLLVMベースのコンパイラであり得る。
少なくとも1つの実施例では、ソース・コード3500をホスト実行可能コード3507及びデバイス実行可能コード3508にコンパイルした後に、リンカ3509は、ホスト実行可能コード3507とデバイス実行可能コード3508とを実行可能ファイル3510において互いにリンクする。少なくとも1つの実施例では、ホストのためのネイティブ・オブジェクト・コードと、デバイスのためのPTX又はバイナリ・コードとは、オブジェクト・コードを記憶するために使用されるコンテナ・フォーマットである、実行可能及びリンク可能フォーマット(「ELF」:Executable and Linkable Format)ファイルにおいて互いにリンクされ得る。
図36は、少なくとも1つの実施例による、ソース・コードをコンパイルするより前にソース・コードをトランスレートすることを示す。少なくとも1つの実施例では、ソース・コード3600は、トランスレーション・ツール3601を通して渡され、トランスレーション・ツール3601は、ソース・コード3600を、トランスレートされたソース・コード3602にトランスレートする。少なくとも1つの実施例では、コンパイラ3603は、図34と併せて上記で説明されたように、ホスト実行可能コード3402及びデバイス実行可能3403へのコンパイラ3401によるソース・コード3400のコンパイルと同様であるプロセスにおいて、トランスレートされたソース・コード3602をホスト実行可能コード3604及びデバイス実行可能コード3605にコンパイルするために使用される。
少なくとも1つの実施例では、トランスレーション・ツール3601によって実施されるトランスレーションは、稼働することが最初に意図された環境とは異なる環境における実行のためにソース3600を移植するために使用される。少なくとも1つの実施例では、トランスレーション・ツール3601は、限定はしないが、CUDAプラットフォームを対象とするCUDAコードを、ROCmプラットフォーム上でコンパイル及び実行され得るHIPコードに「hipify」するために使用される、HIPトランスレータを含み得る。少なくとも1つの実施例では、ソース・コード3600のトランスレーションは、図37A~図38と併せて以下でより詳細に説明されるように、ソース・コード3600を構文解析することと、あるプログラミング・モデル(たとえば、CUDA)によって提供される(1つ又は複数の)APIへのコールを、別のプログラミング・モデル(たとえば、HIP)によって提供される(1つ又は複数の)APIへの対応するコールにコンバートすることとを含み得る。少なくとも1つの実施例では、CUDAコードをhipifyすることの実例に戻ると、CUDAランタイムAPI、CUDAドライバAPI、及び/又はCUDAライブラリへのコールは、対応するHIP APIコールにコンバートされ得る。少なくとも1つの実施例では、トランスレーション・ツール3601によって実施される自動トランスレーションは、時々、不完全であり、ソース・コード3600を完全に移植するために追加の手動の労力を必要とし得る。
汎用コンピューティングのためのGPUを構成すること
以下の図は、限定はしないが、少なくとも1つの実施例による、コンピュート・ソース・コードをコンパイル及び実行するための例示的なアーキテクチャを記載する。
図37Aは、少なくとも1つの実施例による、異なるタイプの処理ユニットを使用してCUDAソース・コード3710をコンパイル及び実行するように構成されたシステム37A00を示す。少なくとも1つの実施例では、システム37A00は、限定はしないが、CUDAソース・コード3710と、CUDAコンパイラ3750と、ホスト実行可能コード3770(1)と、ホスト実行可能コード3770(2)と、CUDAデバイス実行可能コード3784と、CPU3790と、CUDA対応GPU3794と、GPU3792と、CUDAからHIPへのトランスレーション・ツール3720と、HIPソース・コード3730と、HIPコンパイラ・ドライバ3740と、HCC3760と、HCCデバイス実行可能コード3782とを含む。
少なくとも1つの実施例では、CUDAソース・コード3710は、CUDAプログラミング言語の人間が読み取れるコードの集合である。少なくとも1つの実施例では、CUDAコードは、CUDAプログラミング言語の人間が読み取れるコードである。少なくとも1つの実施例では、CUDAプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、デバイス・コードは、コンパイルの後にデバイス上で並列に実行可能であるソース・コードである。少なくとも1つの実施例では、デバイスは、CUDA対応GPU3790、GPU37192、又は別のGPGPUなど、並列命令処理のために最適化されるプロセッサであり得る。少なくとも1つの実施例では、ホスト・コードは、コンパイルの後にホスト上で実行可能であるソース・コードである。少なくとも1つの実施例では、ホストは、CPU3790など、連続命令処理のために最適化されるプロセッサである。
少なくとも1つの実施例では、CUDAソース・コード3710は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3712と、(ゼロを含む)任意の数のデバイス機能3714と、(ゼロを含む)任意の数のホスト機能3716と、(ゼロを含む)任意の数のホスト/デバイス機能3718とを含む。少なくとも1つの実施例では、グローバル機能3712と、デバイス機能3714と、ホスト機能3716と、ホスト/デバイス機能3718とは、CUDAソース・コード3710中で混合され得る。少なくとも1つの実施例では、グローバル機能3712の各々は、デバイス上で実行可能であり、ホストからコール可能である。少なくとも1つの実施例では、グローバル機能3712のうちの1つ又は複数は、したがって、デバイスへのエントリ・ポイントとして働き得る。少なくとも1つの実施例では、グローバル機能3712の各々はカーネルである。少なくとも1つの実施例では、及び動的並列性として知られる技法では、グローバル機能3712のうちの1つ又は複数は、カーネルを定義し、カーネルは、デバイス上で実行可能であり、そのようなデバイスからコール可能である。少なくとも1つの実施例では、カーネルは、実行中にデバイス上のN(ここで、Nは任意の正の整数である)個の異なるスレッドによって並列にN回実行される。
少なくとも1つの実施例では、デバイス機能3714の各々は、デバイス上で実行され、そのようなデバイスからのみコール可能である。少なくとも1つの実施例では、ホスト機能3716の各々は、ホスト上で実行され、そのようなホストからのみコール可能である。少なくとも1つの実施例では、ホスト/デバイス機能3716の各々は、ホスト上で実行可能であり、そのようなホストからのみコール可能であるホスト・バージョンの機能と、デバイス上で実行可能であり、そのようなデバイスからのみコール可能であるデバイス・バージョンの機能の両方を定義する。
少なくとも1つの実施例では、CUDAソース・コード3710は、限定はしないが、CUDAランタイムAPI3702を介して定義される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、CUDAランタイムAPI3702は、限定はしないが、デバイス・メモリを割り振り、割振り解除し、ホスト・メモリとデバイス・メモリとの間でデータを転送し、複数のデバイスをもつシステムを管理するなどのためにホスト上で実行する、任意の数の機能を含み得る。少なくとも1つの実施例では、CUDAソース・コード3710は、任意の数の他のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、CUDA APIは、CUDAコードによる使用のために設計される任意のAPIであり得る。少なくとも1つの実施例では、CUDA APIは、限定はしないが、CUDAランタイムAPI3702、CUDAドライバAPI、任意の数のCUDAライブラリのためのAPIなどを含む。少なくとも1つの実施例では、及びCUDAランタイムAPI3702に対して、CUDAドライバAPIは、より低いレベルのAPIであるが、デバイスのよりきめ細かい制御を提供する。少なくとも1つの実施例では、CUDAライブラリの実例は、限定はしないが、cuBLAS、cuFFT、cuRAND、cuDNNなどを含む。
少なくとも1つの実施例では、CUDAコンパイラ3750は、ホスト実行可能コード3770(1)及びCUDAデバイス実行可能コード3784を生成するために、入力CUDAコード(たとえば、CUDAソース・コード3710)をコンパイルする。少なくとも1つの実施例では、CUDAコンパイラ3750はNVCCである。少なくとも1つの実施例では、ホスト実行可能コード3770(1)は、CPU3790上で実行可能である、入力ソース・コード中に含まれるホスト・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、CPU3790は、連続命令処理のために最適化される任意のプロセッサであり得る。
少なくとも1つの実施例では、CUDAデバイス実行可能コード3784は、CUDA対応GPU3794上で実行可能である、入力ソース・コード中に含まれるデバイス・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、CUDAデバイス実行可能コード3784は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3784は、限定はしないが、PTXコードなどのIRコードを含み、これは、デバイス・ドライバによって、特定のターゲット・デバイス(たとえば、CUDA対応GPU3794)のためのバイナリ・コードに、ランタイムにおいてさらにコンパイルされる。少なくとも1つの実施例では、CUDA対応GPU3794は、並列命令処理のために最適化され、CUDAをサポートする、任意のプロセッサであり得る。少なくとも1つの実施例では、CUDA対応GPU3794は、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される。
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710を機能的に同様のHIPソース・コード3730にトランスレートするように構成される。少なくとも1つの実施例では、HIPソース・コード3730は、HIPプログラミング言語の人間が読み取れるコードの集合である。少なくとも1つの実施例では、HIPコードは、HIPプログラミング言語の人間が読み取れるコードである。少なくとも1つの実施例では、HIPプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための、機能的に同様のバージョンのCUDA機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、HIPプログラミング言語は、CUDAプログラミング言語の機能性のサブセットを含み得る。少なくとも1つの実施例では、たとえば、HIPプログラミング言語は、限定はしないが、グローバル機能3712を定義するための(1つ又は複数の)機構を含むが、そのようなHIPプログラミング言語は、動的並列性のサポートがないことがあり、したがって、HIPコードにおいて定義されたグローバル機能3712は、ホストからのみコール可能であり得る。
少なくとも1つの実施例では、HIPソース・コード3730は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3712と、(ゼロを含む)任意の数のデバイス機能3714と、(ゼロを含む)任意の数のホスト機能3716と、(ゼロを含む)任意の数のホスト/デバイス機能3718とを含む。少なくとも1つの実施例では、HIPソース・コード3730は、HIPランタイムAPI3732において指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、HIPランタイムAPI3732は、限定はしないが、CUDAランタイムAPI3702中に含まれる機能のサブセットの機能的に同様のバージョンを含む。少なくとも1つの実施例では、HIPソース・コード3730は、任意の数の他のHIP APIにおいて指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、HIP APIは、HIPコード及び/又はROCmによる使用のために設計される任意のAPIであり得る。少なくとも1つの実施例では、HIP APIは、限定はしないが、HIPランタイムAPI3732、HIPドライバAPI、任意の数のHIPライブラリのためのAPI、任意の数のROCmライブラリのためのAPIなどを含む。
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3720は、CUDAコード中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、CUDAコード中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。少なくとも1つの実施例では、CUDAコールは、CUDA APIにおいて指定された機能へのコールであり、HIPコールは、HIP APIにおいて指定された機能へのコールである。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3720は、CUDAランタイムAPI3702において指定された機能への任意の数のコールを、HIPランタイムAPI3732において指定された機能への任意の数のコールにコンバートする。
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3720は、テキスト・ベースのトランスレーション・プロセスを実行するhipify-perlとして知られるツールである。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3720は、hipify-clangとして知られるツールであり、これは、hipify-perlに対して、clang(コンパイラ・フロント・エンド)を使用してCUDAコードを構文解析することと、次いで、得られたシンボルをトランスレートすることとを伴う、より複雑でよりロバストなトランスレーション・プロセスを実行する。少なくとも1つの実施例では、CUDAコードをHIPコードに適切にコンバートすることは、CUDAからHIPへのトランスレーション・ツール3720によって実施される修正に加えて、修正(たとえば、手動の編集)を必要とし得る。
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3740は、ターゲット・デバイス3746を決定し、次いで、ターゲット・デバイス3746と互換性があるコンパイラを、HIPソース・コード3730をコンパイルするように構成する、フロント・エンドである。少なくとも1つの実施例では、ターゲット・デバイス3746は、並列命令処理のために最適化されるプロセッサである。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3740は、任意の技術的に実現可能な様式でターゲット・デバイス3746を決定し得る。
少なくとも1つの実施例では、ターゲット・デバイス3746が、CUDA(たとえば、CUDA対応GPU3794)と互換性がある場合、HIPコンパイラ・ドライバ3740は、HIP/NVCCコンパイル・コマンド3742を生成する。少なくとも1つの実施例では、及び図37Bと併せてより詳細に説明されるように、HIP/NVCCコンパイル・コマンド3742は、限定はしないが、HIPからCUDAへのトランスレーション・ヘッダ及びCUDAランタイム・ライブラリを使用してHIPソース・コード3730をコンパイルするようにCUDAコンパイラ3750を構成する。少なくとも1つの実施例では、及びHIP/NVCCコンパイル・コマンド3742に応答して、CUDAコンパイラ3750は、ホスト実行可能コード3770(1)及びCUDAデバイス実行可能コード3784を生成する。
少なくとも1つの実施例では、ターゲット・デバイス3746が、CUDAと互換性がない場合、HIPコンパイラ・ドライバ3740は、HIP/HCCコンパイル・コマンド3744を生成する。少なくとも1つの実施例では、及び図37Cと併せてより詳細に説明されるように、HIP/HCCコンパイル・コマンド3744は、限定はしないが、HCCヘッダ及びHIP/HCCランタイム・ライブラリを使用してHIPソース・コード3730をコンパイルするようにHCC3760を構成する。少なくとも1つの実施例では、及びHIP/HCCコンパイル・コマンド3744に応答して、HCC3760は、ホスト実行可能コード3770(2)及びHCCデバイス実行可能コード3782を生成する。少なくとも1つの実施例では、HCCデバイス実行可能コード3782は、GPU3792上で実行可能である、HIPソース・コード3730中に含まれるデバイス・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、GPU3792は、並列命令処理のために最適化され、CUDAと互換性がなく、HCCと互換性がある、任意のプロセッサであり得る。少なくとも1つの実施例では、GPU3792は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、GPU3792は、CUDA非対応GPU3792である。
単に説明目的のために、CPU3790及び異なるデバイス上での実行のためにCUDAソース・コード3710をコンパイルするために少なくとも1つの実施例において実装され得る3つの異なるフローが、図37Aに図示されている。少なくとも1つの実施例では、直接的CUDAフローが、CUDAソース・コード3710をHIPソース・コード3730にトランスレートすることなしに、CPU3790及びCUDA対応GPU3794上での実行のためにCUDAソース・コード3710をコンパイルする。少なくとも1つの実施例では、間接的CUDAフローが、CUDAソース・コード3710をHIPソース・コード3730にトランスレートし、次いで、CPU3790及びCUDA対応GPU3794上での実行のためにHIPソース・コード3730をコンパイルする。少なくとも1つの実施例では、CUDA/HCCフローが、CUDAソース・コード3710をHIPソース・コード3730にトランスレートし、次いで、CPU3790及びGPU3792上での実行のためにHIPソース・コード3730をコンパイルする。
少なくとも1つの実施例において実装され得る直接的CUDAフローは、破線及びA1~A3とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びA1とアノテーション付けされたバブルで図示されているように、CUDAコンパイラ3750は、CUDAソース・コード3710と、CUDAソース・コード3710をコンパイルするようにCUDAコンパイラ3750を構成するCUDAコンパイル・コマンド3748とを受信する。少なくとも1つの実施例では、直接的CUDAフローにおいて使用されるCUDAソース・コード3710は、C++以外のプログラミング言語(たとえば、C、Fortran、Python、Javaなど)に基づくCUDAプログラミング言語で書かれる。少なくとも1つの実施例では、及びCUDAコンパイル・コマンド3748に応答して、CUDAコンパイラ3750は、ホスト実行可能コード3770(1)及びCUDAデバイス実行可能コード3784を生成する(A2とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びA3とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3770(1)及びCUDAデバイス実行可能コード3784は、それぞれ、CPU3790及びCUDA対応GPU3794上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3784は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3784は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
少なくとも1つの実施例において実装され得る間接的CUDAフローは、点線及びB1~B6とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びB1とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710を受信する。少なくとも1つの実施例では、及びB2とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710をHIPソース・コード3730にトランスレートする。少なくとも1つの実施例では、及びB3とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3740は、HIPソース・コード3730を受信し、ターゲット・デバイス3746がCUDA対応であると決定する。
少なくとも1つの実施例では、及びB4とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3740は、HIP/NVCCコンパイル・コマンド3742を生成し、HIP/NVCCコンパイル・コマンド3742とHIPソース・コード3730の両方をCUDAコンパイラ3750に送信する。少なくとも1つの実施例では、及び図37Bと併せてより詳細に説明されるように、HIP/NVCCコンパイル・コマンド3742は、限定はしないが、HIPからCUDAへのトランスレーション・ヘッダ及びCUDAランタイム・ライブラリを使用してHIPソース・コード3730をコンパイルするようにCUDAコンパイラ3750を構成する。少なくとも1つの実施例では、及びHIP/NVCCコンパイル・コマンド3742に応答して、CUDAコンパイラ3750は、ホスト実行可能コード3770(1)及びCUDAデバイス実行可能コード3784を生成する(B5とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びB6とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3770(1)及びCUDAデバイス実行可能コード3784は、それぞれ、CPU3790及びCUDA対応GPU3794上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3784は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3784は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
少なくとも1つの実施例において実装され得るCUDA/HCCフローは、実線及びC1~C6とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びC1とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710を受信する。少なくとも1つの実施例では、及びC2とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710をHIPソース・コード3730にトランスレートする。少なくとも1つの実施例では、及びC3とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3740は、HIPソース・コード3730を受信し、ターゲット・デバイス3746がCUDA対応でないと決定する。
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3740は、HIP/HCCコンパイル・コマンド3744を生成し、HIP/HCCコンパイル・コマンド3744とHIPソース・コード3730の両方をHCC3760に送信する(C4とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及び図37Cと併せてより詳細に説明されるように、HIP/HCCコンパイル・コマンド3744は、限定はしないが、HCCヘッダ及びHIP/HCCランタイム・ライブラリを使用してHIPソース・コード3730をコンパイルするようにHCC3760を構成する。少なくとも1つの実施例では、及びHIP/HCCコンパイル・コマンド3744に応答して、HCC3760は、ホスト実行可能コード3770(2)及びHCCデバイス実行可能コード3782を生成する(C5とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びC6とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3770(2)及びHCCデバイス実行可能コード3782は、それぞれ、CPU3790及びGPU3792上で実行され得る。
少なくとも1つの実施例では、CUDAソース・コード3710がHIPソース・コード3730にトランスレートされた後に、HIPコンパイラ・ドライバ3740は、その後、CUDAからHIPへのトランスレーション・ツール3720を再実行することなしに、CUDA対応GPU3794又はGPU3792のいずれかのための実行可能コードを生成するために使用され得る。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710をHIPソース・コード3730にトランスレートし、HIPソース・コード3730は、次いで、メモリに記憶される。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3740は、次いで、HIPソース・コード3730に基づいてホスト実行可能コード3770(2)及びHCCデバイス実行可能コード3782を生成するようにHCC3760を構成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3740は、その後、記憶されたHIPソース・コード3730に基づいてホスト実行可能コード3770(1)及びCUDAデバイス実行可能コード3784を生成するようにCUDAコンパイラ3750を構成する。
図37Bは、少なくとも1つの実施例による、CPU3790及びCUDA対応GPU3794を使用して、図37AのCUDAソース・コード3710をコンパイル及び実行するように構成されたシステム3704を示す。少なくとも1つの実施例では、システム3704は、限定はしないが、CUDAソース・コード3710と、CUDAからHIPへのトランスレーション・ツール3720と、HIPソース・コード3730と、HIPコンパイラ・ドライバ3740と、CUDAコンパイラ3750と、ホスト実行可能コード3770(1)と、CUDAデバイス実行可能コード3784と、CPU3790と、CUDA対応GPU3794とを含む。
少なくとも1つの実施例では、及び図37Aと併せて本明細書で前に説明されたように、CUDAソース・コード3710は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3712と、(ゼロを含む)任意の数のデバイス機能3714と、(ゼロを含む)任意の数のホスト機能3716と、(ゼロを含む)任意の数のホスト/デバイス機能3718とを含む。少なくとも1つの実施例では、CUDAソース・コード3710は、限定はしないが、任意の数のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含む。
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710をHIPソース・コード3730にトランスレートする。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、CUDAソース・コード3710中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3740は、ターゲット・デバイス3746がCUDA対応であると決定し、HIP/NVCCコンパイル・コマンド3742を生成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3740は、次いで、HIPソース・コード3730をコンパイルするようにHIP/NVCCコンパイル・コマンド3742を介してCUDAコンパイラ3750を構成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3740は、CUDAコンパイラ3750を構成することの一部として、HIPからCUDAへのトランスレーション・ヘッダ3752へのアクセスを提供する。少なくとも1つの実施例では、HIPからCUDAへのトランスレーション・ヘッダ3752は、任意の数のHIP APIにおいて指定された任意の数の機構(たとえば、機能)を、任意の数のCUDA APIにおいて指定された任意の数の機構にトランスレートする。少なくとも1つの実施例では、CUDAコンパイラ3750は、ホスト実行可能コード3770(1)及びCUDAデバイス実行可能コード3784を生成するために、CUDAランタイムAPI3702に対応するCUDAランタイム・ライブラリ3754と併せて、HIPからCUDAへのトランスレーション・ヘッダ3752を使用する。少なくとも1つの実施例では、ホスト実行可能コード3770(1)及びCUDAデバイス実行可能コード3784は、次いで、それぞれ、CPU3790及びCUDA対応GPU3794上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3784は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3784は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
図37Cは、少なくとも1つの実施例による、CPU3790及びCUDA非対応GPU3792を使用して、図37AのCUDAソース・コード3710をコンパイル及び実行するように構成されたシステム3706を示す。少なくとも1つの実施例では、システム3706は、限定はしないが、CUDAソース・コード3710と、CUDAからHIPへのトランスレーション・ツール3720と、HIPソース・コード3730と、HIPコンパイラ・ドライバ3740と、HCC3760と、ホスト実行可能コード3770(2)と、HCCデバイス実行可能コード3782と、CPU3790と、GPU3792とを含む。
少なくとも1つの実施例では、及び図37Aと併せて本明細書で前に説明されたように、CUDAソース・コード3710は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3712と、(ゼロを含む)任意の数のデバイス機能3714と、(ゼロを含む)任意の数のホスト機能3716と、(ゼロを含む)任意の数のホスト/デバイス機能3718とを含む。少なくとも1つの実施例では、CUDAソース・コード3710は、限定はしないが、任意の数のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含む。
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710をHIPソース・コード3730にトランスレートする。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、ソース・コード3710中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3740は、その後、ターゲット・デバイス3746がCUDA対応でないと決定し、HIP/HCCコンパイル・コマンド3744を生成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3740は、次いで、HIPソース・コード3730をコンパイルするためにHIP/HCCコンパイル・コマンド3744を実行するようにHCC3760を構成する。少なくとも1つの実施例では、HIP/HCCコンパイル・コマンド3744は、限定はしないが、ホスト実行可能コード3770(2)及びHCCデバイス実行可能コード3782を生成するためにHIP/HCCランタイム・ライブラリ3758及びHCCヘッダ3756を使用するようにHCC3760を構成する。少なくとも1つの実施例では、HIP/HCCランタイム・ライブラリ3758は、HIPランタイムAPI3732に対応する。少なくとも1つの実施例では、HCCヘッダ3756は、限定はしないが、HIP及びHCCのための任意の数及びタイプの相互運用性機構を含む。少なくとも1つの実施例では、ホスト実行可能コード3770(2)及びHCCデバイス実行可能コード3782は、それぞれ、CPU3790及びGPU3792上で実行され得る。
図38は、少なくとも1つの実施例による、図37CのCUDAからHIPへのトランスレーション・ツール3720によってトランスレートされた例示的なカーネルを示す。少なくとも1つの実施例では、CUDAソース・コード3710は、所与のカーネルが解くように設計される全体的な問題を、スレッド・ブロックを使用して独立して解かれ得る比較的粗いサブ問題に区分けする。少なくとも1つの実施例では、各スレッド・ブロックは、限定はしないが、任意の数のスレッドを含む。少なくとも1つの実施例では、各サブ問題は、スレッド・ブロック内のスレッドによって並列に連動して解かれ得る比較的細かい部片に区分けされる。少なくとも1つの実施例では、スレッド・ブロック内のスレッドは、共有メモリを通してデータを共有することによって、及びメモリ・アクセスを協調させるために実行を同期させることによって連動することができる。
少なくとも1つの実施例では、CUDAソース・コード3710は、所与のカーネルに関連するスレッド・ブロックを、スレッド・ブロックの1次元グリッド、2次元グリッド、又は3次元グリッドに組織化する。少なくとも1つの実施例では、各スレッド・ブロックは、限定はしないが、任意の数のスレッドを含み、グリッドは、限定はしないが、任意の数のスレッド・ブロックを含む。
少なくとも1つの実施例では、カーネルは、「__global__」宣言指定子(declaration specifier)を使用して定義されるデバイス・コード中の関数である。少なくとも1つの実施例では、所与のカーネル・コール及び関連するストリームについてカーネルを実行するグリッドの次元は、CUDAカーネル起動シンタックス3810を使用して指定される。少なくとも1つの実施例では、CUDAカーネル起動シンタックス3810は、「KernelName<<<GridSize,BlockSize,SharedMemorySize,Stream>>>(KernelArguments);」として指定される。少なくとも1つの実施例では、実行構成シンタックスは、カーネル名(「KernelName」)とカーネル引数の括弧に入れられたリスト(「KernelArguments」)との間に挿入される「<<<...>>>」構築物である。少なくとも1つの実施例では、CUDAカーネル起動シンタックス3810は、限定はしないが、実行構成シンタックスの代わりにCUDA起動機能シンタックスを含む。
少なくとも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を与えられる。
少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3810に関して、「SharedMemorySize」は、静的に割り振られたメモリに加えて、所与のカーネル・コールについてスレッド・ブロックごとに動的に割り振られる共有メモリ中のバイトの数を指定する随意の引数である。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3810に関して、SharedMemorySizeは0にデフォルト設定される。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3810に関して、「Stream」は、関連するストリームを指定する随意の引数であり、デフォルト・ストリームを指定するために0にデフォルト設定される。少なくとも1つの実施例では、ストリームは、イン・オーダーで実行する(場合によっては、異なるホスト・スレッドによって発行された)コマンドのシーケンスである。少なくとも1つの実施例では、異なるストリームは、互いに対してアウト・オブ・オーダーで、又は同時に、コマンドを実行し得る。
少なくとも1つの実施例では、CUDAソース・コード3710は、限定はしないが、例示的なカーネル「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カーネル起動シンタックス3810通りに、カーネルMatAddは、寸法N/16×N/16を有する、スレッド・ブロックのグリッドを使用して実行され、ここで、各スレッド・ブロックは、16×16の寸法を有する。少なくとも1つの実施例では、各スレッド・ブロックは、256個のスレッドを含み、グリッドは、行列要素ごとに1つのスレッドを有するのに十分なブロックで作成され、そのようなグリッド中の各スレッドは、1つのペアワイズ加算を実施するためにカーネルMatAddを実行する。
少なくとも1つの実施例では、CUDAソース・コード3710をHIPソース・コード3730にトランスレートする間、CUDAからHIPへのトランスレーション・ツール3720は、CUDAソース・コード3710中の各カーネル・コールを、CUDAカーネル起動シンタックス3810からHIPカーネル起動シンタックス3820にトランスレートし、ソース・コード3710中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。少なくとも1つの実施例では、HIPカーネル起動シンタックス3820は、「hipLaunchKernelGGL(KernelName,GridSize,BlockSize,SharedMemorySize,Stream,KernelArguments);」として指定される。少なくとも1つの実施例では、KernelName、GridSize、BlockSize、ShareMemorySize、Stream、及びKernelArgumentsの各々は、HIPカーネル起動シンタックス3820において、(本明細書で前に説明された)CUDAカーネル起動シンタックス3810の場合と同じ意味を有する。少なくとも1つの実施例では、引数SharedMemorySize及びStreamは、HIPカーネル起動シンタックス3820では必要とされ、CUDAカーネル起動シンタックス3810では随意である。
少なくとも1つの実施例では、図38に図示されたHIPソース・コード3730の一部分は、カーネルMatAddにデバイス上で実行させるカーネル・コールを除いて、図38に図示されたCUDAソース・コード3710の一部分と同一である。少なくとも1つの実施例では、カーネルMatAddは、カーネルMatAddがCUDAソース・コード3710において定義される、同じ「__global__」宣言指定子を用いて、HIPソース・コード3730において定義される。少なくとも1つの実施例では、HIPソース・コード3730中のカーネル・コールは、「hipLaunchKernelGGL(MatAdd,numBlocks,threadsPerBlock,0,0,A,B,C);」であるが、CUDAソース・コード3710中の対応するカーネル・コールは、「MatAdd<<<numBlocks,threadsPerBlock>>>(A,B,C);」である。
図39は、少なくとも1つの実施例による、図37CのCUDA非対応GPU3792をより詳細に示す。少なくとも1つの実施例では、GPU3792は、サンタクララのAMD corporationによって開発される。少なくとも1つの実施例では、GPU3792は、高度並列様式でコンピュート動作を実施するように構成され得る。少なくとも1つの実施例では、GPU3792は、描画コマンド、ピクセル動作、幾何学的算出、及びディスプレイに画像をレンダリングすることに関連する他の動作など、グラフィックス・パイプライン動作を実行するように構成される。少なくとも1つの実施例では、GPU3792は、グラフィックに関係しない動作を実行するように構成される。少なくとも1つの実施例では、GPU3792は、グラフィックに関係する動作とグラフィックに関係しない動作の両方を実行するように構成される。少なくとも1つの実施例では、GPU3792は、HIPソース・コード3730中に含まれるデバイス・コードを実行するように構成され得る。
少なくとも1つの実施例では、GPU3792は、限定はしないが、任意の数のプログラマブル処理ユニット3920と、コマンド・プロセッサ3910と、L2キャッシュ3922と、メモリ・コントローラ3970と、DMAエンジン3980(1)と、システム・メモリ・コントローラ3982と、DMAエンジン3980(2)と、GPUコントローラ3984とを含む。少なくとも1つの実施例では、各プログラマブル処理ユニット3920は、限定はしないが、ワークロード・マネージャ3930と、任意の数のコンピュート・ユニット3940とを含む。少なくとも1つの実施例では、コマンド・プロセッサ3910は、1つ又は複数のコマンド・キュー(図示せず)からコマンドを読み取り、ワークロード・マネージャ3930にコマンドを分散させる。少なくとも1つの実施例では、各プログラマブル処理ユニット3920について、関連するワークロード・マネージャ3930は、プログラマブル処理ユニット3920中に含まれるコンピュート・ユニット3940にワークを分散させる。少なくとも1つの実施例では、各コンピュート・ユニット3940は、任意の数のスレッド・ブロックを実行し得るが、各スレッド・ブロックは、単一のコンピュート・ユニット3940上で実行する。少なくとも1つの実施例では、ワークグループは、スレッド・ブロックである。
少なくとも1つの実施例では、各コンピュート・ユニット3940は、限定はしないが、任意の数のSIMDユニット3950と、共有メモリ3960とを含む。少なくとも1つの実施例では、各SIMDユニット3950は、SIMDアーキテクチャを実装し、動作を並列に実施するように構成され得る。少なくとも1つの実施例では、各SIMDユニット3950は、限定はしないが、ベクトルALU3952とベクトル・レジスタ・ファイル3954とを含む。少なくとも1つの実施例では、各SIMDユニット3950は、異なるワープを実行する。少なくとも1つの実施例では、ワープは、スレッドのグループ(たとえば、16個のスレッド)であり、ここで、ワープ中の各スレッドは、単一のスレッド・ブロックに属し、命令の単一のセットに基づいて、データの異なるセットを処理するように構成される。少なくとも1つの実施例では、ワープ中の1つ又は複数のスレッドを無効にするために、プレディケーションが使用され得る。少なくとも1つの実施例では、レーンはスレッドである。少なくとも1つの実施例では、ワーク・アイテムはスレッドである。少なくとも1つの実施例では、ウェーブフロントはワープである。少なくとも1つの実施例では、スレッド・ブロック中の異なるウェーブフロントは、互いに同期し、共有メモリ3960を介して通信し得る。
少なくとも1つの実施例では、プログラマブル処理ユニット3920は、「シェーダ・エンジン」と呼ばれる。少なくとも1つの実施例では、各プログラマブル処理ユニット3920は、限定はしないが、コンピュート・ユニット3940に加えて、任意の量の専用グラフィックス・ハードウェアを含む。少なくとも1つの実施例では、各プログラマブル処理ユニット3920は、限定はしないが、(ゼロを含む)任意の数のジオメトリ・プロセッサと、(ゼロを含む)任意の数のラスターライザと、(ゼロを含む)任意の数のレンダー・バック・エンドと、ワークロード・マネージャ3930と、任意の数のコンピュート・ユニット3940とを含む。
少なくとも1つの実施例では、コンピュート・ユニット3940は、L2キャッシュ3922を共有する。少なくとも1つの実施例では、L2キャッシュ3922は区分けされる。少なくとも1つの実施例では、GPUメモリ3990は、GPU3792中のすべてのコンピュート・ユニット3940によってアクセス可能である。少なくとも1つの実施例では、メモリ・コントローラ3970及びシステム・メモリ・コントローラ3982は、GPU3792とホストとの間のデータ転送を容易にし、DMAエンジン3980(1)は、GPU3792とそのようなホストとの間の非同期メモリ転送を可能にする。少なくとも1つの実施例では、メモリ・コントローラ3970及びGPUコントローラ3984は、GPU3792と他のGPU3792との間のデータ転送を容易にし、DMAエンジン3980(2)は、GPU3792と他のGPU3792との間の非同期メモリ転送を可能にする。
少なくとも1つの実施例では、GPU3792は、限定はしないが、GPU3792の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする、任意の量及びタイプのシステム相互接続を含む。少なくとも1つの実施例では、GPU3792は、限定はしないが、任意の数及びタイプの周辺デバイスに結合される、任意の数及びタイプのI/Oインターフェース(たとえば、PCIe)を含む。少なくとも1つの実施例では、GPU3792は、限定はしないが、(ゼロを含む)任意の数のディスプレイ・エンジンと、(ゼロを含む)任意の数のマルチメディア・エンジンとを含み得る。少なくとも1つの実施例では、GPU3792は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ(たとえば、メモリ・コントローラ3970及びシステム・メモリ・コントローラ3982)及びメモリ・デバイス(たとえば、共有メモリ3960)を含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、GPU3792は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ3922)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、SIMDユニット3950、コンピュート・ユニット3940、及びプログラマブル処理ユニット3920)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
図40は、少なくとも1つの実施例による、例示的なCUDAグリッド4020のスレッドが図39の異なるコンピュート・ユニット3940にどのようにマッピングされるかを示す。少なくとも1つの実施例では、及び単に説明目的のために、グリッド4020は、BX×BY×1のGridSizeと、TX×TY×1のBlockSizeとを有する。少なくとも1つの実施例では、グリッド4020は、したがって、限定はしないが、(BX*BY)個のスレッド・ブロック4030を含み、各スレッド・ブロック4030は、限定はしないが、(TX*TY)個のスレッド4040を含む。スレッド4040は、曲がりくねった矢印(squiggly arrow)として図40に図示されている。
少なくとも1つの実施例では、グリッド4020は、限定はしないが、コンピュート・ユニット3940(1)~3940(C)を含むプログラマブル処理ユニット3920(1)にマッピングされる。少なくとも1つの実施例では、及び示されているように、(BJ*BY)個のスレッド・ブロック4030が、コンピュート・ユニット3940(1)にマッピングされ、残りのスレッド・ブロック4030が、コンピュート・ユニット3940(2)にマッピングされる。少なくとも1つの実施例では、各スレッド・ブロック4030は、限定はしないが、任意の数のワープを含み得、各ワープは、図39の異なるSIMDユニット3950にマッピングされる。
少なくとも1つの実施例では、所与のスレッド・ブロック4030中のワープは、互いに同期し、関連するコンピュート・ユニット3940中に含まれる共有メモリ3960を通して通信し得る。たとえば、及び少なくとも1つの実施例では、スレッド・ブロック4030(BJ,1)中のワープは、互いに同期し、共有メモリ3960(1)を通して通信することができる。たとえば、及び少なくとも1つの実施例では、スレッド・ブロック4030(BJ+1,1)中のワープは、互いに同期し、共有メモリ3960(2)を通して通信することができる。
図41は、少なくとも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加速を使用する複雑なアルゴリズムを構築し、次いで、それらを、異なるタイプのデータに関するそれらのソース・コード全体にわたって再使用することができる、単一ソース開発を可能にし得る。
少なくとも1つの実施例では、DPC++コンパイラは、多様なハードウェア・ターゲットにわたって導入され得るDPC++ソース・コードをコンパイルするために使用される。少なくとも1つの実施例では、DPC++コンパイラは、多様なハードウェア・ターゲットにわたって導入され得るDPC++アプリケーションを生成するために使用され、DPC++互換性ツールは、CUDAアプリケーションをDPC++のマルチプラットフォーム・プログラムにマイグレートするために使用され得る。少なくとも1つの実施例では、DPC++ベース・ツール・キットは、多様なハードウェア・ターゲットにわたってアプリケーションを導入するためのDPC++コンパイラと、CPU、GPU、及びFPGAにわたって生産性及び性能を増加させるためのDPC++ライブラリと、CUDAアプリケーションをマルチプラットフォーム・アプリケーションにマイグレートするためのDPC++互換性ツールと、それらの任意の好適な組合せとを含む。
少なくとも1つの実施例では、DPC++プログラミング・モデルは、Data Parallel C++と呼ばれるプログラミング言語を用いて並列性を表現するための現代のC++特徴を使用することによって、単に、CPU及びアクセラレータをプログラムすることに関係する1つ又は複数の態様に対して利用される。DPC++プログラミング言語は、ホスト(たとえば、CPU)及びアクセラレータ(たとえば、GPU又はFPGA)のためのコード再使用に対して利用され、単一のソース言語を使用し、実行及びメモリ依存性が明確に通信され得る。DPC++コード内でのマッピングは、アプリケーションを移行させて、ワークロードを最も良く加速するハードウェア又はハードウェア・デバイスのセット上で稼働するために、使用され得る。利用可能なアクセラレータを有しないプラットフォーム上でも、デバイス・コードの開発及びデバッギングを簡略化するために、ホストが利用可能であり得る。
少なくとも1つの実施例では、人間が読み取れるDPC++4104を生成するために、DPC++互換性ツール4102への入力として、CUDAソース・コード4100が提供される。少なくとも1つの実施例では、人間が読み取れるDPC++4104は、DPC++互換性ツール4102によって生成されたインライン・コメントを含み、これは、コーディングと所望の性能への調整とを完了4106するために、DPC++コードをどのように及び/又はどこで修正すべきかに関して開発者をガイドし、それにより、DPC++ソース・コード4108を生成する。
少なくとも1つの実施例では、CUDAソース・コード4100は、CUDAプログラミング言語の人間が読み取れるソース・コードの集合であるか、又はその集合を含む。少なくとも1つの実施例では、CUDAソース・コード4100は、CUDAプログラミング言語の人間が読み取れるソース・コードである。少なくとも1つの実施例では、CUDAプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、デバイス・コードは、コンパイルの後に、デバイス(たとえば、GPU又はFPGA)上で実行可能であり、デバイスの1つ又は複数のプロセッサ・コア上で実行され得る、又はより並列化可能なワークフローを含み得る、ソース・コードである。少なくとも1つの実施例では、デバイスは、CUDA対応GPU、GPU、又は別のGPGPUなど、並列命令処理のために最適化されるプロセッサであり得る。少なくとも1つの実施例では、ホスト・コードは、コンパイルの後にホスト上で実行可能であるソース・コードである。少なくとも1つの実施例では、ホスト・コード及びデバイス・コードの一部又は全部は、CPU及びGPU/FPGAにわたって並列に実行され得る。少なくとも1つの実施例では、ホストは、CPUなど、連続命令処理のために最適化されるプロセッサである。図41に関して説明されるCUDAソース・コード4100は、本明細書の他の場所で説明されるCUDAソース・コードに従い得る。
少なくとも1つの実施例では、DPC++互換性ツール4102は、DPC++ソース・コード4108へのCUDAソース・コード4100のマイグレーションを容易にするために使用される、実行可能ツール、プログラム、アプリケーション、又は任意の他の好適なタイプのツールを指す。少なくとも1つの実施例では、DPC++互換性ツール4102は、既存のCUDAソースをDPC++に移植するために使用されるDPC++ツール・キットの一部として利用可能なコマンド・ライン・ベースのコード・マイグレーション・ツールである。少なくとも1つの実施例では、DPC++互換性ツール4102は、CUDAアプリケーションの一部又は全部のソース・コードをCUDAからDPC++にコンバートし、人間が読み取れるDPC++4104と呼ばれる、少なくとも部分的にDPC++で書かれる得られたファイルを生成する。少なくとも1つの実施例では、人間が読み取れるDPC++4104は、ユーザ介入がどこで必要であり得るかを指示するためにDPC++互換性ツール4102によって生成されるコメントを含む。少なくとも1つの実施例では、ユーザ介入は、CUDAソース・コード4100が、類似するDPC++APIを有しないCUDA APIをコールするとき、必要であり、ユーザ介入が必要とされる他の実例は、後でより詳細に説明される。
少なくとも1つの実施例では、CUDAソース・コード4100(たとえば、アプリケーション又はそれの部分)をマイグレートするためのワークフローは、1つ又は複数のコンパイル・データベース・ファイルを作成することと、DPC++互換性ツール4102を使用してCUDAをDPC++にマイグレートすることと、マイグレーションを完了し、正当性を確認し、それにより、DPC++ソース・コード4108を生成することと、DPC++アプリケーションを生成するためにDPC++コンパイラを用いてDPC++ソース・コード4108をコンパイルすることとを含む。少なくとも1つの実施例では、互換性ツールは、Makefileが実行するときに使用されるコマンドをインターセプトし、それらをコンパイル・データベース・ファイルに記憶する、ユーティリティを提供する。少なくとも1つの実施例では、ファイルは、JSONフォーマットで記憶される。少なくとも1つの実施例では、intercept-builtコマンドは、MakefileコマンドをDPC互換性コマンドにコンバートする。
少なくとも1つの実施例では、intercept-buildは、ビルド・プロセスをインターセプトして、コンパイル・オプション、マクロ定義(macro defs)、及びインクルード・パス(include paths)をキャプチャし、このデータをコンパイル・データベース・ファイルに書き込む、ユーティリティ・スクリプトである。少なくとも1つの実施例では、コンパイル・データベース・ファイルは、JSONファイルである。少なくとも1つの実施例では、DPC++互換性ツール4102は、コンパイル・データベースを構文解析し、入力ソースをマイグレートするときにオプションを適用する。少なくとも1つの実施例では、intercept-buildの使用は、随意であるが、Make又はCMakeベースの環境について大いに推奨される。少なくとも1つの実施例では、マイグレーション・データベースは、コマンドとディレクトリとファイルとを含み、コマンドは、必要なコンパイル・フラグを含み得、ディレクトリは、ヘッダ・ファイルへのパスを含み得、ファイルは、CUDAファイルへのパスを含み得る。
少なくとも1つの実施例では、DPC++互換性ツール4102は、可能な場合はいつでもDPC++を生成することによって、CUDAで書かれたCUDAコード(たとえば、アプリケーション)をDPC++にマイグレートする。少なくとも1つの実施例では、DPC++互換性ツール4102は、ツール・キットの一部として利用可能である。少なくとも1つの実施例では、DPC++ツール・キットは、intercept-buildツールを含む。少なくとも1つの実施例では、intercept-builtツールは、CUDAファイルをマイグレートするためにコンパイル・コマンドをキャプチャするコンパイル・データベースを作成する。少なくとも1つの実施例では、intercept-builtツールによって生成されたコンパイル・データベースは、CUDAコードをDPC++にマイグレートするためにDPC++互換性ツール4102によって使用される。少なくとも1つの実施例では、非CUDA C++コード及びファイルは、そのままマイグレートされる。少なくとも1つの実施例では、DPC++互換性ツール4102は、人間が読み取れるDPC++4104を生成し、これは、DPC++互換性ツール4102によって生成されたとき、DPC++コンパイラによってコンパイルされないことがあり、正しくマイグレートされなかったコードの部分を確認するための追加のプラミング(plumbing)を必要とする、DPC++コードであり得、開発者によってなど、手動の介入を伴い得る。少なくとも1つの実施例では、DPC++互換性ツール4102は、自動的にマイグレートされないことがある追加のコードを開発者が手動でマイグレートするのを助けるために、コード中に埋め込まれたヒント又はツールを提供する。少なくとも1つの実施例では、マイグレーションは、ソース・ファイル、プロジェクト、又はアプリケーションのための1回のアクティビティである。
少なくとも1つの実施例では、DPC++互換性ツール41002は、CUDAコードのすべての部分をDPC++に正常にマイグレートすることが可能であり、単に、生成されたDPC++ソース・コードの性能を手動で確認及び調整するための随意のステップがあり得る。少なくとも1つの実施例では、DPC++互換性ツール4102は、DPC++互換性ツール4102によって生成されたDPC++コードを修正するための人間の介入を必要とするか又は利用することなしに、DPC++コンパイラによってコンパイルされるDPC++ソース・コード4108を直接生成する。少なくとも1つの実施例では、DPC++互換性ツールは、コンパイル可能なDPC++コードを生成し、これは、性能、読みやすさ、維持可能性、他の様々な考慮事項、又はそれらの任意の組合せについて、開発者によって随意に調整され得る。
少なくとも1つの実施例では、1つ又は複数のCUDAソース・ファイルは、少なくとも部分的にDPC++互換性ツール4102を使用してDPC++ソース・ファイルにマイグレートされる。少なくとも1つの実施例では、CUDAソース・コードは、CUDAヘッダ・ファイルを含み得る1つ又は複数のヘッダ・ファイルを含む。少なくとも1つの実施例では、CUDAソース・ファイルは、<cuda.h>ヘッダ・ファイルと、テキストをプリントするために使用され得る<stdio.h>ヘッダ・ファイルとを含む。少なくとも1つの実施例では、ベクトル加算カーネルCUDAソース・ファイルの一部分は、以下のように書かれるか、又は以下に関係し得る。
Figure 2023007422000015

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

Figure 2023007422000018

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

Claims (32)

  1. メモリ・バリア演算であって、スレッドの複数のグループによるメモリへのアクセスが、前記メモリ・バリア演算によって指示される順序で発生することを引き起こすための、メモリ・バリア演算を実施するための1つ又は複数の回路を備える、プロセッサ。
  2. 前記メモリ・バリア演算が、スレッドの前記複数のグループについての同期情報を単一のアドレス指定可能なメモリ・ロケーションに記憶する、請求項1に記載のプロセッサ。
  3. 前記同期情報が、スレッドの個々のグループの同期を指示するビットの別個のグループをもつビット・フィールドとして記憶される、請求項2に記載のプロセッサ。
  4. 前記ビット・フィールドの個々のビットが、対称型マルチプロセッサ上で並列に実行されることが可能なスレッドのサブグループを表す、請求項3に記載のプロセッサ。
  5. 前記同期情報が、アトミック論理演算を使用して操作される、請求項2に記載のプロセッサ。
  6. 前記メモリ・バリア演算は、スレッドの前記複数のグループが、並列に実行されることを引き起こす、請求項1に記載のプロセッサ。
  7. スレッドの前記複数のグループの個々のグループが連動スレッド・グループである、請求項6に記載のプロセッサ。
  8. 前記連動スレッド・グループが複数のワープにわたる、請求項7に記載のプロセッサ。
  9. メモリ・バリア演算であって、スレッドの複数のグループによるメモリへのアクセスが、前記メモリ・バリア演算によって指示される順序で発生することを引き起こすための、メモリ・バリア演算を実施するステップを含む、コンピュータ実装方法。
  10. 前記メモリ・バリア演算が、スレッドの前記複数のグループについての同期情報を単一のアドレス指定可能なメモリ・ロケーションに記憶する、請求項9に記載のコンピュータ実装方法。
  11. 前記同期情報が、スレッドの個々のグループの同期を指示するビットの別個のグループをもつビット・フィールドとして記憶される、請求項10に記載のコンピュータ実装方法。
  12. 前記ビット・フィールドの個々のビットが、対称型マルチプロセッサ上で並列に実行されることが可能なスレッドのサブグループを表す、請求項11に記載のコンピュータ実装方法。
  13. 前記同期情報が、アトミック論理演算を使用して操作される、請求項10に記載のコンピュータ実装方法。
  14. 前記メモリ・バリア演算は、スレッドの前記複数のグループが、並列に実行されることを引き起こす、請求項9に記載のコンピュータ実装方法。
  15. スレッドの前記複数のグループの個々のグループが連動スレッド・グループである、請求項14に記載のコンピュータ実装方法。
  16. 前記連動スレッド・グループが複数のワープにわたる、請求項15に記載のコンピュータ実装方法。
  17. 1つ又は複数のプロセッサと実行可能命令を記憶するメモリとを備えるコンピュータ・システムであって、前記実行可能命令は、前記1つ又は複数のプロセッサによって実行された結果として、前記コンピュータ・システムに、メモリ・バリア演算であって、スレッドの複数のグループによるメモリへのアクセスが、前記メモリ・バリア演算によって指示される順序で発生することを引き起こす、メモリ・バリア演算を実施させる、コンピュータ・システム。
  18. 前記メモリ・バリア演算が、スレッドの前記複数のグループについての同期情報を単一のアドレス指定可能なメモリ・ロケーションに記憶する、請求項17に記載のコンピュータ・システム。
  19. 前記同期情報が、スレッドの個々のグループの同期を指示するビットの別個のグループをもつビット・フィールドとして記憶される、請求項18に記載のコンピュータ・システム。
  20. 前記ビット・フィールドの個々のビットが、対称型マルチプロセッサ上で並列に実行されることが可能なスレッドのサブグループを表す、請求項19に記載のコンピュータ・システム。
  21. 前記同期情報が、アトミック論理演算を使用して操作される、請求項18に記載のコンピュータ・システム。
  22. 前記メモリ・バリア演算は、スレッドの前記複数のグループが、並列に実行されることを引き起こす、請求項17に記載のコンピュータ・システム。
  23. スレッドの前記複数のグループの個々のグループが連動スレッド・グループである、請求項22に記載のコンピュータ・システム。
  24. 前記連動スレッド・グループが複数のワープにわたる、請求項23に記載のコンピュータ・システム。
  25. 命令のセットを記憶した機械可読媒体であって、命令の前記セットが、1つ又は複数のプロセッサによって実施された場合、前記1つ又は複数のプロセッサに、メモリ・バリア演算であって、スレッドの複数のグループによるメモリへのアクセスが、前記メモリ・バリア演算によって指示される順序で発生することを引き起こす、メモリ・バリア演算を実施させる、機械可読媒体。
  26. 前記メモリ・バリア演算が、スレッドの前記複数のグループについての同期情報を単一のアドレス指定可能なメモリ・ロケーションに記憶する、請求項25に記載の機械可読媒体。
  27. 前記同期情報が、スレッドの個々のグループの同期を指示するビットの別個のグループをもつビット・フィールドとして記憶される、請求項26に記載の機械可読媒体。
  28. 前記ビット・フィールドの個々のビットが、対称型マルチプロセッサ上で並列に実行されることが可能なスレッドのサブグループを表す、請求項27に記載の機械可読媒体。
  29. 前記同期情報が、アトミック論理演算を使用して操作される、請求項26に記載の機械可読媒体。
  30. 前記メモリ・バリア演算は、スレッドの前記複数のグループが、並列に実行されることを引き起こす、請求項25に記載の機械可読媒体。
  31. スレッドの前記複数のグループの個々のグループが連動スレッド・グループである、請求項30に記載の機械可読媒体。
  32. 前記連動スレッド・グループが複数のワープにわたる、請求項31に記載の機械可読媒体。
JP2022090004A 2021-06-29 2022-06-02 同期バリア Pending JP2023007422A (ja)

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
US202163216430P 2021-06-29 2021-06-29
US63/216,430 2021-06-29
US17/366,770 US20220413945A1 (en) 2021-06-29 2021-07-02 Synchronization barrier
US17/366,770 2021-07-02

Publications (1)

Publication Number Publication Date
JP2023007422A true JP2023007422A (ja) 2023-01-18

Family

ID=82705460

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2022090004A Pending JP2023007422A (ja) 2021-06-29 2022-06-02 同期バリア

Country Status (6)

Country Link
US (1) US20220413945A1 (ja)
JP (1) JP2023007422A (ja)
KR (1) KR20230002058A (ja)
CN (1) CN115543641A (ja)
DE (1) DE102022114663A1 (ja)
GB (1) GB2611847A (ja)

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7519967B1 (en) * 2005-06-17 2009-04-14 Sun Microsystems, Inc. Facilitating biased synchronization in an object-based system
US8381203B1 (en) * 2006-11-03 2013-02-19 Nvidia Corporation Insertion of multithreaded execution synchronization points in a software program
US8966488B2 (en) * 2007-07-06 2015-02-24 XMOS Ltd. Synchronising groups of threads with dedicated hardware logic
US9223578B2 (en) * 2009-09-25 2015-12-29 Nvidia Corporation Coalescing memory barrier operations across multiple parallel threads
US8997103B2 (en) * 2009-09-25 2015-03-31 Nvidia Corporation N-way memory barrier operation coalescing

Also Published As

Publication number Publication date
KR20230002058A (ko) 2023-01-05
DE102022114663A1 (de) 2022-12-29
CN115543641A (zh) 2022-12-30
GB202209057D0 (en) 2022-08-10
US20220413945A1 (en) 2022-12-29
GB2611847A (en) 2023-04-19

Similar Documents

Publication Publication Date Title
JP2024519231A (ja) 行列値指示を実施すること
WO2023183874A1 (en) Application programming interface to perform operation with reusable thread
WO2023115014A1 (en) Application programming interface to create and modify graphics objects
US20230244391A1 (en) Graph-based memory storage
US20230185706A1 (en) Asynchronous memory deallocation
US20230185634A1 (en) Application programming interface to cause graph code to update a semaphore
WO2023044353A1 (en) Parallel processing of thread groups
JP2024513617A (ja) コードを同時に起動すること
EP4213459A1 (en) Network multicasting using alternate sets of directives
US20240169023A1 (en) Application programming interface to indicate matrix multiply-accumulate
US20220413945A1 (en) Synchronization barrier
US20240143402A1 (en) Application programming interface to indicate operations
US20240112296A1 (en) Generating and interposing interpolated frames with application frames for display
US20240036953A1 (en) Application programming interface to indicate scheduling policies
US20230185612A1 (en) Asynchronous memory allocation
US20220334845A1 (en) Launching code concurrently
US20220365829A1 (en) Data compression api
US20220334879A1 (en) Application programming interface to identify sharable memory
US20240095024A1 (en) Program code versions
US20230185641A1 (en) Application programming interface to store portions of an image
AU2022204612A1 (en) Synchronization barrier
JP2024514371A (ja) 不完全なグラフ・コードの位置を特定するためのアプリケーション・プログラミング・インターフェース
JP2024514370A (ja) リソース使用量を監視するためのアプリケーション・プログラミング・インターフェース
JP2024513616A (ja) メモリを特定するためのアプリケーション・プログラミング・インターフェース

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20231030