JP2022135998A - 高ダイナミック・レンジ撮像用途のためのトーン利得関数を使用したトーン管理 - Google Patents
高ダイナミック・レンジ撮像用途のためのトーン利得関数を使用したトーン管理 Download PDFInfo
- Publication number
- JP2022135998A JP2022135998A JP2022030893A JP2022030893A JP2022135998A JP 2022135998 A JP2022135998 A JP 2022135998A JP 2022030893 A JP2022030893 A JP 2022030893A JP 2022030893 A JP2022030893 A JP 2022030893A JP 2022135998 A JP2022135998 A JP 2022135998A
- Authority
- JP
- Japan
- Prior art keywords
- cuda
- image
- memory
- contrast
- 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
Links
- 230000006870 function Effects 0.000 title claims description 140
- 238000003384 imaging method Methods 0.000 title description 7
- 238000000034 method Methods 0.000 claims abstract description 126
- 230000015654 memory Effects 0.000 claims description 284
- 238000009499 grossing Methods 0.000 claims description 5
- 230000001747 exhibiting effect Effects 0.000 claims 2
- 230000000694 effects Effects 0.000 abstract description 3
- HPTJABJPZMULFH-UHFFFAOYSA-N 12-[(Cyclohexylcarbamoyl)amino]dodecanoic acid Chemical compound OC(=O)CCCCCCCCCCCNC(=O)NC1CCCCC1 HPTJABJPZMULFH-UHFFFAOYSA-N 0.000 description 300
- 238000012545 processing Methods 0.000 description 210
- 239000008186 active pharmaceutical agent Substances 0.000 description 101
- 238000007667 floating Methods 0.000 description 73
- 230000008569 process Effects 0.000 description 52
- 238000013507 mapping Methods 0.000 description 43
- 238000013519 translation Methods 0.000 description 42
- 230000014616 translation Effects 0.000 description 42
- 238000004891 communication Methods 0.000 description 35
- 238000005227 gel permeation chromatography Methods 0.000 description 31
- 238000005192 partition Methods 0.000 description 30
- 238000007726 management method Methods 0.000 description 28
- 239000000872 buffer Substances 0.000 description 20
- 239000011159 matrix material Substances 0.000 description 20
- 230000002093 peripheral effect Effects 0.000 description 19
- 238000012546 transfer Methods 0.000 description 18
- 230000001133 acceleration Effects 0.000 description 15
- 239000012634 fragment Substances 0.000 description 15
- 239000013598 vector Substances 0.000 description 15
- 230000007246 mechanism Effects 0.000 description 12
- 101000740523 Homo sapiens Syntenin-1 Proteins 0.000 description 11
- 102100037219 Syntenin-1 Human genes 0.000 description 11
- 238000013508 migration Methods 0.000 description 10
- 230000005012 migration Effects 0.000 description 10
- 238000004422 calculation algorithm Methods 0.000 description 9
- 239000003795 chemical substances by application Substances 0.000 description 9
- 238000013135 deep learning Methods 0.000 description 9
- 239000002131 composite material Substances 0.000 description 8
- 230000001419 dependent effect Effects 0.000 description 8
- 239000004744 fabric Substances 0.000 description 8
- 230000005540 biological transmission Effects 0.000 description 7
- 238000009877 rendering Methods 0.000 description 7
- 230000004044 response Effects 0.000 description 7
- 230000009471 action Effects 0.000 description 6
- 238000013500 data storage Methods 0.000 description 6
- 238000003491 array Methods 0.000 description 5
- 238000010586 diagram Methods 0.000 description 5
- 230000010354 integration Effects 0.000 description 5
- 238000004590 computer program Methods 0.000 description 4
- 238000001514 detection method Methods 0.000 description 4
- 238000001914 filtration Methods 0.000 description 4
- 238000010801 machine learning Methods 0.000 description 4
- 239000000047 product Substances 0.000 description 4
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000011161 development Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 238000011068 loading method Methods 0.000 description 3
- 238000002156 mixing Methods 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000005457 optimization Methods 0.000 description 3
- 238000005070 sampling Methods 0.000 description 3
- 230000001360 synchronised effect Effects 0.000 description 3
- 230000001052 transient effect Effects 0.000 description 3
- 102100035964 Gastrokine-2 Human genes 0.000 description 2
- 101001075215 Homo sapiens Gastrokine-2 Proteins 0.000 description 2
- 241000699670 Mus sp. Species 0.000 description 2
- 238000013528 artificial neural network Methods 0.000 description 2
- 230000003190 augmentative effect Effects 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 2
- 238000010276 construction Methods 0.000 description 2
- 238000001816 cooling Methods 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 239000000203 mixture Substances 0.000 description 2
- 229920001690 polydopamine Polymers 0.000 description 2
- 238000012805 post-processing Methods 0.000 description 2
- 238000012216 screening Methods 0.000 description 2
- 238000013515 script Methods 0.000 description 2
- 239000007787 solid Substances 0.000 description 2
- 230000009466 transformation Effects 0.000 description 2
- 230000007704 transition Effects 0.000 description 2
- 239000011800 void material Substances 0.000 description 2
- 241000699666 Mus <mouse, genus> Species 0.000 description 1
- 101100202275 Mus musculus Slc22a8 gene Proteins 0.000 description 1
- 101100285899 Saccharomyces cerevisiae (strain ATCC 204508 / S288c) SSE2 gene Proteins 0.000 description 1
- 241000700605 Viruses Species 0.000 description 1
- 230000002411 adverse Effects 0.000 description 1
- 238000012884 algebraic function Methods 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000004888 barrier function Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000007796 conventional method Methods 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 230000001186 cumulative effect Effects 0.000 description 1
- 238000007405 data analysis Methods 0.000 description 1
- 238000013501 data transformation Methods 0.000 description 1
- 238000000354 decomposition reaction Methods 0.000 description 1
- 229920005994 diacetyl cellulose Polymers 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 206010016256 fatigue Diseases 0.000 description 1
- 238000011773 genetically engineered mouse model Methods 0.000 description 1
- 239000013067 intermediate product Substances 0.000 description 1
- 238000002955 isolation Methods 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 230000007774 longterm Effects 0.000 description 1
- 238000007620 mathematical function Methods 0.000 description 1
- 238000005259 measurement Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000009428 plumbing Methods 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 238000007639 printing Methods 0.000 description 1
- 230000001902 propagating effect Effects 0.000 description 1
- 238000005067 remediation Methods 0.000 description 1
- 238000012552 review Methods 0.000 description 1
- 239000011435 rock Substances 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000035945 sensitivity Effects 0.000 description 1
- 238000012163 sequencing technique Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 239000000758 substrate Substances 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 238000012549 training Methods 0.000 description 1
- 238000000844 transformation Methods 0.000 description 1
- 238000011282 treatment Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T5/00—Image enhancement or restoration
- G06T5/90—Dynamic range modification of images or parts thereof
- G06T5/92—Dynamic range modification of images or parts thereof based on global image properties
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T5/00—Image enhancement or restoration
- G06T5/77—Retouching; Inpainting; Scratch removal
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T5/00—Image enhancement or restoration
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T7/00—Image analysis
- G06T7/90—Determination of colour characteristics
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N23/00—Cameras or camera modules comprising electronic image sensors; Control thereof
- H04N23/70—Circuitry for compensating brightness variation in the scene
- H04N23/741—Circuitry for compensating brightness variation in the scene by increasing the dynamic range of the image compared to the dynamic range of the electronic image sensors
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N5/00—Details of television systems
- H04N5/44—Receiver circuitry for the reception of television signals according to analogue transmission standards
- H04N5/57—Control of contrast or brightness
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T2207/00—Indexing scheme for image analysis or image enhancement
- G06T2207/10—Image acquisition modality
- G06T2207/10024—Color image
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T2207/00—Indexing scheme for image analysis or image enhancement
- G06T2207/20—Special algorithmic details
- G06T2207/20172—Image enhancement details
- G06T2207/20208—High dynamic range [HDR] image processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T2207/00—Indexing scheme for image analysis or image enhancement
- G06T2207/20—Special algorithmic details
- G06T2207/20228—Disparity calculation for image-based rendering
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Multimedia (AREA)
- Signal Processing (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Image Processing (AREA)
- Studio Devices (AREA)
Abstract
【課題】トーン及びコントラスト強調の悪影響を最小限に抑えること。【解決手段】画像データのための効果的なトーン管理を実施するための装置、システム、及び技法。一実施例では、入力画像のトーナル範囲のセットに対応するコントラスト利得曲線のセットが生成される。次いで、少なくとも、入力画像のトーナル範囲に、対応するコントラスト利得曲線を用することによって、出力画像が生成され得る。【選択図】図1
Description
本発明は、高ダイナミック・レンジ撮像用途のためのトーン利得関数を使用したトーン管理に関するものである。
高ダイナミック・レンジ撮像(HDRI:High-Dynamic-Range Imaging)は、高ダイナミック・レンジ(HDR:High Dynamic Range)の画像データを生成する技法を含む。すなわち、HDRIは、最も大きい可能なピクセル値(たとえば、最も大きい可能な光度値)と最も小さい可能なピクセル値(たとえば、最も小さい可能な光度値)との増加された比を提供する。より小さい光度値のピクセルが、符号化された画像のより暗い(たとえば、より黒い)領域としてレンダリングし、より大きい光度値のピクセルが、画像のより明るい(たとえば、より白い)領域としてレンダリングする。最も大きい光度値と最も小さい光度値との拡張された比のために、及び増加されたダイナミック・レンジ(DR:Dynamic Range)をレンダリングするのに十分な能力をもつデバイス上に表示されるとき、HDR画像は、さらなる詳細及びコントラストを提供し得、したがって、人間の閲覧者に、より現実的に及び自然に見え得る。さらに、これらのHDR画像の増加されたコントラスト及び詳細は、画像中のエンティティ又はオブジェクトを識別することなど、様々な画像処理タスクについての成果を改善し得る。たとえば、適切にレンダリングされるとき、HDR画像データ中に符号化されるシーンの画像が、より高い詳細及びコントラストを有し、画像処理ソフトウェアによるシーンにおけるより正確なオブジェクト検出を可能にし得る。
HDR画像データをトーン・マッピング(tone map)するための従来の方法は、不適当なトーン及びコントラスト処置の結果として、画像の飽和及び/又はクリッピングを引き起こすことがあり、これは、データ損失及び/又は検出失敗を生じ得る。さらに、HDR画像、及び/又はトーン・マッピングされたHDR画像データによって符号化された画像の輝度を制御するとき、様々な画像処理技法が、HDRIに関連する視覚的利益の多くを低減し、たとえば、HDR画像及び/又はトーン・マッピングされたHDR画像を、「色あせた(washed-out)」、あまり現実的でない、又はさもなければあまり詳細でないように見えるものとしてレンダリングし得る。
図面を参照しながら様々な技法が説明される。
本開示の実施例は、複数のトーン利得関数を用いた効果的なトーン管理に関する。HDR画像データ内の領域のセットを決定するシステム及び方法が開示され、ここで、別個のトーン利得関数が、領域のセットのうちの特定の領域に適用される。
上記で説明されたものなど、従来のシステムとは対照的に、HDR画像データの個別トーナル領域に別個のトーン利得関数を適用することは、飽和、クリッピング、及び/又はコントラストの欠如など、トーン及びコントラスト強調の悪影響を最小限に抑える。様々な実施例では、最適トーン利得関数が、HDR画像データ内のトーナル範囲を表す複数のトーン・キー(tone key)について決定される。一実例では、これらのトーナル範囲は、シャドー範囲と、中間トーン範囲と、ハイライト範囲とを含む。これらのトーナル範囲は、画像内のローカル・エリアを表し得、特定のトーン利得関数が、これらのローカル・エリアに適用され得る。
様々な実施例では、HDR画像処理パイプラインは、統計分析器(statistical analyzer)と、コントラスト計算器と、コントラスト利得曲線生成器と、コントラスト・マッピングと、グローバル・トーン・マッピングとを含む。HDR画像処理パイプラインの動作は、以下でより詳細に説明されるように、並列に、直列に、又はそれらの組合せで実施され得る。たとえば、統計分析器と、コントラスト計算器と、コントラスト利得曲線生成器と、ローカル・コントラスト・マッピングとを含むローカル・コントラスト処理が、グローバル・トーン・マッピングの実施の前又は後のいずれかに実施され得る。
以下でより詳細に説明される統計分析器は、HDR画像データの様々な統計値を決定するためにHDR画像データを処理し得る。一実施例では、統計分析器は、複数のトーナル範囲、各トーナル範囲についての平均、及び各トーナル範囲についての分散を生成するために、HDR画像データを表すヒストグラムを処理する。一実例では、HDR画像データは、3つのトーナル範囲、すなわち、シャドー範囲、中間トーン範囲、及びハイライト範囲に分割され、ここで、シャドー範囲は、下位10パーセント(たとえば、ヒストグラム中で表されるピクセルの数)を表し、ハイライト範囲は、上位10パーセントを表し、中間トーンレイジは、シャドー範囲とハイライト範囲との間のHDR画像データの部分を表す。様々な実施例では、複数の範囲及び/又は関連する平均は、以下でより詳細に説明されるように、コントラスト利得曲線生成器への入力として提供される。
コントラスト計算器は、一実施例では、入力画像と、ガウス・スケール空間において平滑化ファクタによってスケーリングされた参照トーン画像との間のトーナル差を決定する。さらに、複数のコントラスト画像が、異なるスケールに少なくとも部分的に基づいて生成され得る。様々な実施例では、入力画像のピクセルについてのルミナンス値が決定され、次いで、ルミナンス値は、平滑化されたルミナンス値を生成するためにガウス・カーネルを使用して平滑化される。次いで、コントラスト画像が、少なくとも、ルミナンス値を、平滑化されたルミナンス値と比較することによって、生成され得る。一実例では、コントラスト画像は、正の値と負の値とを含む。
様々な実施例では、コントラスト利得曲線生成器は、統計分析器によって生成されたトーナル範囲についてコントラスト利得曲線のセットを生成する。さらに、様々な制御パラメータが、コントラスト利得曲線のセットのうちのコントラスト利得曲線に適用され、並びにコントラスト利得曲線のセットのうちのコントラスト利得曲線の組合せであり得るグローバル・コントラスト利得曲線に適用され得る。さらに、様々な実施例では、これらの制御ファクタは、シーン条件(たとえば、夜間又は低照度画像(low light image))に基づいて調整される。上記で説明された実例に戻ると、3つの利得曲線、すなわち、シャドー・コントラスト利得曲線、ハイライト・コントラスト利得曲線、及び中間トーン・コントラスト利得曲線が生成される。様々な実施例では、コントラスト利得曲線は、トーナル範囲についての平均値と、トーナル範囲分布に従って統計分析器によって生成されたガウス曲線を表すシグマとに少なくとも部分的に基づいて決定される。概して、コントラスト利得曲線は、入力トーン値の関数であって、そのトーン値についての対応する利得を作り出す。
様々な実施例では、コントラスト・マッピングは、調整されたコントラスト画像を生成するために、コントラスト計算器によって生成されたコントラスト画像にコントラスト利得曲線を適用する。一実例では、これらの調整されたコントラスト画像は、最終コントラスト画像を作成するために組み合わせられる。いくつかの実施例では、最終コントラスト画像は、グローバル・トーン・マッピングの出力とマージされる。また他の実施例では、グローバル・トーン・マッピングは、ローカル・トーン・マッピングを実施するより前に、入力画像に適用される。出力画像(たとえば、最終コントラスト画像、又はグローバル・トーン・マッピングされた画像とマージされた最終コントラスト画像)は、オブジェクト検出アルゴリズム又は他の画像処理アルゴリズムへの入力として使用され得る。また他の実施例では、出力画像は、単に、人間のユーザのためのより魅力的な画像を作成するために生成される。
図1は、別個のトーン利得関数が、出力画像を生成するためにHDR画像及び/又はHDR画像データの個別トーナル領域に適用される、方法100を示す。図1に示されている実例では、入力画像102が、限定はしないが、出力画像120を作り出すための、統計分析器(stat analyzer)106と、コントラスト利得曲線生成108と、コントラスト計算器110と、コントラスト・マッピング112と、グローバル・トーン・マッピング104とを含む、プロセスのいくつかの機能を使用して処理される。入力画像102は、画像キャプチャ・デバイス(たとえば、デジタル・カメラ)によってキャプチャされたシーン、(たとえば、ビデオ・ゲーム又はアニメーション化されたムービーにおける表示のための)自動プロセスによって生成された何か、及び/又は表示されるべき他のデータなど、表示されるべき何かを表すデータであり得る。入力画像102は、一実施例では、ビットマップ・ファイルとしてフォーマットされるが、本開示の技法は、ジョイント・フォトグラフィック・エキスパート・グループ(JPEG:Joint Photographic Experts Group)、及びグラフィックス・インターチェンジ・フォーマット(GIF:Graphics Interchange Format)、ポータブル・ネットワーク・グラフィックス(PNG:Portable Network Graphics)など、他のフォーマットの入力画像のために適応され得る。本開示で説明される方法及び動作は、2次元画像並びに3次元画像(たとえば、アニメーション、ムービー、ビデオ・ゲーム、及び他の画像データ)に適用される。さらに、図1に示されているように、グローバル・トーン・マッピング104は、入力画像102の個別トーナル領域への別個のトーン利得関数の適用と並行して、入力画像102に適用され、2つの得られた画像(たとえば、グローバル・トーン・マッピング104及びローカル・トーン・マッピングの結果)は、出力画像120を生成するために組み合わせられる(図1中でプラス符号によって表される)。本開示で説明されるように、画像を組み合わせることは、画像をマージすること、画像のピクセル値(たとえば、ルミナンス値及び/又はRGB値)に数学的変換を適用すること、ピクセル値を加算すること、減算すること、又はさもなければ修正すること、或いは2つ又はそれ以上の画像をコーミングする他の方法など、様々な動作を含む。代替的に、図2に関して以下でより詳細に説明されるように、グローバル・トーン・マッピング104は、ローカル・トーン・マッピングを実施するより前に、入力画像102に適用される。本開示で説明されるように、ローカル・トーン・マッピングは、入力画像102の個別トーナル領域への別個のトーン利得関数適用のプロセスを指し得る。
図1、図2、図4、図6、図8、及び図10を含む、本開示で説明される方法は、ハードウェア、ファームウェア、及び/又はソフトウェアの任意の組合せを使用して実施され得る、コンピューティング・プロセスを含む。たとえば、メモリに記憶された命令を実行するプロセッサによって、様々な機能が実行され得る。様々な実施例では、これらの図の要素は、コンピューティング・デバイスのプロセッサによって実行されたとき、コンピューティング・デバイスに、以下で説明される動作を実行させる、メモリに記憶されたソース・コード又は他の実行可能命令を含む。方法の各々はまた、コンピュータ記憶媒体に記憶されたコンピュータ使用可能命令として具現され得る。方法は、いくつかの実例を挙げれば、スタンドアロン適用例、サービス又はホストされたサービス(スタンドアロン又は別のホストされたサービスとの組合せで)、或いは、別の製品へのプラグインによって提供され得る。しかしながら、これらの方法は、追加又は代替として、限定はしないが、本明細書で説明されるものを含む、任意の1つのシステム、又はシステムの任意の組合せによって実行され得る。さらに、上記で説明された方法の動作は、省略され、異なる順序で実施され、並列に又は直列と並列との組合せで実施され得る。
図1に戻ると、統計分析器106は、コントラスト利得曲線生成108及びグローバル・トーン・マッピング104中に使用される統計データ及びキー値を決定する。図3に関して以下でより詳細に説明されるように、統計分析器106は、一実施例では、入力画像102に少なくとも部分的に基づいてヒストグラムを生成する。コントラスト計算器110は、ローカル・コントラスト値のセットを含むコントラスト画像を決定し、ここで、ローカル・コントラスト値のセットのうちのローカル・コントラスト値は、入力画像102内の特定のピクセル・ロケーションに対応する。一実例では、入力画像を伴う各ピクセル・ロケーションは、入力画像から取得された画像データに少なくとも部分的に基づいて、コントラスト計算器110によってローカル・コントラスト値を割り当てられる。コントラスト計算器110の様々な動作が、図4に関して以下でより詳細に説明される。
コントラスト利得曲線生成108は、一実施例では、コントラスト計算器110から取得されたコントラスト画像に適用されるコントラスト利得伝達関数を生成する。さらに、統計分析器106から取得されたデータ(たとえば、入力画像102のヒストグラム)が、コントラスト利得曲線生成108中に生成されるコントラスト利得曲線を決定するために使用され得る。一実施例では、コントラスト・マッピング112中に、個別コントラスト利得曲線が、コントラスト画像(たとえば、コントラスト計算器110の出力)に適用される。図8に関して以下でより詳細に説明されるように、様々な実施例では、コントラスト・マッピング112中に、個別トーン関数が、代表的ローカル・ピクセルに少なくとも部分的に基づいて、異なるトーナル領域に適用され得る。
一実施例では、統計分析器106は、入力画像102の統計データ分析のプロセスを含む。一実例では、入力画像102の統計データが推定され、ヒストグラムにおいて提示される。別の実例では、統計データは、入力画像102又は他の統計的代表から直接計算される。様々な実施例では、統計データ及び/又はキー統計データ(key statistical data)は、中間トーン平均と、ハイライト平均と、シャドー平均と、分散とを含む。一実例では、これらの値は、以下の式によって定義される。
上記の式では、Rは、ヒストグラム・エッジ(histogram edge)のインデックスのセットである。たとえば、RSは、シャドー・トーンの範囲を定義する。さらに、変数m、h、及びsは、それぞれ、中間トーン平均値、ハイライト平均値、及びシャドー平均値に対応する。上記の式は、3つの別個の範囲(たとえば、中間トーン、ハイライト、及びシャドー)を含むが、統計分析器106は、入力画像102を任意の数の範囲に下位区分し、対応するキー統計データを生成し得る。上記の例示的な式に戻ると、e[n]及びk[n]は、インデックスnに対するエッジ値、及びe[n]のヒストグラム・エッジ上のピクセルの数を表す。図3に関して以下でより詳細に説明されるように、統計分析器106によって生成されたこのキー統計データは、様々な実施例では、グラフで図示され、ここで、ベース曲線は、シグマの3倍のstdと、中間トーンの平均(m)とをもつ代表的ガウス関数である。さらに、キー統計データは、図6に関して以下でより詳細に説明されるように、異なるシグマ及び平均値をもつコントラスト利得曲線生成108中に使用され得る。
図2は、別個のトーン利得関数が、出力画像を生成するためにHDR画像及び/又はHDR画像データの個別トーナル領域に適用される、方法200を示す。図2に示されている実例では、入力画像202が、限定はしないが、出力画像220を作り出すための、統計分析器206と、コントラスト利得曲線生成208と、コントラスト計算器210と、コントラスト・マッピング212と、グローバル・トーン・マッピング204とを含む、プロセスのいくつかの機能を使用して処理される。さらに、図2に示されているように、グローバル・トーン・マッピング204の結果(又は出力)の個別トーナル領域に別個のトーン利得関数を適用するより前に、グローバル・トーン・マッピング204が適用される。
様々な実施例では、グローバル・トーム・マッピング204が入力画像202に適用された後に、得られた画像は、統計分析器206、コントラスト計算器210への入力として提供され、コントラスト・マッピング212が実施される。さらに、(たとえば、入力画像202のグローバル・トーン・マッピング204を実施した後に)得られた画像は、得られた画像の個別トーナル領域に別個のトーン利得関数(たとえば、図6に関して以下でより詳細に説明されるコントラスト利得曲線)を適用したことの結果と組み合わせられる。言い換えれば、コントラスト利得曲線が決定され、グローバル・トーン・マッピング204の第1の結果に適用されて、第2の結果(たとえば、ローカル・トーン・マッピングが適用された画像)を生成し、出力画像220が、少なくとも、第1の結果と第2の結果とを組み合わせることによって生成され、プラス符号で図2に示されている。
図3は、一実施例による、入力画像に少なくとも部分的に基づいて統計分析器によって生成された統計データ及び/又はキー統計データを示す、例示的なグラフ300である。一実施例では、曲線302が入力画像のヒストグラムを表し、曲線306が入力画像の累積ヒストグラムを表し、曲線304がガウス関数を表し、曲線302の下のエリア308が、(たとえば、入力画像のピクセルについてのルミナンス値に基づいて)入力画像の下位10パーセントを表し、曲線302の下のエリア310が、(たとえば、入力画像のピクセルについてのルミナンス値に基づいて)入力画像の上位10パーセントを表す。さらに、308と310との間の(たとえば、値e[Ns]とe[Nh]との間の)エリアは、入力画像の残りの部分を表す。図示のように、グラフ300は、上位及び下位範囲について10パーセント値を使用するが、この値は、本開示に従って修正され得る。たとえば、様々な照明状況(たとえば、夜間画像、低照度画像、高照度画像(high light image)、画像内の反射オブジェクト、画像内の移動しているオブジェクトなど)、用途、感度、又は他のファクタは、これらの値が調整されること(たとえば、範囲の均等な分布)を必要とし得る。さらに、入力画像は、4つ以上の領域に分割され得る。
グラフ300に示されているように、sがシャドー・トーン平均値を表し、mが中間トーン平均値を表し、hがハイライト平均値を表す。様々な実施例では、これらの値(たとえば、x軸)は、入力画像のピクセルについてのルミナンス値を表す。様々な実施例では、これらのルミナンス値は、入力画像のピクセルについての色値(たとえば、RGB)に少なくとも部分的に基づいて決定される。図3中の実例では、0が入力画像のより暗い部分を表し、1が入力画像の明るい部分を表す。以下でより詳細に説明されるように、s値、m値、及びh値は、統計分析器によって入力画像に少なくとも部分的に基づいて決定されたキー統計データを含む。
図4は、一実施例による、コントラスト計算器が、トーナル画像を生成するために入力画像に適用される、方法400を示す。コントラストは、入力と、ガウス・スケール空間において平滑化ファクタによってスケーリングされた参照トーン画像との間のトーナル差として定義される。図4に示されているように、入力画像402が、コントラスト計算器への入力として提供される。入力画像402は、上記で説明されたように、HDR画像を含み得る。さらに、様々な実施例では、トーン画像404が、入力画像402に少なくとも部分的に基づいて生成される。たとえば、入力画像402のピクセルについてのルミナンス値が、以下の式によって表される入力画像のRGB値のためのBT.709色符号化など、式に少なくとも部分的に基づいて決定される。
Y(x,y)=0.2126×RGB(x,y,1)+0.7152×RGB(x,y,2)+0.0722×RGB(x,y,3)。
Y(x,y)=0.2126×RGB(x,y,1)+0.7152×RGB(x,y,2)+0.0722×RGB(x,y,3)。
しかしながら、画像のルミナンスの様々な他の表現が、本開示に関して使用され得る。図5に関して以下で示されるように、参照トーン画像が、様々な実施例では、異なるt値に少なくとも部分的に基づいてスケール空間表現406A及び406Bに変換した。スケール空間表現406A及び406Bのための式は、一実施例では、次のように記述される。
Yt(x,y)=Y(x,y,t)=Y(x,y)*g(x,y,t)
上記の式では、Ytは、Y(x,y)と、標準偏差(t)をもつガウス・カーネルg(x,y,t)との畳み込みによって定義されるスケール空間表現(たとえば、406A及び406B)である。様々な実施例では、スケール空間表現406A及び406Bは、図5に示されているように、ルミナンス値を平滑化する。このようにして、複数のコントラスト画像が、異なるスケールで生成されて、複数のスケール空間表現406A及び406Bを再生成する。様々な実施例では、これらのスケール空間表現406A及び406Bは、コントラスト・マップ408A及び408Bのセットを生成するために比較される(たとえば、ルミナンス値は減算され、図4中でマイナス・シンボルとして示されている)。
Yt(x,y)=Y(x,y,t)=Y(x,y)*g(x,y,t)
上記の式では、Ytは、Y(x,y)と、標準偏差(t)をもつガウス・カーネルg(x,y,t)との畳み込みによって定義されるスケール空間表現(たとえば、406A及び406B)である。様々な実施例では、スケール空間表現406A及び406Bは、図5に示されているように、ルミナンス値を平滑化する。このようにして、複数のコントラスト画像が、異なるスケールで生成されて、複数のスケール空間表現406A及び406Bを再生成する。様々な実施例では、これらのスケール空間表現406A及び406Bは、コントラスト・マップ408A及び408Bのセットを生成するために比較される(たとえば、ルミナンス値は減算され、図4中でマイナス・シンボルとして示されている)。
図5は、一実施例による、コントラスト画像が、上記で説明された方法400に少なくとも部分的に基づいて生成される、実施例500を示す。一実施例では、入力トーン画像502が、スケール空間表現504を生成するために使用される。たとえば、スケール空間表現504は、少なくとも、Y(x,y)と、t=32である標準偏差(t)をもつガウス・カーネルg(x,y,t)との畳み込みによって定義される上記の式を、入力トーン画像502に適用することによって、生成される。さらに、上記で説明されたように、入力トーン画像502は、入力画像のルミナンス値ピクセル又はそれらのサブセットを含むようにコンバートされるか、又はさもなければ修正され得る。
様々な実施例では、様々なt値をもつ複数のスケール空間表現が生成される。たとえば、本開示で説明されるHDR画像を生成するコンピューティング・デバイスは、少なくとも、複数の異なるt値を用いて入力トーン画像502に上記の式を適用することによって、複数のスケール空間表現を生成する。一実施例では、入力トーン画像502は、コントラスト画像506を生成するためにスケール空間表現504と比較される。コントラスト画像506は、一実例では、画像の特定のピクセルについての正のコントラスト値と負のコントラスト値とを含む。一実例では、グレースケールが、コントラスト画像506において正のコントラスト及び/又は負のコントラストを表すために使用される。さらに、この実例では、そのコントラストの大きさが彩度(saturation)に比例し、ここで、白が0コントラストを表す。
図6は、一実施例による、コントラスト曲線のセットが、統計データに少なくとも部分的に基づいて生成される、方法600を示す。図6に示されているように、3つのコントラスト利得曲線が生成される。一実例では、次いで、3つのコントラスト利得曲線は、制御パラメータ616のセットによって修正され、一緒にマージされ、次いで、制御パラメータ616のセットのうちの最終制御パラメータが、マージされた曲線を修正するために使用される。様々な実施例では、入力画像602(たとえば、上記で説明された入力画像102)が、統計分析器606(たとえば、上記で説明された統計分析器106)に提供される。さらに、上記で説明されたように、統計分析器606は、入力画像602に少なくとも部分的に基づいて、シャドー平均値、ハイライト平均値、及び中間トーン平均値など、統計データを決定する。3つのコントラスト曲線のみが図6に示されているが、任意の数のコントラスト利得曲線が、入力画像の個別部分に少なくとも部分的に基づいて決定され得る。たとえば、コントラスト利得曲線の数は、異なるレベルのコントラストに適応するために、適用の目的に少なくとも部分的に基づいて変動され得る。
図6に戻ると、様々な代表的トーナル領域のコントラスト利得曲線は、対応する式によって定義される。たとえば、中間トーン・コントラスト利得曲線生成608、シャドー・コントラスト利得曲線生成610、及びハイライト・コントラスト利得曲線生成612が、以下の式によって定義される。
中間トーン・コントラスト利得曲線:mcurve(y)=mgain×Gaussian(m,Sm)
ハイライト・コントラスト利得曲線生成:hcurve(y)=hgain×Gaussian(h,Sh)
シャドー・コントラスト利得曲線:scurve(y)=sgain×Gaussian(s,Ss)
上記の式では、m、h、及びsは、上記で説明されたキー統計データを含み、ここで、これらの値は、入力画像602の個別トーナル領域についての平均値(たとえば、シャドー平均値、ハイライト平均値、及び中間トーン平均値)を表す。さらに、Sm、Sh、及びSsは、ガウス曲線を表すシグマ値を含み、ここで、それは、個別トーン領域内の値の分布に従って統計分析器606によって標準偏差(上記で定義されたstd)に基づいて調整される。
中間トーン・コントラスト利得曲線:mcurve(y)=mgain×Gaussian(m,Sm)
ハイライト・コントラスト利得曲線生成:hcurve(y)=hgain×Gaussian(h,Sh)
シャドー・コントラスト利得曲線:scurve(y)=sgain×Gaussian(s,Ss)
上記の式では、m、h、及びsは、上記で説明されたキー統計データを含み、ここで、これらの値は、入力画像602の個別トーナル領域についての平均値(たとえば、シャドー平均値、ハイライト平均値、及び中間トーン平均値)を表す。さらに、Sm、Sh、及びSsは、ガウス曲線を表すシグマ値を含み、ここで、それは、個別トーン領域内の値の分布に従って統計分析器606によって標準偏差(上記で定義されたstd)に基づいて調整される。
図6に示されているように、制御パラメータ616のセットは、中間トーン利得618と、シャドー利得620と、ハイライト利得622と、強さ624とを含む。様々な実施例では、これらの制御パラメータは、コントラスト利得曲線を修正するために使用される値のセットを含む。たとえば、ユーザが、写真撮影、オブジェクト/人の検出、低照度画像、又は他の用途など、特定の用途に少なくとも部分的に基づいて、制御パラメータ616のセットを定義する。上記の式に戻ると、mgain、hgain、及びsgainは、中間トーン利得618、ハイライト利得622、及びシャドー利得620を表す。様々な実施例では、これらの値は、対応するコントラスト利得曲線(たとえば、中間トーン・コントラスト利得曲線生成608、シャドー・コントラスト利得曲線生成610、及びハイライト・コントラスト利得曲線生成612)の最大の大きさを定義するためのスケーリング・ファクタである。一実例では、制御パラメータ616は、入力画像602からのシーン条件に少なくとも部分的に基づいて決定される。
一実施例では、コントラスト利得曲線の最大の大きさは、特定のトーナル領域における十分に広範な固有コントラストにわたるコントラストの拡張可能な余地の量の比によって定義され得、ここで、十分に広範な固有コントラストは、画像の可能な最大コントラストと近隣トーン領域間の限られたコントラストとの重み付けされた組合せ(w)として表され得る。さらに、いくつかの実施例では、重み値wは、入力画像602のヒストグラムのモダリティ及び歪度など、入力画像602の統計的特性に少なくとも部分的に基づいて、適応的に調整される。たとえば、そのヒストグラムにおいてシングル・トーン分布及びより高い歪度を示す画像は、低いトーンと高いトーンの両方が同じローカル領域において共存することのより高い可能性を有する。この実例では、wは、コントラストの推定値が、コントラストの完全な範囲(たとえば、ハイライト領域からシャドー領域まで)により近くなるように、より低く設定される必要がある。別の実例では、画像がそのヒストグラムに示されているマルチ・モダリティを有する場合、wは、トーン分布における改善された分離と、異なるトーンが交差することのより低い可能性とを有するように、シングル・トーンよりも高く設定され得る。様々な実施例では、制御パラメータ616のセットは、図7に関して下方にh_to_max及びs_to_minとして示されている、限られた範囲において最大コントラストに適応する。一実施例では、wは、w∝(モダリティ×1/歪度)の制約で形式化され得る。
また他の実施例では、コントラスト利得曲線はこれらの式に限定されず、利得曲線を決定するための任意の他の方法が採用され得る。たとえば、十分な量の代表的トーン領域を含んでおり、境界上の滑らかな遷移を伴って少なくとも1つの他のトーン領域と区別されるトーン領域を保証する、利得曲線を生成するための方法が、本開示に従って使用され得る。様々な実施例では、中間トーン・コントラスト利得曲線生成608と、シャドー・コントラスト利得曲線生成610と、ハイライト・コントラスト利得曲線生成612とは、対応する制御パラメータ(たとえば、中間トーン利得618、シャドー利得620、ハイライト利得622)が適用された(「×」で図6に示されている)後に、一緒にマージされる。コントラスト利得曲線をマージすること614は、図7に示されている組み合わせられたコントラスト利得曲線を生成する。
図7は、一実施例による、入力画像に少なくとも部分的に基づいて決定されたコントラスト利得曲線のセットの例示的なグラフ700を示す。グラフ700は、画像のヒストグラム708と、シャドー・コントラスト利得曲線702と、中間トーン・コントラスト利得曲線704と、ハイライト・コントラスト利得曲線706と、組み合わせられたコントラスト利得曲線710とを示す。様々な実施例では、シャドー・コントラスト利得曲線702、中間トーン・コントラスト利得曲線704、及びハイライト・コントラスト利得曲線706は、図6に関して上記で説明されたように決定される。組み合わせられたコントラスト利得曲線710は、一実施例では、以下の式に少なくとも部分的に基づいて決定される。
G(y)=P0(P1×scurve(y)+P2×mcurve(y)+P3×scurve(y))
G(y)=P0(P1×scurve(y)+P2×mcurve(y)+P3×scurve(y))
上式では、P0、P1、P2、及びP3は、図6に関して上記で説明されたものなど、制御パラメータを定義する。一実例では、上記で説明されたように、P1はシャドー利得パラメータであり、P2は中間トーン利得パラメータであり、P3はハイライト利得パラメータであり、P0は強さパラメータである。上記で説明されたように、様々な実施例では、4つのコントラスト利得曲線が図7に関して説明されるが、入力画像は、対応するコントラスト利得曲線をもつ任意の数の個別領域に分割され得る。
図8は、一実施例による、コントラスト曲線のセットが、コントラスト画像を生成するために入力画像のスケール空間表現に適用される、方法800を示す。様々な実施例では、コントラスト利得曲線は、コントラスト利得曲線によって定義される対応する利得を作り出すための入力トーン値の関数である。さらに、図8に示されているように、コントラスト利得曲線802A及び802Bが、一実施例では、コントラスト利得マップ810A及び810Bを作り出すために、スケール空間表現804A及び804Bに適用される。コントラスト利得曲線802A及び802Bは、一実例では、上記で説明された方法600を使用して生成される。さらに、スケール空間表現804A及び804Bは、様々な実施例では、上記で説明されたように、Y(x,y)と、標準偏差(t)をもつガウス・カーネルg(x,y,t)との畳み込みに少なくとも部分的に基づいて生成される。
一実施例では、コントラスト利得マップ810A及び810Bは、入力トーン値と、以下の式によって定義されるコントラスト利得曲線802A及び802Bによって定義される対応する利得とに少なくとも部分的に基づいて、トーン値を定義する。
GM(x,y,t)=G(Y(x,y,t))
GM(x,y,t)=G(Y(x,y,t))
図8に示されている実例では、コントラスト利得マップ810A及び810Bは、次いで、対応するコントラスト画像806A及び806Bに適用される(「×」で図8に示されている)。様々な実施例では、コントラスト画像806A及び806Bは、上記で説明された方法400を使用して生成される。たとえば、コントラスト利得マップGM(x,y,t)は、コントラスト画像のコントラスト画像C(x,y,t)ピクセルに適用される。様々な実施例では、コントラスト画像806A及び806Bにコントラスト利得マップ810A及び810Bを適用した結果として、調整されたコントラスト画像812A及び812Bが生成される。上記で説明されたように、調整されたコントラスト画像812A及び812Bは、入力トーン値(たとえば、スケール空間表現804A及び804Bにおいて示されるトーン値)にコントラスト利得曲線802A及び802Bを適用することによって生成されたトーン値を示す。
一実施例では、複数のコントラスト画像(たとえば、調整されたコントラスト画像812A及び812B)が、図8に示されているように、一緒に合計され、「+」によって示されている。一実例では、調整されたコントラスト画像812Aと812Bとを加算することは、以下の式によって定義される。
上記の式では、CFは、少なくとも、t値のセットについての調整されたコントラスト画像のセット(たとえば、調整されたコントラスト画像812A及び812B)を合計することによって生成された、最終コントラスト画像814を定義する。
図9は、一実施例による、画像に適用されるグローバル・トーン・マップの例示的なグラフ900を示す。グラフ900は、様々な実施例では、入力画像の値に適用されるグローバル・トーン・マッピング曲線902を示す。一実例では、グローバル・トーン・マッピング曲線は、入力画像のルミナンス値に適用される。入力画像へのグローバル・トーン・マッピングを決定及び適用するプロセスは、その全体が記載されるかのように参照により組み込まれる、2019年7月30日に出願された、「ENHANCED HIGH-DYNAMIC-RANGE IMAGING AND TONE MAPPING」と題する米国特許出願第16/526,902号において定義されている。
図10は、一実施例による、出力画像1020が、少なくとも、最終コントラスト画像1014をグローバル・トーン・マッピング1004と組み合わせることによって生成される、方法1000を示す。たとえば、コントラスト画像CF(x,y)(たとえば、最終コントラスト画像814)は、上記で説明されたように、入力画像にグローバル・トーン・マッピングを適用した結果とマージされる(図10に「+」シンボルで示されている)。一実例では、入力画像は、図1に関して上記で説明された入力画像102を含む。様々な実施例では、出力画像1020は、HDR画像の個別トーナル領域に別個のトーン利得関数を適用した結果を示す。
以下の説明では、少なくとも1つの実施例のより完全な理解を提供するために、多数の具体的な詳細が記載される。ただし、発明概念はこれらの具体的な詳細のうちの1つ又は複数なしに実施され得ることが当業者には明らかであろう。
データ・センタ
図11は、少なくとも1つの実施例による、例示的なデータ・センタ1100を示す。少なくとも1つの実施例では、データ・センタ1100は、限定はしないが、データ・センタ・インフラストラクチャ層1110と、フレームワーク層1120と、ソフトウェア層1130と、アプリケーション層1140とを含む。
図11は、少なくとも1つの実施例による、例示的なデータ・センタ1100を示す。少なくとも1つの実施例では、データ・センタ1100は、限定はしないが、データ・センタ・インフラストラクチャ層1110と、フレームワーク層1120と、ソフトウェア層1130と、アプリケーション層1140とを含む。
少なくとも1つの実施例では、図11に示されているように、データ・センタ・インフラストラクチャ層1110は、リソース・オーケストレータ1112と、グループ化されたコンピューティング・リソース1114と、ノード・コンピューティング・リソース(「ノードC.R.」:node computing resource)1116(1)~1116(N)とを含み得、ここで、「N」は、任意のすべての正の整数を表す。少なくとも1つの実施例では、ノードC.R.1116(1)~1116(N)は、限定はしないが、任意の数の中央処理ユニット(「CPU」:central processing unit)又は(アクセラレータ、フィールド・プログラマブル・ゲート・アレイ(「FPGA」:field programmable gate array)、グラフィックス・プロセッサなどを含む)他のプロセッサ、メモリ・デバイス(たとえば、動的読取り専用メモリ)、ストレージ・デバイス(たとえば、ソリッド・ステート又はディスク・ドライブ)、ネットワーク入力/出力(「NW I/O」:network input/output)デバイス、ネットワーク・スイッチ、仮想機械(「VM」:virtual machine)、電力モジュール、及び冷却モジュールなどを含み得る。少なくとも1つの実施例では、ノードC.R.1116(1)~1116(N)の中からの1つ又は複数のノードC.R.は、上述のコンピューティング・リソースのうちの1つ又は複数を有するサーバであり得る。
少なくとも1つの実施例では、グループ化されたコンピューティング・リソース1114は、1つ又は複数のラック(図示せず)内に格納されたノードC.R.の別個のグループ化、又は様々な地理的ロケーション(同じく図示せず)においてデータ・センタ中に格納された多くのラックを含み得る。グループ化されたコンピューティング・リソース1114内のノードC.R.の別個のグループ化は、1つ又は複数のワークロードをサポートするように構成されるか又は割り振られ得る、グループ化されたコンピュート・リソース、ネットワーク・リソース、メモリ・リソース、又はストレージ・リソースを含み得る。少なくとも1つの実施例では、CPU又はプロセッサを含むいくつかのノードC.R.は、1つ又は複数のワークロードをサポートするためのコンピュート・リソースを提供するために1つ又は複数のラック内でグループ化され得る。少なくとも1つの実施例では、1つ又は複数のラックはまた、任意の数の電力モジュール、冷却モジュール、及びネットワーク・スイッチを、任意の組合せで含み得る。
少なくとも1つの実施例では、リソース・オーケストレータ1112は、1つ又は複数のノードC.R.1116(1)~1116(N)及び/又はグループ化されたコンピューティング・リソース1114を構成するか、又はさもなければ、制御し得る。少なくとも1つの実施例では、リソース・オーケストレータ1112は、データ・センタ1100のためのソフトウェア設計インフラストラクチャ(「SDI」:software design infrastructure)管理エンティティを含み得る。少なくとも1つの実施例では、リソース・オーケストレータ1112は、ハードウェア、ソフトウェア、又はそれらの何らかの組合せを含み得る。
少なくとも1つの実施例では、図11に示されているように、フレームワーク層1120は、限定はしないが、ジョブ・スケジューラ1132と、構成マネージャ1134と、リソース・マネージャ1136と、分散型ファイル・システム1138とを含む。少なくとも1つの実施例では、フレームワーク層1120は、ソフトウェア層1130のソフトウェア1152、及び/又はアプリケーション層1140の1つ又は複数のアプリケーション1142をサポートするためのフレームワークを含み得る。少なくとも1つの実施例では、ソフトウェア1152又は(1つ又は複数の)アプリケーション1142は、それぞれ、アマゾン・ウェブ・サービス、Google Cloud、及びMicrosoft Azureによって提供されるものなど、ウェブ・ベースのサービス・ソフトウェア又はアプリケーションを含み得る。少なくとも1つの実施例では、フレームワーク層1120は、限定はしないが、大規模データ処理(たとえば、「ビック・データ」)のために分散型ファイル・システム1138を利用し得るApache Spark(商標)(以下「Spark」)など、無料でオープンソースのソフトウェア・ウェブ・アプリケーション・フレームワークのタイプであり得る。少なくとも1つの実施例では、ジョブ・スケジューラ1132は、データ・センタ1100の様々な層によってサポートされるワークロードのスケジューリングを容易にするために、Sparkドライバを含み得る。少なくとも1つの実施例では、構成マネージャ1134は、ソフトウェア層1130、並びに大規模データ処理をサポートするためのSpark及び分散型ファイル・システム1138を含むフレームワーク層1120など、異なる層を構成することが可能であり得る。少なくとも1つの実施例では、リソース・マネージャ1136は、分散型ファイル・システム1138及びジョブ・スケジューラ1132をサポートするようにマッピングされたか又は割り振られた、クラスタ化された又はグループ化されたコンピューティング・リソースを管理することが可能であり得る。少なくとも1つの実施例では、クラスタ化された又はグループ化されたコンピューティング・リソースは、データ・センタ・インフラストラクチャ層1110において、グループ化されたコンピューティング・リソース1114を含み得る。少なくとも1つの実施例では、リソース・マネージャ1136は、リソース・オーケストレータ1112と協調して、これらのマッピングされた又は割り振られたコンピューティング・リソースを管理し得る。
少なくとも1つの実施例では、ソフトウェア層1130中に含まれるソフトウェア1152は、ノードC.R.1116(1)~1116(N)、グループ化されたコンピューティング・リソース1114、及び/又はフレームワーク層1120の分散型ファイル・システム1138の少なくとも部分によって使用されるソフトウェアを含み得る。1つ又は複数のタイプのソフトウェアは、限定はしないが、インターネット・ウェブ・ページ検索ソフトウェアと、電子メール・ウイルス・スキャン・ソフトウェアと、データベース・ソフトウェアと、ストリーミング・ビデオ・コンテンツ・ソフトウェアとを含み得る。
少なくとも1つの実施例では、アプリケーション層1140中に含まれる(1つ又は複数の)アプリケーション1142は、ノードC.R.1116(1)~1116(N)、グループ化されたコンピューティング・リソース1114、及び/又はフレームワーク層1120の分散型ファイル・システム1138の少なくとも部分によって使用される1つ又は複数のタイプのアプリケーションを含み得る。少なくとも1つ又は複数のタイプのアプリケーションでは、限定はしないが、CUDAアプリケーションを含み得る。
少なくとも1つの実施例では、構成マネージャ1134、リソース・マネージャ1136、及びリソース・オーケストレータ1112のいずれかが、任意の技術的に実現可能な様式で獲得された任意の量及びタイプのデータに基づいて、任意の数及びタイプの自己修正アクションを実装し得る。少なくとも1つの実施例では、自己修正アクションは、データ・センタ1100のデータ・センタ・オペレータを、不良の恐れのある構成を判定し、十分に利用されていない及び/又は性能の低いデータ・センタの部分を場合によっては回避することから解放し得る。
コンピュータ・ベースのシステム
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的なコンピュータ・ベースのシステムを記載する。
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的なコンピュータ・ベースのシステムを記載する。
図12は、少なくとも1つの実施例による、処理システム1200を示す。少なくとも1つの実施例では、処理システム1200は、1つ又は複数のプロセッサ1202と1つ又は複数のグラフィックス・プロセッサ1208とを含み、単一プロセッサ・デスクトップ・システム、マルチプロセッサ・ワークステーション・システム、或いは多数のプロセッサ1202又はプロセッサ・コア1207を有するサーバ・システムであり得る。少なくとも1つの実施例では、処理システム1200は、モバイル・デバイス、ハンドヘルド・デバイス、又は組み込みデバイスにおいて使用するためのシステム・オン・チップ(「SoC」:system-on-a-chip)集積回路内に組み込まれた処理プラットフォームである。
少なくとも1つの実施例では、処理システム1200は、サーバ・ベースのゲーミング・プラットフォーム、ゲーム・コンソール、メディア・コンソール、モバイル・ゲーミング・コンソール、ハンドヘルド・ゲーム・コンソール、又はオンライン・ゲーム・コンソールを含むことができるか、或いはそれらの内部に組み込まれ得る。少なくとも1つの実施例では、処理システム1200は、モバイル・フォン、スマート・フォン、タブレット・コンピューティング・デバイス又はモバイル・インターネット・デバイスである。少なくとも1つの実施例では、処理システム1200はまた、スマート・ウォッチ・ウェアラブル・デバイス、スマート・アイウェア・デバイス、拡張現実デバイス、又は仮想現実デバイスなどのウェアラブル・デバイスを含むことができるか、それらと結合することができるか、又はそれらの内部に組み込まれ得る。少なくとも1つの実施例では、処理システム1200は、1つ又は複数のプロセッサ1202と、1つ又は複数のグラフィックス・プロセッサ1208によって生成されるグラフィカル・インターフェースとを有するテレビ又はセット・トップ・ボックス・デバイスである。
少なくとも1つの実施例では、1つ又は複数のプロセッサ1202は、各々、実行されたときにシステム及びユーザ・ソフトウェアのための動作を実施する命令を処理するための1つ又は複数のプロセッサ・コア1207を含む。少なくとも1つの実施例では、1つ又は複数のプロセッサ・コア1207の各々は、特定の命令セット1209を処理するように構成される。少なくとも1つの実施例では、命令セット1209は、複合命令セット・コンピューティング(「CISC」:Complex Instruction Set Computing)、縮小命令セット・コンピューティング(「RISC」:Reduced Instruction Set Computing)、又は超長命令語(「VLIW」:Very Long Instruction Word)を介したコンピューティングを容易にし得る。少なくとも1つの実施例では、プロセッサ・コア1207は、各々、異なる命令セット1209を処理し得、命令セット1209は、他の命令セットのエミュレーションを容易にするための命令を含み得る。少なくとも1つの実施例では、プロセッサ・コア1207はまた、デジタル信号プロセッサ(「DSP」:digital signal processor)などの他の処理デバイスを含み得る。
少なくとも1つの実施例では、プロセッサ1202はキャッシュ・メモリ(「キャッシュ」)1204を含む。少なくとも1つの実施例では、プロセッサ1202は、単一の内部キャッシュ又は複数のレベルの内部キャッシュを有することができる。少なくとも1つの実施例では、キャッシュ・メモリは、プロセッサ1202の様々な構成要素の間で共有される。少なくとも1つの実施例では、プロセッサ1202はまた、外部キャッシュ(たとえば、レベル3(「L3」)キャッシュ又はラスト・レベル・キャッシュ(「LLC」:Last Level Cache))(図示せず)を使用し、外部キャッシュは、知られているキャッシュ・コヒーレンシ技法を使用してプロセッサ・コア1207の間で共有され得る。少なくとも1つの実施例では、追加として、レジスタ・ファイル1206がプロセッサ1202中に含まれ、レジスタ・ファイル1206は、異なるタイプのデータを記憶するための異なるタイプのレジスタ(たとえば、整数レジスタ、浮動小数点レジスタ、ステータス・レジスタ、及び命令ポインタ・レジスタ)を含み得る。少なくとも1つの実施例では、レジスタ・ファイル1206は、汎用レジスタ又は他のレジスタを含み得る。
少なくとも1つの実施例では、1つ又は複数のプロセッサ1202は、アドレス、データ、又は制御信号などの通信信号を、プロセッサ1202と処理システム1200中の他の構成要素との間で送信するために、1つ又は複数のインターフェース・バス1210と結合される。少なくとも1つの実施例では、1つの実施例におけるインターフェース・バス1210は、ダイレクト・メディア・インターフェース(「DMI」:Direct Media Interface)バスのバージョンなどのプロセッサ・バスであり得る。少なくとも1つの実施例では、インターフェース・バス1210は、DMIバスに限定されず、1つ又は複数の周辺構成要素相互接続バス(たとえば、「PCI」:Peripheral Component Interconnect、PCI Express(「PCIe」))、メモリ・バス、又は他のタイプのインターフェース・バスを含み得る。少なくとも1つの実施例では、(1つ又は複数の)プロセッサ1202は、統合されたメモリ・コントローラ1216と、プラットフォーム・コントローラ・ハブ1230とを含む。少なくとも1つの実施例では、メモリ・コントローラ1216は、メモリ・デバイスと処理システム1200の他の構成要素との間の通信を容易にし、プラットフォーム・コントローラ・ハブ(「PCH」:platform controller hub)1230は、ローカル入力/出力(「I/O」:Input/Output)バスを介してI/Oデバイスへの接続を提供する。
少なくとも1つの実施例では、メモリ・デバイス1220は、ダイナミック・ランダム・アクセス・メモリ(「DRAM」:dynamic random access memory)デバイス、スタティック・ランダム・アクセス・メモリ(「SRAM」:static random access memory)デバイス、フラッシュ・メモリ・デバイス、相変化メモリ・デバイス、又はプロセッサ・メモリとして働くのに好適な性能を有する何らかの他のメモリ・デバイスであり得る。少なくとも1つの実施例では、メモリ・デバイス1220は、1つ又は複数のプロセッサ1202がアプリケーション又はプロセスを実行するときの使用のためのデータ1222及び命令1221を記憶するために、処理システム1200のためのシステム・メモリとして動作することができる。少なくとも1つの実施例では、メモリ・コントローラ1216はまた、随意の外部グラフィックス・プロセッサ1212と結合し、外部グラフィックス・プロセッサ1212は、グラフィックス動作及びメディア動作を実施するために、プロセッサ1202中の1つ又は複数のグラフィックス・プロセッサ1208と通信し得る。少なくとも1つの実施例では、ディスプレイ・デバイス1211は、(1つ又は複数の)プロセッサ1202に接続することができる。少なくとも1つの実施例では、ディスプレイ・デバイス1211は、モバイル電子デバイス又はラップトップ・デバイスの場合のような内部ディスプレイ・デバイス、或いは、ディスプレイ・インターフェース(たとえば、DisplayPortなど)を介して取り付けられた外部ディスプレイ・デバイスのうちの1つ又は複数を含むことができる。少なくとも1つの実施例では、ディスプレイ・デバイス1211は、仮想現実(「VR」:virtual reality)アプリケーション又は拡張現実(「AR」:augmented reality)アプリケーションにおいて使用するための立体ディスプレイ・デバイスなどの頭部装着型ディスプレイ(「HMD」:head mounted display)を含むことができる。
少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ1230は、周辺機器が高速I/Oバスを介してメモリ・デバイス1220及びプロセッサ1202に接続することを可能にする。少なくとも1つの実施例では、I/O周辺機器は、限定はしないが、オーディオ・コントローラ1246と、ネットワーク・コントローラ1234と、ファームウェア・インターフェース1228と、ワイヤレス・トランシーバ1226と、タッチ・センサ1225と、データ・ストレージ・デバイス1224(たとえば、ハード・ディスク・ドライブ、フラッシュ・メモリなど)とを含む。少なくとも1つの実施例では、データ・ストレージ・デバイス1224は、ストレージ・インターフェース(たとえば、SATA)を介して、或いはPCI又はPCIeなどの周辺バスを介して、接続することができる。少なくとも1つの実施例では、タッチ・センサ1225は、タッチ・スクリーン・センサ、圧力センサ、又は指紋センサを含むことができる。少なくとも1つの実施例では、ワイヤレス・トランシーバ1226は、Wi-Fiトランシーバ、Bluetoothトランシーバ、或いは3G、4G、又はロング・ターム・エボリューション(「LTE」:Long Term Evolution)トランシーバなどのモバイル・ネットワーク・トランシーバであり得る。少なくとも1つの実施例では、ファームウェア・インターフェース1228は、システム・ファームウェアとの通信を可能にし、たとえば、ユニファイド・エクステンシブル・ファームウェア・インターフェース(「UEFI」:unified extensible firmware interface)であり得る。少なくとも1つの実施例では、ネットワーク・コントローラ1234は、ワイヤード・ネットワークへのネットワーク接続を可能にすることができる。少なくとも1つの実施例では、高性能ネットワーク・コントローラ(図示せず)は、インターフェース・バス1210と結合する。少なくとも1つの実施例では、オーディオ・コントローラ1246は、マルチチャネル高精細度オーディオ・コントローラである。少なくとも1つの実施例では、処理システム1200は、レガシー(たとえば、パーソナル・システム2(「PS/2」:Personal System 2))デバイスを処理システム1200に結合するための随意のレガシーI/Oコントローラ1240を含む。少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ1230は、キーボードとマウス1243との組合せ、カメラ1244、又は他のUSB入力デバイスなど、1つ又は複数のユニバーサル・シリアル・バス(「USB」:Universal Serial Bus)コントローラ1242接続入力デバイスにも接続することができる。
少なくとも1つの実施例では、メモリ・コントローラ1216及びプラットフォーム・コントローラ・ハブ1230のインスタンスが、外部グラフィックス・プロセッサ1212などの慎重な外部グラフィックス・プロセッサに組み込まれ得る。少なくとも1つの実施例では、プラットフォーム・コントローラ・ハブ1230及び/又はメモリ・コントローラ1216は、1つ又は複数のプロセッサ1202の外部にあり得る。たとえば、少なくとも1つの実施例では、処理システム1200は、外部のメモリ・コントローラ1216とプラットフォーム・コントローラ・ハブ1230とを含むことができ、それらは、(1つ又は複数の)プロセッサ1202と通信しているシステム・チップセット内のメモリ・コントローラ・ハブ及び周辺コントローラ・ハブとして構成され得る。
図13は、少なくとも1つの実施例による、コンピュータ・システム1300を示す。少なくとも1つの実施例では、コンピュータ・システム1300は、相互接続されたデバイス及び構成要素をもつシステム、SOC、又は何らかの組合せであり得る。少なくとも1つの実施例では、コンピュータ・システム1300は、命令を実行するための実行ユニットを含み得るプロセッサ1302とともに形成される。少なくとも1つの実施例では、コンピュータ・システム1300は、限定はしないが、データを処理するためのアルゴリズムを実施するための論理を含む実行ユニットを採用するための、プロセッサ1302などの構成要素を含み得る。少なくとも1つの実施例では、コンピュータ・システム1300は、カリフォルニア州サンタクララのIntel Corporationから入手可能なPENTIUM(登録商標)プロセッサ・ファミリー、Xeon(商標)、Itanium(登録商標)、XScale(商標)及び/又はStrongARM(商標)、Intel(登録商標)Core(商標)、又はIntel(登録商標)Nervana(商標)マイクロプロセッサなどのプロセッサを含み得るが、(他のマイクロプロセッサ、エンジニアリング・ワークステーション、セット・トップ・ボックスなどを有するPCを含む)他のシステムも使用され得る。少なくとも1つの実施例では、コンピュータ・システム1300は、ワシントン州レドモンドのMicrosoft Corporationから入手可能なWINDOWS(登録商標)オペレーティング・システムのあるバージョンを実行し得るが、他のオペレーティング・システム(たとえば、UNIX(登録商標)及びLinux(登録商標))、組み込みソフトウェア、及び/又はグラフィカル・ユーザ・インターフェースも使用され得る。
少なくとも1つの実施例では、コンピュータ・システム1300は、ハンドヘルド・デバイス及び組み込みアプリケーションなど、他のデバイスにおいて使用され得る。ハンドヘルド・デバイスのいくつかの実例は、セルラー・フォン、インターネット・プロトコル・デバイス、デジタル・カメラ、パーソナル・デジタル・アシスタント(「PDA」:personal digital assistant)、及びハンドヘルドPCを含む。少なくとも1つの実施例では、組み込みアプリケーションは、マイクロコントローラ、デジタル信号プロセッサ(DSP)、SoC、ネットワーク・コンピュータ(「NetPC」:network computer)、セット・トップ・ボックス、ネットワーク・ハブ、ワイド・エリア・ネットワーク(「WAN」:wide area network)スイッチ、又は1つ又は複数の命令を実施し得る任意の他のシステムを含み得る。
少なくとも1つの実施例では、コンピュータ・システム1300は、限定はしないが、プロセッサ1302を含み得、プロセッサ1302は、限定はしないが、コンピュート・ユニファイド・デバイス・アーキテクチャ(「CUDA」:Compute Unified Device Architecture)(CUDA(登録商標)は、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される)プログラムを実行するように構成され得る、1つ又は複数の実行ユニット1308を含み得る。少なくとも1つの実施例では、CUDAプログラムは、CUDAプログラミング言語で書かれたソフトウェア・アプリケーションの少なくとも一部分である。少なくとも1つの実施例では、コンピュータ・システム1300は、シングル・プロセッサ・デスクトップ又はサーバ・システムである。少なくとも1つの実施例では、コンピュータ・システム1300は、マルチプロセッサ・システムであり得る。少なくとも1つの実施例では、プロセッサ1302は、限定はしないが、CISCマイクロプロセッサ、RISCマイクロプロセッサ、VLIWマイクロプロセッサ、命令セットの組合せを実装するプロセッサ、又は、たとえばデジタル信号プロセッサなど、任意の他のプロセッサ・デバイスを含み得る。少なくとも1つの実施例では、プロセッサ1302は、プロセッサ・バス1310に結合され得、プロセッサ・バス1310は、プロセッサ1302とコンピュータ・システム1300中の他の構成要素との間でデータ信号を送信し得る。
少なくとも1つの実施例では、プロセッサ1302は、限定はしないが、レベル1(「L1」)の内部キャッシュ・メモリ(「キャッシュ」)1304を含み得る。少なくとも1つの実施例では、プロセッサ1302は、単一の内部キャッシュ又は複数のレベルの内部キャッシュを有し得る。少なくとも1つの実施例では、キャッシュ・メモリは、プロセッサ1302の外部に存在し得る。少なくとも1つの実施例では、プロセッサ1302は、内部キャッシュと外部キャッシュの両方の組合せをも含み得る。少なくとも1つの実施例では、レジスタ・ファイル1306は、限定はしないが、整数レジスタ、浮動小数点レジスタ、ステータス・レジスタ、及び命令ポインタ・レジスタを含む様々なレジスタに、異なるタイプのデータを記憶し得る。
少なくとも1つの実施例では、限定はしないが、整数演算及び浮動小数点演算を実施するための論理を含む実行ユニット1308も、プロセッサ1302中に存在し得る。プロセッサ1302は、いくつかのマクロ命令のためのマイクロコードを記憶するマイクロコード(「uコード」)読取り専用メモリ(「ROM」:read only memory)をも含み得る。少なくとも1つの実施例では、実行ユニット1308は、パック命令セット1309に対処するための論理を含み得る。少なくとも1つの実施例では、パック命令セット1309を、命令を実行するための関連する回路要素とともに汎用プロセッサ1302の命令セットに含めることによって、多くのマルチメディア・アプリケーションによって使用される演算が、汎用プロセッサ1302中のパック・データを使用して実施され得る。少なくとも1つの実施例では、多くのマルチメディア・アプリケーションが、パック・データの演算を実施するためにプロセッサのデータ・バスの全幅を使用することによって加速され、より効率的に実行され得、これは、一度に1つのデータ要素ずつ1つ又は複数の演算を実施するために、プロセッサのデータ・バスにわたってより小さい単位のデータを転送する必要をなくし得る。
少なくとも1つの実施例では、実行ユニット1308はまた、マイクロコントローラ、組み込みプロセッサ、グラフィックス・デバイス、DSP、及び他のタイプの論理回路において使用され得る。少なくとも1つの実施例では、コンピュータ・システム1300は、限定はしないが、メモリ1320を含み得る。少なくとも1つの実施例では、メモリ1320は、DRAMデバイス、SRAMデバイス、フラッシュ・メモリ・デバイス、又は他のメモリ・デバイスとして実装され得る。メモリ1320は、プロセッサ1302によって実行され得るデータ信号によって表される(1つ又は複数の)命令1319及び/又はデータ1321を記憶し得る。
少なくとも1つの実施例では、システム論理チップが、プロセッサ・バス1310及びメモリ1320に結合され得る。少なくとも1つの実施例では、システム論理チップは、限定はしないが、メモリ・コントローラ・ハブ(「MCH」:memory controller hub)1316を含み得、プロセッサ1302は、プロセッサ・バス1310を介してMCH1316と通信し得る。少なくとも1つの実施例では、MCH1316は、命令及びデータ・ストレージのための、並びにグラフィックス・コマンド、データ及びテクスチャのストレージのための、高帯域幅メモリ経路1318をメモリ1320に提供し得る。少なくとも1つの実施例では、MCH1316は、プロセッサ1302と、メモリ1320と、コンピュータ・システム1300中の他の構成要素との間でデータ信号をダイレクトし、プロセッサ・バス1310と、メモリ1320と、システムI/O1322との間でデータ信号をブリッジし得る。少なくとも1つの実施例では、システム論理チップは、グラフィックス・コントローラに結合するためのグラフィックス・ポートを提供し得る。少なくとも1つの実施例では、MCH1316は、高帯域幅メモリ経路1318を通してメモリ1320に結合され得、グラフィックス/ビデオ・カード1312は、アクセラレーテッド・グラフィックス・ポート(「AGP」:Accelerated Graphics Port)相互接続1314を介してMCH1316に結合され得る。
少なくとも1つの実施例では、コンピュータ・システム1300は、MCH1316をI/Oコントローラ・ハブ(「ICH」:I/O controller hub)1330に結合するためのプロプライエタリ・ハブ・インターフェース・バスである、システムI/O1322を使用し得る。少なくとも1つの実施例では、ICH1330は、ローカルI/Oバスを介していくつかのI/Oデバイスに直接接続を提供し得る。少なくとも1つの実施例では、ローカルI/Oバスは、限定はしないが、周辺機器をメモリ1320、チップセット、及びプロセッサ1302に接続するための高速I/Oバスを含み得る。実例は、限定はしないが、オーディオ・コントローラ1329と、ファームウェア・ハブ(「フラッシュBIOS」)1328と、ワイヤレス・トランシーバ1326と、データ・ストレージ1324と、ユーザ入力インターフェース1325及びキーボード・インターフェースを含んでいるレガシーI/Oコントローラ1323と、USBなどのシリアル拡張ポート1327と、ネットワーク・コントローラ1334とを含み得る。データ・ストレージ1324は、ハード・ディスク・ドライブ、フロッピー・ディスク・ドライブ、CD-ROMデバイス、フラッシュ・メモリ・デバイス、又は他の大容量ストレージ・デバイスを備え得る。
少なくとも1つの実施例では、図13は、相互接続されたハードウェア・デバイス又は「チップ」を含むシステムを示す。少なくとも1つの実施例では、図13は、例示的なSoCを示し得る。少なくとも1つの実施例では、図13に示されているデバイスは、プロプライエタリ相互接続、標準相互接続(たとえば、PCIe)、又はそれらの何らかの組合せで相互接続され得る。少なくとも1つの実施例では、システム1300の1つ又は複数の構成要素は、コンピュート・エクスプレス・リンク(「CXL」:compute express link)相互接続を使用して相互接続される。
図14は、少なくとも1つの実施例による、システム1400を示す。少なくとも1つの実施例では、システム1400は、プロセッサ1410を利用する電子デバイスである。少なくとも1つの実施例では、システム1400は、たとえば、限定はしないが、ノートブック、タワー・サーバ、ラック・サーバ、ブレード・サーバ、ラップトップ、デスクトップ、タブレット、モバイル・デバイス、電話、組み込みコンピュータ、又は任意の他の好適な電子デバイスであり得る。
少なくとも1つの実施例では、システム1400は、限定はしないが、任意の好適な数又は種類の構成要素、周辺機器、モジュール、又はデバイスに通信可能に結合されたプロセッサ1410を含み得る。少なくとも1つの実施例では、プロセッサ1410は、I2Cバス、システム管理バス(「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つの実施例では、図14は、相互接続されたハードウェア・デバイス又は「チップ」を含むシステムを示す。少なくとも1つの実施例では、図14は、例示的なSoCを示し得る。少なくとも1つの実施例では、図14に示されているデバイスは、プロプライエタリ相互接続、標準相互接続(たとえば、PCIe)又はそれらの何らかの組合せで相互接続され得る。少なくとも1つの実施例では、図14の1つ又は複数の構成要素は、CXL相互接続を使用して相互接続される。
少なくとも1つの実施例では、図14は、ディスプレイ1424、タッチ・スクリーン1425、タッチ・パッド1430、ニア・フィールド通信ユニット(「NFC」:Near Field Communication)1445、センサ・ハブ1440、熱センサ1446、エクスプレス・チップセット(「EC」:Express Chipset)1435、トラステッド・プラットフォーム・モジュール(「TPM」:Trusted Platform Module)1438、BIOS/ファームウェア/フラッシュ・メモリ(「BIOS、FWフラッシュ」:BIOS/firmware/flash memory)1422、DSP1460、ソリッド・ステート・ディスク(「SSD」:Solid State Disk)又はハード・ディスク・ドライブ(「HDD」:Hard Disk Drive)1420、ワイヤレス・ローカル・エリア・ネットワーク・ユニット(「WLAN」:wireless local area network)1450、Bluetoothユニット1452、ワイヤレス・ワイド・エリア・ネットワーク・ユニット(「WWAN」:Wireless Wide Area Network)1456、全地球測位システム(「GPS」:Global Positioning System)1455、USB3.0カメラなどのカメラ(「USB3.0カメラ」)1454、或いは、たとえばLPDDR3規格において実装された低電力ダブル・データ・レート(「LPDDR」:Low Power Double Data Rate)メモリ・ユニット(「LPDDR3」)1415を含み得る。これらの構成要素は、各々、任意の好適な様式で実装され得る。
少なくとも1つの実施例では、上記で説明された構成要素を通して、他の構成要素がプロセッサ1410に通信可能に結合され得る。少なくとも1つの実施例では、加速度計1441と、周囲光センサ(「ALS」:Ambient Light Sensor)1442と、コンパス1443と、ジャイロスコープ1444とが、センサ・ハブ1440に通信可能に結合され得る。少なくとも1つの実施例では、熱センサ1439と、ファン1437と、キーボード1436と、タッチ・パッド1430とが、EC1435に通信可能に結合され得る。少なくとも1つの実施例では、スピーカー1463と、ヘッドフォン1464と、マイクロフォン(「mic」)1465とが、オーディオ・ユニット(「オーディオ・コーデック及びクラスdアンプ」)1462に通信可能に結合され得、オーディオ・ユニット1462は、DSP1460に通信可能に結合され得る。少なくとも1つの実施例では、オーディオ・ユニット1462は、たとえば、限定はしないが、オーディオ・コーダ/デコーダ(「コーデック」)及びクラスD増幅器を含み得る。少なくとも1つの実施例では、SIMカード(「SIM」)1457は、WWANユニット1456に通信可能に結合され得る。少なくとも1つの実施例では、WLANユニット1450及びBluetoothユニット1452などの構成要素、並びにWWANユニット1456は、次世代フォーム・ファクタ(「NGFF」:Next Generation Form Factor)において実装され得る。
図15は、少なくとも1つの実施例による、例示的な集積回路1500を示す。少なくとも1つの実施例では、例示的な集積回路1500は、1つ又は複数のIPコアを使用して作製され得るSoCである。少なくとも1つの実施例では、集積回路1500は、1つ又は複数のアプリケーション・プロセッサ1505(たとえば、CPU)、少なくとも1つのグラフィックス・プロセッサ1510を含み、追加として、画像プロセッサ1515及び/又はビデオ・プロセッサ1520を含み得、それらのいずれも、モジュール式IPコアであり得る。少なくとも1つの実施例では、集積回路1500は、USBコントローラ1525、UARTコントローラ1530、SPI/SDIOコントローラ1535、及びI2S/I2Cコントローラ1540を含む周辺機器又はバス論理を含む。少なくとも1つの実施例では、集積回路1500は、高精細度マルチメディア・インターフェース(「HDMI(登録商標)」:high-definition multimedia interface)コントローラ1550及びモバイル・インダストリ・プロセッサ・インターフェース(「MIPI」:mobile industry processor interface)ディスプレイ・インターフェース1555のうちの1つ又は複数に結合されたディスプレイ・デバイス1545を含むことができる。少なくとも1つの実施例では、フラッシュ・メモリとフラッシュ・メモリ・コントローラとを含むフラッシュ・メモリ・サブシステム1560によって、ストレージが提供され得る。少なくとも1つの実施例では、SDRAM又はSRAMメモリ・デバイスへのアクセスのために、メモリ・コントローラ1565を介してメモリ・インターフェースが提供され得る。少なくとも1つの実施例では、いくつかの集積回路は、追加として、組み込みセキュリティ・エンジン1570を含む。
図16は、少なくとも1つの実施例による、コンピューティング・システム1600を示す。少なくとも1つの実施例では、コンピューティング・システム1600は、メモリ・ハブ1605を含み得る相互接続経路を介して通信する1つ又は複数のプロセッサ1602とシステム・メモリ1604とを有する処理サブシステム1601を含む。少なくとも1つの実施例では、メモリ・ハブ1605は、チップセット構成要素内の別個の構成要素であり得るか、又は1つ又は複数のプロセッサ1602内に組み込まれ得る。少なくとも1つの実施例では、メモリ・ハブ1605は、通信リンク1606を介してI/Oサブシステム1611と結合する。少なくとも1つの実施例では、I/Oサブシステム1611は、コンピューティング・システム1600が1つ又は複数の入力デバイス1608からの入力を受信することを可能にすることができるI/Oハブ1607を含む。少なくとも1つの実施例では、I/Oハブ1607は、1つ又は複数のプロセッサ1602中に含まれ得るディスプレイ・コントローラが、1つ又は複数のディスプレイ・デバイス1610Aに出力を提供することを可能にすることができる。少なくとも1つの実施例では、I/Oハブ1607と結合された1つ又は複数のディスプレイ・デバイス1610Aは、ローカルの、内部の、又は組み込まれたディスプレイ・デバイスを含むことができる。
少なくとも1つの実施例では、処理サブシステム1601は、バス又は他の通信リンク1613を介してメモリ・ハブ1605に結合された1つ又は複数の並列プロセッサ1612を含む。少なくとも1つの実施例では、通信リンク1613は、限定はしないがPCIeなど、任意の数の規格ベースの通信リンク技術又はプロトコルのうちの1つであり得るか、或いはベンダー固有の通信インターフェース又は通信ファブリックであり得る。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1612は、メニー・インテグレーテッド・コア・プロセッサなど、多数の処理コア及び/又は処理クラスタを含むことができる、算出に集中した並列又はベクトル処理システムを形成する。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1612は、グラフィックス処理サブシステムを形成し、グラフィックス処理サブシステムは、I/Oハブ1607を介して結合された1つ又は複数のディスプレイ・デバイス1610Aのうちの1つにピクセルを出力することができる。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1612はまた、ディスプレイ・コントローラと、1つ又は複数のディスプレイ・デバイス1610Bへの直接接続を可能にするためのディスプレイ・インターフェース(図示せず)とを含むことができる。
少なくとも1つの実施例では、システム・ストレージ・ユニット1614は、I/Oハブ1607に接続して、コンピューティング・システム1600のためのストレージ機構を提供することができる。少なくとも1つの実施例では、I/Oハブ1607と、プラットフォームに組み込まれ得るネットワーク・アダプタ1618及び/又はワイヤレス・ネットワーク・アダプタ1619などの他の構成要素、並びに1つ又は複数のアドイン・デバイス1620を介して追加され得る様々な他のデバイスとの間の接続を可能にするためのインターフェース機構を提供するために、I/Oスイッチ1616が使用され得る。少なくとも1つの実施例では、ネットワーク・アダプタ1618は、イーサネット・アダプタ又は別のワイヤード・ネットワーク・アダプタであり得る。少なくとも1つの実施例では、ワイヤレス・ネットワーク・アダプタ1619は、Wi-Fi、Bluetooth、NFC、又は1つ又は複数のワイヤレス無線を含む他のネットワーク・デバイスのうちの1つ又は複数を含むことができる。
少なくとも1つの実施例では、コンピューティング・システム1600は、USB又は他のポート接続、光学ストレージ・ドライブ、ビデオ・キャプチャ・デバイスなどを含む、I/Oハブ1607にも接続され得る、明示的に示されていない他の構成要素を含むことができる。少なくとも1つの実施例では、図16中の様々な構成要素を相互接続する通信経路が、PCIベースのプロトコル(たとえば、PCIe)などの任意の好適なプロトコル、或いはNVLink高速相互接続などの他のバス又はポイントツーポイント通信インターフェース及び/又は(1つ又は複数の)プロトコル、或いは相互接続プロトコルを使用して、実装され得る。
少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1612は、たとえばビデオ出力回路要素を含むグラフィックス及びビデオ処理のために最適化された回路要素を組み込み、グラフィックス処理ユニット(「GPU」:graphics processing unit)を構成する。少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1612は、汎用処理のために最適化された回路要素を組み込む。少なくとも実施例では、コンピューティング・システム1600の構成要素は、単一の集積回路上の1つ又は複数の他のシステム要素と統合され得る。たとえば、少なくとも1つの実施例では、1つ又は複数の並列プロセッサ1612、メモリ・ハブ1605、(1つ又は複数の)プロセッサ1602、及びI/Oハブ1607は、SoC集積回路に組み込まれ得る。少なくとも1つの実施例では、コンピューティング・システム1600の構成要素は、システム・イン・パッケージ(「SIP」:system in package)構成を形成するために、単一のパッケージに組み込まれ得る。少なくとも1つの実施例では、コンピューティング・システム1600の構成要素の少なくとも一部分は、マルチチップ・モジュール(「MCM」:multi-chip module)に組み込まれ得、マルチチップ・モジュールは、他のマルチチップ・モジュールと相互接続されてモジュール式コンピューティング・システムにすることができる。少なくとも1つの実施例では、I/Oサブシステム1611及びディスプレイ・デバイス1610Bは、コンピューティング・システム1600から省略される。
処理システム
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的な処理システムを記載する。
以下の図は、限定はしないが、少なくとも1つの実施例を実装するために使用され得る、例示的な処理システムを記載する。
図17は、少なくとも1つの実施例による、加速処理ユニット(「APU」:accelerated processing unit)1700を示す。少なくとも1つの実施例では、APU1700は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、APU1700は、CUDAプログラムなど、アプリケーション・プログラムを実行するように構成され得る。少なくとも1つの実施例では、APU1700は、限定はしないが、コア複合体1710と、グラフィックス複合体1740と、ファブリック1760と、I/Oインターフェース1770と、メモリ・コントローラ1780と、ディスプレイ・コントローラ1792と、マルチメディア・エンジン1794とを含む。少なくとも1つの実施例では、APU1700は、限定はしないが、任意の数のコア複合体1710と、任意の数のグラフィックス複合体1750と、任意の数のディスプレイ・コントローラ1792と、任意の数のマルチメディア・エンジン1794とを、任意の組合せで含み得る。説明目的のために、同様のオブジェクトの複数のインスタンスは、オブジェクトを識別する参照番号と、必要な場合にインスタンスを識別する括弧付きの番号とともに、本明細書で示される。
少なくとも1つの実施例では、コア複合体1710はCPUであり、グラフィックス複合体1740はGPUであり、APU1700は、限定はしないが、単一のチップ上に1710及び1740を組み込む処理ユニットである。少なくとも1つの実施例では、いくつかのタスクは、コア複合体1710に割り当てられ得、他のタスクは、グラフィックス複合体1740に割り当てられ得る。少なくとも1つの実施例では、コア複合体1710は、オペレーティング・システムなど、APU1700に関連するメイン制御ソフトウェアを実行するように構成される。少なくとも1つの実施例では、コア複合体1710は、APU1700のマスタ・プロセッサであり、他のプロセッサの動作を制御し、協調させる。少なくとも1つの実施例では、コア複合体1710は、グラフィックス複合体1740の動作を制御するコマンドを発行する。少なくとも1つの実施例では、コア複合体1710は、CUDAソース・コードから導出されたホスト実行可能コードを実行するように構成され得、グラフィックス複合体1740は、CUDAソース・コードから導出されたデバイス実行可能コードを実行するように構成され得る。
少なくとも1つの実施例では、コア複合体1710は、限定はしないが、コア1720(1)~1720(4)と、L3キャッシュ1730とを含む。少なくとも1つの実施例では、コア複合体1710は、限定はしないが、任意の数のコア1720と、任意の数及びタイプのキャッシュとを、任意の組合せで含み得る。少なくとも1つの実施例では、コア1720は、特定の命令セット・アーキテクチャ(「ISA」:instruction set architecture)の命令を実行するように構成される。少なくとも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つの実施例では、グラフィックス複合体1740は、高度並列様式でコンピュート動作を実施するように構成され得る。少なくとも1つの実施例では、グラフィックス複合体1740は、描画コマンド、ピクセル動作、幾何学的算出、及びディスプレイに画像をレンダリングすることに関連する他の動作など、グラフィックス・パイプライン動作を実行するように構成される。少なくとも1つの実施例では、グラフィックス複合体1740は、グラフィックに関係しない動作を実行するように構成される。少なくとも1つの実施例では、グラフィックス複合体1740は、グラフィックに関係する動作とグラフィックに関係しない動作の両方を実行するように構成される。
少なくとも1つの実施例では、グラフィックス複合体1740は、限定はしないが、任意の数のコンピュート・ユニット1750と、L2キャッシュ1742とを含む。少なくとも1つの実施例では、コンピュート・ユニット1750は、L2キャッシュ1742を共有する。少なくとも1つの実施例では、L2キャッシュ1742は区分けされる。少なくとも1つの実施例では、グラフィックス複合体1740は、限定はしないが、任意の数のコンピュート・ユニット1750と、(ゼロを含む)任意の数及びタイプのキャッシュとを含む。少なくとも1つの実施例では、グラフィックス複合体1740は、限定はしないが、任意の量の専用グラフィックス・ハードウェアを含む。
少なくとも1つの実施例では、各コンピュート・ユニット1750は、限定はしないが、任意の数のSIMDユニット1752と、共有メモリ1754とを含む。少なくとも1つの実施例では、各SIMDユニット1752は、SIMDアーキテクチャを実装し、動作を並列に実施するように構成され得る。少なくとも1つの実施例では、各コンピュート・ユニット1750は、任意の数のスレッド・ブロックを実行し得るが、各スレッド・ブロックは、単一のコンピュート・ユニット1750上で実行する。少なくとも1つの実施例では、スレッド・ブロックは、限定はしないが、任意の数の実行のスレッドを含む。少なくとも1つの実施例では、ワークグループは、スレッド・ブロックである。少なくとも1つの実施例では、各SIMDユニット1752は、異なるワープを実行する。少なくとも1つの実施例では、ワープは、スレッドのグループ(たとえば、16個のスレッド)であり、ここで、ワープ中の各スレッドは、単一のスレッド・ブロックに属し、命令の単一のセットに基づいて、データの異なるセットを処理するように構成される。少なくとも1つの実施例では、ワープ中の1つ又は複数のスレッドを無効にするために、プレディケーションが使用され得る。少なくとも1つの実施例では、レーンはスレッドである。少なくとも1つの実施例では、ワーク・アイテムはスレッドである。少なくとも1つの実施例では、ウェーブフロントはワープである。少なくとも1つの実施例では、スレッド・ブロック中の異なるウェーブフロントは、互いに同期し、共有メモリ1754を介して通信し得る。
少なくとも1つの実施例では、ファブリック1760は、コア複合体1710、グラフィックス複合体1740、I/Oインターフェース1770、メモリ・コントローラ1780、ディスプレイ・コントローラ1792、及びマルチメディア・エンジン1794にわたるデータ及び制御送信を容易にするシステム相互接続である。少なくとも1つの実施例では、APU1700は、限定はしないが、ファブリック1760に加えて又はそれの代わりに、任意の量及びタイプのシステム相互接続を含み得、それは、APU1700の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする。少なくとも1つの実施例では、I/Oインターフェース1770は、任意の数及びタイプのI/Oインターフェース(たとえば、PCI、PCI-Extended(「PCI-X」)、PCIe、ギガビット・イーサネット(「GBE」:gigabit Ethernet)、USBなど)を表す。少なくとも1つの実施例では、様々なタイプの周辺デバイスが、I/Oインターフェース1770に結合される。少なくとも1つの実施例では、I/Oインターフェース1770に結合される周辺デバイスは、限定はしないが、キーボード、マウス、プリンタ、スキャナ、ジョイスティック又は他のタイプのゲーム・コントローラ、メディア記録デバイス、外部ストレージ・デバイス、ネットワーク・インターフェース・カードなどを含み得る。
少なくとも1つの実施例では、ディスプレイ・コントローラAMD92は、液晶ディスプレイ(「LCD」:liquid crystal display)デバイスなど、1つ又は複数のディスプレイ・デバイス上に画像を表示する。少なくとも1つの実施例では、マルチメディア・エンジン240は、限定はしないが、ビデオ・デコーダ、ビデオ・エンコーダ、画像信号プロセッサなど、マルチメディアに関係する任意の量及びタイプの回路要素を含む。少なくとも1つの実施例では、メモリ・コントローラ1780は、APU1700と統一システム・メモリ1790との間のデータ転送を容易にする。少なくとも1つの実施例では、コア複合体1710とグラフィックス複合体1740とは、統一システム・メモリ1790を共有する。
少なくとも1つの実施例では、APU1700は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ1780及びメモリ・デバイス(たとえば、共有メモリ1754)を含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、APU1700は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ1828、L3キャッシュ1730、及びL2キャッシュ1742)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、コア1720、コア複合体1710、SIMDユニット1752、コンピュート・ユニット1750、及びグラフィックス複合体1740)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
図18は、少なくとも1つの実施例による、CPU1800を示す。少なくとも1つの実施例では、CPU1800は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、CPU1800は、アプリケーション・プログラムを実行するように構成され得る。少なくとも1つの実施例では、CPU1800は、オペレーティング・システムなど、メイン制御ソフトウェアを実行するように構成される。少なくとも1つの実施例では、CPU1800は、外部GPU(図示せず)の動作を制御するコマンドを発行する。少なくとも1つの実施例では、CPU1800は、CUDAソース・コードから導出されたホスト実行可能コードを実行するように構成され得、外部GPUは、そのようなCUDAソース・コードから導出されたデバイス実行可能コードを実行するように構成され得る。少なくとも1つの実施例では、CPU1800は、限定はしないが、任意の数のコア複合体1810と、ファブリック1860と、I/Oインターフェース1870と、メモリ・コントローラ1880とを含む。
少なくとも1つの実施例では、コア複合体1810は、限定はしないが、コア1820(1)~1820(4)と、L3キャッシュ1830とを含む。少なくとも1つの実施例では、コア複合体1810は、限定はしないが、任意の数のコア1820と、任意の数及びタイプのキャッシュとを、任意の組合せで含み得る。少なくとも1つの実施例では、コア1820は、特定のISAの命令を実行するように構成される。少なくとも1つの実施例では、各コア1820はCPUコアである。
少なくとも1つの実施例では、各コア1820は、限定はしないが、フェッチ/復号ユニット1822と、整数実行エンジン1824と、浮動小数点実行エンジン1826と、L2キャッシュ1828とを含む。少なくとも1つの実施例では、フェッチ/復号ユニット1822は、命令をフェッチし、そのような命令を復号し、マイクロ・オペレーションを生成し、整数実行エンジン1824と浮動小数点実行エンジン1826とに別個のマイクロ命令をディスパッチする。少なくとも1つの実施例では、フェッチ/復号ユニット1822は、同時に、あるマイクロ命令を整数実行エンジン1824にディスパッチし、別のマイクロ命令を浮動小数点実行エンジン1826にディスパッチすることができる。少なくとも1つの実施例では、整数実行エンジン1824は、限定はしないが、整数及びメモリ演算を実行する。少なくとも1つの実施例では、浮動小数点エンジン1826は、限定はしないが、浮動小数点及びベクトル演算を実行する。少なくとも1つの実施例では、フェッチ復号ユニット1822は、整数実行エンジン1824と浮動小数点実行エンジン1826の両方を置き換える単一の実行エンジンに、マイクロ命令をディスパッチする。
少なくとも1つの実施例では、iがコア1820の特定のインスタンスを表す整数である、各コア1820(i)は、コア1820(i)中に含まれるL2キャッシュ1828(i)にアクセスし得る。少なくとも1つの実施例では、jがコア複合体1810の特定のインスタンスを表す整数である、コア複合体1810(j)中に含まれる各コア1820は、コア複合体1810(j)中に含まれるL3キャッシュ1830(j)を介して、コア複合体1810(j)中の他のコア1820に接続される。少なくとも1つの実施例では、jがコア複合体1810の特定のインスタンスを表す整数である、コア複合体1810(j)中に含まれるコア1820は、コア複合体1810(j)中に含まれるL3キャッシュ1830(j)のすべてにアクセスすることができる。少なくとも1つの実施例では、L3キャッシュ1830は、限定はしないが、任意の数のスライスを含み得る。
少なくとも1つの実施例では、ファブリック1860は、コア複合体1810(1)~1810(N)(ここで、Nは0よりも大きい整数である)、I/Oインターフェース1870、及びメモリ・コントローラ1880にわたるデータ及び制御送信を容易にするシステム相互接続である。少なくとも1つの実施例では、CPU1800は、限定はしないが、ファブリック1860に加えて又はそれの代わりに、任意の量及びタイプのシステム相互接続を含み得、それは、CPU1800の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする。少なくとも1つの実施例では、I/Oインターフェース1870は、任意の数及びタイプのI/Oインターフェース(たとえば、PCI、PCI-X、PCIe、GBE、USBなど)を表す。少なくとも1つの実施例では、様々なタイプの周辺デバイスが、I/Oインターフェース1870に結合される。少なくとも1つの実施例では、I/Oインターフェース1870に結合される周辺デバイスは、限定はしないが、ディスプレイ、キーボード、マウス、プリンタ、スキャナ、ジョイスティック又は他のタイプのゲーム・コントローラ、メディア記録デバイス、外部ストレージ・デバイス、ネットワーク・インターフェース・カードなどを含み得る。
少なくとも1つの実施例では、メモリ・コントローラ1880は、CPU1800とシステム・メモリ1890との間のデータ転送を容易にする。少なくとも1つの実施例では、コア複合体1810とグラフィックス複合体1840とは、システム・メモリ1890を共有する。少なくとも1つの実施例では、CPU1800は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ1880及びメモリ・デバイスを含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、CPU1800は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ1828及びL3キャッシュ1830)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、コア1820及びコア複合体1810)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
図19は、少なくとも1つの実施例による、例示的なアクセラレータ統合スライス1990を示す。本明細書で使用される「スライス」は、アクセラレータ統合回路の処理リソースの指定部分を備える。少なくとも1つの実施例では、アクセラレータ統合回路は、グラフィックス加速モジュール中に含まれる複数のグラフィックス処理エンジンの代わりに、キャッシュ管理、メモリ・アクセス、コンテキスト管理、及び割込み管理サービスを提供する。グラフィックス処理エンジンは、各々、別個のGPUを備え得る。代替的に、グラフィックス処理エンジンは、GPU内に、グラフィックス実行ユニット、メディア処理エンジン(たとえば、ビデオ・エンコーダ/デコーダ)、サンプラ、及びBlitエンジンなど、異なるタイプのグラフィックス処理エンジンを備え得る。少なくとも1つの実施例では、グラフィックス加速モジュールは、複数のグラフィックス処理エンジンをもつGPUであり得る。少なくとも1つの実施例では、グラフィックス処理エンジンは、共通のパッケージ、ライン・カード、又はチップ上に組み込まれた個々のGPUであり得る。
システム・メモリ1914内のアプリケーション実効アドレス空間1982は、プロセス要素1983を記憶する。一実施例では、プロセス要素1983は、プロセッサ1907上で実行されるアプリケーション1980からのGPU呼出し1981に応答して、記憶される。プロセス要素1983は、対応するアプリケーション1980のプロセス状態を含んでいる。プロセス要素1983に含まれているワーク記述子(「WD」:work descriptor)1984は、アプリケーションによって要求される単一のジョブであり得るか、又はジョブのキューに対するポインタを含んでいることがある。少なくとも1つの実施例では、WD1984は、アプリケーション実効アドレス空間1982におけるジョブ要求キューに対するポインタである。
グラフィックス加速モジュール1946及び/又は個々のグラフィックス処理エンジンは、システム中のプロセスのすべて又はサブセットによって共有され得る。少なくとも1つの実施例では、プロセス状態を設定し、WD1984をグラフィックス加速モジュール1946に送出して、仮想化環境中でジョブを開始するためのインフラストラクチャが、含められ得る。
少なくとも1つの実施例では、専用プロセス・プログラミング・モデルは、実装固有である。このモデルでは、単一のプロセスが、グラフィックス加速モジュール1946又は個々のグラフィックス処理エンジンを所有する。グラフィックス加速モジュール1946が単一のプロセスによって所有されるので、ハイパーバイザは、所有パーティションについてアクセラレータ統合回路を初期化し、グラフィックス加速モジュール1946が割り当てられたとき、オペレーティング・システムは、所有プロセスについてアクセラレータ統合回路を初期化する。
動作時、アクセラレータ統合スライス1990中のWDフェッチ・ユニット1991は、グラフィックス加速モジュール1946の1つ又は複数のグラフィックス処理エンジンによって行われるべきであるワークの指示を含む、次のWD1984をフェッチする。示されているように、WD1984からのデータは、レジスタ1945に記憶され、メモリ管理ユニット(「MMU」:memory management unit)1939、割込み管理回路1947、及び/又はコンテキスト管理回路1948によって使用され得る。たとえば、MMU1939の一実施例は、OS仮想アドレス空間1985内のセグメント/ページ・テーブル1986にアクセスするためのセグメント/ページ・ウォーク回路要素を含む。割込み管理回路1947は、グラフィックス加速モジュール1946から受信された割込みイベント(「INT」:interrupt)1992を処理し得る。グラフィックス動作を実施するとき、グラフィックス処理エンジンによって生成された実効アドレス1993は、MMU1939によって実アドレスにトランスレートされる。
一実施例では、レジスタ1945の同じセットが、各グラフィックス処理エンジン、及び/又はグラフィックス加速モジュール1946について複製され、ハイパーバイザ又はオペレーティング・システムによって初期化され得る。これらの複製されたレジスタの各々は、アクセラレータ統合スライス1990中に含められ得る。ハイパーバイザによって初期化され得る例示的なレジスタが、表1に示されている。
オペレーティング・システムによって初期化され得る例示的なレジスタが、表2に示されている。
オペレーティング・システムによって初期化され得る例示的なレジスタが、表2に示されている。
一実施例では、各WD1984は、特定のグラフィックス加速モジュール1946及び/又は特定のグラフィックス処理エンジンに固有である。WD1984は、ワークを行うためにグラフィックス処理エンジンによって必要とされるすべての情報を含んでいるか、又は、WD1984
は、完了されるべきワークのコマンド・キューをアプリケーションが設定したメモリ・ロケーションに対するポインタであり得る。
は、完了されるべきワークのコマンド・キューをアプリケーションが設定したメモリ・ロケーションに対するポインタであり得る。
図20A~図20Bは、少なくとも1つの実施例による、例示的なグラフィックス・プロセッサを示す。少なくとも1つの実施例では、例示的なグラフィックス・プロセッサのうちのいずれかは、1つ又は複数のIPコアを使用して作製され得る。示されているものに加えて、少なくとも1つの実施例では、追加のグラフィックス・プロセッサ/コア、周辺インターフェース・コントローラ、又は汎用プロセッサ・コアを含む他の論理及び回路が含まれ得る。少なくとも1つの実施例では、例示的なグラフィックス・プロセッサは、SoC内での使用のためのものである。
図20Aは、少なくとも1つの実施例による、1つ又は複数のIPコアを使用して作製され得るSoC集積回路の例示的なグラフィックス・プロセッサ2010を示す。図20Bは、少なくとも1つの実施例による、1つ又は複数のIPコアを使用して作製され得るSoC集積回路の追加の例示的なグラフィックス・プロセッサ2040を示す。少なくとも1つの実施例では、図20Aのグラフィックス・プロセッサ2010は、低電力グラフィックス・プロセッサ・コアである。少なくとも1つの実施例では、図20Bのグラフィックス・プロセッサ2040は、より高性能のグラフィックス・プロセッサ・コアである。少なくとも1つの実施例では、グラフィックス・プロセッサ2010、2040の各々は、図15のグラフィックス・プロセッサ1510の変形態であり得る。
少なくとも1つの実施例では、グラフィックス・プロセッサ2010は、頂点プロセッサ2005と、1つ又は複数のフラグメント・プロセッサ2015A~2015N(たとえば、2015A、2015B、2015C、2015D~2015N-1、及び2015N)とを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2010は、別個の論理を介して異なるシェーダ・プログラムを実行することができ、それにより、頂点プロセッサ2005は、頂点シェーダ・プログラムのための動作を実行するように最適化され、1つ又は複数のフラグメント・プロセッサ2015A~2015Nは、フラグメント又はピクセル・シェーダ・プログラムのためのフラグメント(たとえば、ピクセル)シェーディング動作を実行する。少なくとも1つの実施例では、頂点プロセッサ2005は、3Dグラフィックス・パイプラインの頂点処理段階を実施し、プリミティブ及び頂点データを生成する。少なくとも1つの実施例では、(1つ又は複数の)フラグメント・プロセッサ2015A~2015Nは、頂点プロセッサ2005によって生成されたプリミティブ及び頂点データを使用して、ディスプレイ・デバイス上に表示されるフレームバッファを作り出す。少なくとも1つの実施例では、(1つ又は複数の)フラグメント・プロセッサ2015A~2015Nは、OpenGL APIにおいて提供されるようなフラグメント・シェーダ・プログラムを実行するように最適化され、OpenGL APIは、Direct 3D APIにおいて提供されるようなピクセル・シェーダ・プログラムと同様の動作を実施するために使用され得る。
少なくとも1つの実施例では、グラフィックス・プロセッサ2010は、追加として、1つ又は複数のMMU2020A~2020Bと、(1つ又は複数の)キャッシュ2025A~2025Bと、(1つ又は複数の)回路相互接続2030A~2030Bとを含む。少なくとも1つの実施例では、1つ又は複数のMMU2020A~2020Bは、頂点プロセッサ2005及び/又は(1つ又は複数の)フラグメント・プロセッサ2015A~2015Nを含む、グラフィックス・プロセッサ2010のための仮想-物理アドレス・マッピングを提供し、それらは、1つ又は複数のキャッシュ2025A~2025Bに記憶された頂点又は画像/テクスチャ・データに加えて、メモリに記憶された頂点又は画像/テクスチャ・データを参照し得る。少なくとも1つの実施例では、1つ又は複数のMMU2020A~2020Bは、図15の1つ又は複数のアプリケーション・プロセッサ1505、画像プロセッサ1515、及び/又はビデオ・プロセッサ1520に関連する1つ又は複数のMMUを含む、システム内の他のMMUと同期され得、それにより、各プロセッサ1505~1520は、共有又は統一仮想メモリ・システムに参加することができる。少なくとも1つの実施例では、1つ又は複数の回路相互接続2030A~2030Bは、グラフィックス・プロセッサ2010が、SoCの内部バスを介して又は直接接続を介してのいずれかで、SoC内の他のIPコアとインターフェースすることを可能にする。
少なくとも1つの実施例では、グラフィックス・プロセッサ2040は、図20Aのグラフィックス・プロセッサ2010の1つ又は複数のMMU2020A~2020Bと、キャッシュ2025A~2025Bと、回路相互接続2030A~2030Bとを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2040は、1つ又は複数のシェーダ・コア2055A~2055N(たとえば、2055A、2055B、2055C、2055D、2055E、2055F~2055N-1、及び2055N)を含み、1つ又は複数のシェーダ・コア2055A~2055Nは、単一のコア、又はタイプ、又はコアが、頂点シェーダ、フラグメント・シェーダ、及び/又はコンピュート・シェーダを実装するためのシェーダ・プログラム・コードを含むすべてのタイプのプログラマブル・シェーダ・コードを実行することができる統一シェーダ・コア・アーキテクチャを提供する。少なくとも1つの実施例では、シェーダ・コアの数は変動することができる。少なくとも1つの実施例では、グラフィックス・プロセッサ2040は、1つ又は複数のシェーダ・コア2055A~2055Nに実行スレッドをディスパッチするためのスレッド・ディスパッチャとして作用するコア間タスク・マネージャ2045と、たとえばシーン内のローカル空間コヒーレンスを利用するため、又は内部キャッシュの使用を最適化するために、シーンについてのレンダリング動作が画像空間において下位区分される、タイル・ベースのレンダリングのためのタイリング動作を加速するためのタイリング・ユニット2058とを含む。
図21Aは、少なくとも1つの実施例による、グラフィックス・コア2100を示す。少なくとも1つの実施例では、グラフィックス・コア2100は、図15のグラフィックス・プロセッサ1510内に含まれ得る。少なくとも1つの実施例では、グラフィックス・コア2100は、図20Bの場合のような統一シェーダ・コア2055A~2055Nであり得る。少なくとも1つの実施例では、グラフィックス・コア2100は、共有命令キャッシュ2102と、テクスチャ・ユニット2118と、キャッシュ/共有メモリ2120とを含み、それらは、グラフィックス・コア2100内の実行リソースに共通である。少なくとも1つの実施例では、グラフィックス・コア2100は、複数のスライス2101A~2101N、又は各コアについてのパーティションを含むことができ、グラフィックス・プロセッサは、グラフィックス・コア2100の複数のインスタンスを含むことができる。スライス2101A~2101Nは、ローカル命令キャッシュ2104A~2104Nと、スレッド・スケジューラ2106A~2106Nと、スレッド・ディスパッチャ2108A~2108Nと、レジスタのセット2110A~2110Nとを含むサポート論理を含むことができる。少なくとも1つの実施例では、スライス2101A~2101Nは、追加機能ユニット(「AFU」:additional function unit)2112A~2112N、浮動小数点ユニット(「FPU」:floating-point unit)2114A~2114N、整数算術論理ユニット(「ALU」:integer arithmetic logic unit)2116~2116N、アドレス算出ユニット(「ACU」:address computational unit)2113A~2113N、倍精度浮動小数点ユニット(「DPFPU」:double-precision floating-point unit)2115A~2115N、及び行列処理ユニット(「MPU」:matrix processing unit)2117A~2117Nのセットを含むことができる。
少なくとも1つの実施例では、FPU2114A~2114Nは、単精度(32ビット)及び半精度(16ビット)の浮動小数点演算を実施することができ、DPFPU2115A~2115Nは、倍精度(64ビット)の浮動小数点演算を実施する。少なくとも1つの実施例では、ALU2116A~2116Nは、8ビット、16ビット、及び32ビットの精度で可変精度整数演算を実施することができ、混合精度演算のために構成され得る。少なくとも1つの実施例では、MPU2117A~2117Nも、半精度浮動小数点演算と8ビット整数演算とを含む、混合精度行列演算のために構成され得る。少なくとも1つの実施例では、MPU2117~2117Nは、加速汎用行列-行列乗算(「GEMM」:general matrix to matrix multiplication)のサポートを可能にすることを含む、CUDAプログラムを加速するための様々な行列演算を実施することができる。少なくとも1つの実施例では、AFU2112A~2112Nは、三角関数演算(たとえば、サイン、コサインなど)を含む、浮動小数点ユニット又は整数ユニットによってサポートされていない追加の論理演算を実施することができる。
図21Bは、少なくとも1つの実施例による、汎用グラフィックス処理ユニット(「GPGPU」:general-purpose graphics processing unit)2130を示す。少なくとも1つの実施例では、GPGPU2130は、高度並列であり、マルチチップ・モジュール上での導入に好適である。少なくとも1つの実施例では、GPGPU2130は、高度並列コンピュート動作がGPUのアレイによって実施されることを可能にするように構成され得る。少なくとも1つの実施例では、GPGPU2130は、CUDAプログラムのための実行時間を改善するためにマルチGPUクラスタを作成するために、GPGPU2130の他のインスタンスに直接リンクされ得る。少なくとも1つの実施例では、GPGPU2130は、ホスト・プロセッサとの接続を可能にするためのホスト・インターフェース2132を含む。少なくとも1つの実施例では、ホスト・インターフェース2132は、PCIeインターフェースである。少なくとも1つの実施例では、ホスト・インターフェース2132は、ベンダー固有の通信インターフェース又は通信ファブリックであり得る。少なくとも1つの実施例では、GPGPU2130は、ホスト・プロセッサからコマンドを受信し、グローバル・スケジューラ2134を使用して、それらのコマンドに関連する実行スレッドを、コンピュート・クラスタ2136A~2136Hのセットに分散させる。少なくとも1つの実施例では、コンピュート・クラスタ2136A~2136Hは、キャッシュ・メモリ2138を共有する。少なくとも1つの実施例では、キャッシュ・メモリ2138は、コンピュート・クラスタ2136A~2136H内のキャッシュ・メモリのためのより高レベルのキャッシュとして働くことができる。
少なくとも1つの実施例では、GPGPU2130は、メモリ・コントローラ2142A~2142Bのセットを介してコンピュート・クラスタ2136A~2136Hと結合されたメモリ2144A~2144Bを含む。少なくとも1つの実施例では、メモリ2144A~2144Bは、DRAM、又は、グラフィックス・ダブル・データ・レート(「GDDR」:graphics double data rate)メモリを含む同期グラフィックス・ランダム・アクセス・メモリ(「SGRAM」:synchronous graphics random access memory)などのグラフィックス・ランダム・アクセス・メモリを含む、様々なタイプのメモリ・デバイスを含むことができる。
少なくとも1つの実施例では、コンピュート・クラスタ2136A~2136Hは、各々、図21Aのグラフィックス・コア2100などのグラフィックス・コアのセットを含み、グラフィックス・コアのセットは、CUDAプログラムに関連する算出に適したものを含む、様々な精度で算出動作を実施することができる複数のタイプの整数及び浮動小数点論理ユニットを含むことができる。たとえば、少なくとも1つの実施例では、コンピュート・クラスタ2136A~2136Hの各々における浮動小数点ユニットの少なくともサブセットは、16ビット又は32ビットの浮動小数点演算を実施するように構成され得、浮動小数点ユニットの異なるサブセットは、64ビットの浮動小数点演算を実施するように構成され得る。
少なくとも1つの実施例では、GPGPU2130の複数のインスタンスは、コンピュート・クラスタとして動作するように構成され得る。コンピュート・クラスタ2136A~2136Hは、同期及びデータ交換のための任意の技術的に実現可能な通信技法を実装し得る。少なくとも1つの実施例では、GPGPU2130の複数のインスタンスは、ホスト・インターフェース2132を介して通信する。少なくとも1つの実施例では、GPGPU2130は、I/Oハブ2139を含み、I/Oハブ2139は、GPGPU2130を、GPGPU2130の他のインスタンスへの直接接続を可能にするGPUリンク2140と結合する。少なくとも1つの実施例では、GPUリンク2140は、GPGPU2130の複数のインスタンス間での通信及び同期を可能にする専用GPU-GPUブリッジに結合される。少なくとも1つの実施例では、GPUリンク2140は、他のGPGPU2130又は並列プロセッサにデータを送信及び受信するために高速相互接続と結合される。少なくとも1つの実施例では、GPGPU2130の複数のインスタンスは、別個のデータ処理システムに位置し、ホスト・インターフェース2132を介してアクセス可能であるネットワーク・デバイスを介して通信する。少なくとも1つの実施例では、GPUリンク2140は、ホスト・インターフェース2132に加えて、又はその代替として、ホスト・プロセッサへの接続を可能にするように構成され得る。少なくとも1つの実施例では、GPGPU2130は、CUDAプログラムを実行するように構成され得る。
図22Aは、少なくとも1つの実施例による、並列プロセッサ2200を示す。少なくとも1つの実施例では、並列プロセッサ2200の様々な構成要素は、プログラマブル・プロセッサ、特定用途向け集積回路(「ASIC」:application specific integrated circuit)、又はFPGAなど、1つ又は複数の集積回路デバイスを使用して実装され得る。
少なくとも1つの実施例では、並列プロセッサ2200は並列処理ユニット2202を含む。少なくとも1つの実施例では、並列処理ユニット2202は、並列処理ユニット2202の他のインスタンスを含む、他のデバイスとの通信を可能にするI/Oユニット2204を含む。少なくとも1つの実施例では、I/Oユニット2204は、他のデバイスに直接接続され得る。少なくとも1つの実施例では、I/Oユニット2204は、メモリ・ハブ2205など、ハブ又はスイッチ・インターフェースの使用を介して他のデバイスと接続する。少なくとも1つの実施例では、メモリ・ハブ2205とI/Oユニット2204との間の接続は、通信リンクを形成する。少なくとも1つの実施例では、I/Oユニット2204は、ホスト・インターフェース2206及びメモリ・クロスバー2216と接続し、ホスト・インターフェース2206は、処理動作を実施することを対象とするコマンドを受信し、メモリ・クロスバー2216は、メモリ動作を実施することを対象とするコマンドを受信する。
少なくとも1つの実施例では、ホスト・インターフェース2206が、I/Oユニット2204を介してコマンド・バッファを受信したとき、ホスト・インターフェース2206は、それらのコマンドを実施するためのワーク動作をフロント・エンド2208に向けることができる。少なくとも1つの実施例では、フロント・エンド2208はスケジューラ2210と結合し、スケジューラ2210は、コマンド又は他のワーク・アイテムを処理アレイ2212に分散させるように構成される。少なくとも1つの実施例では、スケジューラ2210は、処理アレイ2212にタスクが分散される前に、処理アレイ2212が適切に構成され、有効な状態にあることを確実にする。少なくとも1つの実施例では、スケジューラ2210は、マイクロコントローラ上で実行しているファームウェア論理を介して実装される。少なくとも1つの実施例では、マイクロコントローラ実装スケジューラ2210は、複雑なスケジューリング及びワーク分散動作を、粗い粒度及び細かい粒度において実施するように構成可能であり、処理アレイ2212上で実行しているスレッドの迅速なプリエンプション及びコンテキスト切替えを可能にする。少なくとも1つの実施例では、ホスト・ソフトウェアは、処理アレイ2212上でのスケジューリングのためのワークロードを、複数のグラフィックス処理ドアベルのうちの1つを介して証明することができる。少なくとも1つの実施例では、ワークロードは、次いで、スケジューラ2210を含むマイクロコントローラ内のスケジューラ2210論理によって、処理アレイ2212にわたって自動的に分散され得る。
少なくとも1つの実施例では、処理アレイ2212は、最高「N」個のクラスタ(たとえば、クラスタ2214A、クラスタ2214B~クラスタ2214N)を含むことができる。少なくとも1つの実施例では、処理アレイ2212の各クラスタ2214A~2214Nは、多数の同時スレッドを実行することができる。少なくとも1つの実施例では、スケジューラ2210は、様々なスケジューリング及び/又はワーク分散アルゴリズムを使用して処理アレイ2212のクラスタ2214A~2214Nにワークを割り振ることができ、それらのアルゴリズムは、プログラム又は算出の各タイプについて生じるワークロードに応じて変動し得る。少なくとも1つの実施例では、スケジューリングは、スケジューラ2210によって動的に対処され得るか、又は処理アレイ2212による実行のために構成されたプログラム論理のコンパイル中に、コンパイラ論理によって部分的に支援され得る。少なくとも1つの実施例では、処理アレイ2212の異なるクラスタ2214A~2214Nは、異なるタイプのプログラムを処理するために、又は異なるタイプの算出を実施するために割り振られ得る。
少なくとも1つの実施例では、処理アレイ2212は、様々なタイプの並列処理動作を実施するように構成され得る。少なくとも1つの実施例では、処理アレイ2212は、汎用並列コンピュート動作を実施するように構成される。たとえば、少なくとも1つの実施例では、処理アレイ2212は、ビデオ及び/又はオーディオ・データをフィルタリングすること、物理動作を含むモデリング動作を実施すること、及びデータ変換を実施することを含む処理タスクを実行するための論理を含むことができる。
少なくとも1つの実施例では、処理アレイ2212は、並列グラフィックス処理動作を実施するように構成される。少なくとも1つの実施例では、処理アレイ2212は、限定はしないが、テクスチャ動作を実施するためのテクスチャ・サンプリング論理、並びにテッセレーション論理及び他の頂点処理論理を含む、そのようなグラフィックス処理動作の実行をサポートするための追加の論理を含むことができる。少なくとも1つの実施例では、処理アレイ2212は、限定はしないが、頂点シェーダ、テッセレーション・シェーダ、ジオメトリ・シェーダ、及びピクセル・シェーダなど、グラフィックス処理関係シェーダ・プログラムを実行するように構成され得る。少なくとも1つの実施例では、並列処理ユニット2202は、処理のためにI/Oユニット2204を介してシステム・メモリからデータを転送することができる。少なくとも1つの実施例では、処理中に、転送されたデータは、処理中にオンチップ・メモリ(たとえば、並列プロセッサ・メモリ2222)に記憶され、次いでシステム・メモリに書き戻され得る。
少なくとも1つの実施例では、並列処理ユニット2202がグラフィックス処理を実施するために使用されるとき、スケジューラ2210は、処理アレイ2212の複数のクラスタ2214A~2214Nへのグラフィックス処理動作の分散をより良く可能にするために、処理ワークロードをほぼ等しいサイズのタスクに分割するように構成され得る。少なくとも1つの実施例では、処理アレイ2212の部分は、異なるタイプの処理を実施するように構成され得る。たとえば、少なくとも1つの実施例では、表示のために、レンダリングされた画像を作り出すために、第1の部分は、頂点シェーディング及びトポロジ生成を実施するように構成され得、第2の部分は、テッセレーション及びジオメトリ・シェーディングを実施するように構成され得、第3の部分は、ピクセル・シェーディング又は他のスクリーン空間動作を実施するように構成され得る。少なくとも1つの実施例では、クラスタ2214A~2214Nのうちの1つ又は複数によって作り出された中間データは、中間データがさらなる処理のためにクラスタ2214A~2214N間で送信されることを可能にするために、バッファに記憶され得る。
少なくとも1つの実施例では、処理アレイ2212は、実行されるべき処理タスクをスケジューラ2210を介して受信することができ、スケジューラ2210は、処理タスクを定義するコマンドをフロント・エンド2208から受信する。少なくとも1つの実施例では、処理タスクは、処理されるべきデータのインデックス、たとえば、表面(パッチ)データ、プリミティブ・データ、頂点データ、及び/又はピクセル・データ、並びに、データがどのように処理されるべきであるか(たとえば、どのプログラムが実行されるべきであるか)を定義する状態パラメータ及びコマンドを含むことができる。少なくとも1つの実施例では、スケジューラ2210は、タスクに対応するインデックスをフェッチするように構成され得るか、又はフロント・エンド2208からインデックスを受信し得る。少なくとも1つの実施例では、フロント・エンド2208は、入って来るコマンド・バッファ(たとえば、バッチ・バッファ、プッシュ・バッファなど)によって指定されるワークロードが始動される前に、処理アレイ2212が有効な状態に構成されることを確実にするように構成され得る。
少なくとも1つの実施例では、並列処理ユニット2202の1つ又は複数のインスタンスの各々は、並列プロセッサ・メモリ2222と結合することができる。少なくとも1つの実施例では、並列プロセッサ・メモリ2222は、メモリ・クロスバー2216を介してアクセスされ得、メモリ・クロスバー2216は、処理アレイ2212並びにI/Oユニット2204からメモリ要求を受信することができる。少なくとも1つの実施例では、メモリ・クロスバー2216は、メモリ・インターフェース2218を介して並列プロセッサ・メモリ2222にアクセスすることができる。少なくとも1つの実施例では、メモリ・インターフェース2218は、複数のパーティション・ユニット(たとえば、パーティション・ユニット2220A、パーティション・ユニット2220B~パーティション・ユニット2220N)を含むことができ、複数のパーティション・ユニットは、各々、並列プロセッサ・メモリ2222の一部分(たとえば、メモリ・ユニット)に結合することができる。少なくとも1つの実施例では、パーティション・ユニット2220A~2220Nの数は、メモリ・ユニットの数に等しくなるように構成され、それにより、第1のパーティション・ユニット2220Aは、対応する第1のメモリ・ユニット2224Aを有し、第2のパーティション・ユニット2220Bは、対応するメモリ・ユニット2224Bを有し、第Nのパーティション・ユニット2220Nは、対応する第Nのメモリ・ユニット2224Nを有する。少なくとも1つの実施例では、パーティション・ユニット2220A~2220Nの数は、メモリ・デバイスの数に等しくないことがある。
少なくとも1つの実施例では、メモリ・ユニット2224A~2224Nは、GDDRメモリを含むSGRAMなど、DRAM又はグラフィックス・ランダム・アクセス・メモリを含む、様々なタイプのメモリ・デバイスを含むことができる。少なくとも1つの実施例では、メモリ・ユニット2224A~2224Nは、限定はしないが高帯域幅メモリ(「HBM」:high bandwidth memory)を含む、3D積層メモリをも含み得る。少なくとも1つの実施例では、並列プロセッサ・メモリ2222の利用可能な帯域幅を効率的に使用するために、フレーム・バッファ又はテクスチャ・マップなどのレンダー・ターゲットが、メモリ・ユニット2224A~2224Nにわたって記憶されて、パーティション・ユニット2220A~2220Nが、各レンダー・ターゲットの部分を並列に書き込むことを可能にし得る。少なくとも1つの実施例では、ローカル・キャッシュ・メモリと併せてシステム・メモリを利用する統一メモリ設計に有利なように、並列プロセッサ・メモリ2222のローカル・インスタンスが除外され得る。
少なくとも1つの実施例では、処理アレイ2212のクラスタ2214A~2214Nのうちのいずれか1つは、並列プロセッサ・メモリ2222内のメモリ・ユニット2224A~2224Nのいずれかに書き込まれることになるデータを処理することができる。少なくとも1つの実施例では、メモリ・クロスバー2216は、各クラスタ2214A~2214Nの出力を、出力に対して追加の処理動作を実施することができる任意のパーティション・ユニット2220A~2220Nに転送するか、又は別のクラスタ2214A~2214Nに転送するように構成され得る。少なくとも1つの実施例では、各クラスタ2214A~2214Nは、様々な外部メモリ・デバイスから読み取るか、又はそれに書き込むために、メモリ・クロスバー2216を通してメモリ・インターフェース2218と通信することができる。少なくとも1つの実施例では、メモリ・クロスバー2216は、I/Oユニット2204と通信するためのメモリ・インターフェース2218への接続、並びに、並列プロセッサ・メモリ2222のローカル・インスタンスへの接続を有し、これは、異なるクラスタ2214A~2214N内の処理ユニットが、システム・メモリ、又は並列処理ユニット2202にローカルでない他のメモリと通信することを可能にする。少なくとも1つの実施例では、メモリ・クロスバー2216は、クラスタ2214A~2214Nとパーティション・ユニット2220A~2220Nとの間でトラフィック・ストリームを分離するために、仮想チャネルを使用することができる。
少なくとも1つの実施例では、並列処理ユニット2202の複数のインスタンスは、単一のアドイン・カード上で提供され得るか、又は複数のアドイン・カードが相互接続され得る。少なくとも1つの実施例では、並列処理ユニット2202の異なるインスタンスは、異なるインスタンスが異なる数の処理コア、異なる量のローカル並列プロセッサ・メモリ、及び/又は他の構成の差を有する場合でも、相互動作するように構成され得る。たとえば、少なくとも1つの実施例では、並列処理ユニット2202のいくつかのインスタンスは、他のインスタンスに対してより高い精度の浮動小数点ユニットを含むことができる。少なくとも1つの実施例では、並列処理ユニット2202又は並列プロセッサ2200の1つ又は複数のインスタンスを組み込んだシステムは、限定はしないが、デスクトップ、ラップトップ、又はハンドヘルド・パーソナル・コンピュータ、サーバ、ワークステーション、ゲーム・コンソール、及び/又は組み込みシステムを含む、様々な構成及びフォーム・ファクタにおいて実装され得る。
図22Bは、少なくとも1つの実施例による、処理クラスタ2294を示す。少なくとも1つの実施例では、処理クラスタ2294は、並列処理ユニット内に含まれる。少なくとも1つの実施例では、処理クラスタ2294は、図22の処理クラスタ2214A~2214Nのうちの1つである。少なくとも1つの実施例では、処理クラスタ2294は、多くのスレッドを並列で実行するように構成され得、「スレッド」という用語は、入力データの特定のセットに対して実行している特定のプログラムのインスタンスを指す。少なくとも1つの実施例では、複数の独立した命令ユニットを提供することなしに多数のスレッドの並列実行をサポートするために、単一命令複数データ(「SIMD」:single instruction,multiple data)命令発行技法が使用される。少なくとも1つの実施例では、各処理クラスタ2294内の処理エンジンのセットに命令を発行するように構成された共通の命令ユニットを使用して、全体的に同期された多数のスレッドの並列実行をサポートするために、単一命令複数スレッド(「SIMT」:single instruction,multiple thread)技法が使用される。
少なくとも1つの実施例では、処理クラスタ2294の動作は、SIMT並列プロセッサに処理タスクを分散させるパイプライン・マネージャ2232を介して制御され得る。少なくとも1つの実施例では、パイプライン・マネージャ2232は、図22のスケジューラ2210から命令を受信し、グラフィックス・マルチプロセッサ2234及び/又はテクスチャ・ユニット2236を介してそれらの命令の実行を管理する。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2234は、SIMT並列プロセッサの例示的なインスタンスである。しかしながら、少なくとも1つの実施例では、異なるアーキテクチャの様々なタイプのSIMT並列プロセッサが、処理クラスタ2294内に含められ得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2234の1つ又は複数のインスタンスは、処理クラスタ2294内に含められ得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2234はデータを処理することができ、処理されたデータを、他のシェーダ・ユニットを含む複数の可能な宛先のうちの1つに分散させるために、データ・クロスバー2240が使用され得る。少なくとも1つの実施例では、パイプライン・マネージャ2232は、データ・クロスバー2240を介して分散されることになる処理されたデータのための宛先を指定することによって、処理されたデータの分散を容易にすることができる。
少なくとも1つの実施例では、処理クラスタ2294内の各グラフィックス・マルチプロセッサ2234は、関数実行論理(たとえば、算術論理ユニット、ロード/ストア・ユニット(「LSU」:load/store unit)など)の同一のセットを含むことができる。少なくとも1つの実施例では、関数実行論理は、前の命令が完了する前に新しい命令が発行され得るパイプライン様式で構成され得る。少なくとも1つの実施例では、関数実行論理は、整数及び浮動小数点算術、比較演算、ブール演算、ビット・シフト、及び様々な代数関数の算出を含む様々な演算をサポートする。少なくとも1つの実施例では、異なる演算を実施するために同じ関数ユニット・ハードウェアが活用され得、関数ユニットの任意の組合せが存在し得る。
少なくとも1つの実施例では、処理クラスタ2294に送信される命令がスレッドを構成する。少なくとも1つの実施例では、並列処理エンジンのセットにわたって実行しているスレッドのセットが、スレッド・グループである。少なくとも1つの実施例では、スレッド・グループは、異なる入力データに対してプログラムを実行する。少なくとも1つの実施例では、スレッド・グループ内の各スレッドは、グラフィックス・マルチプロセッサ2234内の異なる処理エンジンに割り当てられ得る。少なくとも1つの実施例では、スレッド・グループは、グラフィックス・マルチプロセッサ2234内の処理エンジンの数よりも少ないスレッドを含み得る。少なくとも1つの実施例では、スレッド・グループが処理エンジンの数よりも少ないスレッドを含むとき、処理エンジンのうちの1つ又は複数は、そのスレッド・グループが処理されているサイクル中にアイドルであり得る。少なくとも1つの実施例では、スレッド・グループはまた、グラフィックス・マルチプロセッサ2234内の処理エンジンの数よりも多いスレッドを含み得る。少なくとも1つの実施例では、スレッド・グループがグラフィックス・マルチプロセッサ2234内の処理エンジンの数よりも多くのスレッドを含むとき、連続するクロック・サイクルにわたって処理が実施され得る。少なくとも1つの実施例では、複数のスレッド・グループが、グラフィックス・マルチプロセッサ2234上で同時に実行され得る。
少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2234は、ロード動作及びストア動作を実施するための内部キャッシュ・メモリを含む。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2234は、内部キャッシュをやめ、処理クラスタ2294内のキャッシュ・メモリ(たとえば、L1キャッシュ2248)を使用することができる。少なくとも1つの実施例では、各グラフィックス・マルチプロセッサ2234はまた、パーティション・ユニット(たとえば、図22Aのパーティション・ユニット2220A~2220N)内のレベル2(「L2」)キャッシュへのアクセスをも有し、それらのL2キャッシュは、すべての処理クラスタ2294の間で共有され、スレッド間でデータを転送するために使用され得る。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2234はまた、オフチップ・グローバル・メモリにアクセスし得、オフチップ・グローバル・メモリは、ローカル並列プロセッサ・メモリ及び/又はシステム・メモリのうちの1つ又は複数を含むことができる。少なくとも1つの実施例では、並列処理ユニット2202の外部の任意のメモリが、グローバル・メモリとして使用され得る。少なくとも1つの実施例では、処理クラスタ2294は、グラフィックス・マルチプロセッサ2234の複数のインスタンスを含み、グラフィックス・マルチプロセッサ2234は、共通の命令及びデータを共有することができ、共通の命令及びデータは、L1キャッシュ2248に記憶され得る。
少なくとも1つの実施例では、各処理クラスタ2294は、仮想アドレスを物理アドレスにマッピングするように構成されたMMU2245を含み得る。少なくとも1つの実施例では、MMU2245の1つ又は複数のインスタンスは、図22のメモリ・インターフェース2218内に存在し得る。少なくとも1つの実施例では、MMU2245は、仮想アドレスを、タイル及び随意にキャッシュ・ライン・インデックスの物理アドレスにマッピングするために使用されるページ・テーブル・エントリ(「PTE」:page table entry)のセットを含む。少なくとも1つの実施例では、MMU2245は、アドレス・トランスレーション・ルックアサイド・バッファ(「TLB」:translation lookaside buffer)又はキャッシュを含み得、これらは、グラフィックス・マルチプロセッサ2234又はL1キャッシュ2248或いは処理クラスタ2294内に存在し得る。少なくとも1つの実施例では、物理アドレスが、表面データ・アクセス・ローカリティを分散させて、パーティション・ユニットの間での効率的な要求インターリーブを可能にするために処理される。少なくとも1つの実施例では、キャッシュ・ライン・インデックスが、キャッシュ・ラインについての要求がヒットであるのかミスであるのかを決定するために使用され得る。
少なくとも1つの実施例では、処理クラスタ2294は、各グラフィックス・マルチプロセッサ2234が、テクスチャ・マッピング動作、たとえば、テクスチャ・サンプル位置を決定すること、テクスチャ・データを読み取ること、及びテクスチャ・データをフィルタリングすることを実施するためのテクスチャ・ユニット2236に結合されるように、構成され得る。少なくとも1つの実施例では、テクスチャ・データは、内部テクスチャL1キャッシュ(図示せず)から又はグラフィックス・マルチプロセッサ2234内のL1キャッシュから読み取られ、必要に応じて、L2キャッシュ、ローカル並列プロセッサ・メモリ、又はシステム・メモリからフェッチされる。少なくとも1つの実施例では、各グラフィックス・マルチプロセッサ2234は、処理されたタスクをデータ・クロスバー2240に出力して、処理されたタスクを、さらなる処理のために別の処理クラスタ2294に提供するか、或いは、処理されたタスクを、メモリ・クロスバー2216を介してL2キャッシュ、ローカル並列プロセッサ・メモリ、又はシステム・メモリに記憶する。少なくとも1つの実施例では、プレ・ラスタ演算ユニット(「プレROP」:pre-raster operation)2242は、グラフィックス・マルチプロセッサ2234からデータを受信し、データをROPユニットにダイレクトするように構成され、ROPユニットは、本明細書で説明されるようなパーティション・ユニット(たとえば、図22のパーティション・ユニット2220A~2220N)とともに位置し得る。少なくとも1つの実施例では、プレROP2242は、色ブレンディングのための最適化を実施し、ピクセル色データを組織化し、アドレス・トランスレーションを実施することができる。
図22Cは、少なくとも1つの実施例による、グラフィックス・マルチプロセッサ2296を示す。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2296は、図22Bのグラフィックス・マルチプロセッサ2234である。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2296は、処理クラスタ2294のパイプライン・マネージャ2232と結合する。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2296は、限定はしないが、命令キャッシュ2252と、命令ユニット2254と、アドレス・マッピング・ユニット2256と、レジスタ・ファイル2258と、1つ又は複数のGPGPUコア2262と、1つ又は複数のLSU2266とを含む実行パイプラインを有する。GPGPUコア2262及びLSU2266は、メモリ及びキャッシュ相互接続2268を介してキャッシュ・メモリ2272及び共有メモリ2270と結合される。
少なくとも1つの実施例では、命令キャッシュ2252は、実行すべき命令のストリームをパイプライン・マネージャ2232から受信する。少なくとも1つの実施例では、命令は、命令キャッシュ2252においてキャッシュされ、命令ユニット2254による実行のためにディスパッチされる。少なくとも1つの実施例では、命令ユニット2254は、命令をスレッド・グループ(たとえば、ワープ)としてディスパッチすることができ、スレッド・グループの各スレッドは、GPGPUコア2262内の異なる実行ユニットに割り当てられる。少なくとも1つの実施例では、命令は、統一アドレス空間内のアドレスを指定することによって、ローカル、共有、又はグローバルのアドレス空間のいずれかにアクセスすることができる。少なくとも1つの実施例では、アドレス・マッピング・ユニット2256は、統一アドレス空間中のアドレスを、LSU2266によってアクセスされ得る個別メモリ・アドレスにトランスレートするために使用され得る。
少なくとも1つの実施例では、レジスタ・ファイル2258は、グラフィックス・マルチプロセッサ2296の機能ユニットにレジスタのセットを提供する。少なくとも1つの実施例では、レジスタ・ファイル2258は、グラフィックス・マルチプロセッサ2296の機能ユニット(たとえば、GPGPUコア2262、LSU2266)のデータ経路に接続された、オペランドのための一時的ストレージを提供する。少なくとも1つの実施例では、レジスタ・ファイル2258は、各機能ユニットがレジスタ・ファイル2258の専用部分を割り振られるように、機能ユニットの各々の間で分割される。少なくとも1つの実施例では、レジスタ・ファイル2258は、グラフィックス・マルチプロセッサ2296によって実行されている異なるスレッド・グループ間で分割される。
少なくとも1つの実施例では、GPGPUコア2262は、各々、グラフィックス・マルチプロセッサ2296の命令を実行するために使用されるFPU及び/又は整数ALUを含むことができる。GPGPUコア2262は、同様のアーキテクチャであることも異なるアーキテクチャであることもある。少なくとも1つの実施例では、GPGPUコア2262の第1の部分は、単精度FPU及び整数ALUを含み、GPGPUコア2262の第2の部分は、倍精度FPUを含む。少なくとも1つの実施例では、FPUは、浮動小数点算術のためのIEEE754-2008規格を実装することができるか、又は、可変精度の浮動小数点算術を有効にすることができる。少なくとも1つの実施例では、グラフィックス・マルチプロセッサ2296は、追加として、矩形コピー動作又はピクセル・ブレンディング動作などの特定の機能を実施するための1つ又は複数の固定機能ユニット又は特別機能ユニットを含むことができる。少なくとも1つの実施例では、GPGPUコア2262のうちの1つ又は複数は、固定又は特別機能論理をも含むことができる。
少なくとも1つの実施例では、GPGPUコア2262は、複数のデータ・セットに対して単一の命令を実施することが可能なSIMD論理を含む。少なくとも1つの実施例では、GPGPUコア2262は、SIMD4、SIMD8、及びSIMD16命令を物理的に実行し、SIMD1、SIMD2、及びSIMD32命令を論理的に実行することができる。少なくとも1つの実施例では、GPGPUコア2262のためのSIMD命令は、シェーダ・コンパイラによるコンパイル時に生成されるか、或いは、単一プログラム複数データ(「SPMD」:single program multiple data)又はSIMTアーキテクチャのために書かれ、コンパイルされたプログラムを実行しているときに自動的に生成され得る。少なくとも1つの実施例では、SIMT実行モデルのために構成されたプログラムの複数のスレッドは、単一のSIMD命令を介して実行され得る。たとえば、少なくとも1つの実施例では、同じ又は同様の動作を実施する8つのSIMTスレッドが、単一のSIMD8論理ユニットを介して並列に実行され得る。
少なくとも1つの実施例では、メモリ及びキャッシュ相互接続2268は、グラフィックス・マルチプロセッサ2296の各機能ユニットをレジスタ・ファイル2258及び共有メモリ2270に接続する相互接続ネットワークである。少なくとも1つの実施例では、メモリ及びキャッシュ相互接続2268は、LSU2266が、共有メモリ2270とレジスタ・ファイル2258との間でロード動作及びストア動作を実装することを可能にするクロスバー相互接続である。少なくとも1つの実施例では、レジスタ・ファイル2258は、GPGPUコア2262と同じ周波数において動作することができ、したがって、GPGPUコア2262とレジスタ・ファイル2258との間のデータ転送は、非常に低いレイテンシである。少なくとも1つの実施例では、共有メモリ2270は、グラフィックス・マルチプロセッサ2296内の機能ユニット上で実行するスレッド間の通信を可能にするために使用され得る。少なくとも1つの実施例では、キャッシュ・メモリ2272は、たとえば、機能ユニットとテクスチャ・ユニット2236との間で通信されるテクスチャ・データをキャッシュするために、データ・キャッシュとして使用され得る。少なくとも1つの実施例では、共有メモリ2270は、キャッシュされる管理されるプログラムとしても使用され得る。少なくとも1つの実施例では、GPGPUコア2262上で実行しているスレッドは、キャッシュ・メモリ2272内に記憶される自動的にキャッシュされるデータに加えて、データを共有メモリ内にプログラム的に記憶することができる。
少なくとも1つの実施例では、本明細書で説明されるような並列プロセッサ又はGPGPUは、グラフィックス動作、機械学習動作、パターン分析動作、及び様々な汎用GPU(GPGPU)機能を加速するために、ホスト/プロセッサ・コアに通信可能に結合される。少なくとも1つの実施例では、GPUは、バス又は他の相互接続(たとえば、PCIe又はNVLinkなどの高速相互接続)を介してホスト・プロセッサ/コアに通信可能に結合され得る。少なくとも1つの実施例では、GPUは、コアとして同じパッケージ又はチップに集積され、パッケージ又はチップの内部にあるプロセッサ・バス/相互接続を介してコアに通信可能に結合され得る。少なくとも1つの実施例では、GPUが接続される様式にかかわらず、プロセッサ・コアは、WD中に含まれているコマンド/命令のシーケンスの形態で、ワークをGPUに割り振り得る。少なくとも1つの実施例では、GPUは、次いで、これらのコマンド/命令を効率的に処理するための専用回路要素/論理を使用する。
図23は、少なくとも1つの実施例による、グラフィックス・プロセッサ2300を示す。少なくとも1つの実施例では、グラフィックス・プロセッサ2300は、リング相互接続2302と、パイプライン・フロント・エンド2304と、メディア・エンジン2337と、グラフィックス・コア2380A~2380Nとを含む。少なくとも1つの実施例では、リング相互接続2302は、グラフィックス・プロセッサ2300を、他のグラフィックス・プロセッサ又は1つ又は複数の汎用プロセッサ・コアを含む他の処理ユニットに結合する。少なくとも1つの実施例では、グラフィックス・プロセッサ2300は、マルチコア処理システム内に組み込まれた多くのプロセッサのうちの1つである。
少なくとも1つの実施例では、グラフィックス・プロセッサ2300は、リング相互接続2302を介してコマンドのバッチを受信する。少なくとも1つの実施例では、入って来るコマンドは、パイプライン・フロント・エンド2304中のコマンド・ストリーマ2303によって解釈される。少なくとも1つの実施例では、グラフィックス・プロセッサ2300は、(1つ又は複数の)グラフィックス・コア2380A~2380Nを介して3Dジオメトリ処理及びメディア処理を実施するためのスケーラブル実行論理を含む。少なくとも1つの実施例では、3Dジオメトリ処理コマンドについて、コマンド・ストリーマ2303は、コマンドをジオメトリ・パイプライン2336に供給する。少なくとも1つの実施例では、少なくともいくつかのメディア処理コマンドについて、コマンド・ストリーマ2303は、コマンドをビデオ・フロント・エンド2334に供給し、ビデオ・フロント・エンド2334はメディア・エンジン2337と結合する。少なくとも1つの実施例では、メディア・エンジン2337は、ビデオ及び画像後処理のためのビデオ品質エンジン(「VQE」:Video Quality Engine)2330と、ハードウェア加速メディア・データ・エンコード及びデコードを提供するためのマルチ・フォーマット・エンコード/デコード(「MFX」:multi-format encode/decode)エンジン2333とを含む。少なくとも1つの実施例では、ジオメトリ・パイプライン2336及びメディア・エンジン2337は、各々、少なくとも1つのグラフィックス・コア2380Aによって提供されるスレッド実行リソースのための実行スレッドを生成する。
少なくとも1つの実施例では、グラフィックス・プロセッサ2300は、各々が(コア・サブ・スライスと呼ばれることもある)複数のサブ・コア2350A~550N、2360A~2360Nを有する、(コア・スライスと呼ばれることもある)モジュール式グラフィックス・コア2380A~2380Nを特徴とするスケーラブル・スレッド実行リソースを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2300は、任意の数のグラフィックス・コア2380A~2380Nを有することができる。少なくとも1つの実施例では、グラフィックス・プロセッサ2300は、少なくとも第1のサブ・コア2350A及び第2のサブ・コア2360Aを有するグラフィックス・コア2380Aを含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2300は、単一のサブ・コア(たとえば、サブ・コア2350A)をもつ低電力プロセッサである。少なくとも1つの実施例では、グラフィックス・プロセッサ2300は、各々が第1のサブ・コア2350A~2350Nのセットと第2のサブ・コア2360A~2360Nのセットとを含む、複数のグラフィックス・コア2380A~2380Nを含む。少なくとも1つの実施例では、第1のサブ・コア2350A~2350N中の各サブ・コアは、少なくとも、実行ユニット(「EU」:execution unit)2352A~2352N及びメディア/テクスチャ・サンプラ2354A~2354Nの第1のセットを含む。少なくとも1つの実施例では、第2のサブ・コア2360A~2360N中の各サブ・コアは、少なくとも、実行ユニット2362A~2362N及びサンプラ2364A~2364Nの第2のセットを含む。少なくとも1つの実施例では、各サブ・コア2350A~2350N、2360A~2360Nは、共有リソース2370A~2370Nのセットを共有する。少なくとも1つの実施例では、共有リソース2370は、共有キャッシュ・メモリ及びピクセル動作論理を含む。
図24は、少なくとも1つの実施例による、プロセッサ2400を示す。少なくとも1つの実施例では、プロセッサ2400は、限定はしないが、命令を実施するための論理回路を含み得る。少なくとも1つの実施例では、プロセッサ2400は、x86命令、AMR命令、ASICのための特別命令などを含む命令を実施し得る。少なくとも1つの実施例では、プロセッサ2410は、カリフォルニア州サンタクララのIntel Corporationからの、MMX(商標)技術で可能にされたマイクロプロセッサ中の64ビット幅MMXレジスタなど、パック・データを記憶するためのレジスタを含み得る。少なくとも1つの実施例では、整数形式と浮動小数点形式の両方で利用可能なMMXレジスタは、SIMD及びストリーミングSIMD拡張(「SSE」:streaming SIMD extension)命令を伴うパック・データ要素で動作し得る。少なくとも1つの実施例では、SSE2、SSE3、SSE4、AVX、又はそれ以上(総称して「SSEx」と呼ばれる)技術に関係する128ビット幅XMMレジスタは、そのようなパック・データ・オペランドを保持し得る。少なくとも1つの実施例では、プロセッサ2410は、CUDAプログラムを加速するための命令を実施し得る。
少なくとも1つの実施例では、プロセッサ2400は、実行されるべき命令をフェッチし、プロセッサ・パイプラインにおいて後で使用されるべき命令を準備するためのイン・オーダー・フロント・エンド(「フロント・エンド」)2401を含む。少なくとも1つの実施例では、フロント・エンド2401は、いくつかのユニットを含み得る。少なくとも1つの実施例では、命令プリフェッチャ2426が、メモリから命令をフェッチし、命令を命令デコーダ2428にフィードし、命令デコーダ2428が命令を復号又は解釈する。たとえば、少なくとも1つの実施例では、命令デコーダ2428は、受信された命令を、実行のために「マイクロ命令」又は「マイクロ・オペレーション」と呼ばれる(「マイクロ・オプ」又は「uop」とも呼ばれる)1つ又は複数のオペレーションに復号する。少なくとも1つの実施例では、命令デコーダ2428は、命令を、動作を実施するためにマイクロアーキテクチャによって使用され得るオプコード及び対応するデータ並びに制御フィールドに構文解析する。少なくとも1つの実施例では、トレース・キャッシュ2430は、復号されたuopを、実行のためにuopキュー2434においてプログラム順のシーケンス又はトレースにアセンブルし得る。少なくとも1つの実施例では、トレース・キャッシュ2430が複雑な命令に遭遇したとき、マイクロコードROM2432が、動作を完了するために必要なuopを提供する。
少なくとも1つの実施例では、単一のマイクロ・オプにコンバートされ得る命令もあれば、全動作を完了するためにいくつかのマイクロ・オプを必要とする命令もある。少なくとも1つの実施例では、命令を完了するために5つ以上のマイクロ・オプが必要とされる場合、命令デコーダ2428は、マイクロコードROM2432にアクセスして命令を実施し得る。少なくとも1つの実施例では、命令は、命令デコーダ2428における処理のために少数のマイクロ・オプに復号され得る。少なくとも1つの実施例では、命令は、動作を達成するためにいくつかのマイクロ・オプが必要とされる場合、マイクロコードROM2432内に記憶され得る。少なくとも1つの実施例では、トレース・キャッシュ2430は、マイクロコードROM2432からの1つ又は複数の命令を完了するために、エントリ・ポイント・プログラマブル論理アレイ(「PLA」:programmable logic array)を参照して、マイクロコード・シーケンスを読み取るための正しいマイクロ命令ポインタを決定する。少なくとも1つの実施例では、マイクロコードROM2432が命令のためにマイクロ・オプのシーケンシングを終えた後、機械のフロント・エンド2401は、トレース・キャッシュ2430からマイクロ・オプをフェッチすることを再開し得る。
少なくとも1つの実施例では、アウト・オブ・オーダー実行エンジン(「アウト・オブ・オーダー・エンジン」)2403は、実行のために命令を準備し得る。少なくとも1つの実施例では、アウト・オブ・オーダー実行論理は、命令がパイプラインを下り、実行のためにスケジューリングされるときの性能を最適化するために、命令のフローを滑らかにし、それを並べ替えるためのいくつかのバッファを有する。アウト・オブ・オーダー実行エンジン2403は、限定はしないが、アロケータ/レジスタ・リネーマ2440と、メモリuopキュー2442と、整数/浮動小数点uopキュー2444と、メモリ・スケジューラ2446と、高速スケジューラ2402と、低速/汎用浮動小数点スケジューラ(「低速/汎用FP(floating point)スケジューラ」)2404と、単純浮動小数点スケジューラ(「単純FPスケジューラ」)2406とを含む。少なくとも1つの実施例では、高速スケジューラ2402、低速/汎用浮動小数点スケジューラ2404、及び単純浮動小数点スケジューラ2406は、総称して本明細書では「uopスケジューラ2402、2404、2406」とも呼ばれる。アロケータ/レジスタ・リネーマ2440は、実行するために各uopが必要とする機械バッファ及びリソースを割り振る。少なくとも1つの実施例では、アロケータ/レジスタ・リネーマ2440は、レジスタ・ファイルへのエントリ時に論理レジスタをリネームする。少なくとも1つの実施例では、アロケータ/レジスタ・リネーマ2440はまた、メモリ・スケジューラ2446及びuopスケジューラ2402、2404、2406の前の、2つのuopキュー、すなわちメモリ動作のためのメモリuopキュー2442及び非メモリ動作のための整数/浮動小数点uopキュー2444のうちの1つにおいて、各uopのためのエントリを割り振る。少なくとも1つの実施例では、uopスケジューラ2402、2404、2406は、uopがいつ実行する準備ができるかを、それらの従属入力レジスタ・オペランド・ソースが準備されていることと、それらの動作を完了するためにuopが必要とする実行リソースの利用可能性とに基づいて、決定する。少なくとも1つの実施例では、少なくとも1つの実施例の高速スケジューラ2402は、メイン・クロック・サイクルの半分ごとにスケジューリングし得、低速/汎用浮動小数点スケジューラ2404及び単純浮動小数点スケジューラ2406は、メイン・プロセッサ・クロック・サイクル当たりに1回スケジューリングし得る。少なくとも1つの実施例では、uopスケジューラ2402、2404、2406は、実行のためにuopをスケジューリングするためにディスパッチ・ポートを調停する。
少なくとも1つの実施例では、実行ブロック2411は、限定はしないが、整数レジスタ・ファイル/バイパス・ネットワーク2408と、浮動小数点レジスタ・ファイル/バイパス・ネットワーク(「FPレジスタ・ファイル/バイパス・ネットワーク」)2410と、アドレス生成ユニット(「AGU」:address generation unit)2412及び2414と、高速ALU2416及び2418と、低速ALU2420と、浮動小数点ALU(「FP」)2422と、浮動小数点移動ユニット(「FP移動」)2424とを含む。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2408及び浮動小数点レジスタ・ファイル/バイパス・ネットワーク2410は、本明細書では「レジスタ・ファイル2408、2410」とも呼ばれる。少なくとも1つの実施例では、AGU2412及び2414、高速ALU2416及び2418、低速ALU2420、浮動小数点ALU2422、及び浮動小数点移動ユニット2424は、本明細書では「実行ユニット2412、2414、2416、2418、2420、2422、及び2424」とも呼ばれる。少なくとも1つの実施例では、実行ブロックは、限定はしないが、(ゼロを含む)任意の数及びタイプのレジスタ・ファイル、バイパス・ネットワーク、アドレス生成ユニット、及び実行ユニットを、任意の組合せで含み得る。
少なくとも1つの実施例では、レジスタ・ファイル2408、2410は、uopスケジューラ2402、2404、2406と、実行ユニット2412、2414、2416、2418、2420、2422、及び2424との間に配置され得る。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2408は、整数演算を実施する。少なくとも1つの実施例では、浮動小数点レジスタ・ファイル/バイパス・ネットワーク2410は、浮動小数点演算を実施する。少なくとも1つの実施例では、レジスタ・ファイル2408、2410の各々は、限定はしないが、バイパス・ネットワークを含み得、バイパス・ネットワークは、レジスタ・ファイルにまだ書き込まれていない完了したばかりの結果を、新しい従属uopにバイパス又はフォワーディングし得る。少なくとも1つの実施例では、レジスタ・ファイル2408、2410は、互いにデータを通信し得る。少なくとも1つの実施例では、整数レジスタ・ファイル/バイパス・ネットワーク2408は、限定はしないが、2つの別個のレジスタ・ファイル、すなわち低次32ビットのデータのための1つのレジスタ・ファイル及び高次32ビットのデータのための第2のレジスタ・ファイルを含み得る。少なくとも1つの実施例では、浮動小数点命令は、通常、64~128ビット幅のオペランドを有するので、浮動小数点レジスタ・ファイル/バイパス・ネットワーク2410は、限定はしないが、128ビット幅のエントリを含み得る。
少なくとも1つの実施例では、実行ユニット2412、2414、2416、2418、2420、2422、2424は、命令を実行し得る。少なくとも1つの実施例では、レジスタ・ファイル2408、2410は、マイクロ命令が実行する必要がある整数及び浮動小数点データ・オペランド値を記憶する。少なくとも1つの実施例では、プロセッサ2400は、限定はしないが、任意の数及び組合せの実行ユニット2412、2414、2416、2418、2420、2422、2424を含み得る。少なくとも1つの実施例では、浮動小数点ALU2422及び浮動小数点移動ユニット2424は、浮動小数点、MMX、SIMD、AVX及びSSE、又は他の演算を実行し得る。少なくとも1つの実施例では、浮動小数点ALU2422は、限定はしないが、除算、平方根、及び剰余マイクロ・オプを実行するための64ビットずつの浮動小数点デバイダを含み得る。少なくとも1つの実施例では、浮動小数点値を伴う命令は、浮動小数点ハードウェアで対処され得る。少なくとも1つの実施例では、ALU演算は、高速ALU2416、2418に渡され得る。少なくとも1つの実施例では、高速ALU2416、2418は、クロック・サイクルの半分の実効レイテンシを伴う高速演算を実行し得る。少なくとも1つの実施例では、低速ALU2420は、限定はしないが、乗数、シフト、フラグ論理、及びブランチ処理などの長レイテンシ・タイプの演算のための整数実行ハードウェアを含み得るので、ほとんどの複雑な整数演算は低速ALU2420に進む。少なくとも1つの実施例では、メモリ・ロード/ストア動作は、AGU2412、2414によって実行され得る。少なくとも1つの実施例では、高速ALU2416、高速ALU2418、及び低速ALU2420は、64ビット・データ・オペランドで整数演算を実施し得る。少なくとも1つの実施例では、高速ALU2416、高速ALU2418、及び低速ALU2420は、16、32、128、256などを含む様々なデータ・ビット・サイズをサポートするために実装され得る。少なくとも1つの実施例では、浮動小数点ALU2422及び浮動小数点移動ユニット2424は、様々なビット幅を有する様々なオペランドをサポートするために実装され得る。少なくとも1つの実施例では、浮動小数点ALU2422及び浮動小数点移動ユニット2424は、SIMD及びマルチメディア命令と併せた128ビット幅のパック・データ・オペランドで動作し得る。
少なくとも1つの実施例では、uopスケジューラ2402、2404、2406は、親ロードが実行し終える前に従属演算をディスパッチする。少なくとも1つの実施例では、uopは、プロセッサ2400において投機的にスケジューリング及び実行され得るので、プロセッサ2400は、メモリ・ミスに対処するための論理をも含み得る。少なくとも1つの実施例では、データ・キャッシュにおいてデータ・ロードがミスした場合、一時的に不正確なデータをもつスケジューラを通り過ぎたパイプラインにおいて、進行中の従属演算があり得る。少なくとも1つの実施例では、リプレイ機構が、不正確なデータを使用する命令を追跡及び再実行する。少なくとも1つの実施例では、従属演算は、リプレイされる必要があり得、独立した演算は、完了することを可能にされ得る。少なくとも1つの実施例では、プロセッサの少なくとも1つの実施例のスケジューラ及びリプレイ機構はまた、テキスト・ストリング比較演算のための命令シーケンスを捕捉するように設計され得る。
少なくとも1つの実施例では、「レジスタ」という用語は、オペランドを識別するための命令の一部として使用され得るオンボード・プロセッサ・ストレージ・ロケーションを指し得る。少なくとも1つの実施例では、レジスタは、(プログラマの視点から見て)プロセッサの外部から使用可能であり得るものであり得る。少なくとも1つの実施例では、レジスタは、特定のタイプの回路に限定されないことがある。むしろ、少なくとも1つの実施例では、レジスタは、データを記憶し、データを提供し、本明細書で説明される機能を実施し得る。少なくとも1つの実施例では、本明細書で説明されるレジスタは、専用物理レジスタ、レジスタ・リネーミングを使用して動的に割り振られる物理レジスタ、専用物理レジスタと動的に割り振られる物理レジスタとの組合せなど、任意の数の異なる技法を使用して、プロセッサ内の回路要素によって実装され得る。少なくとも1つの実施例では、整数レジスタは、32ビット整数データを記憶する。少なくとも1つの実施例のレジスタ・ファイルは、パック・データのための8つのマルチメディアSIMDレジスタをも含んでいる。
図25は、少なくとも1つの実施例による、プロセッサ2500を示す。少なくとも1つの実施例では、プロセッサ2500は、限定はしないが、1つ又は複数のプロセッサ・コア(「コア」)2502A~2502Nと、統合されたメモリ・コントローラ2514と、統合されたグラフィックス・プロセッサ2508とを含む。少なくとも1つの実施例では、プロセッサ2500は、破線ボックスによって表される追加プロセッサ・コア2502Nまでの追加コアを含むことができる。少なくとも1つの実施例では、プロセッサ・コア2502A~2502Nの各々は、1つ又は複数の内部キャッシュ・ユニット2504A~2504Nを含む。少なくとも1つの実施例では、各プロセッサ・コアはまた、1つ又は複数の共有キャッシュ・ユニット2506へのアクセスを有する。
少なくとも1つの実施例では、内部キャッシュ・ユニット2504A~2504Nと共有キャッシュ・ユニット2506とは、プロセッサ2500内のキャッシュ・メモリ階層を表す。少なくとも1つの実施例では、キャッシュ・メモリ・ユニット2504A~2504Nは、各プロセッサ・コア内の命令及びデータ・キャッシュの少なくとも1つのレベル、及びL2、L3、レベル4(「L4」)などの共有中間レベル・キャッシュの1つ又は複数のレベル、又はキャッシュの他のレベルを含み得、ここで、外部メモリの前の最高レベルのキャッシュは、LLCとして分類される。少なくとも1つの実施例では、キャッシュ・コヒーレンシ論理は、様々なキャッシュ・ユニット2506及び2504A~2504N間でコヒーレンシを維持する。
少なくとも1つの実施例では、プロセッサ2500は、1つ又は複数のバス・コントローラ・ユニット2516とシステム・エージェント・コア2510とのセットをも含み得る。少なくとも1つの実施例では、1つ又は複数のバス・コントローラ・ユニット2516は、1つ又は複数のPCI又はPCIエクスプレス・バスなどの周辺バスのセットを管理する。少なくとも1つの実施例では、システム・エージェント・コア2510は、様々なプロセッサ構成要素のための管理機能性を提供する。少なくとも1つの実施例では、システム・エージェント・コア2510は、様々な外部メモリ・デバイス(図示せず)へのアクセスを管理するための1つ又は複数の統合されたメモリ・コントローラ2514を含む。
少なくとも1つの実施例では、プロセッサ・コア2502A~2502Nのうちの1つ又は複数は、同時マルチスレッディングのサポートを含む。少なくとも1つの実施例では、システム・エージェント・コア2510は、マルチスレッド処理中にプロセッサ・コア2502A~2502Nを協調させ、動作させるための構成要素を含む。少なくとも1つの実施例では、システム・エージェント・コア2510は、追加として、電力制御ユニット(「PCU」:power control unit)を含み得、PCUは、プロセッサ・コア2502A~2502N及びグラフィックス・プロセッサ2508の1つ又は複数の電力状態を調節するための論理及び構成要素を含む。
少なくとも1つの実施例では、プロセッサ2500は、追加として、グラフィックス処理動作を実行するためのグラフィックス・プロセッサ2508を含む。少なくとも1つの実施例では、グラフィックス・プロセッサ2508は、共有キャッシュ・ユニット2506、及び1つ又は複数の統合されたメモリ・コントローラ2514を含むシステム・エージェント・コア2510と結合する。少なくとも1つの実施例では、システム・エージェント・コア2510は、1つ又は複数の結合されたディスプレイへのグラフィックス・プロセッサ出力を駆動するためのディスプレイ・コントローラ2511をも含む。少なくとも1つの実施例では、ディスプレイ・コントローラ2511はまた、少なくとも1つの相互接続を介してグラフィックス・プロセッサ2508と結合された別個のモジュールであり得るか、又はグラフィックス・プロセッサ2508内に組み込まれ得る。
少なくとも1つの実施例では、プロセッサ2500の内部構成要素を結合するために、リング・ベースの相互接続ユニット2512が使用される。少なくとも1つの実施例では、ポイントツーポイント相互接続、切替え相互接続、又は他の技法などの代替相互接続ユニットが使用され得る。少なくとも1つの実施例では、グラフィックス・プロセッサ2508は、I/Oリンク2513を介してリング相互接続2512と結合する。
少なくとも1つの実施例では、I/Oリンク2513は、様々なプロセッサ構成要素と、eDRAMモジュールなどの高性能組み込みメモリ・モジュール2518との間の通信を容易にするオン・パッケージI/O相互接続を含む、複数の種類のI/O相互接続のうちの少なくとも1つを表す。少なくとも1つの実施例では、プロセッサ・コア2502A~2502Nの各々と、グラフィックス・プロセッサ2508とは、共有LLCとして組み込みメモリ・モジュール2518を使用する。
少なくとも1つの実施例では、プロセッサ・コア2502A~2502Nは、共通の命令セット・アーキテクチャを実行する同種のコアである。少なくとも1つの実施例では、プロセッサ・コア2502A~2502Nは、ISAという観点から異種であり、ここで、プロセッサ・コア2502A~2502Nのうちの1つ又は複数は、共通の命令セットを実行し、プロセッサ・コア2502A~25-02Nのうちの1つ又は複数の他のコアは、共通の命令セットのサブセット、又は異なる命令セットを実行する。少なくとも1つの実施例では、プロセッサ・コア2502A~2502Nは、マイクロアーキテクチャという観点から異種であり、ここで、電力消費量が比較的高い1つ又は複数のコアは、電力消費量がより低い1つ又は複数のコアと結合する。少なくとも1つの実施例では、プロセッサ2500は、1つ又は複数のチップ上に、又はSoC集積回路として実装され得る。
図26は、説明される少なくとも1つの実施例による、グラフィックス・プロセッサ・コア2600を示す。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2600は、グラフィックス・コア・アレイ内に含まれる。少なくとも1つの実施例では、コア・スライスと呼ばれることもあるグラフィックス・プロセッサ・コア2600は、モジュール式グラフィックス・プロセッサ内の1つ又は複数のグラフィックス・コアであり得る。少なくとも1つの実施例では、グラフィックス・プロセッサ・コア2600は、1つのグラフィックス・コア・スライスの実例であり、本明細書で説明されるグラフィックス・プロセッサは、ターゲット電力及び性能エンベロープに基づいて、複数のグラフィックス・コア・スライスを含み得る。少なくとも1つの実施例では、各グラフィックス・コア2600は、汎用及び固定機能論理のモジュール式ブロックを含む、サブ・スライスとも呼ばれる複数のサブ・コア2601A~2601Fと結合された固定機能ブロック2630を含むことができる。
少なくとも1つの実施例では、固定機能ブロック2630は、たとえば、より低い性能及び/又はより低い電力のグラフィックス・プロセッサ実装形態において、グラフィックス・プロセッサ2600中のすべてのサブ・コアによって共有され得るジオメトリ/固定機能パイプライン2636を含む。少なくとも1つの実施例では、ジオメトリ/固定機能パイプライン2636は、3D固定機能パイプラインと、ビデオ・フロント・エンド・ユニットと、スレッド・スポーナ(spawner)及びスレッド・ディスパッチャと、統一リターン・バッファを管理する統一リターン・バッファ・マネージャとを含む。
少なくとも1つの実施例では、固定機能ブロック2630はまた、グラフィックスSoCインターフェース2637と、グラフィックス・マイクロコントローラ2638と、メディア・パイプライン2639とを含む。グラフィックスSoCインターフェース2637は、グラフィックス・コア2600と、SoC集積回路内の他のプロセッサ・コアとの間のインターフェースを提供する。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2638は、スレッド・ディスパッチと、スケジューリングと、プリエンプションとを含む、グラフィックス・プロセッサ2600の様々な機能を管理するように構成可能であるプログラマブル・サブ・プロセッサである。少なくとも1つの実施例では、メディア・パイプライン2639は、画像及びビデオ・データを含むマルチメディア・データの復号、符号化、前処理、及び/又は後処理を容易にするための論理を含む。少なくとも1つの実施例では、メディア・パイプライン2639は、サブ・コア2601~2601F内のコンピュート論理又はサンプリング論理への要求を介して、メディア動作を実装する。
少なくとも1つの実施例では、SoCインターフェース2637は、グラフィックス・コア2600が汎用アプリケーション・プロセッサ・コア(たとえば、CPU)及び/又はSoC内の他の構成要素と通信することを可能にし、SoC内の他の構成要素は、共有LLCメモリ、システムRAM、及び/或いは組み込みオンチップ又はオンパッケージDRAMなどのメモリ階層要素を含む。少なくとも1つの実施例では、SoCインターフェース2637はまた、カメラ撮像パイプラインなど、SoC内の固定機能デバイスとの通信を可能にすることができ、グラフィックス・コア2600とSoC内のCPUとの間で共有され得るグローバル・メモリ・アトミックの使用を可能にし、及び/又はそれを実装する。少なくとも1つの実施例では、SoCインターフェース2637はまた、グラフィックス・コア2600のための電力管理制御を実装し、グラフィック・コア2600のクロック・ドメインとSoC内の他のクロック・ドメインとの間のインターフェースを可能にすることができる。少なくとも1つの実施例では、SoCインターフェース2637は、グラフィックス・プロセッサ内の1つ又は複数のグラフィックス・コアの各々にコマンド及び命令を提供するように構成されたコマンド・ストリーマ及びグローバル・スレッド・ディスパッチャからのコマンド・バッファの受信を可能にする。少なくとも1つの実施例では、コマンド及び命令は、メディア動作が実施されるべきであるときにメディア・パイプライン2639にディスパッチされ得るか、又は、グラフィックス処理動作が実施されるべきであるときにジオメトリ及び固定機能パイプライン(たとえば、ジオメトリ及び固定機能パイプライン2636、ジオメトリ及び固定機能パイプライン2614)にディスパッチされ得る。
少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2638は、グラフィックス・コア2600のための様々なスケジューリング及び管理タスクを実施するように構成され得る。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2638は、サブ・コア2601A~2601F内の実行ユニット(EU)アレイ2602A~2602F、2604A~2604F内の様々なグラフィックス並列エンジンに対して、グラフィックスを実施し、及び/又はワークロード・スケジューリングを算出することができる。少なくとも1つの実施例では、グラフィックス・コア2600を含むSoCのCPUコア上で実行しているホスト・ソフトウェアは、複数のグラフィック・プロセッサ・ドアベルのうちの1つにワークロードをサブミットすることができ、このドアベルが、適切なグラフィックス・エンジンに対するスケジューリング動作を呼び出す。少なくとも1つの実施例では、スケジューリング動作は、どのワークロードを次に稼働すべきかを決定することと、ワークロードをコマンド・ストリーマにサブミットすることと、エンジン上で稼働している既存のワークロードをプリエンプトすることと、ワークロードの進行を監視することと、ワークロードが完了したときにホスト・ソフトウェアに通知することとを含む。少なくとも1つの実施例では、グラフィックス・マイクロコントローラ2638はまた、グラフィックス・コア2600のための低電力又はアイドル状態を促進して、オペレーティング・システム及び/又はシステム上のグラフィックス・ドライバ・ソフトウェアとは無関係に、低電力状態移行にわたってグラフィックス・コア2600内のレジスタを保存及び復元するアビリティをグラフィックス・コア2600に提供することができる。
少なくとも1つの実施例では、グラフィックス・コア2600は、示されているサブ・コア2601A~2601Fよりも多い又はそれよりも少ない、N個までのモジュール式サブ・コアを有し得る。N個のサブ・コアの各セットについて、少なくとも1つの実施例では、グラフィックス・コア2600はまた、共有機能論理2610、共有及び/又はキャッシュ・メモリ2612、ジオメトリ/固定機能パイプライン2614、並びに様々なグラフィックスを加速し、処理動作を算出するための追加の固定機能論理2616を含むことができる。少なくとも1つの実施例では、共有機能論理2610は、グラフィックス・コア2600内の各N個のサブ・コアによって共有され得る論理ユニット(たとえば、サンプラ、数理、及び/又はスレッド間通信論理)を含むことができる。共有及び/又はキャッシュ・メモリ2612は、グラフィックス・コア2600内のN個のサブ・コア2601A~2601FのためのLLCであり得、また、複数のサブ・コアによってアクセス可能である共有メモリとして働き得る。少なくとも1つの実施例では、ジオメトリ/固定機能パイプライン2614は、固定機能ブロック2630内のジオメトリ/固定機能パイプライン2636の代わりに含まれ得、同じ又は同様の論理ユニットを含むことができる。
少なくとも1つの実施例では、グラフィックス・コア2600は、グラフィックス・コア2600による使用のための様々な固定機能加速論理を含むことができる追加の固定機能論理2616を含む。少なくとも1つの実施例では、追加の固定機能論理2616は、位置限定シェーディング(position only shading)において使用するための追加のジオメトリ・パイプラインを含む。位置限定シェーディングでは、少なくとも2つのジオメトリ・パイプラインが存在するが、ジオメトリ/固定機能パイプライン2616、2636内の完全ジオメトリ・パイプライン、並びに選別パイプライン(cull pipeline)においてであり、選別パイプラインは、追加の固定機能論理2616内に含まれ得る追加のジオメトリ・パイプラインである。少なくとも1つの実施例では、選別パイプラインは、完全ジオメトリ・パイプラインの縮小版である。少なくとも1つの実施例では、完全パイプライン及び選別パイプラインは、アプリケーションの異なるインスタンスを実行することができ、各インスタンスは別個のコンテキストを有する。少なくとも1つの実施例では、位置限定シェーディングは、切り捨てられた三角形の長い選別ランを隠すことができ、これは、いくつかのインスタンスにおいてシェーディングがより早く完了することを可能にする。たとえば、少なくとも1つの実施例では、選別パイプラインは、ピクセルの、フレーム・バッファへのラスタ化及びレンダリングを実施することなしに、頂点の位置属性をフェッチし、シェーディングするので、追加の固定機能論理2616内の選別パイプライン論理は、メイン・アプリケーションと並列で位置シェーダを実行することができ、全体的に完全パイプラインよりも速く臨界結果(critical result)を生成する。少なくとも1つの実施例では、選別パイプラインは、生成された臨界結果を使用して、すべての三角形について、それらの三角形が選別されているかどうかにかかわらず、可視性情報を算出することができる。少なくとも1つの実施例では、(このインスタンスではリプレイ・パイプラインと呼ばれることがある)完全パイプラインは、可視性情報を消費して、選別された三角形を飛ばして可視三角形のみをシェーディングすることができ、可視三角形は、最終的にラスタ化フェーズに渡される。
少なくとも1つの実施例では、追加の固定機能論理2616はまた、CUDAプログラムを加速するために、固定機能行列乗算論理など、汎用処理加速論理を含むことができる。
少なくとも1つの実施例では、各グラフィックス・サブ・コア2601A~2601Fは、実行リソースのセットを含み、実行リソースのセットは、グラフィックス・パイプライン、メディア・パイプライン、又はシェーダ・プログラムによる要求に応答して、グラフィックス動作、メディア動作、及びコンピュート動作を実施するために使用され得る。少なくとも1つの実施例では、グラフィックス・サブ・コア2601A~2601Fは、複数のEUアレイ2602A~2602F、2604A~2604Fと、スレッド・ディスパッチ及びスレッド間通信(「TD/IC」:thread dispatch and inter-thread communication)論理2603A~2603Fと、3D(たとえば、テクスチャ)サンプラ2605A~2605Fと、メディア・サンプラ2606A~2606Fと、シェーダ・プロセッサ2607A~2607Fと、共有ローカル・メモリ(「SLM」:shared local memory)2608A~2608Fとを含む。EUアレイ2602A~2602F、2604A~2604Fは、各々、複数の実行ユニットを含み、複数の実行ユニットは、グラフィックス、メディア、又はコンピュート・シェーダ・プログラムを含むグラフィックス動作、メディア動作、又はコンピュート動作のサービスにおいて浮動小数点及び整数/固定小数点論理演算を実施することが可能なGPGPUである。少なくとも1つの実施例では、TD/IC論理2603A~2603Fは、サブ・コア内の実行ユニットのためのローカル・スレッド・ディスパッチ及びスレッド制御動作を実施し、サブ・コアの実行ユニット上で実行しているスレッド間の通信を容易にする。少なくとも1つの実施例では、3-Dサンプラ2605A~2605Fは、テクスチャ又は他の3Dグラフィックス関係データをメモリに読み取ることができる。少なくとも1つの実施例では、3Dサンプラは、所与のテクスチャに関連する、構成されたサンプル状態及びテクスチャ・フォーマットに基づいて、テクスチャ・データを異なるやり方で読み取ることができる。少なくとも1つの実施例では、メディア・サンプラ2606A~2606Fは、メディア・データに関連するタイプ及びフォーマットに基づいて、同様の読取り動作を実施することができる。少なくとも1つの実施例では、各グラフィックス・サブ・コア2601A~2601Fは、代替的に統一3D及びメディア・サンプラを含むことができる。少なくとも1つの実施例では、サブ・コア2601A~2601Fの各々内の実行ユニット上で実行しているスレッドは、スレッド・グループ内で実行しているスレッドがオンチップ・メモリの共通のプールを使用して実行することを可能にするために、各サブ・コア内の共有ローカル・メモリ2608A~2608Fを利用することができる。
図27は、少なくとも1つの実施例による、並列処理ユニット(「PPU」:parallel processing unit)2700を示す。少なくとも1つの実施例では、PPU2700は、PPU2700によって実行された場合、PPU2700に、本明細書で説明されるプロセス及び技法のいくつか又はすべてを実施させる機械可読コードで構成される。少なくとも1つの実施例では、PPU2700はマルチスレッド・プロセッサであり、マルチスレッド・プロセッサは、1つ又は複数の集積回路デバイス上で実装され、(機械可読命令又は単に命令とも呼ばれる)コンピュータ可読命令を複数のスレッド上で並列に処理するように設計されたレイテンシ隠蔽技法としてマルチスレッディングを利用する。少なくとも1つの実施例では、スレッドは、実行のスレッドを指し、PPU2700によって実行されるように構成された命令のセットのインスタンス化である。少なくとも1つの実施例では、PPU2700は、LCDデバイスなどのディスプレイ・デバイス上での表示のための2次元(「2D」)画像データを生成するために3次元(「3D」)グラフィックス・データを処理するためのグラフィックス・レンダリング・パイプラインを実装するように構成されたGPUである。少なくとも1つの実施例では、PPU2700は、線形代数演算及び機械学習演算などの算出を実施するために利用される。図27は、単に例示を目的とした例示的な並列プロセッサを示し、少なくとも1つの実施例において実装され得るプロセッサ・アーキテクチャの非限定的な実例として解釈されるべきである。
少なくとも1つの実施例では、1つ又は複数のPPU2700は、高性能コンピューティング(「HPC」:High Performance Computing)、データ・センタ、及び機械学習アプリケーションを加速するように構成される。少なくとも1つの実施例では、1つ又は複数のPPU2700は、CUDAプログラムを加速するように構成される。少なくとも1つの実施例では、PPU2700は、限定はしないが、I/Oユニット2706と、フロント・エンド・ユニット2710と、スケジューラ・ユニット2712と、ワーク分散ユニット2714と、ハブ2716と、クロスバー(「Xバー」:crossbar)2720と、1つ又は複数の汎用処理クラスタ(「GPC」:general processing cluster)2718と、1つ又は複数のパーティション・ユニット(「メモリ・パーティション・ユニット」)2722とを含む。少なくとも1つの実施例では、PPU2700は、1つ又は複数の高速GPU相互接続(「GPU相互接続」)2708を介してホスト・プロセッサ又は他のPPU2700に接続される。少なくとも1つの実施例では、PPU2700は、システム・バス又は相互接続2702を介してホスト・プロセッサ又は他の周辺デバイスに接続される。少なくとも1つの実施例では、PPU2700は、1つ又は複数のメモリ・デバイス(「メモリ」)2704を備えるローカル・メモリに接続される。少なくとも1つの実施例では、メモリ・デバイス2704は、限定はしないが、1つ又は複数のダイナミック・ランダム・アクセス・メモリ(DRAM)デバイスを含む。少なくとも1つの実施例では、1つ又は複数のDRAMデバイスは、複数のDRAMダイが各デバイス内で積層された高帯域幅メモリ(「HBM」:high-bandwidth memory)サブシステムとして構成され、及び/又は構成可能である。
少なくとも1つの実施例では、高速GPU相互接続2708は、ワイヤ・ベースのマルチ・レーン通信リンクを指し得、ワイヤ・ベースのマルチ・レーン通信リンクは、1つ又は複数のCPUと組み合わせられた1つ又は複数のPPU2700をスケーリングし、含めるために、システムによって使用され、PPU2700とCPUとの間のキャッシュ・コヒーレンス、及びCPUマスタリングをサポートする。少なくとも1つの実施例では、データ及び/又はコマンドは、高速GPU相互接続2708によって、ハブ2716を通して、1つ又は複数のコピー・エンジン、ビデオ・エンコーダ、ビデオ・デコーダ、電力管理ユニット、及び図27に明示的に示されていないこともある他の構成要素など、PPU2700の他のユニットに/から送信される。
少なくとも1つの実施例では、I/Oユニット2706は、システム・バス2702を介して(図27に示されていない)ホスト・プロセッサから通信(たとえば、コマンド、データ)を送受信するように構成される。少なくとも1つの実施例では、I/Oユニット2706は、システム・バス2702を介して直接、又は、メモリ・ブリッジなどの1つ又は複数の中間デバイスを通して、ホスト・プロセッサと通信する。少なくとも1つの実施例では、I/Oユニット2706は、システム・バス2702を介してPPU2700のうちの1つ又は複数などの1つ又は複数の他のプロセッサと通信し得る。少なくとも1つの実施例では、I/Oユニット2706は、PCIeインターフェースを、PCIeバスを介した通信のために実装する。少なくとも1つの実施例では、I/Oユニット2706は、外部デバイスと通信するためのインターフェースを実装する。
少なくとも1つの実施例では、I/Oユニット2706は、システム・バス2702を介して受信されたパケットを復号する。少なくとも1つの実施例では、少なくともいくつかのパケットは、PPU2700に様々な動作を実施させるように構成されたコマンドを表す。少なくとも1つの実施例では、I/Oユニット2706は、復号されたコマンドを、コマンドによって指定されるPPU2700の様々な他のユニットに送信する。少なくとも1つの実施例では、コマンドは、フロント・エンド・ユニット2710に送信され、及び/或いは、ハブ2716、又は(図27に明示的に示されていない)1つ又は複数のコピー・エンジン、ビデオ・エンコーダ、ビデオ・デコーダ、電力管理ユニットなど、PPU2700の他のユニットに送信される。少なくとも1つの実施例では、I/Oユニット2706はPPU2700の様々な論理ユニット間で及びそれらの間で通信をルーティングするように構成される。
少なくとも1つの実施例では、ホスト・プロセッサによって実行されるプログラムは、処理のためにワークロードをPPU2700に提供するバッファにおいて、コマンド・ストリームを符号化する。少なくとも1つの実施例では、ワークロードは、命令と、それらの命令によって処理されるべきデータとを含む。少なくとも1つの実施例では、バッファは、ホスト・プロセッサとPPU2700の両方によってアクセス(たとえば、書込み/読取り)可能であるメモリ中の領域であり、ホスト・インターフェース・ユニットは、I/Oユニット2706によってシステム・バス2702を介して送信されるメモリ要求を介して、システム・バス2702に接続されたシステム・メモリ中のバッファにアクセスするように構成され得る。少なくとも1つの実施例では、ホスト・プロセッサは、バッファにコマンド・ストリームを書き込み、次いでコマンド・ストリームの開始に対するポインタをPPU2700に送信し、それにより、フロント・エンド・ユニット2710は、1つ又は複数のコマンド・ストリームに対するポインタを受信し、1つ又は複数のコマンド・ストリームを管理して、コマンド・ストリームからコマンドを読み取り、コマンドをPPU2700の様々なユニットにフォワーディングする。
少なくとも1つの実施例では、フロント・エンド・ユニット2710は、1つ又は複数のコマンド・ストリームによって定義されるタスクを処理するように様々なGPC2718を構成するスケジューラ・ユニット2712に結合される。少なくとも1つの実施例では、スケジューラ・ユニット2712は、スケジューラ・ユニット2712によって管理される様々なタスクに関係する状態情報を追跡するように構成され、状態情報は、GPC2718のうちのどれにタスクが割り当てられるか、タスクがアクティブであるのか非アクティブであるのか、タスクに関連する優先レベルなどを示し得る。少なくとも1つの実施例では、スケジューラ・ユニット2712は、GPC2718のうちの1つ又は複数上での複数のタスクの実行を管理する。
少なくとも1つの実施例では、スケジューラ・ユニット2712は、GPC2718上での実行のためのタスクをディスパッチするように構成されたワーク分散ユニット2714に結合される。少なくとも1つの実施例では、ワーク分散ユニット2714は、スケジューラ・ユニット2712から受信された、スケジューリングされたタスクの数を追跡し、ワーク分散ユニット2714は、GPC2718の各々について、ペンディング・タスク・プール及びアクティブ・タスク・プールを管理する。少なくとも1つの実施例では、ペンディング・タスク・プールは、特定のGPC2718によって処理されるように割り当てられたタスクを含んでいるいくつかのスロット(たとえば、32個のスロット)を備え、アクティブ・タスク・プールは、GPC2718によってアクティブに処理されているタスクのためのいくつかのスロット(たとえば、4つのスロット)を備え、それにより、GPC2718のうちの1つがタスクの実行を完了したとき、GPC2718のためのアクティブ・タスク・プールからそのタスクが排除され、ペンディング・タスク・プールからの他のタスクのうちの1つが選択され、GPC2718上での実行のためにスケジューリングされる。少なくとも1つの実施例では、データ依存性が解決されるのを待っている間など、アクティブ・タスクがGPC2718上でアイドルである場合、アクティブ・タスクがGPC2718から排除され、ペンディング・タスク・プールに戻され、その間に、ペンディング・タスク・プール中の別のタスクが選択され、GPC2718上での実行のためにスケジューリングされる。
少なくとも1つの実施例では、ワーク分散ユニット2714は、Xバー2720を介して1つ又は複数のGPC2718と通信する。少なくとも1つの実施例では、Xバー2720は、PPU2700の多くのユニットをPPU2700の他のユニットに結合する相互接続ネットワークであり、ワーク分散ユニット2714を特定のGPC2718に結合するように構成され得る。少なくとも1つの実施例では、PPU2700の1つ又は複数の他のユニットも、ハブ2716を介してXバー2720に接続され得る。
少なくとも1つの実施例では、タスクはスケジューラ・ユニット2712によって管理され、ワーク分散ユニット2714によってGPC2718のうちの1つにディスパッチされる。GPC2718は、タスクを処理し、結果を生成するように構成される。少なくとも1つの実施例では、結果は、GPC2718内の他のタスクによって消費されるか、Xバー2720を介して異なるGPC2718にルーティングされるか、又はメモリ2704に記憶され得る。少なくとも1つの実施例では、結果は、パーティション・ユニット2722を介してメモリ2704に書き込まれ得、パーティション・ユニット2722は、メモリ2704への/からのデータの読取り及び書込みを行うためのメモリ・インターフェースを実装する。少なくとも1つの実施例では、結果は、高速GPU相互接続2708を介して別のPPU2704又はCPUに送信され得る。少なくとも1つの実施例では、PPU2700は、限定はしないが、PPU2700に結合された別個の個別メモリ・デバイス2704の数に等しいU個のパーティション・ユニット2722を含む。
少なくとも1つの実施例では、ホスト・プロセッサはドライバ・カーネルを実行し、ドライバ・カーネルは、ホスト・プロセッサ上で実行している1つ又は複数のアプリケーションがPPU2700上での実行のために動作をスケジューリングすることを可能にするアプリケーション・プログラミング・インターフェース(「API」:application programming interface)を実装する。少なくとも1つの実施例では、複数のコンピュート・アプリケーションが、PPU2700によって同時に実行され、PPU2700は、複数のコンピュート・アプリケーションに対して、隔離、サービス品質(「QoS」:quality of service)、及び独立したアドレス空間を提供する。少なくとも1つの実施例では、アプリケーションは、PPU2700による実行のための1つ又は複数のタスクをドライバ・カーネルに生成させる(たとえば、APIコールの形態の)命令を生成し、ドライバ・カーネルは、PPU2700によって処理されている1つ又は複数のストリームにタスクを出力する。少なくとも1つの実施例では、各タスクは、ワープと呼ばれることがある関係スレッドの1つ又は複数のグループを備える。少なくとも1つの実施例では、ワープは、並列に実行され得る複数の関係スレッド(たとえば、32個のスレッド)を備える。少なくとも1つの実施例では、連動スレッドは、タスクを実施するための命令を含み、共有メモリを通してデータを交換する、複数のスレッドを指すことができる。
図28は、少なくとも1つの実施例による、GPC2800を示す。少なくとも1つの実施例では、GPC2800は、図27のGPC2718である。少なくとも1つの実施例では、各GPC2800は、限定はしないが、タスクを処理するためのいくつかのハードウェア・ユニットを含み、各GPC2800は、限定はしないが、パイプライン・マネージャ2802、プレ・ラスタ演算ユニット(「PROP」:pre-raster operation)2804、ラスタ・エンジン2808、ワーク分散クロスバー(「WDX」:work distribution crossbar)2816、MMU2818、1つ又は複数のデータ処理クラスタ(「DPC」:Data Processing Cluster)2806、及びパーツの任意の好適な組合せを含む。
少なくとも1つの実施例では、GPC2800の動作は、パイプライン・マネージャ2802によって制御される。少なくとも1つの実施例では、パイプライン・マネージャ2802は、GPC2800に割り振られたタスクを処理するための1つ又は複数のDPC2806の構成を管理する。少なくとも1つの実施例では、パイプライン・マネージャ2802は、グラフィックス・レンダリング・パイプラインの少なくとも一部分を実装するように、1つ又は複数のDPC2806のうちの少なくとも1つを構成する。少なくとも1つの実施例では、DPC2806は、プログラマブル・ストリーミング・マルチプロセッサ(「SM」:streaming multiprocessor)2814上で頂点シェーダ・プログラムを実行するように構成される。少なくとも1つの実施例では、パイプライン・マネージャ2802は、ワーク分散ユニットから受信されたパケットを、GPC2800内の適切な論理ユニットにルーティングするように構成され、少なくとも1つの実施例では、いくつかのパケットは、PROP2804中の固定機能ハードウェア・ユニット及び/又はラスタ・エンジン2808にルーティングされ得、他のパケットは、プリミティブ・エンジン2812又はSM2814による処理のためにDPC2806にルーティングされ得る。少なくとも1つの実施例では、パイプライン・マネージャ2802は、コンピューティング・パイプラインを実装するように、DPC2806のうちの少なくとも1つを構成する。少なくとも1つの実施例では、パイプライン・マネージャ2802は、CUDAプログラムの少なくとも一部分を実行するように、DPC2806のうちの少なくとも1つを構成する。
少なくとも1つの実施例では、PROPユニット2804は、ラスタ・エンジン2808及びDPC2806によって生成されたデータを、図27と併せて上記でより詳細に説明されたメモリ・パーティション・ユニット2722など、パーティション・ユニット中のラスタ演算(「ROP」:Raster Operation)ユニットにルーティングするように構成される。少なくとも1つの実施例では、PROPユニット2804は、色ブレンディングのための最適化を実施すること、ピクセル・データを組織化すること、アドレス・トランスレーションを実施することなどを行うように構成される。少なくとも1つの実施例では、ラスタ・エンジン2808は、限定はしないが、様々なラスタ演算を実施するように構成されたいくつかの固定機能ハードウェア・ユニットを含み、少なくとも1つの実施例では、ラスタ・エンジン2808は、限定はしないが、セットアップ・エンジン、粗いラスタ・エンジン、選別エンジン、クリッピング・エンジン、細かいラスタ・エンジン、タイル合体エンジン、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、セットアップ・エンジンは、変換された頂点を受信し、頂点によって定義された幾何学的プリミティブに関連する平面方程式を生成し、平面方程式は、プリミティブについてのカバレージ情報(たとえば、タイルのためのx、yカバレージ・マスク)を生成するために粗いラスタ・エンジンに送信され、粗いラスタ・エンジンの出力は選別エンジンに送信され、zテストに落ちたプリミティブに関連するフラグメントが選別され、クリッピング・エンジンに送信され、視錐台の外側にあるフラグメントがクリップされる。少なくとも1つの実施例では、クリッピング及び選別を通過したフラグメントは、セットアップ・エンジンによって生成された平面方程式に基づいてピクセル・フラグメントについての属性を生成するために、細かいラスタ・エンジンに渡される。少なくとも1つの実施例では、ラスタ・エンジン2808の出力は、DPC2806内に実装されたフラグメント・シェーダによってなど、任意の好適なエンティティによって処理されるべきフラグメントを含む。
少なくとも1つの実施例では、GPC2800中に含まれる各DPC2806は、限定はしないが、Mパイプ・コントローラ(「MPC」:M-Pipe Controller)2810、プリミティブ・エンジン2812、1つ又は複数のSM2814、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、MPC2810は、DPC2806の動作を制御して、パイプライン・マネージャ2802から受信されたパケットを、DPC2806中の適切なユニットにルーティングする。少なくとも1つの実施例では、頂点に関連するパケットは、頂点に関連する頂点属性をメモリからフェッチするように構成されたプリミティブ・エンジン2812にルーティングされ、対照的に、シェーダ・プログラムに関連するパケットは、SM2814に送信され得る。
少なくとも1つの実施例では、SM2814は、限定はしないが、いくつかのスレッドによって表されたタスクを処理するように構成されたプログラマブル・ストリーミング・プロセッサを含む。少なくとも1つの実施例では、SM2814はマルチスレッド化され、スレッドの特定のグループからの複数のスレッド(たとえば、32個のスレッド)を同時に実行するように構成され、SIMDアーキテクチャを実装し、スレッドのグループ(たとえば、ワープ)中の各スレッドは、命令の同じセットに基づいてデータの異なるセットを処理するように構成される。少なくとも1つの実施例では、スレッドのグループ中のすべてのスレッドが同じ命令を実行する。少なくとも1つの実施例では、SM2814は、SIMTアーキテクチャを実装し、スレッドのグループ中の各スレッドは、命令の同じセットに基づいて、データの異なるセットを処理するように構成されるが、スレッドのグループ中の個々のスレッドは、実行中に発散することを可能にされる。少なくとも1つの実施例では、プログラム・カウンタ、コール・スタック、及び実行状態が、各ワープについて維持されて、ワープ内のスレッドが発散するときのワープ間の同時処理及びワープ内の直列実行を可能にする。別の実施例では、プログラム・カウンタ、コール・スタック、及び実行状態が、各個々のスレッドについて維持されて、すべてのスレッド間、ワープ内及びワープ間での等しい同時処理を可能にする。少なくとも1つの実施例では、実行状態が、各個々のスレッドについて維持され、同じ命令を実行しているスレッドが、より良い効率性のために収束され、並列に実行され得る。SM2814の少なくとも1つの実施例は、図29と併せてさらに詳細に説明される。
少なくとも1つの実施例では、MMU2818は、GPC2800とメモリ・パーティション・ユニット(たとえば、図27のパーティション・ユニット2722)との間のインターフェースを提供し、MMU2818は、仮想アドレスから物理アドレスへのトランスレーションと、メモリ保護と、メモリ要求の調停とを提供する。少なくとも1つの実施例では、MMU2818は、仮想アドレスからメモリ中の物理アドレスへのトランスレーションを実施するための1つ又は複数のトランスレーション・ルックアサイド・バッファ(TLB)を提供する。
図29は、少なくとも1つの実施例による、ストリーミング・マルチプロセッサ(「SM」)2900を示す。少なくとも1つの実施例では、SM2900は、図28のSM2814である。少なくとも1つの実施例では、SM2900は、限定はしないが、命令キャッシュ2902、1つ又は複数のスケジューラ・ユニット2904、レジスタ・ファイル2908、1つ又は複数の処理コア(「コア」)2910、1つ又は複数の特殊機能ユニット(「SFU」:special function unit)2912、1つ又は複数のLSU2914、相互接続ネットワーク2916、共有メモリ/L1キャッシュ2918、及びそれらの任意の好適な組合せを含む。少なくとも1つの実施例では、ワーク分散ユニットは、並列処理ユニット(PPU)のGPC上での実行のためにタスクをディスパッチし、各タスクは、GPC内の特定のデータ処理クラスタ(DPC)に割り振られ、タスクがシェーダ・プログラムに関連する場合、タスクはSM2900のうちの1つに割り振られる。少なくとも1つの実施例では、スケジューラ・ユニット2904は、ワーク分散ユニットからタスクを受信し、SM2900に割り当てられた1つ又は複数のスレッド・ブロックについて命令スケジューリングを管理する。少なくとも1つの実施例では、スケジューラ・ユニット2904は、並列スレッドのワープとしての実行のためにスレッド・ブロックをスケジューリングし、各スレッド・ブロックは、少なくとも1つのワープを割り振られる。少なくとも1つの実施例では、各ワープは、スレッドを実行する。少なくとも1つの実施例では、スケジューラ・ユニット2904は、複数の異なるスレッド・ブロックを管理して、異なるスレッド・ブロックにワープを割り振り、次いで、複数の異なる連動グループからの命令を、各クロック・サイクル中に様々な機能ユニット(たとえば、処理コア2910、SFU2912、及びLSU2914)にディスパッチする。
少なくとも1つの実施例では、「連動グループ」は、通信するスレッドのグループを組織化するためのプログラミング・モデルを指し得、プログラミング・モデルは、スレッドが通信している粒度を開発者が表現することを可能にして、より豊富でより効率的な並列分解の表現を可能にする。少なくとも1つの実施例では、連動起動APIは、並列アルゴリズムの実行のためにスレッド・ブロックの間の同期をサポートする。少なくとも1つの実施例では、従来のプログラミング・モデルのAPIは、連動スレッドを同期するための単一の簡単な構築物、すなわちスレッド・ブロックのすべてのスレッドにわたるバリア(たとえば、syncthreads()関数)を提供する。しかしながら、少なくとも1つの実施例では、プログラマは、スレッド・ブロックよりも小さい粒度においてスレッドのグループを定義し、定義されたグループ内で同期して、集合的なグループ全般にわたる機能インターフェースの形態で、より高い性能、設計のフレキシビリティ、及びソフトウェア再利用を可能にし得る。少なくとも1つの実施例では、連動グループは、プログラマが、サブ・ブロック粒度及びマルチ・ブロック粒度において、スレッドのグループを明示的に定義し、連動グループ中のスレッドに対する同期などの集合的な動作を実施することを可能にする。少なくとも1つの実施例では、サブ・ブロック粒度は、単一スレッドと同じくらい小さい。少なくとも1つの実施例では、プログラミング・モデルは、ソフトウェア境界にわたるクリーンな合成をサポートし、それにより、ライブラリ及びユーティリティ関数が、収束に関して仮定する必要なしにそれらのローカル・コンテキスト内で安全に同期することができる。少なくとも1つの実施例では、連動グループ・プリミティブは、限定はしないが、プロデューサ-コンシューマ並列性、日和見並列性(opportunistic parallelism)、及びスレッド・ブロックのグリッド全体にわたるグローバルな同期を含む、新しいパターンの連動並列性を可能にする。
少なくとも1つの実施例では、ディスパッチ・ユニット2906は、機能ユニットのうちの1つ又は複数に命令を送信するように構成され、スケジューラ・ユニット2904は、限定はしないが、同じワープからの2つの異なる命令が各クロック・サイクル中にディスパッチされることを可能にする2つのディスパッチ・ユニット2906を含む。少なくとも1つの実施例では、各スケジューラ・ユニット2904は、単一のディスパッチ・ユニット2906又は追加のディスパッチ・ユニット2906を含む。
少なくとも1つの実施例では、各SM2900は、少なくとも1つの実施例では、限定はしないが、SM2900の機能ユニットにレジスタのセットを提供するレジスタ・ファイル2908を含む。少なくとも1つの実施例では、レジスタ・ファイル2908は、各機能ユニットがレジスタ・ファイル2908の専用部分を割り振られるように、機能ユニットの各々の間で分割される。少なくとも1つの実施例では、レジスタ・ファイル2908は、SM2900によって実行されている異なるワープ間で分割され、レジスタ・ファイル2908は、機能ユニットのデータ経路に接続されたオペランドのための一時的ストレージを提供する。少なくとも1つの実施例では、各SM2900は、限定はしないが、複数のL個の処理コア2910を含む。少なくとも1つの実施例では、SM2900は、限定はしないが、多数の(たとえば、128個以上の)個別の処理コア2910を含む。少なくとも1つの実施例では、各処理コア2910は、限定はしないが、完全にパイプライン化された、単精度の、倍精度の、及び/又は混合精度の処理ユニットを含み、これは、限定はしないが、浮動小数点算術論理ユニット及び整数算術論理ユニットを含む。少なくとも1つの実施例では、浮動小数点算術論理ユニットは、浮動小数点算術のためのIEEE754-2008規格を実装する。少なくとも1つの実施例では、処理コア2910は、限定はしないが、64個の単精度(32ビット)浮動小数点コアと、64個の整数コアと、32個の倍精度(64ビット)浮動小数点コアと、8つのテンソル・コアとを含む。
少なくとも1つの実施例では、テンソル・コアは、行列演算を実施するように構成される。少なくとも1つの実施例では、1つ又は複数のテンソル・コアは、処理コア2910中に含まれる。少なくとも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つの実施例では、各SM2900は、限定はしないが、特殊関数(たとえば、属性評価、逆数平方根など)を実施するM個のSFU2912を含む。少なくとも1つの実施例では、SFU2912は、限定はしないが、階層ツリー・データ構造をトラバースするように構成されたツリー・トラバーサル・ユニットを含む。少なくとも1つの実施例では、SFU2912は、限定はしないが、テクスチャ・マップ・フィルタリング動作を実施するように構成されたテクスチャ・ユニットを含む。少なくとも1つの実施例では、テクスチャ・ユニットは、メモリ及びサンプル・テクスチャ・マップからテクスチャ・マップ(たとえば、テクセルの2Dアレイ)をロードして、SM2900によって実行されるシェーダ・プログラムにおける使用のためのサンプリングされたテクスチャ値を作り出すように構成される。少なくとも1つの実施例では、テクスチャ・マップは、共有メモリ/L1キャッシュ2918に記憶される。少なくとも1つの実施例では、テクスチャ・ユニットは、ミップ・マップ(たとえば、詳細のレベルが異なるテクスチャ・マップ)を使用したフィルタリング動作などのテクスチャ動作を実装する。少なくとも1つの実施例では、各SM2900は、限定はしないが、2つのテクスチャ・ユニットを含む。
少なくとも1つの実施例では、各SM2900は、限定はしないが、共有メモリ/L1キャッシュ2918とレジスタ・ファイル2908との間でロード及びストア動作を実装するN個のLSU2914を含む。少なくとも1つの実施例では、各SM2900は、限定はしないが、相互接続ネットワーク2916を含み、相互接続ネットワーク2916は、機能ユニットの各々をレジスタ・ファイル2908に接続し、LSU2914をレジスタ・ファイル2908及び共有メモリ/L1キャッシュ2918に接続する。少なくとも1つの実施例では、相互接続ネットワーク2916はクロスバーであり、クロスバーは、機能ユニットのうちのいずれかをレジスタ・ファイル2908中のレジスタのうちのいずれかに接続し、LSU2914をレジスタ・ファイル2908と共有メモリ/L1キャッシュ2918中のメモリ・ロケーションとに接続するように構成され得る。
少なくとも1つの実施例では、共有メモリ/L1キャッシュ2918は、SM2900とプリミティブ・エンジンとの間及びSM2900中のスレッド間でのデータ・ストレージ及び通信を可能にするオンチップ・メモリのアレイである。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2918は、限定はしないが、128KBのストレージ容量を備え、SM2900からパーティション・ユニットへの経路中にある。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2918は、読取り及び書込みをキャッシュするために使用される。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2918、L2キャッシュ、及びメモリのうちの1つ又は複数は、補助ストアである。
少なくとも1つの実施例では、データ・キャッシュと共有メモリ機能性とを単一のメモリ・ブロックに組み合わせることは、両方のタイプのメモリ・アクセスについて改善された性能を提供する。少なくとも1つの実施例では、容量は、共有メモリが容量の半分を使用するように構成され、テクスチャ及びロード/ストア動作が残りの容量を使用することができる場合など、共有メモリを使用しないプログラムによってキャッシュとして使用されるか、又は使用可能である。少なくとも1つの実施例では、共有メモリ/L1キャッシュ2918内の統合は、共有メモリ/L1キャッシュ2918が、データをストリーミングするための高スループット管として機能しながら、同時に高帯域幅及び低レイテンシのアクセスを、頻繁に再使用されるデータに提供することを可能にする。少なくとも1つの実施例では、汎用並列算出のために構成されたとき、グラフィックス処理と比較してより簡単な構成が使用され得る。少なくとも1つの実施例では、固定機能GPUがバイパスされて、はるかに簡単なプログラミング・モデルを作成する。少なくとも1つの実施例では及び汎用並列算出構成では、ワーク分散ユニットは、スレッドのブロックをDPCに直接割り当て、分散させる。少なくとも1つの実施例では、ブロック中のスレッドは、各スレッドが一意の結果を生成することを確実にするように、計算において一意のスレッドIDを使用して、同じプログラムを実行し、SM2900を使用してプログラムを実行し、計算を実施し、共有メモリ/L1キャッシュ2918を使用してスレッド間で通信し、LSU2914を使用して、共有メモリ/L1キャッシュ2918及びメモリ・パーティション・ユニットを通してグローバル・メモリを読み取り、書き込む。少なくとも1つの実施例では、汎用並列算出のために構成されたとき、SM2900は、DPC上で新しいワークを起動するためにスケジューラ・ユニット2904が使用することができるコマンドを書き込む。
少なくとも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つの実施例を実装するための例示的なソフトウェア構築物を記載する。
図30は、少なくとも1つの実施例による、プログラミング・プラットフォームのソフトウェア・スタックを示す。少なくとも1つの実施例では、プログラミング・プラットフォームは、算出タスクを加速するために、コンピューティング・システム上のハードウェアを活用するためのプラットフォームである。少なくとも1つの実施例では、プログラミング・プラットフォームは、ライブラリ、コンパイラ指令、及び/又はプログラミング言語への拡張を通して、ソフトウェア開発者にとってアクセス可能であり得る。少なくとも1つの実施例では、プログラミング・プラットフォームは、限定はしないが、CUDA、Radeonオープン・コンピュート・プラットフォーム(「ROCm」:Radeon Open Compute Platform)、OpenCL(OpenCL(商標)はクロノス・グループ(Khronos group)によって開発される)、SYCL、又はIntel One APIであり得る。
少なくとも1つの実施例では、プログラミング・プラットフォームのソフトウェア・スタック3000は、アプリケーション3001のための実行環境を提供する。少なくとも1つの実施例では、アプリケーション3001は、ソフトウェア・スタック3000上で起動されることが可能な任意のコンピュータ・ソフトウェアを含み得る。少なくとも1つの実施例では、アプリケーション3001は、限定はしないが、人工知能(「AI」:artificial intelligence)/機械学習(「ML」:machine learning)アプリケーション、高性能コンピューティング(「HPC」)アプリケーション、仮想デスクトップ・インフラストラクチャ(「VDI」:virtual desktop infrastructure)、又はデータ・センタ・ワークロードを含み得る。
少なくとも1つの実施例では、アプリケーション3001及びソフトウェア・スタック3000は、ハードウェア3007上で稼働し得る。少なくとも1つの実施例では、ハードウェア3007は、1つ又は複数のGPU、CPU、FPGA、AIエンジン、及び/又はプログラミング・プラットフォームをサポートする他のタイプのコンピュート・デバイスを含み得る。CUDAの場合など、少なくとも1つの実施例では、ソフトウェア・スタック3000は、ベンダー固有であり、(1つ又は複数の)特定のベンダーからのデバイスのみと互換性があり得る。OpenCLの場合など、少なくとも1つの実施例では、ソフトウェア・スタック3000は、異なるベンダーからのデバイスで使用され得る。少なくとも1つの実施例では、ハードウェア3007は、アプリケーション・プログラミング・インターフェース(「API」)コールを介して算出タスクを実施するためにアクセスされ得るもう1つのデバイスに接続されたホストを含む。少なくとも1つの実施例では、限定はしないが、CPU(ただし、コンピュート・デバイスをも含み得る)及びそのメモリを含み得る、ハードウェア3007内のホストとは対照的に、ハードウェア3007内のデバイスは、限定はしないが、GPU、FPGA、AIエンジン、又は他のコンピュート・デバイス(ただし、CPUをも含み得る)及びそのメモリを含み得る。
少なくとも1つの実施例では、プログラミング・プラットフォームのソフトウェア・スタック3000は、限定はしないが、いくつかのライブラリ3003と、ランタイム3005と、デバイス・カーネル・ドライバ3006とを含む。少なくとも1つの実施例では、ライブラリ3003の各々は、コンピュータ・プログラムによって使用され、ソフトウェア開発中に活用され得る、データ及びプログラミング・コードを含み得る。少なくとも1つの実施例では、ライブラリ3003は、限定はしないが、事前に書かれたコード及びサブルーチン、クラス、値、タイプ仕様、構成データ、ドキュメンテーション、ヘルプ・データ、並びに/又はメッセージ・テンプレートを含み得る。少なくとも1つの実施例では、ライブラリ3003は、1つ又は複数のタイプのデバイス上での実行のために最適化される機能を含む。少なくとも1つの実施例では、ライブラリ3003は、限定はしないが、デバイス上で数学、深層学習、及び/又は他のタイプの動作を実施するための機能を含み得る。少なくとも1つの実施例では、ライブラリ3003は、ライブラリ3003において実装される機能を公開する、1つ又は複数のAPIを含み得る、対応するAPI3002に関連する。
少なくとも1つの実施例では、アプリケーション3001は、図35~図37と併せて以下でより詳細に説明されるように、実行可能コードにコンパイルされるソース・コードとして書かれる。少なくとも1つの実施例では、アプリケーション3001の実行可能コードは、少なくとも部分的に、ソフトウェア・スタック3000によって提供される実行環境上で稼働し得る。少なくとも1つの実施例では、アプリケーション3001の実行中に、ホストとは対照的な、デバイス上で稼働する必要があるコードに達し得る。少なくとも1つの実施例では、そのような場合、デバイス上で必須のコードをロード及び起動するために、ランタイム3005がコールされ得る。少なくとも1つの実施例では、ランタイム3005は、アプリケーションS01の実行をサポートすることが可能である、任意の技術的に実現可能なランタイム・システムを含み得る。
少なくとも1つの実施例では、ランタイム3005は、(1つ又は複数の)API3004として示されている、対応するAPIに関連する、1つ又は複数のランタイム・ライブラリとして実装される。少なくとも1つの実施例では、そのようなランタイム・ライブラリのうちの1つ又は複数は、限定はしないが、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、及び/又は同期のための機能を含み得る。少なくとも1つの実施例では、メモリ管理機能は、限定はしないが、デバイス・メモリを割り振り、割振り解除し、コピーし、並びにホスト・メモリとデバイス・メモリとの間でデータを転送するための機能を含み得る。少なくとも1つの実施例では、実行制御機能は、限定はしないが、デバイス上で機能(機能がホストからコール可能なグローバル機能であるとき、「カーネル」と呼ばれることがある)を起動し、デバイス上で実行されるべき所与の機能のためのランタイム・ライブラリによって維持されるバッファ中に属性値をセットするための機能を含み得る。
少なくとも1つの実施例では、ランタイム・ライブラリ及び対応する(1つ又は複数の)API3004は、任意の技術的に実現可能な様式で実装され得る。少なくとも1つの実施例では、ある(又は任意の数の)APIは、デバイスのきめ細かい制御のための機能の低レベルのセットを公開し得るが、別の(又は任意の数の)APIは、そのような機能のより高いレベルのセットを公開し得る。少なくとも1つの実施例では、高レベル・ランタイムAPIは、低レベルAPIの上に築かれ得る。少なくとも1つの実施例では、ランタイムAPIのうちの1つ又は複数は、言語依存しないランタイムAPIの上に階層化された言語固有APIであり得る。
少なくとも1つの実施例では、デバイス・カーネル・ドライバ3006は、基礎をなすデバイスとの通信を容易にするように構成される。少なくとも1つの実施例では、デバイス・カーネル・ドライバ3006は、(1つ又は複数の)API3004などのAPI及び/又は他のソフトウェアが依拠する、低レベル機能性を提供し得る。少なくとも1つの実施例では、デバイス・カーネル・ドライバ3006は、ランタイムにおいて中間表現(「IR」:intermediate representation)コードをバイナリ・コードにコンパイルするように構成され得る。少なくとも1つの実施例では、CUDAの場合、デバイス・カーネル・ドライバ3006は、ハードウェア固有でない並列スレッド実行(「PTX」:Parallel Thread Execution)IRコードを、(コンパイルされたバイナリ・コードのキャッシングを伴って)ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにコンパイルし得、これは、コードを「ファイナライズする」(finalizing)と呼ばれることもある。少なくとも1つの実施例では、そうすることは、ファイナライズされたコードがターゲット・デバイス上で稼働することを許し得、これは、ソース・コードが最初にPTXコードにコンパイルされたとき、存在していないことがある。代替的に、少なくとも1つの実施例では、デバイス・ソース・コードは、デバイス・カーネル・ドライバ3006がランタイムにおいてIRコードをコンパイルすることを必要とすることなしに、オフラインでバイナリ・コードにコンパイルされ得る。
図31は、少なくとも1つの実施例による、図30のソフトウェア・スタック3000のCUDA実装形態を示す。少なくとも1つの実施例では、アプリケーション3101が起動され得るCUDAソフトウェア・スタック3100は、CUDAライブラリ3103と、CUDAランタイム3105と、CUDAドライバ3107と、デバイス・カーネル・ドライバ3108とを含む。少なくとも1つの実施例では、CUDAソフトウェア・スタック3100は、ハードウェア3109上で実行し、ハードウェア3109はGPUを含み得、GPUは、CUDAをサポートし、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される。
少なくとも1つの実施例では、アプリケーション3101、CUDAランタイム3105、及びデバイス・カーネル・ドライバ3108は、それぞれ、図30と併せて上記で説明された、アプリケーション3001、ランタイム3005、及びデバイス・カーネル・ドライバ3006と同様の機能性を実施し得る。少なくとも1つの実施例では、CUDAドライバ3107は、CUDAドライバAPI3106を実装するライブラリ(libcuda.so)を含む。少なくとも1つの実施例では、CUDAランタイム・ライブラリ(cudart)によって実装されるCUDAランタイムAPI3104と同様に、CUDAドライバAPI3106は、限定はしないが、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、同期、及び/又はグラフィックス相互運用性のための機能を公開し得る。少なくとも1つの実施例では、CUDAドライバAPI3106は、CUDAランタイムAPI3104が、暗黙的な初期化、(プロセスに類似する)コンテキスト管理、及び(動的にロードされたライブラリに類似する)モジュール管理を提供することによって、デバイス・コード管理を簡略化するという点で、CUDAランタイムAPI3104とは異なる。少なくとも1つの実施例では、高レベルCUDAランタイムAPI3104とは対照的に、CUDAドライバAPI3106は、特にコンテキスト及びモジュール・ローディングに関して、デバイスのよりきめ細かい制御を提供する低レベルAPIである。少なくとも1つの実施例では、CUDAドライバAPI3106は、CUDAランタイムAPI3104によって公開されないコンテキスト管理のための機能を公開し得る。少なくとも1つの実施例では、CUDAドライバAPI3106はまた、言語依存せず、たとえば、CUDAランタイムAPI3104に加えて、OpenCLをサポートする。さらに、少なくとも1つの実施例では、CUDAランタイム3105を含む開発ライブラリは、ユーザモードCUDAドライバ3107と(「ディスプレイ」ドライバと呼ばれることもある)カーネルモード・デバイス・ドライバ3108とを含むドライバ構成要素とは別個のものと見なされ得る。
少なくとも1つの実施例では、CUDAライブラリ3103は、限定はしないが、数学ライブラリ、深層学習ライブラリ、並列アルゴリズム・ライブラリ、及び/又は信号/画像/ビデオ処理ライブラリを含み得、それらをアプリケーション3101などの並列コンピューティング・アプリケーションが利用し得る。少なくとも1つの実施例では、CUDAライブラリ3103は、とりわけ、線形代数演算を実施するための基本線形代数サブプログラム(「BLAS」:Basic Linear Algebra Subprograms)の実装であるcuBLASライブラリ、高速フーリエ変換(「FFT」:fast Fourier transform)を算出するためのcuFFTライブラリ、及び乱数を生成するためのcuRANDライブラリなど、数学ライブラリを含み得る。少なくとも1つの実施例では、CUDAライブラリ3103は、とりわけ、深層ニューラル・ネットワークのためのプリミティブのcuDNNライブラリ及び高性能深層学習推論のためのTensorRTプラットフォームなど、深層学習ライブラリを含み得る。
図32は、少なくとも1つの実施例による、図30のソフトウェア・スタック3000のROCm実装形態を示す。少なくとも1つの実施例では、アプリケーション3201が起動され得るROCmソフトウェア・スタック3200は、言語ランタイム3203と、システム・ランタイム3205と、サンク(thunk)3207と、ROCmカーネル・ドライバ3208とを含む。少なくとも1つの実施例では、ROCmソフトウェア・スタック3200は、ハードウェア3209上で実行し、ハードウェア3209はGPUを含み得、GPUは、ROCmをサポートし、カリフォルニア州サンタクララのAMD Corporationによって開発される。
少なくとも1つの実施例では、アプリケーション3201は、図30と併せて上記で説明されたアプリケーション3001と同様の機能性を実施し得る。少なくとも1つの実施例では、さらに、言語ランタイム3203及びシステム・ランタイム3205は、図30と併せて上記で説明されたランタイム3005と同様の機能性を実施し得る。少なくとも1つの実施例では、言語ランタイム3203とシステム・ランタイム3205とは、システム・ランタイム3205が、ROCrシステム・ランタイムAPI3204を実装し、異種システム・アーキテクチャ(「HSA」:Heterogeneous System Architecture)ランタイムAPIを利用する、言語依存しないランタイムであるという点で、異なる。少なくとも1つの実施例では、HSAランタイムAPIは、とりわけ、メモリ管理、カーネルの設計されたディスパッチを介した実行制御、エラー対処、システム及びエージェント情報、並びにランタイム初期化及び停止(shutdown)のための機能を含む、AMD GPUにアクセスし、それと対話するためのインターフェースを公開する、シン(thin)・ユーザモードAPIである。少なくとも1つの実施例では、システム・ランタイム3205とは対照的に、言語ランタイム3203は、ROCrシステム・ランタイムAPI3204の上に階層化された言語固有ランタイムAPI3202の実装である。少なくとも1つの実施例では、言語ランタイムAPIは、限定はしないが、とりわけ、ポータビリティのための異種コンピュート・インターフェース(「HIP」:Heterogeneous compute Interface for Portability)言語ランタイムAPI、異種コンピュート・コンパイラ(「HCC」:Heterogeneous Compute Compiler)言語ランタイムAPI、又はOpenCL APIを含み得る。特にHIP言語は、機能的に同様のバージョンのCUDA機構をもつC++プログラミング言語の拡張であり、少なくとも1つの実施例では、HIP言語ランタイムAPIは、とりわけ、メモリ管理、実行制御、デバイス管理、エラー対処、及び同期のための機能など、図31と併せて上記で説明されたCUDAランタイムAPI3104の機能と同様である機能を含む。
少なくとも1つの実施例では、サンク(ROCt)3207は、基礎をなすROCmドライバ3208と対話するために使用され得るインターフェース3206である。少なくとも1つの実施例では、ROCmドライバ3208は、AMDGPUドライバとHSAカーネル・ドライバ(amdkfd)との組合せである、ROCkドライバである。少なくとも1つの実施例では、AMDGPUドライバは、図30と併せて上記で説明されたデバイス・カーネル・ドライバ3006と同様の機能性を実施する、AMDによって開発されたGPUのためのデバイス・カーネル・ドライバである。少なくとも1つの実施例では、HSAカーネル・ドライバは、異なるタイプのプロセッサがハードウェア特徴を介してより効果的にシステム・リソースを共有することを許すドライバである。
少なくとも1つの実施例では、様々なライブラリ(図示せず)が、言語ランタイム3203より上にROCmソフトウェア・スタック3200中に含まれ、図31と併せて上記で説明されたCUDAライブラリ3103に対する機能性の類似性を提供し得る。少なくとも1つの実施例では、様々なライブラリは、限定はしないが、とりわけ、CUDA cuBLASの機能と同様の機能を実装するhipBLASライブラリ、CUDA cuFFTと同様であるFFTを算出するためのrocFFTライブラリなど、数学、深層学習、及び/又は他のライブラリを含み得る。
図33は、少なくとも1つの実施例による、図30のソフトウェア・スタック3000のOpenCL実装形態を示す。少なくとも1つの実施例では、アプリケーション3301が起動され得るOpenCLソフトウェア・スタック3300は、OpenCLフレームワーク3310と、OpenCLランタイム3306と、ドライバ3307とを含む。少なくとも1つの実施例では、OpenCLソフトウェア・スタック3300は、ベンダー固有でないハードウェア3109上で実行する。少なくとも1つの実施例では、OpenCLは、異なるベンダーによって開発されたデバイスによってサポートされるので、そのようなベンダーからのハードウェアと相互動作するために、特定のOpenCLドライバが必要とされ得る。
少なくとも1つの実施例では、アプリケーション3301、OpenCLランタイム3306、デバイス・カーネル・ドライバ3307、及びハードウェア3308は、それぞれ、図30と併せて上記で説明された、アプリケーション3001、ランタイム3005、デバイス・カーネル・ドライバ3006、及びハードウェア3007と同様の機能性を実施し得る。少なくとも1つの実施例では、アプリケーション3301は、デバイス上で実行されるべきであるコードをもつOpenCLカーネル3302をさらに含む。
少なくとも1つの実施例では、OpenCLは、ホストに接続されたデバイスをホストが制御することを可能にする「プラットフォーム」を定義する。少なくとも1つの実施例では、OpenCLフレームワークは、プラットフォームAPI3303及びランタイムAPI3305として示されている、プラットフォーム層API及びランタイムAPIを提供する。少なくとも1つの実施例では、ランタイムAPI3305は、デバイス上でのカーネルの実行を管理するためにコンテキストを使用する。少なくとも1つの実施例では、各識別されたデバイスは、それぞれのコンテキストに関連し得、ランタイムAPI3305は、それぞれのコンテキストを使用して、そのデバイスのために、とりわけ、コマンド・キュー、プログラム・オブジェクト、及びカーネル・オブジェクトを管理し、メモリ・オブジェクトを共有し得る。少なくとも1つの実施例では、プラットフォームAPI3303は、とりわけ、デバイスを選択及び初期化し、コマンド・キューを介してデバイスにワークをサブミットし、デバイスとの間でのデータ転送を可能にするために、デバイス・コンテキストが使用されることを許す機能を公開する。少なくとも1つの実施例では、さらに、OpenCLフレームワークは、とりわけ、数学関数とリレーショナル関数と画像処理関数とを含む、様々な組み込み関数(図示せず)を提供する。
少なくとも1つの実施例では、コンパイラ3304も、OpenCLフレームワーク3310中に含まれる。少なくとも1つの実施例では、ソース・コードは、アプリケーションを実行するより前にオフラインでコンパイルされるか、又はアプリケーションの実行中にオンラインでコンパイルされ得る。CUDA及びROCmとは対照的に、少なくとも1つの実施例におけるOpenCLアプリケーションは、コンパイラ3304によってオンラインでコンパイルされ得、コンパイラ3304は、標準ポータブル中間表現(「SPIR-V」:Standard Portable Intermediate Representation)コードなど、ソース・コード及び/又はIRコードをバイナリ・コードにコンパイルするために使用され得る、任意の数のコンパイラを表すために含まれる。代替的に、少なくとも1つの実施例では、OpenCLアプリケーションは、そのようなアプリケーションの実行より前に、オフラインでコンパイルされ得る。
図34は、少なくとも1つの実施例による、プログラミング・プラットフォームによってサポートされるソフトウェアを示す。少なくとも1つの実施例では、プログラミング・プラットフォーム3404は、アプリケーション3400が依拠し得る、様々なプログラミング・モデル3403、ミドルウェア及び/又はライブラリ3402、並びにフレームワーク3401をサポートするように構成される。少なくとも1つの実施例では、アプリケーション3400は、たとえば、MXNet、PyTorch、又はTensorFlowなど、深層学習フレームワークを使用して実装される、AI/MLアプリケーションであり得、これは、基礎をなすハードウェア上で加速コンピューティングを提供するために、cuDNN、NVIDIA集合通信ライブラリ(「NCCL」:NVIDIA Collective Communications Library)、及び/又はNVIDAディベロッパー・データ・ローディング・ライブラリ(「DALI(登録商標)」:NVIDA Developer Data Loading Library)CUDAライブラリなど、ライブラリに依拠し得る。
少なくとも1つの実施例では、プログラミング・プラットフォーム3404は、それぞれ、図31、図32、及び図33と併せて上記で説明された、CUDA、ROCm、又はOpenCLプラットフォームのうちの1つであり得る。少なくとも1つの実施例では、プログラミング・プラットフォーム3404は、アルゴリズム及びデータ構造の表現を許す基礎をなすコンピューティング・システムの抽象化である、複数のプログラミング・モデル3403をサポートする。少なくとも1つの実施例では、プログラミング・モデル3403は、性能を改善するために、基礎をなすハードウェアの特徴を公開し得る。少なくとも1つの実施例では、プログラミング・モデル3403は、限定はしないが、CUDA、HIP、OpenCL、C++加速超並列処理(「C++AMP」:C++ Accelerated Massive Parallelism)、オープン・マルチプロセシング(「OpenMP」:Open Multi-Processing)、オープン・アクセラレータ(「OpenACC」:Open Accelerators)、及び/又はVulcanコンピュート(Vulcan Compute)を含み得る。
少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3402は、プログラミング・モデル3404の抽象化の実装を提供する。少なくとも1つの実施例では、そのようなライブラリは、コンピュータ・プログラムによって使用され、ソフトウェア開発中に活用され得る、データ及びプログラミング・コードを含む。少なくとも1つの実施例では、そのようなミドルウェアは、プログラミング・プラットフォーム3404から利用可能なソフトウェア以外にアプリケーションにサービスを提供するソフトウェアを含む。少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3402は、限定はしないが、cuBLAS、cuFFT、cuRAND、及び他のCUDAライブラリ、又は、rocBLAS、rocFFT、rocRAND、及び他のROCmライブラリを含み得る。さらに、少なくとも1つの実施例では、ライブラリ及び/又はミドルウェア3402は、GPUのための通信ルーチンを提供するNCCL及びROCm通信集合ライブラリ(「RCCL」:ROCm Communication Collectives Library)のライブラリ、深層学習加速のためのMIOpenライブラリ、並びに/又は、線形代数、行列及びベクトル演算、幾何学的変換、数値ソルバー、及び関係するアルゴリズムのための固有(Eigen)ライブラリを含み得る。
少なくとも1つの実施例では、アプリケーション・フレームワーク3401は、ライブラリ及び/又はミドルウェア3402に依存する。少なくとも1つの実施例では、アプリケーション・フレームワーク3401の各々は、アプリケーション・ソフトウェアの標準構造を実装するために使用されるソフトウェア・フレームワークである。少なくとも1つの実施例では、上記で説明されたAI/ML実例に戻ると、AI/MLアプリケーションは、Caffe、Caffe2、TensorFlow、Keras、PyTorch、又はMxNet深層学習フレームワークなど、フレームワークを使用して実装され得る。
図35は、少なくとも1つの実施例による、図30~図33のプログラミング・プラットフォームのうちの1つの上で実行するためのコードをコンパイルすることを示す。少なくとも1つの実施例では、コンパイラ3501は、ホスト・コード並びにデバイス・コードの両方を含むソース・コード3500を受信する。少なくとも1つの実施例では、コンパイラ3501は、ソース・コード3500を、ホスト上での実行のためのホスト実行可能コード3502及びデバイス上での実行のためのデバイス実行可能コード3503にコンバートするように構成される。少なくとも1つの実施例では、ソース・コード3500は、アプリケーションの実行より前にオフラインでコンパイルされるか、又はアプリケーションの実行中にオンラインでコンパイルされるかのいずれかであり得る。
少なくとも1つの実施例では、ソース・コード3500は、C++、C、Fortranなど、コンパイラ3501によってサポートされる任意のプログラミング言語のコードを含み得る。少なくとも1つの実施例では、ソース・コード3500は、ホスト・コードとデバイス・コードとの混合物を有する単一ソース・ファイル中に含まれ得、その中にデバイス・コードのロケーションが示されている。少なくとも1つの実施例では、単一ソース・ファイルは、CUDAコードを含む.cuファイル、又はHIPコードを含む.hip.cppファイルであり得る。代替的に、少なくとも1つの実施例では、ソース・コード3500は、その中でホスト・コードとデバイス・コードとが分離される単一ソース・ファイルではなく、複数のソース・コード・ファイルを含み得る。
少なくとも1つの実施例では、コンパイラ3501は、ソース・コード3500を、ホスト上での実行のためのホスト実行可能コード3502及びデバイス上での実行のためのデバイス実行可能コード3503にコンパイルするように構成される。少なくとも1つの実施例では、コンパイラ3501は、ソース・コード3500を抽象システム・ツリー(AST:abstract system tree)に構文解析することと、最適化を実施することと、実行可能コードを生成することとを含む、動作を実施する。ソース・コード3500が単一ソース・ファイルを含む、少なくとも1つの実施例では、コンパイラ3501は、図36に関して以下でより詳細に説明されるように、そのような単一ソース・ファイル中でデバイス・コードをホスト・コードから分離し、デバイス・コード及びホスト・コードを、それぞれ、デバイス実行可能コード3503及びホスト実行可能コード3502にコンパイルし、デバイス実行可能コード3503とホスト実行可能コード3502とを単一のファイルにおいて互いにリンクし得る。
少なくとも1つの実施例では、ホスト実行可能コード3502及びデバイス実行可能コード3503は、バイナリ・コード及び/又はIRコードなど、任意の好適なフォーマットのものであり得る。少なくとも1つの実施例では、CUDAの場合、ホスト実行可能コード3502は、ネイティブ・オブジェクト・コードを含み得、デバイス実行可能コード3503は、PTX中間表現のコードを含み得る。少なくとも1つの実施例では、ROCmの場合、ホスト実行可能コード3502とデバイス実行可能コード3503の両方は、ターゲット・バイナリ・コードを含み得る。
図36は、少なくとも1つの実施例による、図30~図33のプログラミング・プラットフォームのうちの1つの上で実行するためのコードをコンパイルすることのより詳細な図である。少なくとも1つの実施例では、コンパイラ3601は、ソース・コード3600を受信し、ソース・コード3600をコンパイルし、実行可能ファイル3610を出力するように構成される。少なくとも1つの実施例では、ソース・コード3600は、ホスト・コードとデバイス・コードの両方を含む、.cuファイル、.hip.cppファイル、又は別のフォーマットのファイルなど、単一ソース・ファイルである。少なくとも1つの実施例では、コンパイラ3601は、限定はしないが、.cuファイル中のCUDAコードをコンパイルするためのNVIDIA CUDAコンパイラ(「NVCC」:NVIDIA CUDA compiler)、又は.hip.cppファイル中のHIPコードをコンパイルするためのHCCコンパイラであり得る。
少なくとも1つの実施例では、コンパイラ3601は、コンパイラ・フロント・エンド3602と、ホスト・コンパイラ3605と、デバイス・コンパイラ3606と、リンカ3609とを含む。少なくとも1つの実施例では、コンパイラ・フロント・エンド3602は、ソース・コード3600中でデバイス・コード3604をホスト・コード3603から分離するように構成される。少なくとも1つの実施例では、デバイス・コード3604は、デバイス・コンパイラ3606によってデバイス実行可能コード3608にコンパイルされ、デバイス実行可能コード3608は、説明されたように、バイナリ・コード又はIRコードを含み得る。少なくとも1つの実施例では、別個に、ホスト・コード3603は、ホスト・コンパイラ3605によってホスト実行可能コード3607にコンパイルされる。少なくとも1つの実施例では、NVCCの場合、ホスト・コンパイラ3605は、限定はしないが、ネイティブ・オブジェクト・コードを出力する汎用C/C++コンパイラであり得るが、デバイス・コンパイラ3606は、限定はしないが、LLVMコンパイラ・インフラストラクチャをフォークし、PTXコード又はバイナリ・コードを出力する、低レベル仮想機械(「LLVM」:Low Level Virtual Machine)ベースのコンパイラであり得る。少なくとも1つの実施例では、HCCの場合、ホスト・コンパイラ3605とデバイス・コンパイラ3606の両方は、限定はしないが、ターゲット・バイナリ・コードを出力するLLVMベースのコンパイラであり得る。
少なくとも1つの実施例では、ソース・コード3600をホスト実行可能コード3607及びデバイス実行可能コード3608にコンパイルした後に、リンカ3609は、ホスト実行可能コード3607とデバイス実行可能コード3608とを実行可能ファイル3610において互いにリンクする。少なくとも1つの実施例では、ホストのためのネイティブ・オブジェクト・コードと、デバイスのためのPTX又はバイナリ・コードとは、オブジェクト・コードを記憶するために使用されるコンテナ・フォーマットである、実行可能及びリンク可能フォーマット(「ELF」:Executable and Linkable Format)ファイルにおいて互いにリンクされ得る。
図37は、少なくとも1つの実施例による、ソース・コードをコンパイルするより前にソース・コードをトランスレートすることを示す。少なくとも1つの実施例では、ソース・コード3700は、トランスレーション・ツール3701を通して渡され、トランスレーション・ツール3701は、ソース・コード3700を、トランスレートされたソース・コード3702にトランスレートする。少なくとも1つの実施例では、コンパイラ3703は、図35と併せて上記で説明されたように、ホスト実行可能コード3502及びデバイス実行可能3503へのコンパイラ3501によるソース・コード3500のコンパイルと同様であるプロセスにおいて、トランスレートされたソース・コード3702をホスト実行可能コード3704及びデバイス実行可能コード3705にコンパイルするために使用される。
少なくとも1つの実施例では、トランスレーション・ツール3701によって実施されるトランスレーションは、稼働することが最初に意図された環境とは異なる環境における実行のためにソース3700を移植するために使用される。少なくとも1つの実施例では、トランスレーション・ツール3701は、限定はしないが、CUDAプラットフォームを対象とするCUDAコードを、ROCmプラットフォーム上でコンパイル及び実行され得るHIPコードに「hipify」するために使用される、HIPトランスレータを含み得る。少なくとも1つの実施例では、ソース・コード3700のトランスレーションは、図38A~図39と併せて以下でより詳細に説明されるように、ソース・コード3700を構文解析することと、あるプログラミング・モデル(たとえば、CUDA)によって提供される(1つ又は複数の)APIへのコールを、別のプログラミング・モデル(たとえば、HIP)によって提供される(1つ又は複数の)APIへの対応するコールにコンバートすることとを含み得る。少なくとも1つの実施例では、CUDAコードをhipifyすることの実例に戻ると、CUDAランタイムAPI、CUDAドライバAPI、及び/又はCUDAライブラリへのコールは、対応するHIP APIコールにコンバートされ得る。少なくとも1つの実施例では、トランスレーション・ツール3701によって実施される自動トランスレーションは、時々、不完全であり、ソース・コード3700を完全に移植するために追加の手動の労力を必要とし得る。
汎用コンピューティングのためのGPUを構成すること
以下の図は、限定はしないが、少なくとも1つの実施例による、コンピュート・ソース・コードをコンパイル及び実行するための例示的なアーキテクチャを記載する。
以下の図は、限定はしないが、少なくとも1つの実施例による、コンピュート・ソース・コードをコンパイル及び実行するための例示的なアーキテクチャを記載する。
図38Aは、少なくとも1つの実施例による、異なるタイプの処理ユニットを使用してCUDAソース・コード3810をコンパイル及び実行するように構成されたシステム38A00を示す。少なくとも1つの実施例では、システム38A00は、限定はしないが、CUDAソース・コード3810と、CUDAコンパイラ3850と、ホスト実行可能コード3870(1)と、ホスト実行可能コード3870(2)と、CUDAデバイス実行可能コード3884と、CPU3890と、CUDA対応GPU3894と、GPU3892と、CUDAからHIPへのトランスレーション・ツール3820と、HIPソース・コード3830と、HIPコンパイラ・ドライバ3840と、HCC3860と、HCCデバイス実行可能コード3882とを含む。
少なくとも1つの実施例では、CUDAソース・コード3810は、CUDAプログラミング言語の人間が読み取れるコードの集合である。少なくとも1つの実施例では、CUDAコードは、CUDAプログラミング言語の人間が読み取れるコードである。少なくとも1つの実施例では、CUDAプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、デバイス・コードは、コンパイルの後にデバイス上で並列に実行可能であるソース・コードである。少なくとも1つの実施例では、デバイスは、CUDA対応GPU3890、GPU38192、又は別のGPGPUなど、並列命令処理のために最適化されるプロセッサであり得る。少なくとも1つの実施例では、ホスト・コードは、コンパイルの後にホスト上で実行可能であるソース・コードである。少なくとも1つの実施例では、ホストは、CPU3890など、連続命令処理のために最適化されるプロセッサである。
少なくとも1つの実施例では、CUDAソース・コード3810は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3812と、(ゼロを含む)任意の数のデバイス機能3814と、(ゼロを含む)任意の数のホスト機能3816と、(ゼロを含む)任意の数のホスト/デバイス機能3818とを含む。少なくとも1つの実施例では、グローバル機能3812と、デバイス機能3814と、ホスト機能3816と、ホスト/デバイス機能3818とは、CUDAソース・コード3810中で混合され得る。少なくとも1つの実施例では、グローバル機能3812の各々は、デバイス上で実行可能であり、ホストからコール可能である。少なくとも1つの実施例では、グローバル機能3812のうちの1つ又は複数は、したがって、デバイスへのエントリ・ポイントとして働き得る。少なくとも1つの実施例では、グローバル機能3812の各々はカーネルである。少なくとも1つの実施例では、及び動的並列処理として知られる技法では、グローバル機能3812のうちの1つ又は複数は、カーネルを定義し、カーネルは、デバイス上で実行可能であり、そのようなデバイスからコール可能である。少なくとも1つの実施例では、カーネルは、実行中にデバイス上のN(ここで、Nは任意の正の整数である)個の異なるスレッドによって並列にN回実行される。
少なくとも1つの実施例では、デバイス機能3814の各々は、デバイス上で実行され、そのようなデバイスからのみコール可能である。少なくとも1つの実施例では、ホスト機能3816の各々は、ホスト上で実行され、そのようなホストからのみコール可能である。少なくとも1つの実施例では、ホスト/デバイス機能3816の各々は、ホスト上で実行可能であり、そのようなホストからのみコール可能であるホスト・バージョンの機能と、デバイス上で実行可能であり、そのようなデバイスからのみコール可能であるデバイス・バージョンの機能の両方を定義する。
少なくとも1つの実施例では、CUDAソース・コード3810は、限定はしないが、CUDAランタイムAPI3802を介して定義される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、CUDAランタイムAPI3802は、限定はしないが、デバイス・メモリを割り振り、割振り解除し、ホスト・メモリとデバイス・メモリとの間でデータを転送し、複数のデバイスをもつシステムを管理するなどのためにホスト上で実行する、任意の数の機能を含み得る。少なくとも1つの実施例では、CUDAソース・コード3810は、任意の数の他のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、CUDA APIは、CUDAコードによる使用のために設計される任意のAPIであり得る。少なくとも1つの実施例では、CUDA APIは、限定はしないが、CUDAランタイムAPI3802、CUDAドライバAPI、任意の数のCUDAライブラリのためのAPIなどを含む。少なくとも1つの実施例では、及びCUDAランタイムAPI3802に対して、CUDAドライバAPIは、より低いレベルのAPIであるが、デバイスのよりきめ細かい制御を提供する。少なくとも1つの実施例では、CUDAライブラリの実例は、限定はしないが、cuBLAS、cuFFT、cuRAND、cuDNNなどを含む。
少なくとも1つの実施例では、CUDAコンパイラ3850は、ホスト実行可能コード3870(1)及びCUDAデバイス実行可能コード3884を生成するために、入力CUDAコード(たとえば、CUDAソース・コード3810)をコンパイルする。少なくとも1つの実施例では、CUDAコンパイラ3850はNVCCである。少なくとも1つの実施例では、ホスト実行可能コード3870(1)は、CPU3890上で実行可能である、入力ソース・コード中に含まれるホスト・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、CPU3890は、連続命令処理のために最適化される任意のプロセッサであり得る。
少なくとも1つの実施例では、CUDAデバイス実行可能コード3884は、CUDA対応GPU3894上で実行可能である、入力ソース・コード中に含まれるデバイス・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、CUDAデバイス実行可能コード3884は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3884は、限定はしないが、PTXコードなどのIRコードを含み、これは、デバイス・ドライバによって、特定のターゲット・デバイス(たとえば、CUDA対応GPU3894)のためのバイナリ・コードに、ランタイムにおいてさらにコンパイルされる。少なくとも1つの実施例では、CUDA対応GPU3894は、並列命令処理のために最適化され、CUDAをサポートする、任意のプロセッサであり得る。少なくとも1つの実施例では、CUDA対応GPU3894は、カリフォルニア州サンタクララのNVIDIA Corporationによって開発される。
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810を機能的に同様のHIPソース・コード3830にトランスレートするように構成される。少なくとも1つの実施例では、HIPソース・コード3830は、HIPプログラミング言語の人間が読み取れるコードの集合である。少なくとも1つの実施例では、HIPコードは、HIPプログラミング言語の人間が読み取れるコードである。少なくとも1つの実施例では、HIPプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための、機能的に同様のバージョンのCUDA機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、HIPプログラミング言語は、CUDAプログラミング言語の機能性のサブセットを含み得る。少なくとも1つの実施例では、たとえば、HIPプログラミング言語は、限定はしないが、グローバル機能3812を定義するための(1つ又は複数の)機構を含むが、そのようなHIPプログラミング言語は、動的並列処理のサポートがないことがあり、したがって、HIPコードにおいて定義されたグローバル機能3812は、ホストからのみコール可能であり得る。
少なくとも1つの実施例では、HIPソース・コード3830は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3812と、(ゼロを含む)任意の数のデバイス機能3814と、(ゼロを含む)任意の数のホスト機能3816と、(ゼロを含む)任意の数のホスト/デバイス機能3818とを含む。少なくとも1つの実施例では、HIPソース・コード3830は、HIPランタイムAPI3832において指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、HIPランタイムAPI3832は、限定はしないが、CUDAランタイムAPI3802中に含まれる機能のサブセットの機能的に同様のバージョンを含む。少なくとも1つの実施例では、HIPソース・コード3830は、任意の数の他のHIP APIにおいて指定される任意の数の機能への任意の数のコールをも含み得る。少なくとも1つの実施例では、HIP APIは、HIPコード及び/又はROCmによる使用のために設計される任意のAPIであり得る。少なくとも1つの実施例では、HIP APIは、限定はしないが、HIPランタイムAPI3832、HIPドライバAPI、任意の数のHIPライブラリのためのAPI、任意の数のROCmライブラリのためのAPIなどを含む。
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3820は、CUDAコード中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、CUDAコード中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。少なくとも1つの実施例では、CUDAコールは、CUDA APIにおいて指定された機能へのコールであり、HIPコールは、HIP APIにおいて指定された機能へのコールである。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3820は、CUDAランタイムAPI3802において指定された機能への任意の数のコールを、HIPランタイムAPI3832において指定された機能への任意の数のコールにコンバートする。
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3820は、テキスト・ベースのトランスレーション・プロセスを実行するhipify-Perlとして知られるツールである。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3820は、hipify-clangとして知られるツールであり、これは、hipify-Perlに対して、clang(コンパイラ・フロント・エンド)を使用してCUDAコードを構文解析することと、次いで、得られたシンボルをトランスレートすることとを伴う、より複雑でよりロバストなトランスレーション・プロセスを実行する。少なくとも1つの実施例では、CUDAコードをHIPコードに適切にコンバートすることは、CUDAからHIPへのトランスレーション・ツール3820によって実施される修正に加えて、修正(たとえば、手動の編集)を必要とし得る。
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3840は、ターゲット・デバイス3846を決定し、次いで、ターゲット・デバイス3846と互換性があるコンパイラを、HIPソース・コード3830をコンパイルするように構成する、フロント・エンドである。少なくとも1つの実施例では、ターゲット・デバイス3846は、並列命令処理のために最適化されるプロセッサである。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3840は、任意の技術的に実現可能な様式でターゲット・デバイス3846を決定し得る。
少なくとも1つの実施例では、ターゲット・デバイス3846が、CUDA(たとえば、CUDA対応GPU3894)と互換性がある場合、HIPコンパイラ・ドライバ3840は、HIP/NVCCコンパイル・コマンド3842を生成する。少なくとも1つの実施例では、及び図38Bと併せてより詳細に説明されるように、HIP/NVCCコンパイル・コマンド3842は、限定はしないが、HIPからCUDAへのトランスレーション・ヘッダ及びCUDAランタイム・ライブラリを使用してHIPソース・コード3830をコンパイルするようにCUDAコンパイラ3850を構成する。少なくとも1つの実施例では、及びHIP/NVCCコンパイル・コマンド3842に応答して、CUDAコンパイラ3850は、ホスト実行可能コード3870(1)及びCUDAデバイス実行可能コード3884を生成する。
少なくとも1つの実施例では、ターゲット・デバイス3846が、CUDAと互換性がない場合、HIPコンパイラ・ドライバ3840は、HIP/HCCコンパイル・コマンド3844を生成する。少なくとも1つの実施例では、及び図38Cと併せてより詳細に説明されるように、HIP/HCCコンパイル・コマンド3844は、限定はしないが、HCCヘッダ及びHIP/HCCランタイム・ライブラリを使用してHIPソース・コード3830をコンパイルするようにHCC3860を構成する。少なくとも1つの実施例では、及びHIP/HCCコンパイル・コマンド3844に応答して、HCC3860は、ホスト実行可能コード3870(2)及びHCCデバイス実行可能コード3882を生成する。少なくとも1つの実施例では、HCCデバイス実行可能コード3882は、GPU3892上で実行可能である、HIPソース・コード3830中に含まれるデバイス・コードのコンパイルされたバージョンである。少なくとも1つの実施例では、GPU3892は、並列命令処理のために最適化され、CUDAと互換性がなく、HCCと互換性がある、任意のプロセッサであり得る。少なくとも1つの実施例では、GPU3892は、カリフォルニア州サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、GPU3892は、CUDA非対応GPU3892である。
単に説明目的のために、CPU3890及び異なるデバイス上での実行のためにCUDAソース・コード3810をコンパイルするために少なくとも1つの実施例において実装され得る3つの異なるフローが、図38Aに図示されている。少なくとも1つの実施例では、直接的CUDAフローが、CUDAソース・コード3810をHIPソース・コード3830にトランスレートすることなしに、CPU3890及びCUDA対応GPU3894上での実行のためにCUDAソース・コード3810をコンパイルする。少なくとも1つの実施例では、間接的CUDAフローが、CUDAソース・コード3810をHIPソース・コード3830にトランスレートし、次いで、CPU3890及びCUDA対応GPU3894上での実行のためにHIPソース・コード3830をコンパイルする。少なくとも1つの実施例では、CUDA/HCCフローが、CUDAソース・コード3810をHIPソース・コード3830にトランスレートし、次いで、CPU3890及びGPU3892上での実行のためにHIPソース・コード3830をコンパイルする。
少なくとも1つの実施例において実装され得る直接的CUDAフローは、破線及びA1~A3とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びA1とアノテーション付けされたバブルで図示されているように、CUDAコンパイラ3850は、CUDAソース・コード3810と、CUDAソース・コード3810をコンパイルするようにCUDAコンパイラ3850を構成するCUDAコンパイル・コマンド3848とを受信する。少なくとも1つの実施例では、直接的CUDAフローにおいて使用されるCUDAソース・コード3810は、C++以外のプログラミング言語(たとえば、C、Fortran、Python、Javaなど)に基づくCUDAプログラミング言語で書かれる。少なくとも1つの実施例では、及びCUDAコンパイル・コマンド3848に応答して、CUDAコンパイラ3850は、ホスト実行可能コード3870(1)及びCUDAデバイス実行可能コード3884を生成する(A2とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びA3とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3870(1)及びCUDAデバイス実行可能コード3884は、それぞれ、CPU3890及びCUDA対応GPU3894上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3884は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3884は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
少なくとも1つの実施例において実装され得る間接的CUDAフローは、点線及びB1~B6とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びB1とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810を受信する。少なくとも1つの実施例では、及びB2とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810をHIPソース・コード3830にトランスレートする。少なくとも1つの実施例では、及びB3とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3840は、HIPソース・コード3830を受信し、ターゲット・デバイス3846がCUDA対応であると決定する。
少なくとも1つの実施例では、及びB4とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3840は、HIP/NVCCコンパイル・コマンド3842を生成し、HIP/NVCCコンパイル・コマンド3842とHIPソース・コード3830の両方をCUDAコンパイラ3850に送信する。少なくとも1つの実施例では、及び図38Bと併せてより詳細に説明されるように、HIP/NVCCコンパイル・コマンド3842は、限定はしないが、HIPからCUDAへのトランスレーション・ヘッダ及びCUDAランタイム・ライブラリを使用してHIPソース・コード3830をコンパイルするようにCUDAコンパイラ3850を構成する。少なくとも1つの実施例では、及びHIP/NVCCコンパイル・コマンド3842に応答して、CUDAコンパイラ3850は、ホスト実行可能コード3870(1)及びCUDAデバイス実行可能コード3884を生成する(B5とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びB6とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3870(1)及びCUDAデバイス実行可能コード3884は、それぞれ、CPU3890及びCUDA対応GPU3894上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3884は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3884は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
少なくとも1つの実施例において実装され得るCUDA/HCCフローは、実線及びC1~C6とアノテーション付けされた一連のバブルを介して図示されている。少なくとも1つの実施例では、及びC1とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810を受信する。少なくとも1つの実施例では、及びC2とアノテーション付けされたバブルで図示されているように、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810をHIPソース・コード3830にトランスレートする。少なくとも1つの実施例では、及びC3とアノテーション付けされたバブルで図示されているように、HIPコンパイラ・ドライバ3840は、HIPソース・コード3830を受信し、ターゲット・デバイス3846がCUDA対応でないと決定する。
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3840は、HIP/HCCコンパイル・コマンド3844を生成し、HIP/HCCコンパイル・コマンド3844とHIPソース・コード3830の両方をHCC3860に送信する(C4とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及び図38Cと併せてより詳細に説明されるように、HIP/HCCコンパイル・コマンド3844は、限定はしないが、HCCヘッダ及びHIP/HCCランタイム・ライブラリを使用してHIPソース・コード3830をコンパイルするようにHCC3860を構成する。少なくとも1つの実施例では、及びHIP/HCCコンパイル・コマンド3844に応答して、HCC3860は、ホスト実行可能コード3870(2)及びHCCデバイス実行可能コード3882を生成する(C5とアノテーション付けされたバブルで図示される)。少なくとも1つの実施例では、及びC6とアノテーション付けされたバブルで図示されているように、ホスト実行可能コード3870(2)及びHCCデバイス実行可能コード3882は、それぞれ、CPU3890及びGPU3892上で実行され得る。
少なくとも1つの実施例では、CUDAソース・コード3810がHIPソース・コード3830にトランスレートされた後に、HIPコンパイラ・ドライバ3840は、その後、CUDAからHIPへのトランスレーション・ツール3820を再実行することなしに、CUDA対応GPU3894又はGPU3892のいずれかのための実行可能コードを生成するために使用され得る。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810をHIPソース・コード3830にトランスレートし、HIPソース・コード3830は、次いで、メモリに記憶される。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3840は、次いで、HIPソース・コード3830に基づいてホスト実行可能コード3870(2)及びHCCデバイス実行可能コード3882を生成するようにHCC3860を構成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3840は、その後、記憶されたHIPソース・コード3830に基づいてホスト実行可能コード3870(1)及びCUDAデバイス実行可能コード3884を生成するようにCUDAコンパイラ3850を構成する。
図38Bは、少なくとも1つの実施例による、CPU3890及びCUDA対応GPU3894を使用して、図38AのCUDAソース・コード3810をコンパイル及び実行するように構成されたシステム3804を示す。少なくとも1つの実施例では、システム3804は、限定はしないが、CUDAソース・コード3810と、CUDAからHIPへのトランスレーション・ツール3820と、HIPソース・コード3830と、HIPコンパイラ・ドライバ3840と、CUDAコンパイラ3850と、ホスト実行可能コード3870(1)と、CUDAデバイス実行可能コード3884と、CPU3890と、CUDA対応GPU3894とを含む。
少なくとも1つの実施例では、及び図38Aと併せて本明細書で前に説明されたように、CUDAソース・コード3810は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3812と、(ゼロを含む)任意の数のデバイス機能3814と、(ゼロを含む)任意の数のホスト機能3816と、(ゼロを含む)任意の数のホスト/デバイス機能3818とを含む。少なくとも1つの実施例では、CUDAソース・コード3810は、限定はしないが、任意の数のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含む。
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810をHIPソース・コード3830にトランスレートする。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、CUDAソース・コード3810中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3840は、ターゲット・デバイス3846がCUDA対応であると決定し、HIP/NVCCコンパイル・コマンド3842を生成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3840は、次いで、HIPソース・コード3830をコンパイルするようにHIP/NVCCコンパイル・コマンド3842を介してCUDAコンパイラ3850を構成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3840は、CUDAコンパイラ3850を構成することの一部として、HIPからCUDAへのトランスレーション・ヘッダ3852へのアクセスを提供する。少なくとも1つの実施例では、HIPからCUDAへのトランスレーション・ヘッダ3852は、任意の数のHIP APIにおいて指定された任意の数の機構(たとえば、機能)を、任意の数のCUDA APIにおいて指定された任意の数の機構にトランスレートする。少なくとも1つの実施例では、CUDAコンパイラ3850は、ホスト実行可能コード3870(1)及びCUDAデバイス実行可能コード3884を生成するために、CUDAランタイムAPI3802に対応するCUDAランタイム・ライブラリ3854と併せて、HIPからCUDAへのトランスレーション・ヘッダ3852を使用する。少なくとも1つの実施例では、ホスト実行可能コード3870(1)及びCUDAデバイス実行可能コード3884は、次いで、それぞれ、CPU3890及びCUDA対応GPU3894上で実行され得る。少なくとも1つの実施例では、CUDAデバイス実行可能コード3884は、限定はしないが、バイナリ・コードを含む。少なくとも1つの実施例では、CUDAデバイス実行可能コード3884は、限定はしないが、PTXコードを含み、ランタイムにおいて特定のターゲット・デバイスのためのバイナリ・コードにさらにコンパイルされる。
図38Cは、少なくとも1つの実施例による、CPU3890及びCUDA非対応GPU3892を使用して、図38AのCUDAソース・コード3810をコンパイル及び実行するように構成されたシステム3806を示す。少なくとも1つの実施例では、システム3806は、限定はしないが、CUDAソース・コード3810と、CUDAからHIPへのトランスレーション・ツール3820と、HIPソース・コード3830と、HIPコンパイラ・ドライバ3840と、HCC3860と、ホスト実行可能コード3870(2)と、HCCデバイス実行可能コード3882と、CPU3890と、GPU3892とを含む。
少なくとも1つの実施例では、及び図38Aと併せて本明細書で前に説明されたように、CUDAソース・コード3810は、限定はしないが、(ゼロを含む)任意の数のグローバル機能3812と、(ゼロを含む)任意の数のデバイス機能3814と、(ゼロを含む)任意の数のホスト機能3816と、(ゼロを含む)任意の数のホスト/デバイス機能3818とを含む。少なくとも1つの実施例では、CUDAソース・コード3810は、限定はしないが、任意の数のCUDA APIにおいて指定される任意の数の機能への任意の数のコールをも含む。
少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810をHIPソース・コード3830にトランスレートする。少なくとも1つの実施例では、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810中の各カーネル・コールを、CUDAシンタックスからHIPシンタックスにコンバートし、ソース・コード3810中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。
少なくとも1つの実施例では、HIPコンパイラ・ドライバ3840は、その後、ターゲット・デバイス3846がCUDA対応でないと決定し、HIP/HCCコンパイル・コマンド3844を生成する。少なくとも1つの実施例では、HIPコンパイラ・ドライバ3840は、次いで、HIPソース・コード3830をコンパイルするためにHIP/HCCコンパイル・コマンド3844を実行するようにHCC3860を構成する。少なくとも1つの実施例では、HIP/HCCコンパイル・コマンド3844は、限定はしないが、ホスト実行可能コード3870(2)及びHCCデバイス実行可能コード3882を生成するためにHIP/HCCランタイム・ライブラリ3858及びHCCヘッダ3856を使用するようにHCC3860を構成する。少なくとも1つの実施例では、HIP/HCCランタイム・ライブラリ3858は、HIPランタイムAPI3832に対応する。少なくとも1つの実施例では、HCCヘッダ3856は、限定はしないが、HIP及びHCCのための任意の数及びタイプの相互運用性機構を含む。少なくとも1つの実施例では、ホスト実行可能コード3870(2)及びHCCデバイス実行可能コード3882は、それぞれ、CPU3890及びGPU3892上で実行され得る。
図39は、少なくとも1つの実施例による、図38CのCUDAからHIPへのトランスレーション・ツール3820によってトランスレートされた例示的なカーネルを示す。少なくとも1つの実施例では、CUDAソース・コード3810は、所与のカーネルが解くように設計される全体的な問題を、スレッド・ブロックを使用して独立して解かれ得る比較的粗いサブ問題に区分けする。少なくとも1つの実施例では、各スレッド・ブロックは、限定はしないが、任意の数のスレッドを含む。少なくとも1つの実施例では、各サブ問題は、スレッド・ブロック内のスレッドによって並列に連動して解かれ得る比較的細かい部片に区分けされる。少なくとも1つの実施例では、スレッド・ブロック内のスレッドは、共有メモリを通してデータを共有することによって、及びメモリ・アクセスを協調させるために実行を同期させることによって連動することができる。
少なくとも1つの実施例では、CUDAソース・コード3810は、所与のカーネルに関連するスレッド・ブロックを、スレッド・ブロックの1次元グリッド、2次元グリッド、又は3次元グリッドに組織化する。少なくとも1つの実施例では、各スレッド・ブロックは、限定はしないが、任意の数のスレッドを含み、グリッドは、限定はしないが、任意の数のスレッド・ブロックを含む。
少なくとも1つの実施例では、カーネルは、「__global__」宣言指定子(declaration specifier)を使用して定義されるデバイス・コード中の関数である。少なくとも1つの実施例では、所与のカーネル・コール及び関連するストリームについてカーネルを実行するグリッドの次元は、CUDAカーネル起動シンタックス3910を使用して指定される。少なくとも1つの実施例では、CUDAカーネル起動シンタックス3910は、「KernelName<<<GridSize,BlockSize,SharedMemorySize,Stream>>>(KernelArguments);」として指定される。少なくとも1つの実施例では、実行構成シンタックスは、カーネル名(「KernelName」)とカーネル引数の括弧に入れられたリスト(「KernelArguments」)との間に挿入される「<<<...>>>」構築物である。少なくとも1つの実施例では、CUDAカーネル起動シンタックス3910は、限定はしないが、実行構成シンタックスの代わりに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カーネル起動シンタックス3910に関して、「SharedMemorySize」は、静的に割り振られたメモリに加えて、所与のカーネル・コールについてスレッド・ブロックごとに動的に割り振られる共有メモリ中のバイトの数を指定する随意の引数である。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3910に関して、SharedMemorySizeは0にデフォルト設定される。少なくとも1つの実施例では、及びCUDAカーネル起動シンタックス3910に関して、「Stream」は、関連するストリームを指定する随意の引数であり、デフォルト・ストリームを指定するために0にデフォルト設定される。少なくとも1つの実施例では、ストリームは、イン・オーダーで実行する(場合によっては、異なるホスト・スレッドによって発行された)コマンドのシーケンスである。少なくとも1つの実施例では、異なるストリームは、互いに対してアウト・オブ・オーダーで、又は同時に、コマンドを実行し得る。
少なくとも1つの実施例では、CUDAソース・コード3810は、限定はしないが、例示的なカーネル「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カーネル起動シンタックス3910通りに、カーネルMatAddは、寸法N/16×N/16を有する、スレッド・ブロックのグリッドを使用して実行され、ここで、各スレッド・ブロックは、16×16の寸法を有する。少なくとも1つの実施例では、各スレッド・ブロックは、256個のスレッドを含み、グリッドは、行列要素ごとに1つのスレッドを有するのに十分なブロックで作成され、そのようなグリッド中の各スレッドは、1つのペアワイズ加算を実施するためにカーネルMatAddを実行する。
少なくとも1つの実施例では、CUDAソース・コード3810をHIPソース・コード3830にトランスレートする間、CUDAからHIPへのトランスレーション・ツール3820は、CUDAソース・コード3810中の各カーネル・コールを、CUDAカーネル起動シンタックス3910からHIPカーネル起動シンタックス3920にトランスレートし、ソース・コード3810中の任意の数の他のCUDAコールを、任意の数の他の機能的に同様のHIPコールにコンバートする。少なくとも1つの実施例では、HIPカーネル起動シンタックス3920は、「hipLaunchKernelGGL(KernelName,GridSize,BlockSize,SharedMemorySize,Stream,KernelArguments);」として指定される。少なくとも1つの実施例では、KernelName、GridSize、BlockSize、ShareMemorySize、Stream、及びKernelArgumentsの各々は、HIPカーネル起動シンタックス3920において、(本明細書で前に説明された)CUDAカーネル起動シンタックス3910の場合と同じ意味を有する。少なくとも1つの実施例では、引数SharedMemorySize及びStreamは、HIPカーネル起動シンタックス3920では必要とされ、CUDAカーネル起動シンタックス3910では随意である。
少なくとも1つの実施例では、図39に図示されたHIPソース・コード3830の一部分は、カーネルMatAddにデバイス上で実行させるカーネル・コールを除いて、図39に図示されたCUDAソース・コード3810の一部分と同一である。少なくとも1つの実施例では、カーネルMatAddは、カーネルMatAddがCUDAソース・コード3810において定義される、同じ「__global__」宣言指定子を用いて、HIPソース・コード3830において定義される。少なくとも1つの実施例では、HIPソース・コード3830中のカーネル・コールは、「hipLaunchKernelGGL(MatAdd,numBlocks,threadsPerBlock,0,0,A,B,C);」であるが、CUDAソース・コード3810中の対応するカーネル・コールは、「MatAdd<<<numBlocks,threadsPerBlock>>>(A,B,C);」である。
図40は、少なくとも1つの実施例による、図38CのCUDA非対応GPU3892をより詳細に示す。少なくとも1つの実施例では、GPU3892は、サンタクララのAMD Corporationによって開発される。少なくとも1つの実施例では、GPU3892は、高度並列様式でコンピュート動作を実施するように構成され得る。少なくとも1つの実施例では、GPU3892は、描画コマンド、ピクセル動作、幾何学的算出、及びディスプレイに画像をレンダリングすることに関連する他の動作など、グラフィックス・パイプライン動作を実行するように構成される。少なくとも1つの実施例では、GPU3892は、グラフィックに関係しない動作を実行するように構成される。少なくとも1つの実施例では、GPU3892は、グラフィックに関係する動作とグラフィックに関係しない動作の両方を実行するように構成される。少なくとも1つの実施例では、GPU3892は、HIPソース・コード3830中に含まれるデバイス・コードを実行するように構成され得る。
少なくとも1つの実施例では、GPU3892は、限定はしないが、任意の数のプログラマブル処理ユニット4020と、コマンド・プロセッサ4010と、L2キャッシュ4022と、メモリ・コントローラ4070と、DMAエンジン4080(1)と、システム・メモリ・コントローラ4082と、DMAエンジン4080(2)と、GPUコントローラ4084とを含む。少なくとも1つの実施例では、各プログラマブル処理ユニット4020は、限定はしないが、ワークロード・マネージャ4030と、任意の数のコンピュート・ユニット4040とを含む。少なくとも1つの実施例では、コマンド・プロセッサ4010は、1つ又は複数のコマンド・キュー(図示せず)からコマンドを読み取り、ワークロード・マネージャ4030にコマンドを分散させる。少なくとも1つの実施例では、各プログラマブル処理ユニット4020について、関連するワークロード・マネージャ4030は、プログラマブル処理ユニット4020中に含まれるコンピュート・ユニット4040にワークを分散させる。少なくとも1つの実施例では、各コンピュート・ユニット4040は、任意の数のスレッド・ブロックを実行し得るが、各スレッド・ブロックは、単一のコンピュート・ユニット4040上で実行する。少なくとも1つの実施例では、ワークグループは、スレッド・ブロックである。
少なくとも1つの実施例では、各コンピュート・ユニット4040は、限定はしないが、任意の数のSIMDユニット4050と、共有メモリ4060とを含む。少なくとも1つの実施例では、各SIMDユニット4050は、SIMDアーキテクチャを実装し、動作を並列に実施するように構成され得る。少なくとも1つの実施例では、各SIMDユニット4050は、限定はしないが、ベクトルALU4052とベクトル・レジスタ・ファイル4054とを含む。少なくとも1つの実施例では、各SIMDユニット4050は、異なるワープを実行する。少なくとも1つの実施例では、ワープは、スレッドのグループ(たとえば、16個のスレッド)であり、ここで、ワープ中の各スレッドは、単一のスレッド・ブロックに属し、命令の単一のセットに基づいて、データの異なるセットを処理するように構成される。少なくとも1つの実施例では、ワープ中の1つ又は複数のスレッドを無効にするために、プレディケーションが使用され得る。少なくとも1つの実施例では、レーンはスレッドである。少なくとも1つの実施例では、ワーク・アイテムはスレッドである。少なくとも1つの実施例では、ウェーブフロントはワープである。少なくとも1つの実施例では、スレッド・ブロック中の異なるウェーブフロントは、互いに同期し、共有メモリ4060を介して通信し得る。
少なくとも1つの実施例では、プログラマブル処理ユニット4020は、「シェーダ・エンジン」と呼ばれる。少なくとも1つの実施例では、各プログラマブル処理ユニット4020は、限定はしないが、コンピュート・ユニット4040に加えて、任意の量の専用グラフィックス・ハードウェアを含む。少なくとも1つの実施例では、各プログラマブル処理ユニット4020は、限定はしないが、(ゼロを含む)任意の数のジオメトリ・プロセッサと、(ゼロを含む)任意の数のラスターライザと、(ゼロを含む)任意の数のレンダー・バック・エンドと、ワークロード・マネージャ4030と、任意の数のコンピュート・ユニット4040とを含む。
少なくとも1つの実施例では、コンピュート・ユニット4040は、L2キャッシュ4022を共有する。少なくとも1つの実施例では、L2キャッシュ4022は区分けされる。少なくとも1つの実施例では、GPUメモリ4090は、GPU3892中のすべてのコンピュート・ユニット4040によってアクセス可能である。少なくとも1つの実施例では、メモリ・コントローラ4070及びシステム・メモリ・コントローラ4082は、GPU3892とホストとの間のデータ転送を容易にし、DMAエンジン4080(1)は、GPU3892とそのようなホストとの間の非同期メモリ転送を可能にする。少なくとも1つの実施例では、メモリ・コントローラ4070及びGPUコントローラ4084は、GPU3892と他のGPU3892との間のデータ転送を容易にし、DMAエンジン4080(2)は、GPU3892と他のGPU3892との間の非同期メモリ転送を可能にする。
少なくとも1つの実施例では、GPU3892は、限定はしないが、GPU3892の内部又は外部にあり得る、任意の数及びタイプの直接又は間接的にリンクされた構成要素にわたるデータ及び制御送信を容易にする、任意の量及びタイプのシステム相互接続を含む。少なくとも1つの実施例では、GPU3892は、限定はしないが、任意の数及びタイプの周辺デバイスに結合される、任意の数及びタイプのI/Oインターフェース(たとえば、PCIe)を含む。少なくとも1つの実施例では、GPU3892は、限定はしないが、(ゼロを含む)任意の数のディスプレイ・エンジンと、(ゼロを含む)任意の数のマルチメディア・エンジンとを含み得る。少なくとも1つの実施例では、GPU3892は、限定はしないが、1つの構成要素に専用であるか又は複数の構成要素の間で共有され得る、任意の量及びタイプのメモリ・コントローラ(たとえば、メモリ・コントローラ4070及びシステム・メモリ・コントローラ4082)及びメモリ・デバイス(たとえば、共有メモリ4060)を含む、メモリ・サブシステムを実装する。少なくとも1つの実施例では、GPU3892は、限定はしないが、1つ又は複数のキャッシュ・メモリ(たとえば、L2キャッシュ4022)を含む、キャッシュ・サブシステムを実装し、1つ又は複数のキャッシュ・メモリは、各々、任意の数の構成要素(たとえば、SIMDユニット4050、コンピュート・ユニット4040、及びプログラマブル処理ユニット4020)に対してプライベートであるか、又は任意の数の構成要素間で共有され得る。
図41は、少なくとも1つの実施例による、例示的なCUDAグリッド4120のスレッドが図40の異なるコンピュート・ユニット4040にどのようにマッピングされるかを示す。少なくとも1つの実施例では、及び単に説明目的のために、グリッド4120は、BX×BY×1のGridSizeと、TX×TY×1のBlockSizeとを有する。少なくとも1つの実施例では、グリッド4120は、したがって、限定はしないが、(BX*BY)個のスレッド・ブロック4130を含み、各スレッド・ブロック4130は、限定はしないが、(TX*TY)個のスレッド4140を含む。スレッド4140は、曲がりくねった矢印(squiggly arrow)として図41に図示されている。
少なくとも1つの実施例では、グリッド4120は、限定はしないが、コンピュート・ユニット4040(1)~4040(C)を含むプログラマブル処理ユニット4020(1)にマッピングされる。少なくとも1つの実施例では、及び示されているように、(BJ*BY)個のスレッド・ブロック4130が、コンピュート・ユニット4040(1)にマッピングされ、残りのスレッド・ブロック4130が、コンピュート・ユニット4040(2)にマッピングされる。少なくとも1つの実施例では、各スレッド・ブロック4130は、限定はしないが、任意の数のワープを含み得、各ワープは、図40の異なるSIMDユニット4050にマッピングされる。
少なくとも1つの実施例では、所与のスレッド・ブロック4130中のワープは、互いに同期し、関連するコンピュート・ユニット4040中に含まれる共有メモリ4060を通して通信し得る。たとえば、及び少なくとも1つの実施例では、スレッド・ブロック4130(BJ,1)中のワープは、互いに同期し、共有メモリ4060(1)を通して通信することができる。たとえば、及び少なくとも1つの実施例では、スレッド・ブロック4130(BJ+1,1)中のワープは、互いに同期し、共有メモリ4060(2)を通して通信することができる。
図42は、少なくとも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++4204を生成するために、DPC++互換性ツール4202への入力として、CUDAソース・コード4200が提供される。少なくとも1つの実施例では、人間が読み取れるDPC++4204は、DPC++互換性ツール4202によって生成されたインライン・コメントを含み、これは、コーディングと所望の性能への調整とを完了4206するために、DPC++コードをどのように及び/又はどこで修正すべきかに関して開発者をガイドし、それにより、DPC++ソース・コード4208を生成する。
少なくとも1つの実施例では、CUDAソース・コード4200は、CUDAプログラミング言語の人間が読み取れるソース・コードの集合であるか、又はその集合を含む。少なくとも1つの実施例では、CUDAソース・コード4200は、CUDAプログラミング言語の人間が読み取れるソース・コードである。少なくとも1つの実施例では、CUDAプログラミング言語は、限定はしないが、デバイス・コードを定義し、デバイス・コードとホスト・コードとを区別するための機構を含む、C++プログラミング言語の拡張である。少なくとも1つの実施例では、デバイス・コードは、コンパイルの後に、デバイス(たとえば、GPU又はFPGA)上で実行可能であり、デバイスの1つ又は複数のプロセッサ・コア上で実行され得る、又はより並列化可能なワークフローを含み得る、ソース・コードである。少なくとも1つの実施例では、デバイスは、CUDA対応GPU、GPU、又は別のGPGPUなど、並列命令処理のために最適化されるプロセッサであり得る。少なくとも1つの実施例では、ホスト・コードは、コンパイルの後にホスト上で実行可能であるソース・コードである。少なくとも1つの実施例では、ホスト・コード及びデバイス・コードの一部又は全部は、CPU及びGPU/FPGAにわたって並列に実行され得る。少なくとも1つの実施例では、ホストは、CPUなど、連続命令処理のために最適化されるプロセッサである。図42に関して説明されるCUDAソース・コード4200は、本明細書の他の場所で説明されるCUDAソース・コードに従い得る。
少なくとも1つの実施例では、DPC++互換性ツール4202は、DPC++ソース・コード4208へのCUDAソース・コード4200のマイグレーションを容易にするために使用される、実行可能ツール、プログラム、アプリケーション、又は任意の他の好適なタイプのツールを指す。少なくとも1つの実施例では、DPC++互換性ツール4202は、既存のCUDAソースをDPC++に移植するために使用されるDPC++ツール・キットの一部として利用可能なコマンド・ライン・ベースのコード・マイグレーション・ツールである。少なくとも1つの実施例では、DPC++互換性ツール4202は、CUDAアプリケーションの一部又は全部のソース・コードをCUDAからDPC++にコンバートし、人間が読み取れるDPC++4204と呼ばれる、少なくとも部分的にDPC++で書かれる得られたファイルを生成する。少なくとも1つの実施例では、人間が読み取れるDPC++4204は、ユーザ介入がどこで必要であり得るかを示すためにDPC++互換性ツール4202によって生成されるコメントを含む。少なくとも1つの実施例では、ユーザ介入は、CUDAソース・コード4200が、類似するDPC++APIを有しないCUDA APIをコールするとき、必要であり、ユーザ介入が必要とされる他の実例は、後でより詳細に説明される。
少なくとも1つの実施例では、CUDAソース・コード4200(たとえば、アプリケーション又はそれの部分)をマイグレートするためのワークフローは、1つ又は複数のコンパイル・データベース・ファイルを作成することと、DPC++互換性ツール4002を使用してCUDAをDPC++にマイグレートすることと、マイグレーションを完了し、正当性を確認し、それにより、DPC++ソース・コード4208を生成することと、DPC++アプリケーションを生成するためにDPC++コンパイラを用いてDPC++ソース・コード4208をコンパイルすることとを含む。少なくとも1つの実施例では、互換性ツールは、Makefileが実行するときに使用されるコマンドをインターセプトし、それらをコンパイル・データベース・ファイルに記憶する、ユーティリティを提供する。少なくとも1つの実施例では、ファイルは、JSONフォーマットで記憶される。少なくとも1つの実施例では、intercept-builtコマンドは、MakefileコマンドをDPC互換性コマンドにコンバートする。
少なくとも1つの実施例では、intercept-buildは、ビルド・プロセスをインターセプトして、コンパイル・オプション、マクロ定義(macro defs)、及びインクルード・パス(include paths)をキャプチャし、このデータをコンパイル・データベース・ファイルに書き込む、ユーティリティ・スクリプトである。少なくとも1つの実施例では、コンパイル・データベース・ファイルは、JSONファイルである。少なくとも1つの実施例では、DPC++互換性ツール4202は、コンパイル・データベースを構文解析し、入力ソースをマイグレートするときにオプションを適用する。少なくとも1つの実施例では、intercept-buildの使用は、随意であるが、Make又はCMakeベースの環境について大いに推奨される。少なくとも1つの実施例では、マイグレーション・データベースは、コマンドとディレクトリとファイルとを含み、コマンドは、必要なコンパイル・フラグを含み得、ディレクトリは、ヘッダ・ファイルへのパスを含み得、ファイルは、CUDAファイルへのパスを含み得る。
少なくとも1つの実施例では、DPC++互換性ツール4202は、可能な場合はいつでもDPC++を生成することによって、CUDAで書かれたCUDAコード(たとえば、アプリケーション)をDPC++にマイグレートする。少なくとも1つの実施例では、DPC++互換性ツール4202は、ツール・キットの一部として利用可能である。少なくとも1つの実施例では、DPC++ツール・キットは、intercept-buildツールを含む。少なくとも1つの実施例では、intercept-builtツールは、CUDAファイルをマイグレートするためにコンパイル・コマンドをキャプチャするコンパイル・データベースを作成する。少なくとも1つの実施例では、intercept-builtツールによって生成されたコンパイル・データベースは、CUDAコードをDPC++にマイグレートするためにDPC++互換性ツール4202によって使用される。少なくとも1つの実施例では、非CUDA C++コード及びファイルは、そのままマイグレートされる。少なくとも1つの実施例では、DPC++互換性ツール4202は、人間が読み取れるDPC++4204を生成し、これは、DPC++互換性ツール4202によって生成されたとき、DPC++コンパイラによってコンパイルされないことがあり、正しくマイグレートされなかったコードの部分を確認するための追加のプラミング(plumbing)を必要とする、DPC++コードであり得、開発者によってなど、手動の介入を伴い得る。少なくとも1つの実施例では、DPC++互換性ツール4202は、自動的にマイグレートされないことがある追加のコードを開発者が手動でマイグレートするのを助けるために、コード中に埋め込まれたヒント又はツールを提供する。少なくとも1つの実施例では、マイグレーションは、ソース・ファイル、プロジェクト、又はアプリケーションのための1回のアクティビティである。
少なくとも1つの実施例では、DPC++互換性ツール42002は、CUDAコードのすべての部分をDPC++に正常にマイグレートすることが可能であり、単に、生成されたDPC++ソース・コードの性能を手動で確認及び調整するための随意のステップがあり得る。少なくとも1つの実施例では、DPC++互換性ツール4202は、DPC++互換性ツール4202によって生成されたDPC++コードを修正するための人間の介入を必要とするか又は利用することなしに、DPC++コンパイラによってコンパイルされるDPC++ソース・コード4208を直接生成する。少なくとも1つの実施例では、DPC++互換性ツールは、コンパイル可能なDPC++コードを生成し、これは、性能、読みやすさ、維持可能性、他の様々な考慮事項、又はそれらの任意の組合せについて、開発者によって随意に調整され得る。
少なくとも1つの実施例では、1つ又は複数のCUDAソース・ファイルは、少なくとも部分的にDPC++互換性ツール4202を使用してDPC++ソース・ファイルにマイグレートされる。少なくとも1つの実施例では、CUDAソース・コードは、CUDAヘッダ・ファイルを含み得る1つ又は複数のヘッダ・ファイルを含む。少なくとも1つの実施例では、CUDAソース・ファイルは、<cuda.h>ヘッダ・ファイルと、テキストをプリントするために使用され得る<stdio.h>ヘッダ・ファイルとを含む。少なくとも1つの実施例では、ベクトル加算カーネルCUDAソース・ファイルの一部分は、以下のように書かれるか、又は以下に関係し得る。
#include <cuda.h>
#include <stdio.h>
#define VECTOR_SIZE 256
[] global__ void VectorAddKernel(float* A,float* B,float* C)
{
A[threadIdx.x]=threadIdx.x+1.0f;
B[threadIdx.x]=threadIdx.x+1.0f;
C[threadIdx.x]=A[threadIdx.x]+B[threadIdx.x];
}
int main()
{
float *d_A,*d_B,*d_C;
cudaMalloc(&d_A,VECTOR_SIZE*sizeof(float));
cudaMalloc(&d_B,VECTOR_SIZE*sizeof(float));
cudaMalloc(&d_C,VECTOR_SIZE*sizeof(float));
VectorAddKernel<<<1,VECTOR_SIZE>>>(d_A,d_B,d_C);
float Result[VECTOR_SIZE]={ };
cudaMemcpy(Result,d_C,VECTOR_SIZE*sizeof(float),cudaMemcpyDeviceToHost);
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
for(int i=0; i<VECTOR_SIZE; i++ {
if(i%16==0){
printf(“\n”);
}
printf(“%f”,Result[i]);
}
return 0;
}
#include <cuda.h>
#include <stdio.h>
#define VECTOR_SIZE 256
[] global__ void VectorAddKernel(float* A,float* B,float* C)
{
A[threadIdx.x]=threadIdx.x+1.0f;
B[threadIdx.x]=threadIdx.x+1.0f;
C[threadIdx.x]=A[threadIdx.x]+B[threadIdx.x];
}
int main()
{
float *d_A,*d_B,*d_C;
cudaMalloc(&d_A,VECTOR_SIZE*sizeof(float));
cudaMalloc(&d_B,VECTOR_SIZE*sizeof(float));
cudaMalloc(&d_C,VECTOR_SIZE*sizeof(float));
VectorAddKernel<<<1,VECTOR_SIZE>>>(d_A,d_B,d_C);
float Result[VECTOR_SIZE]={ };
cudaMemcpy(Result,d_C,VECTOR_SIZE*sizeof(float),cudaMemcpyDeviceToHost);
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
for(int i=0; i<VECTOR_SIZE; i++ {
if(i%16==0){
printf(“\n”);
}
printf(“%f”,Result[i]);
}
return 0;
}
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、DPC++互換性ツール4202は、CUDAソース・コードを構文解析し、ヘッダ・ファイルを、適切なDPC++ヘッダ・ファイル及びSYCLヘッダ・ファイルと置き換える。少なくとも1つの実施例では、DPC++ヘッダ・ファイルは、ヘルパー宣言(helper declaration)を含む。CUDAでは、スレッドIDの概念があり、対応して、DPC++又はSYCLでは、各要素について、ローカル識別子がある。
少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、初期化される2つのベクトルA及びBがあり、ベクトル加算結果が、VectorAddKernel()の一部として、ベクトルCに入れられる。少なくとも1つの実施例では、DPC++互換性ツール4202は、CUDAコードをDPC++コードにマイグレートすることの一部として、ワーク要素をインデックス付けするために使用されるCUDAスレッドIDを、ローカルIDを介したワーク要素のためのSYCL標準アドレッシングにコンバートする。少なくとも1つの実施例では、DPC++互換性ツール4202によって生成された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++互換性ツール4202によって修正されることなしに、そのままマイグレートされる。少なくとも1つの実施例では、DPC++互換性ツール4202は、加速デバイス上でカーネルを実行するために、メモリ・セットアップ及び/又はホスト・コールのためのCUDA APIを修正する。少なくとも1つの実施例では、及び上記で提示されたCUDAソース・ファイルに関して、(たとえば、コンパイルされ得る)対応する人間が読み取れるDPC++4204は、以下のように書かれるか、又は以下に関係する。
#include <CL/sycl.hpp>
#include <dpct/dpct.hpp>
#define VECTOR_SIZE 256
void VectorAddKernel(float* A,float* B,float* C,sycl::nd_item<3> item_ct1)
{
A[item_ct1.get_local_id(2)]=item_ct1.get_local_id(2)+1.0f;
B[item_ct1.get_local_id(2)]=item_ct1.get_local_id(2)+1.0f;
C[item_ct1.get_local_id(2)]=
A[item_ct1.get_local_id(2)]+B[item_ct1.get_local_id(2)];
}
int main()
{
float *d_A,*d_B,*d_C;
d_A=(float *)sycl::malloc_device(VECTOR_SIZE * sizeof(float),
dpct::get_current_device(),
dpct::get_default_context());
d_B=(float *)sycl::malloc_device(VECTOR_SIZE * sizeof(float),
dpct::get_current_device(),
dpct::get_default_context());
d_C=(float *)sycl::malloc_device(VECTOR_SIZE * sizeof(float),
dpct::get_current_device(),
dpct::get_default_context());
dpct::get_default_queue_wait().submit([&](sycl::handler&cgh){
cgh.parallel_for(
sycl::nd_range<3>(
sycl::range<3>(1,1,1) *
sycl::range<3>(1,1,VECTOR_SIZE) *
sycl::range<3>(1,1,VECTOR_SIZE)),
[=](sycl::nd_items<3> item_ct1){
VectorAddKernel(d_A,d_B,d_C,item_ct1);
});
});
float Result[VECTOR_SIZE]={ };
dpct::get_default_queue_wait()
.memcpy(Result,d_C,VECTOR_SIZE * sizeof(float))
.wait();
sycl::free(d_A,dpct::get_default_context());
sycl::free(d_B,dpct::get_default_context());
sycl::free(d_C,dpct::get_default_context());
for(int i=0; i<VECTOR_SIZE; i++ {
if(i%16==0){
printf(“\n”);
}
printf(“%f”,Result[i]);
}
return 0;
}
#include <CL/sycl.hpp>
#include <dpct/dpct.hpp>
#define VECTOR_SIZE 256
void VectorAddKernel(float* A,float* B,float* C,sycl::nd_item<3> item_ct1)
{
A[item_ct1.get_local_id(2)]=item_ct1.get_local_id(2)+1.0f;
B[item_ct1.get_local_id(2)]=item_ct1.get_local_id(2)+1.0f;
C[item_ct1.get_local_id(2)]=
A[item_ct1.get_local_id(2)]+B[item_ct1.get_local_id(2)];
}
int main()
{
float *d_A,*d_B,*d_C;
d_A=(float *)sycl::malloc_device(VECTOR_SIZE * sizeof(float),
dpct::get_current_device(),
dpct::get_default_context());
d_B=(float *)sycl::malloc_device(VECTOR_SIZE * sizeof(float),
dpct::get_current_device(),
dpct::get_default_context());
d_C=(float *)sycl::malloc_device(VECTOR_SIZE * sizeof(float),
dpct::get_current_device(),
dpct::get_default_context());
dpct::get_default_queue_wait().submit([&](sycl::handler&cgh){
cgh.parallel_for(
sycl::nd_range<3>(
sycl::range<3>(1,1,1) *
sycl::range<3>(1,1,VECTOR_SIZE) *
sycl::range<3>(1,1,VECTOR_SIZE)),
[=](sycl::nd_items<3> item_ct1){
VectorAddKernel(d_A,d_B,d_C,item_ct1);
});
});
float Result[VECTOR_SIZE]={ };
dpct::get_default_queue_wait()
.memcpy(Result,d_C,VECTOR_SIZE * sizeof(float))
.wait();
sycl::free(d_A,dpct::get_default_context());
sycl::free(d_B,dpct::get_default_context());
sycl::free(d_C,dpct::get_default_context());
for(int i=0; i<VECTOR_SIZE; i++ {
if(i%16==0){
printf(“\n”);
}
printf(“%f”,Result[i]);
}
return 0;
}
少なくとも1つの実施例では、人間が読み取れるDPC++4204は、DPC++互換性ツール4202によって生成された出力を指し、ある様式又は別の様式で最適化され得る。少なくとも1つの実施例では、DPC++互換性ツール4202によって生成された人間が読み取れるDPC++4204は、それをより維持可能にすること、性能、又は他の考慮事項のために、マイグレーションの後に開発者によって手動で編集され得る。少なくとも1つの実施例では、開示されるDPC++などのDPC++互換性ツール42002によって生成されたDPC++コードは、各malloc_device()コールのためのget_current_device()及び/又はget_default_context()への繰返しコールを削除することによって最適化され得る。少なくとも1つの実施例では、上記で生成されるDPC++コードは、3次元のnd_rangeを使用し、これは、単一次元のみを使用し、それにより、メモリ使用量を低減するために、再ファクタ化され得る。少なくとも1つの実施例では、開発者は、DPC++互換性ツール4202によって生成されたDPC++コードを手動で編集し、統一共有メモリの使用をアクセッサと置き換えることができる。少なくとも1つの実施例では、DPC++互換性ツール4202は、それがCUDAコードをDPC++コードにどのようにマイグレートするかを変更するためのオプションを有する。少なくとも1つの実施例では、DPC++互換性ツール4202は、それが、CUDAコードを、多数の場合について機能するDPC++コードにマイグレートするための一般的なテンプレートを使用しているので、冗長である。
少なくとも1つの実施例では、CUDAからDPC++へのマイグレーション・ワークフローは、intercept-buildスクリプトを使用してマイグレーションの準備をするためのステップと、DPC++互換性ツール4202を使用してDPC++へのCUDAプロジェクトのマイグレーションを実施するためのステップと、完了及び正当性のために、マイグレートされたソース・ファイルを手動で検討及び編集するためのステップと、DPC++アプリケーションを生成するために最終DPC++コードをコンパイルするためのステップと含む。少なくとも1つの実施例では、DPC++ソース・コードの手動の検討は、限定はしないが、マイグレートされたAPIがエラー・コードを返さないこと(CUDAコードは、エラー・コードを返すことができ、エラー・コードは、次いで、アプリケーションよって消費され得るが、SYCLは、エラーを報告するために例外を使用し、したがって、エラーを表面化させるためのエラー・コードを使用しない)、CUDAコンピュート能力依存論理がDPC++によってサポートされないこと、ステートメントが削除されないことがあることを含む、1つ又は複数のシナリオにおいて必要とされ得る。少なくとも1つの実施例では、DPC++コードが手動の介入を必要とするシナリオは、限定はしないが、エラー・コード論理が(*,0)コードと置き換えられるか又はコメント・アウトされる、等価なDPC++APIが利用可能でない、CUDAコンピュート能力依存論理、ハードウェア依存API(clock())、欠落した特徴、サポートされていないAPI、実行時間測定論理、組み込みベクトル・タイプ競合に対処すること、cuBLAS APIのマイグレーションなどを含み得る。
他の変形形態は、本開示の範囲内にある。したがって、開示される技法は、様々な修正及び代替構築が可能であるが、それらのいくつかの例示的な実施例が図面に示され、上記で詳細に説明された。しかしながら、特定の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つ又は複数の方法をシステムが具体化し得、方法がシステムと考えられ得る場合に限り、本明細書において交換可能に使用される。
本明細書では、アナログ・データ又はデジタル・データを取得すること、獲得すること、受信すること、或いはそれらをサブシステム、コンピュータ・システム、又はコンピュータ実装機械に入力することに言及し得る。アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、関数コール、又はアプリケーション・プログラミング・インターフェースへのコールのパラメータとしてデータを受信することによってなど、様々なやり方で実現され得る。いくつかの実装形態では、アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、直列又は並列インターフェースを介してデータを転送することによって実現され得る。別の実装形態では、アナログ・データ又はデジタル・データを取得する、獲得する、受信する、又は入力するプロセスは、提供するエンティティから獲得するエンティティにコンピュータ・ネットワークを介してデータを転送することによって実現され得る。アナログ・データ又はデジタル・データを提供すること、出力すること、送信すること、送出すること、又は提示することにも言及し得る。様々な実例では、アナログ・データ又はデジタル・データを提供する、出力する、送信する、送出する、又は提示するプロセスは、関数コールの入力又は出力パラメータ、アプリケーション・プログラミング・インターフェース又はプロセス間通信機構のパラメータとしてデータを転送することによって実現され得る。
上記の説明は、説明された技法の例示的な実装形態について述べているが、他のアーキテクチャが、説明された機能性を実装するために使用され得、本開示の範囲内にあることが意図される。さらに、説明を目的として、責任の具体的な分散が定義されるが、様々な機能及び責任は、状況に応じて異なるやり方で分散及び分割され得る。
さらに、主題は、構造的特徴及び/又は方法論的行為に特有の言語で説明されたが、添付の特許請求の範囲で特許請求される主題は、説明された特有の特徴又は行為に必ずしも限定されるとは限らないことが理解されるべきである。むしろ、特有の特徴及び行為は、特許請求の範囲を実装する例示的な形態として開示される。
Claims (35)
- 値の第1のセットを決定するステップであって、値の前記第1のセットが、入力画像に対応する1つ又は複数のトーナル範囲を表す、ステップと、
前記入力画像と、少なくとも、平滑化ファクタを適用することによって、生成された第2の画像との間の差に少なくとも部分的に基づいて、コントラスト画像を生成するステップと、
値の前記第1のセットと値の第2のセットとに少なくとも部分的に基づいて、前記1つ又は複数のトーナル範囲に対応するコントラスト利得曲線のセットを生成するステップと、
少なくとも、前記コントラスト画像にコントラスト利得マップを適用することによって、出力画像を生成するステップであって、ここで、前記コントラスト利得マップが、少なくとも、前記入力画像の第1のスケール空間表現にコントラスト利得曲線の前記セットのうちの第1のコントラスト利得曲線を適用することによって、前記入力画像のピクセルのセットについて決定される、ステップと
を含む、方法。 - 前記第2の画像が、さらに、前記入力画像のスケール空間表現を含む、請求項1に記載の方法。
- 前記平滑化ファクタが、前記入力画像に適用されるガウス・カーネルである、請求項1に記載の方法。
- 前記方法が、修正された入力画像を生成するために前記入力画像にグローバル・トーン・マップを適用するステップをさらに含む、請求項1に記載の方法。
- 前記1つ又は複数の範囲が、ヒストグラムとして表される範囲のセットを含む、請求項4に記載の方法。
- 前記方法が、前記修正された入力画像に少なくとも部分的に基づいて前記ヒストグラムを生成するステップをさらに含む、請求項5に記載の方法。
- 前記方法が、前記入力画像又は前記出力画像のうちの少なくとも1つにグローバル・トーン・マップを適用するステップをさらに含む、請求項1に記載の方法。
- 値の前記第2のセットが、1つ又は複数のガウス曲線を表すシグマ値のセットを含む、請求項1に記載の方法。
- 前記1つ又は複数のトーナル範囲が、さらに、シャドー範囲、ハイライト範囲、又は中間トーン範囲のうちの少なくとも1つを含む、請求項1に記載の方法。
- 値の前記第1のセットが、さらに、前記1つ又は複数のトーナル範囲の平均値のセットを含む、請求項9に記載の方法。
- 前記シャドー範囲が、さらに、第1のしきい値を下回る前記入力画像のピクセルの第1のセットを含む、請求項10に記載の方法。
- 平均値の前記セットのうちの第1の平均値が、さらに、ピクセルの前記第1のセットの平均を含む、請求項11に記載の方法。
- 前記ハイライト範囲が、さらに、第2のしきい値を上回る前記入力画像のピクセルの第2のセットを含む、請求項12に記載の方法。
- 前記中間トーン範囲が、さらに、前記第1のしきい値を上回る且つ前記第2のしきい値を下回る、前記入力画像のピクセルの第3のセットを含む、請求項13に記載の方法。
- 前記第1のしきい値が、前記入力画像のピクセルの割合を表す、請求項14に記載の方法。
- コントラスト利得曲線の前記セットのうちのコントラスト利得曲線が、対応する利得を作り出すための入力トーン値の関数である、請求項1に記載の方法。
- 前記1つ又は複数のトーナル範囲が、さらに、しきい値ピクセル値によって分類されたピクセルのグループに少なくとも部分的に基づいて定義されたトーン範囲を含み、ここで、前記しきい値ピクセル値が、ピクセルの前記グループの割合ピクセルに少なくとも部分的に基づいて決定される、請求項1に記載の方法。
- 1つ又は複数のプロセッサと、
命令を記憶するメモリと
を備えるシステムであって、前記命令は、前記1つ又は複数のプロセッサによって実行された結果として、前記システムに、
入力画像を表す画像データを取得することと、
前記画像データに少なくとも部分的に基づいて、1つ又は複数のトーン範囲と値の第1のセットとを決定することであって、ここで、値の前記第1のセットのうちの第1の値が、前記1つ又は複数のトーン範囲のうちの第1のトーン範囲に対応する、決定することと、
前記入力画像のスケール空間表現のセットと前記入力画像のルミナンス値のセットとに少なくとも部分的に基づいて、コントラスト画像を生成することと、
前記第1のトーン範囲についての第1のコントラスト利得関数を生成することと、
少なくとも、前記コントラスト画像に第1のコントラスト利得マップを適用することによって、出力画像を生成することであって、ここで、前記第1のコントラスト利得マップが、前記第1のコントラスト利得関数に少なくとも部分的に基づいて生成される、生成することと
を行わせる、システム。 - 前記画像データが、前記入力画像のヒストグラムである、請求項18に記載のシステム。
- 前記画像データが、高ダイナミック・レンジ(HDR)画像データである、請求項18に記載のシステム。
- 前記メモリが、前記1つ又は複数のプロセッサによって実行された結果として、前記システムに、トーン範囲のセットのうちの第2のトーン範囲についての第2のコントラスト利得関数を生成することを行わせる命令をさらに含む、請求項18に記載のシステム。
- 前記メモリが、前記1つ又は複数のプロセッサによって実行された結果として、前記システムに、前記第2のコントラスト利得関数に少なくとも部分的に基づいて第2のコントラスト利得マップを生成することを行わせる命令をさらに含む、請求項21に記載のシステム。
- 前記システムに、少なくとも、前記コントラスト画像に前記第1のコントラスト利得マップを適用することによって、前記出力画像を生成することを行わせる前記命令が、前記1つ又は複数のプロセッサによって実行された結果として、前記システムに、少なくとも、前記第1のコントラスト利得マップと前記第2のコントラスト利得マップとを適用することによって、前記出力画像を生成することを行わせる命令をさらに含む、請求項22に記載のシステム。
- 前記1つ又は複数のトーン範囲が、さらに、シャドー範囲、ハイライト範囲、又は中間トーン範囲のうちの少なくとも1つを含む、請求項18に記載のシステム。
- 前記画像データが、さらに、入力画像を表す統計的画像データを含む、請求項18に記載のシステム。
- 前記統計的画像データが、さらに、ヒストグラムを含む、請求項25に記載のシステム。
- 画像の複数のトーナル領域を決定するステップと、
複数の修正されたトーナル領域を生成するために、前記複数のトーナル領域のうちの異なる領域に異なる利得関数を適用するステップと、
前記修正されたトーナル領域に基づいて前記画像の修正されたバージョンを生成するステップと
を含む、方法。 - 前記複数のトーナル領域が、さらに、シャドー範囲、ハイライト範囲、又は中間トーン範囲のうちの少なくとも1つを含む、請求項27に記載の方法。
- 前記方法が、入力画像と、少なくとも、前記入力画像に平滑化ファクタを適用することによって、生成された前記画像との間の差に少なくとも部分的に基づいて、前記画像を生成するステップをさらに含む、請求項27に記載の方法。
- 前記方法が、前記複数のトーナル領域のうちの別個のトーナル領域に対応する前記利得関数を生成するステップをさらに含む、請求項27に記載の方法。
- 前記利得関数が、値のセットとガウス曲線を表すシグマ値のセットとに少なくとも部分的に基づいて生成される、請求項30に記載の方法。
- 値の前記セットが、トーナル範囲のセットのルミナンスについての平均値のセットを表す、請求項31に記載の方法。
- 平均値の前記セットのうちの第1の平均値が、前記画像のピクセルの第1のセットに少なくとも部分的に基づいて計算され、ここで、ピクセルの前記第1のセットが、しきい値を下回るルミナンス値を示す、請求項32に記載の方法。
- 平均値の前記セットのうちの第1の平均値が、前記画像のピクセルの第1のセットに少なくとも部分的に基づいて計算され、ここで、ピクセルの前記第1のセットが、しきい値を上回るルミナンス値を示す、請求項32に記載の方法。
- 平均値の前記セットのうちの第1の平均値が、前記画像のピクセルの第1のセットに少なくとも部分的に基づいて計算され、ここで、ピクセルの前記第1のセットが、第1のしきい値と第2のしきい値との間のルミナンス値を示す、請求項32に記載の方法。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US17/192,698 | 2021-03-04 | ||
US17/192,698 US11810274B2 (en) | 2021-03-04 | 2021-03-04 | Tone management using tone gain functions for high dynamic range imaging applications |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2022135998A true JP2022135998A (ja) | 2022-09-15 |
Family
ID=82898301
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2022030893A Pending JP2022135998A (ja) | 2021-03-04 | 2022-03-01 | 高ダイナミック・レンジ撮像用途のためのトーン利得関数を使用したトーン管理 |
Country Status (4)
Country | Link |
---|---|
US (2) | US11810274B2 (ja) |
JP (1) | JP2022135998A (ja) |
CN (1) | CN115018718A (ja) |
DE (1) | DE102022104253A1 (ja) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11967042B2 (en) * | 2021-05-11 | 2024-04-23 | Synaptics Incorporated | Data pre-processing for low-light images |
US20230069500A1 (en) * | 2021-08-19 | 2023-03-02 | Gopro, Inc. | Tone mapping for image capture |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR100393071B1 (ko) * | 2001-08-18 | 2003-07-31 | 삼성전자주식회사 | 영상의 히스토그램 평활화 장치 및 방법 |
US7605872B2 (en) * | 2005-06-20 | 2009-10-20 | Mediatek Inc. | Video contrast adjusting method and system |
US8411938B2 (en) * | 2007-11-29 | 2013-04-02 | Sri International | Multi-scale multi-camera adaptive fusion with contrast normalization |
US8238687B1 (en) | 2008-01-09 | 2012-08-07 | Helwett-Packard Development Company, L.P. | Local contrast enhancement of images |
US8406569B2 (en) * | 2009-01-19 | 2013-03-26 | Sharp Laboratories Of America, Inc. | Methods and systems for enhanced dynamic range images and video from multiple exposures |
US8290295B2 (en) * | 2009-03-03 | 2012-10-16 | Microsoft Corporation | Multi-modal tone-mapping of images |
EP2309447A1 (en) * | 2009-09-22 | 2011-04-13 | Nxp B.V. | Image contrast enhancement |
MX350910B (es) | 2013-02-21 | 2017-09-25 | Koninklijke Philips Nv | Métodos y dispositivos de codificación y decodificación de imágenes mejoradas de alto rango dinámico (hdr). |
CN110992914B (zh) * | 2014-10-06 | 2022-07-01 | 三星电子株式会社 | 显示设备及控制该显示设备的方法 |
CN108702496B (zh) * | 2015-09-02 | 2021-09-14 | 佛吉亚艾里斯泰克股份有限公司 | 用于实时色调映射的系统和方法 |
WO2018009828A1 (en) | 2016-07-08 | 2018-01-11 | Vid Scale, Inc. | Systems and methods for region-of-interest tone remapping |
EP3491620B1 (en) * | 2016-07-26 | 2021-04-28 | Microsoft Technology Licensing, LLC | Real-time adaptive shadow and highlight enhancement |
US11544823B2 (en) | 2019-06-12 | 2023-01-03 | Intel Corporation | Systems and methods for tone mapping of high dynamic range images for high-quality deep learning based processing |
US11138699B2 (en) * | 2019-06-13 | 2021-10-05 | Adobe Inc. | Utilizing context-aware sensors and multi-dimensional gesture inputs to efficiently generate enhanced digital images |
US11182884B2 (en) | 2019-07-30 | 2021-11-23 | Nvidia Corporation | Enhanced high-dynamic-range imaging and tone mapping |
-
2021
- 2021-03-04 US US17/192,698 patent/US11810274B2/en active Active
-
2022
- 2022-02-23 DE DE102022104253.7A patent/DE102022104253A1/de active Pending
- 2022-03-01 JP JP2022030893A patent/JP2022135998A/ja active Pending
- 2022-03-03 CN CN202210203808.4A patent/CN115018718A/zh active Pending
-
2023
- 2023-09-15 US US18/368,732 patent/US20240005462A1/en active Pending
Also Published As
Publication number | Publication date |
---|---|
DE102022104253A1 (de) | 2022-09-08 |
US20220284553A1 (en) | 2022-09-08 |
US11810274B2 (en) | 2023-11-07 |
CN115018718A (zh) | 2022-09-06 |
US20240005462A1 (en) | 2024-01-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US12039633B2 (en) | Light-resampling with surface similarity test | |
US11922556B2 (en) | Ray-traced light resampling using screen space visibility | |
WO2022081418A1 (en) | Techniques to power balance multiple chips | |
US20240005462A1 (en) | Tone management using tone gain functions for high dynamic range imaging applications | |
US20240296618A1 (en) | Spatiotemporal resampling with decoupled shading and reuse | |
WO2023039380A9 (en) | Multi-architecture execution graphs | |
US20230244942A1 (en) | Tensor modification based on processing resources | |
US20230176933A1 (en) | Techniques for modifying graph code | |
US20230185611A1 (en) | Application programming interface to limit memory | |
JP2023007422A (ja) | 同期バリア | |
US20230360319A1 (en) | Using importance resampling to reduce the memory incoherence of light sampling | |
WO2023183874A1 (en) | Application programming interface to perform operation with reusable thread | |
WO2023115014A1 (en) | Application programming interface to create and modify graphics objects | |
US20230325157A1 (en) | Regular expression processor | |
US20230244391A1 (en) | Graph-based memory storage | |
US20230102843A1 (en) | User-configurable memory allocation | |
JP2024513617A (ja) | コードを同時に起動すること | |
US20220058851A1 (en) | Grid-based light sampling for ray tracing applications | |
US20240143402A1 (en) | Application programming interface to indicate operations | |
US20230162429A1 (en) | Real-time caustics mapping | |
US20240112296A1 (en) | Generating and interposing interpolated frames with application frames for display | |
US20240168762A1 (en) | Application programming interface to wait on matrix multiply-accumulate | |
US20240095302A1 (en) | Changing precision of operands | |
US20230093254A1 (en) | Application programming interface to set up graph resources | |
US20230118662A1 (en) | Configurable processor partitioning |