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

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

▶ インテル コーポレイションの特許一覧

特開2022-89162グラフィック処理ユニットロング命令トレースを生成するための方法および装置
<>
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図1
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図2
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図3
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図4
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図5
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図6
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図7
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図8
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図9
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図10
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図11
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図12
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図13
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図14
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図15
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図16
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図17
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図18
  • 特開-グラフィック処理ユニットロング命令トレースを生成するための方法および装置 図19
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2022089162
(43)【公開日】2022-06-15
(54)【発明の名称】グラフィック処理ユニットロング命令トレースを生成するための方法および装置
(51)【国際特許分類】
   G06F 11/34 20060101AFI20220608BHJP
【FI】
G06F11/34 176
【審査請求】未請求
【請求項の数】25
【出願形態】OL
【外国語出願】
(21)【出願番号】P 2021179495
(22)【出願日】2021-11-02
(31)【優先権主張番号】17/111,136
(32)【優先日】2020-12-03
(33)【優先権主張国・地域又は機関】US
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
2.JAVASCRIPT
3.SWIFT
(71)【出願人】
【識別番号】593096712
【氏名又は名称】インテル コーポレイション
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100135079
【弁理士】
【氏名又は名称】宮崎 修
(72)【発明者】
【氏名】コンスタンティン レヴィット-グレヴィチ
【テーマコード(参考)】
5B042
【Fターム(参考)】
5B042GA13
5B042GA15
5B042HH30
5B042LA02
(57)【要約】
【課題】グラフィック処理ユニット(GPU)ロング命令トレースを生成する方法、装置、システムおよび製造物品が開示される。
【解決手段】例示的な装置は、少なくとも1つのメモリと、少なくとも1つのプロセッサと、を含み、少なくとも1つのプロセッサは、命令を実行して、少なくとも、GPUによって実行される第2のルーチンの識別子に基づいて第1のルーチンを識別することであって、第1のルーチンは、第2のルーチンのエミュレーションに基づく、識別することと、GPUのGPU状態の第1の値を判定する第1のルーチンを実行することであって、第1のルーチンは、(i)第2のルーチンに関連付けられた第1の引数と、(ii)第1のーチンを実行する前のGPU状態の第2の値に対応する第2の引数と、を有する、実行することと、GPU状態の第1の値に基づいてGPUのワークロードを制御することと、を行う。
【選択図】図1
【特許請求の範囲】
【請求項1】
ハードウェアをプロファイリングする装置であって、
少なくとも1つのメモリと、
少なくとも1つのプロセッサであって、少なくとも、
グラフィック処理ユニット(GPU)によって実行される第2のルーチンの識別子に基づいて第1のルーチンを識別することであって、前記第1のルーチンは、前記第2のルーチンのエミュレーションに基づく、識別することと、
前記GPUのGPU状態の第1の値を判定する前記第1のルーチンを実行することであって、前記第1のルーチンは、(i)前記第2のルーチンに関連付けられた第1の引数、および(ii)前記第1のルーチンを実行する前の前記GPU状態の第2の値に対応する第2の引数を有する、実行することと、
前記GPU状態の前記第1の値に基づいて前記GPUのワークロードを制御することと、を行う命令を実行する少なくとも1つのプロセッサと、を含む、装置。
【請求項2】
前記GPU状態は、前記GPUのハードウェアスレッドに関連付けられたアーキテクチャレジスタファイルにおける第1のレジスタまたは前記ハードウェアスレッドの汎用レジスタファイルの第2のレジスタの状態である、請求項1に記載の装置。
【請求項3】
前記識別子は、符号化されたバイナリファイルから抽出された第1の識別子であり、前記少なくとも1つのプロセッサは、
前記GPUのハードウェアスレッドによって実行されるカーネルに1つ以上のプロファイルルーチンを挿入することと、
ロング命令トレースから前記1の値、前記第2の値、およびハードウェアスレッド識別子を判定することであって、前記ロング命令トレースは、ハードウェアスレッドによる前記1つ以上のプロファイルルーチンの実行に応答して、前記ハードウェアスレッドによって生成され、前記第1の値は、前記ハードウェアスレッドによる前記カーネルの実行後のGPUレジスタ値に対応し、前記第2の値は、前記ハードウェアスレッドによる前記カーネルの実行前の前記GPUレジスタ値に対応し、前記ハードウェアスレッド識別子は、前記ハードウェアスレッドを識別する、判定することと、を行う、請求項1~2のいずれか一項に記載の装置。
【請求項4】
前記ハードウェアスレッドは、第1のハードウェアスレッドであり、前記ロング命令トレースは、前記第1のハードウェアスレッドに関連付けられた第1のロング命令トレースであり、前記符号化されたバイナリファイルは、前記第1のロング命令トレースと、1つ以上の第2のハードウェアスレッドに関連付けられた1つ以上の第2のロング命令トレースとを含み、前記符号化されたバイナリファイルは、マルチスレッドGPUトレースを表す、請求項3に記載の装置。
【請求項5】
前記カーネルは、前記ハードウェアスレッドによって実行されるデバイスアクセス命令を含み、前記少なくとも1つのプロセッサは、
前記GPUの汎用レジスタファイルの1つ以上のそれぞれの第1のレジスタの1つ以上の第1のレジスタ値を判定することと、
前記GPUのアーキテクチャレジスタファイルの1つ以上のそれぞれの第2のレジスタの1つ以上の第2のレジスタ値を判定することと、
前記1つ以上の第1のレジスタ値、前記1つ以上の第2のレジスタ値、1つ以上の第3のレジスタ値、および前記デバイスアクセス命令を前記ロング命令トレースに記憶することであって、前記1つ以上の第3のレジスタ値は、前記デバイスアクセス命令に関連付けられた1つ以上のそれぞれの宛先レジスタに対応する、記憶することを行う、請求項3に記載の装置。
【請求項6】
前記少なくとも1つのプロセッサは、
前記第1のGPU状態に基づいて前記GPUの利用率を判定することと、
前記利用率をしきい値と比較することと、
前記比較に基づいて前記しきい値が満たされていないと判定することに応答して、前記第2のルーチンの調整、または前記GPUによって実行される計算タスクの数の増加のうちの少なくとも1つを行って、前記GPUのワークロードを制御することと、を行う、請求項1~2のいずれか一項に記載の装置。
【請求項7】
前記第1のルーチンは、エミュレーションルーチンを含む計装ルーチンであり、前記少なくとも1つのプロセッサは、
前記エミュレーションルーチンの前に前記計装ルーチンに第1のコールバックルーチンを挿入することであって、前記第1のコールバックルーチンは、第1のアプリケーションプログラミングインターフェース(API)を呼び出して、前記第2のGPU状態をアプリケーションに提供する、挿入することと、
前記エミュレーションルーチンの後に前記計装ルーチンに第2のコールバックルーチンを挿入することであって、前記第2のコールバックルーチンは、前記第1のAPIまたは第2のAPIを呼び出して、前記第1のGPU状態を前記アプリケーションに提供する、挿入することと、を行う、請求項1~2のいずれか一項に記載の装置。
【請求項8】
命令を含む少なくとも1つの記憶デバイスであって、前記命令は、実行されるときに、少なくとも1つのプロセッサに、
グラフィック処理ユニット(GPU)によって実行される第2のルーチンの識別子に基づいて第1のルーチンを識別することであって、前記第1のルーチンは、前記第2のルーチンのエミュレーションに基づく、識別することと、
前記GPUのGPU状態の第1の値を判定する前記第1のルーチンを実行することであって、前記第1のルーチンは、(i)前記第2のルーチンに関連付けられた第1の引数、および(ii)前記第1のルーチンを実行する前の前記GPU状態の第2の値に対応する第2の引数を有する、実行することと、
前記GPU状態の前記第1の値に基づいて前記GPUのワークロードを制御することと、を行わせる、少なくとも1つの記憶デバイス。
【請求項9】
前記GPU状態は、前記GPUのハードウェアスレッドに関連付けられたアーキテクチャレジスタファイルにおける第1のレジスタ、または前記ハードウェアスレッドの汎用レジスタファイルの第2のレジスタの状態である、請求項8に記載の少なくとも1つの記憶デバイス。
【請求項10】
前記識別子は、符号化されたバイナリファイルから抽出された第1の識別子であり、前記命令は、実行されるときに、前記少なくとも1つのプロセッサに、
前記GPUのハードウェアスレッドによって実行されるカーネルに1つ以上のプロファイルルーチンを挿入することと、
ロング命令トレースから前記1の値、前記第2の値、およびハードウェアスレッド識別子を判定することであって、前記ロング命令トレースは、ハードウェアスレッドによる前記1つ以上のプロファイルルーチンの実行に応答して、前記ハードウェアスレッドによって生成され、前記第1の値は、前記ハードウェアスレッドによる前記カーネルの実行後のGPUレジスタ値に対応し、前記第2の値は、前記ハードウェアスレッドによる前記カーネルの実行前の前記GPUレジスタ値に対応し、前記ハードウェアスレッド識別子は、前記ハードウェアスレッドを識別する、判定することと、を行わせる、請求項8~9のいずれか一項に記載の少なくとも1つの記憶デバイス。
【請求項11】
前記ハードウェアスレッドは、第1のハードウェアスレッドであり、前記ロング命令トレースは、前記第1のハードウェアスレッドに関連付けられた第1のロング命令トレースであり、前記符号化されたバイナリファイルは、前記第1のロング命令トレースと、1つ以上の第2のハードウェアスレッドに関連付けられた1つ以上の第2のロング命令トレースと、を含み、前記符号化されたバイナリファイルは、マルチスレッドGPUトレースを表す、請求項10に記載の少なくとも1つの記憶デバイス。
【請求項12】
前記カーネルは、前記ハードウェアスレッドによって実行されるデバイスアクセス命令を含み、前記命令は、実行されると、前記少なくとも1つのプロセッサに、
前記GPUの汎用レジスタファイルの1つ以上のそれぞれの第1のレジスタの1つ以上の第1のレジスタ値を判定することと、
前記GPUのアーキテクチャレジスタファイルの1つ以上のそれぞれの第2のレジスタの1つ以上の第2のレジスタ値を判定することと、
前記1つ以上の第1のレジスタ値、前記1つ以上の第2のレジスタ値、1つ以上の第3のレジスタ値、および前記デバイスアクセス命令を前記ロング命令トレースに記憶することであって、前記1つ以上の第3のレジスタ値は、前記デバイスアクセス命令に関連付けられた1つ以上のそれぞれの宛先レジスタに対応する、記憶することと、を行わせる、請求項10に記載の少なくとも1つの記憶デバイス。
【請求項13】
前記命令は、実行されると、前記少なくとも1つのプロセッサに、
前記第1のGPU状態に基づいて前記GPUの利用率を判定することと、
前記利用率をしきい値と比較することと、
前記比較に基づいて前記しきい値が満たされていないと判定することに応答して、前記第2のルーチンの調整、または前記GPUによって実行される計算タスクの数の増加のうちの少なくとも1つを行って、前記GPUのワークロードを制御することと、を行わせる、請求項8~9のいずれか一項に記載の少なくとも1つの記憶デバイス。
【請求項14】
前記第1のルーチンは、エミュレーションルーチンを含む計装ルーチンであり、前記命令は、実行されると、前記少なくとも1つのプロセッサに、
前記エミュレーションルーチンの前に前記計装ルーチンに第1のコールバックルーチンを挿入することであって、前記第1のコールバックルーチンは、第1のアプリケーションプログラミングインターフェース(API)を呼び出して、前記第2のGPU状態をアプリケーションに提供する、挿入することと、
前記エミュレーションルーチンの後に前記計装ルーチンに第2のコールバックルーチンを挿入することであって、前記第2のコールバックルーチンは、前記第1のAPIまたは第2のAPIを呼び出して、前記第1のGPU状態を前記アプリケーションに提供する、挿入することと、を行わせる、請求項8~9のいずれか一項に記載の少なくとも1つの記憶デバイス。
【請求項15】
ハードウェアをプロファイリングする装置であって、
グラフィック処理ユニット(GPU)によって実行される第2のルーチンの識別子に基づいて第1のルーチンを識別するための手段であって、前記第1のルーチンは、前記第2のルーチンのエミュレーションに基づく、手段と、
前記GPUのGPU状態の第1の値を判定する第1のルーチンを実行するための手段であって、前記第1のルーチンは、(i)前記第2のルーチンに関連付けられた第1の引数、および(ii)前記第1のルーチンを実行する前の前記GPU状態の第2の値に対応する第2の引数を有する、手段と、
前記GPU状態の前記第1の値に基づいて前記GPUのワークロードを制御するための手段と、を含む、装置。
【請求項16】
前記GPU状態は、前記GPUのハードウェアスレッドに関連付けられたアーキテクチャレジスタファイルにおける第1のレジスタまたは前記ハードウェアスレッドの汎用レジスタファイルの第2のレジスタの状態である、請求項15に記載の装置。
【請求項17】
前記識別子は、符号化されたバイナリファイルから抽出された第1の識別子であり、前記GPUのハードウェアスレッドによって実行されるカーネルに1つ以上のプロファイルルーチンを挿入するための手段と、
前記ハードウェアスレッドによる1つ以上のプロファイルルーチンの実行に応答して、前記ハードウェアスレッドによって生成されたロング命令トレースから、前記第1の値、前記第2の値、およびハードウェアスレッド識別子を判定することを実行するための手段であって、前記第1の値は、前記ハードウェアスレッドによる前記カーネルの実行前のGPUレジスタ値に対応し、前記第2の値は、前記ハードウェアスレッドによる前記カーネルの実行後の前記GPUレジスタ値に対応し、前記ハードウェアスレッド識別子は、前記ハードウェアスレッドを識別する、手段と、をさらに含む、請求項15~16のいずれか一項に記載の装置。
【請求項18】
前記ハードウェアスレッドは、第1のハードウェアスレッドであり、前記ロング命令トレースは、前記第1のハードウェアスレッドに関連付けられた第1のロング命令トレースであり、前記符号化されたバイナリファイルは、前記第1のロング命令トレースと、1つ以上の第2のハードウェアスレッドに関連付けられた1つ以上の第2のロング命令トレースとを含み、前記符号化されたバイナリファイルは、マルチスレッドGPUトレースを表す、請求項17に記載の装置。
【請求項19】
前記カーネルは、前記ハードウェアスレッドによって実行されるデバイスアクセス命令を含み、前記実行するための手段は、
前記GPUの汎用レジスタファイルの1つ以上のそれぞれの第1のレジスタの1つ以上の第1のレジスタ値を判定することと、
前記GPUのアーキテクチャレジスタファイルの1つ以上のそれぞれの第2のレジスタの1つ以上の第2のレジスタ値を判定することと、
前記1つ以上の第1のレジスタ値、前記1つ以上の第2のレジスタ値、1つ以上の第3のレジスタ値、および前記デバイスアクセス命令を前記ロング命令トレースに記憶することであって、前記1つ以上の第3のレジスタ値は、前記デバイスアクセス命令に関連付けられた1つ以上のそれぞれの宛先レジスタに対応する、記憶することと、を行う、請求項17に記載の装置。
【請求項20】
前記第1のGPU状態に基づいて前記GPUの利用率を判定するための手段をさらに含み、前記制御するための手段は、前記利用率がしきい値を満たさないという判定に応答して、前記第2のルーチンの調整、または前記GPUによって実行される計算タスクの数の増加のうちの少なくとも1つを行って、前記GPUのワークロードを制御することを行う、請求項15~16のいずれか一項に記載の装置。
【請求項21】
前記第1のルーチンは、エミュレーションルーチンを含む計装ルーチンであり、前記実行するための手段は、
前記エミュレーションルーチンの前に前記計装ルーチンに第1のコールバックルーチンを挿入することであって、前記第1のコールバックルーチンは、第1のアプリケーションプログラミングインターフェース(API)を呼び出して、前記第2のGPU状態をアプリケーションに提供する、挿入することと、
前記エミュレーションルーチンの後に前記計装ルーチンに第2のコールバックルーチンを挿入することであって、前記第2のコールバックルーチンは、前記第1のAPIまたは第2のAPIを呼び出して、前記第1のGPU状態を前記アプリケーションに提供する、挿入することと、を行う、請求項15~16のいずれか一項に記載の装置。
【請求項22】
ハードウェアをプロファイリングするシステムであって、
ハードウェアスレッドを有するグラフィック処理ユニット(GPU)であって、前記ハードウェアスレッドは、
GPU状態の第1の値を判定することと、
カーネルに含まれるGPUルーチンを実行して、前記GPU状態の第2の値を判定することと、
前記GPUルーチン、前記第1の値、および前記第2の値を含むロング命令トレースを生成することと、を行う、GPUと、
中央処理ユニット(CPU)であって、
前記カーネルに1つ以上のプロファイルルーチンを挿入することと、
前記GPUルーチンの識別子に基づいて第1のルーチンを識別することであって、前記第1のルーチンは、前記GPUルーチンのエミュレーションに基づく、識別することと、
前記GPU状態の前記第2の値を判定する前記GPUルーチンの実行をリプレイする前記第1のルーチンを実行することであって、前記第1のルーチンは、(i)前記GPUルーチンに関連付けられた第1の引数、および(ii)前記GPU状態の前記第1の値に対応する第2の引数を有する、実行することと、
前記第1のルーチンの実行に基づいて前記GPUのワークロードを制御することと、を行う、CPUと、を含む、システム。
【請求項23】
前記GPU状態は、前記GPUのハードウェアスレッドに関連付けられたアーキテクチャレジスタファイルにおける第2のレジスタまたは前記ハードウェアスレッドの汎用レジスタファイルの第2のレジスタの状態である、請求項22に記載のシステム。
【請求項24】
前記識別子は、符号化されたバイナリファイルから抽出された第1の識別子であり、前記符号化されたバイナリファイルは、前記ロング命令トレースを含み、前記CPUは、前記第1の値、前記第2の値、および前記符号化されたバイナリファイルからのハードウェアスレッド識別子を判定することを行い、前記ハードウェアスレッド識別子は、前記ハードウェアスレッドを識別する、請求項22~23のいずれか一項に記載のシステム。
【請求項25】
前記ハードウェアスレッドは、第1のハードウェアスレッドであり、前記ロング命令トレースは、前記第1のハードウェアスレッドに関連付けられた第1のロング命令トレースであり、前記符号化されたバイナリファイルは、前記第1のロング命令トレースと、1つ以上の第2のハードウェアスレッドに関連付けられた1つ以上の第2のロング命令トレースとを含み、前記1つ以上の第2のハードウェアスレッドは、前記カーネルの1つ以上の実行に応答して、前記1つ以上の第2のロング命令トレースを生成し、前記符号化されたバイナリファイルは、マルチスレッドGPUトレースを表す、請求項24に記載のシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、一般に、コンピュータに関し、より詳細には、グラフィック処理ユニットロング命令トレースを生成するための方法および装置に関係する。
【背景技術】
【0002】
ソフトウェア開発者は、可能な限り効率的に実行できるコードを開発しようとする。コード実行をより良く理解するために、例えば、実行時間、メモリ消費などのような異なるコード実行統計を測定するためにプロファイリングが使用される。いくつかの例では、プロファイリングは、プロファイリング命令をコードに挿入することによって実装される。このようなプロファイリング命令は、コード実行に関する情報を記憶し、分析するために使用することができる。
【図面の簡単な説明】
【0003】
図1】例示的なグラフィック処理ユニットロング命令トレース(GLIT)エンジンがプロファイリング命令を、例示的なグラフィック処理ユニット(GPU)によって実行される例示的なGPUカーネルに挿入するブロック図である。
【0004】
図2図1のGPUの例示的な部分の例示的な実装の図である。
【0005】
図3】例示的な長命令トレースの例示的なフォーマットを示す。
【0006】
図4図1のGLITエンジンの例示的な実装のブロック図である。
【0007】
図5図1の例示的なGPUおよび/または図2の例示的なGPU部分を実装して、例示的な実行ユニットのハードウェアスレッドの動作を制御することができる例示的なシステムの図である。
【0008】
図6図1の例示的なGPUおよび/または図2の例示的なGPU部分に対する例示的なGPUロング命令トレースの図である。
【0009】
図7図6のGLITを生成および分析するための例示的なシステムの図である。
【0010】
図8図6のGLITをエミュレートおよび分析するための例示的なシステムの図である。
【0011】
図9】例示的なカーネルおよび例示的な計装カーネルを示す。
【0012】
図10図9の例示的な計装カーネルの実行をエミュレートするための例示的なワークフローの図である。
【0013】
図11図9の例示的な計装カーネルの実行をエミュレートするための例示的なソースコードを示す。
【0014】
図12】例示的なソフトウェアスレッドの実行をエミュレートするための例示的なソースコードを示す。
【0015】
図13】例示的な計装ソフトウェアスレッドの実行をエミュレートするための例示的なソースコードを示す。
【0016】
図14】エミュレーションルーチンを実装するための例示的なソースコードを示す。
【0017】
図15図1の例示的なGPUおよび/または図2の例示的なGPU部分の動作を改善するために、図1および/または図4のGLITエンジンを実装するように実行され得る機械可読命令を表すフローチャートである。
【0018】
図16】1つ以上の例示的なGLITをエミュレートするために、図1および/または図4のGLITエンジンを実装するように実行され得る機械可読命令を表すフローチャートである。
【0019】
図17図1の例示的なGPUおよび/または図2の例示的なGPU部分の動作を改善するために、図1および/または図4のGLITエンジンを実装するように実行され得る機械可読命令を表す別のフローチャートである。
【0020】
図18図1および/または図4の例示的なGLITエンジンを実装するために、図11~17の機械可読命令を実行するように構造化された例示的な処理プラットフォームのブロック図である。
【0021】
図19】消費者(例えば、ライセンス許諾、販売および/または使用のため)、小売業者(例えば、販売、再販売、ライセンス許諾および/またはサブライセンス許諾のため)、および/またはオリジナル機器製造業者(OEM)(例えば、小売業者に分配される、および/または、顧客に直接販売される製品に含めるため)などのクライアントデバイスにソフトウェア(例えば、図11~17の例示的なコンピュータ可読命令に対応するソフトウェア)を分配するための例示的なソフトウェア分配プラットフォームのブロック図である。
【発明を実施するための形態】
【0022】
数字は、縮尺通りではない。一般に、同一の参照番号は、図面および添付の書面による説明の全体を通じて、同一または類似の部分を指すために使用される。本明細書で使用される場合、接続参照(例えば、取り付け、結合、接続、および接合)は、他に示されない限り、接続参照によって参照される要素間の中間部材および/またはそれらの要素間の相対的移動を含んでもよい。このように、接続参照は、必ずしも2つの要素が直接接続されている、および/または、互いに固定された関係にあるとは推論しない。
【0023】
特に明記しない限り、「第1」、「第2」、「第3」などの記述子は、優先権、物理的順序、リスト内の配置、および/または何らかの順序の意味を補足または他の方法で示すことなく、開示された例を理解しやすくするために要素を区別するためのラベルおよび/または任意の名称としてのみ使用される。いくつかの例では、記述子「第1」は、発明を実施するための形態において要素を指すために使用されてもよいが、同じ要素は、「第2」、「第3」などの異なる記述子を用いて請求項では呼ばれることがある。そのような場合では、このような記述子は、例えば、他の方法で同じ名前を共有する可能性があるこれらの要素を区別的に識別するためだけに使用されると理解されたい。
【0024】
開発者は、中央処理ユニット(CPU)などのプロセッサ上で所望のタスクを実行するために、最も計算効率の良い機械可読コードを作成したい。場合によっては、開発者は、CPUのための機械可読コードを作成し、LIT(Long Instruction Trace、ロング命令トレース)を実行するCPUシミュレータを用いて、機械可読コードの効率を分析する。LITは、CPUのアーキテクチャ状態のスナップショットである。アーキテクチャ状態は、システムメモリの状態を含んでもよく、システムメモリは、CPUに関連付けられたメモリレジスタの値を含んでもよい。そのようなLITによっては、ダイレクトメモリアクセス(DMA)トラフィックなどのシステムイベントをシミュレートするために必要なシステム割り込みのリストを含むことがある。LITによっては、ユーザおよび/またはカーネル命令の実行に応答して、システムメモリの全体のスナップショットを含む。
【0025】
開発者は、CPUカーネルを開発し、プロファイラおよび/またはプロファイリングシステムを使用して、CPUカーネルの動作統計(例えば、動作パラメータ、パフォーマンス統計など)を収集し、CPUによって実行されるCPUカーネルの効率のより良い理解を得ることができる。プロファイラは、CPUカーネルに追加の命令を挿入して、このような動作統計を収集する。このようなプロファイラおよび/またはプロファイリングシステムを使用して、CPUの利用率を判定することができる。このようなプロファイラおよび/またはプロファイリングシステムは、CPU上で動作するオペレーティングシステムが、CPUのコアおよびスレッドの各々についてCPU利用率の可視性を提供するので、CPUの利用率を判定することができる。開発者は、このようなLITおよび/またはプロファイリング技術を、グラフィック処理ユニット(GPU)などの代替タイプのプロセッサに利用することができないことがある。
【0026】
GPUは、バッファのコンテンツを修正するための命令を実行する電子回路である。典型的には、バッファは、ディスプレイデバイス(例えば、モニタ、タッチスクリーンなど)に情報を出力するために使用されるフレームバッファである。近年、GPUは、出力画像の生成に必ずしも関係しないタスクに使用されている。
【0027】
GPUは、一般にカーネル、計算カーネル、シェーダと呼ばれる命令パッケージを実行する。カーネルという用語は、例えば、OpenCL(Open Computing Language)タスク、メディアタスクのためのCなどの汎用計算タスクに使用される。典型的に、シェーダという用語は、カーネルがDirectX、OpenGL(Open Graphics Library)タスク、ピクセルシェーダ/シェーディングタスク、頂点シェーダ/シェーディングタスクなどのグラフィック関係タスクに使用されるときに使用される。本明細書で開示されている例示的なアプローチはカーネルという用語を使用するが、このようなアプローチはシェーダを使用するのと同じくらい適している。このようなカーネルは、複数回繰り返されるプログラムの内部ループに概ね対応する。本明細書で使用される場合、GPUカーネルは、バイナリ形式のカーネルを指す。GPUプログラマは、HLSL(High-Level Shader Language)、OpenCLなどのハイレベルプログラミング言語でカーネル/シェーダを開発し、次いで、コードをカーネルのバイナリバージョンにコンパイルし、それがGPUによって実行される。本明細書に開示される例示的なアプローチは、カーネルのバイナリバージョンに適用される。
【0028】
CPU開発者と同様に、GPU開発者も、GPU上で所望のタスクを実行するために、最も計算効率の良い機械可読コードを作成することを望んでいる。しかしながら、プロファイラおよび/またはプロファイリングシステムは、GPU開発者が、それらの機械可読コードを分析するのに効率的ではないことがある。CPU上で動作しているオペレーティングシステムを有するCPUとは異なり、GPUは、GPU上で動作しているオペレーティングシステム有さないため、GPUは、GPUが、GPUの実行ユニットおよびハードウェアスレッドの粒度で、ビジーおよびアイドル時間間隔、カーネルの実行に応答したレジスタの値などの動作統計を測定するための能力をGPU上に有していない。GPUデバイスベンダによっては、GPUプロファイリングツールを提供しているが、このようなツールは限られており、GPU実行の性能を損なうことなく、各特定のGPU命令のレベルでGPUワークロードの複雑な分析を動的に適用するには効率的ではない。
【0029】
本明細書に開示された例は、GPUロング命令トレース(GLIT)を生成および分析することによって、GPU動作の改善を識別するために使用され得るGPUプロファイリングを改善する。いくつかの開示された例では、GLITは、GPUが計装カーネル(例えば、計装GPUカーネル)を実行することに応答して、GPUの状態(例えば、GPU状態)を捕捉する。本明細書に開示されたいくつかの例は、GLITの分析に基づいてGPUの動作パラメータを測定し、測定された動作パラメータに基づいてGPUの動作を調整するかどうかを判定することによって、GPUの動作を改善する。いくつかの開示された例では、CPUなどのプロセッサは、GPU状態、実行時間パラメータ、ビジー時間パラメータ、アイドル時間パラメータ、占有時間パラメータ、またはGLITに基づく利用率パラメータのうちの少なくとも1つを含む、GPUに関連付けられた1つ以上の動作パラメータ(例えば、動作統計、性能統計など)を判定することができる。
【0030】
本明細書で使用される場合、計装カーネルとは、実行されたとき、カーネルの実行を統計的に測定および/または監視するハードウェアによって実行されるプロファイリングおよび/またはトレース命令を含むカーネルを指す。本明細書で使用される場合、GPU状態とは、汎用レジスタファイル(GRF)に記憶された1つ以上の第1の値、および/またはGPUのハードウェアスレッドに関連付けられたアーキテクチャレジスタファイル(ARF)に記憶された1つ以上の第2の値を指す。例えば、GPUは、複数の第1のレジスタを含むGRFと、複数の第2のレジスタを含むARFとを有するハードウェアスレッドを有することができる。このような例では、GRFレジスタの第1のものの第1の値は第1のGPU状態であってもよく、ARFレジスタの第1のものの第1の値は第2のGPU状態であってもよいなどである。
【0031】
本明細書で使用される場合、GPUの実行時間は、GPUのハードウェアスレッド、および/または、より一般的には、GPUがカーネル(例えば、計装カーネル)を実行するために使用する時間間隔、時間継続時間などを指す。本明細書で使用される場合、GPUのビジー時間とは、GPUのハードウェアスレッドが計算タスクを実行するのにビジーであるときの、時間間隔、時間継続時間などを指す。本明細書で使用される場合、GPUのアイドル時間は、GPUのハードウェアスレッドが計算タスクを実行していないときの時間間隔、時間継続時間などを指す。本明細書で使用される場合、GPUの占有は、1つ以上の計算タスクの実行中に、GPUの実行ユニットおよび/またはハードウェアスレッドに関連付けられたビジーおよび/またはアイドル時間間隔のセットを指す。本明細書で使用される場合、GPUの利用率は、1つ以上の計算タスクの実行に関連付けられたビジー時間および合計時間の比率を指す。
【0032】
いくつかの開示された例では、CPUは、カーネルの実行に関連付けられた1つ以上の動作パラメータに対応する情報を収集するために、追加の命令をカーネルに挿入する。追加の命令は、GLITを生成するようにGPUに指示するためのプロファイリング命令を含み、これは、ハードウェアスレッド識別子(TID)、ハードウェアスレッドのGPU状態、GPU命令を識別するためのオペコード、GPU命令のタイプ(例えば、「read SEND」または EOT(End-of-Thread)命令)、カーネルの実行の開始および/または終了時間に関連付けられたタイムスタンプ、および/またはそれらの組み合わせを含むことができる。例えば、GPUが追加命令を含むカーネルを実行するときに、GPUは、(i)カーネルを実行する前のGRFレジスタの第1の値、(ii)GLITにおいてカーネルを実行した後のGRFレジスタの第2の値、および/または(iii)カーネルを実行したハードウェアスレッドに対応するハードウェアスレッド識別子を記憶することができる。GPUは、GLITをメモリにおけるトレースバッファに記憶することができる。
【0033】
いくつかの開示された例では、CPUは、トレースバッファからGLITを取得し、GPU分析のためにGLITをリプレイすることができる。例えば、CPUは、GRFレジスタの第1の値および/または第2の値に基づいてカーネルの実行をエミュレートすることができる。いくつかの例では、CPUは、カーネルのエミュレートされた実行からの出力データをGPUプロファイリングツールに提供して、GPUに関連付けられた1つ以上の動作パラメータを判定するために、コールバックルーチンを登録(例えば、ソフトウェアアプリケーション、オペレーティングシステム(OS)および/またはその組み合わせを用いて登録)することができる。有利には、GPUプロファイリングツールを利用して、GPUによって実行されるカーネルの効率を判定してもよい。例えば、GPUプロファイリングツールは、GPUが、1つ以上の動作パラメータに基づいて、追加の計算タスク、より少ない追加の計算タスクなどを実行することができることを判定してもよく、したがって、カーネル、および/または、より一般的には、GPUの動作、CPUの動作のスケジューリングなどの改善を識別してもよい。
【0034】
図1は、例示的なGPUロング命令トレース(GLIT)エンジン102を含む例示的なシステム100を示すブロック図であり、GLITエンジン102は、例示的なプロファイリング命令104A~104Cを第1の例示的なカーネル106に挿入して、第2の例示的なカーネル108を生成する。この例では、第1のカーネル106は、例示的なGPU110によって実行されるGPUカーネルである。この例では、第2のカーネル108は、計装カーネル(例えば、計装GPUカーネル)である。代替的には、第1のカーネル106は、ニューラルネットワークプロセッサ、視覚処理ユニット(VPU)などによって実行されるカーネルのような、他のタイプのカーネルであってもよい。
【0035】
GPU110は、スライス(例えば、GPUスライス)に配置された複数の実行ユニットによって実装されてもよい。例えば、GPU110は、複数のスライス(例えば、3スライス、6スライス、12スライスなど)によって実装されてもよい。GPUスライス200の例示的な実装が、図2の例示的な例に示されている。図2を参照すると、GPUスライス200は、3つの例示的なサブスライス202および24の例示的な実行ユニット204を含む。この例では、サブスライス202の各々は、8つの実行ユニット204を含む。実行ユニット204は、3次元(3D)シェーダ、メディア、および汎用処理グラフィック処理ユニット(GPGPU)カーネルの実行に使用される独立した計算ユニットである。例えば、実行ユニット204は、SIMD(multi-issue single instruction, multiple data)動作を実行することができるマルチスレッドハードウェアで実装されてもよい。この例では、実行ユニット204の各々は、7つの例示的なスレッド(例えば、ハードウェアスレッド、GPUスレッドなど)206で実装されてもよい。
【0036】
図2の示された例では、GPUスライス200は、サブスライス202のうちの1つ(複数可)と通信する例示的な固定機能ユニット207を含む。固定機能ユニット207は、(例えば、ユーザ、アプリケーションなどにより)部分的および/または他の方法では完全にプログラマブルではないハードウェアによって実装され得る。代替的には、GPUスライス200は、固定機能ユニット207を含まなくてもよい。例えば、固定機能ユニット207は、プログラム可能なシェーダによってエミュレートされ、および/または他の方法で実装される。
【0037】
図2の示された例では、GPUスライス200は、例示的なキャッシュメモリ210を含む。この例では、キャッシュメモリ210は、例示的なアトミックバリア212および例示的な共有ローカルメモリ214を含むレベル3(L3)のデータキャッシュによって実装される。代替的には、キャッシュメモリ210は、任意の他のタイプのメモリ、データストレージなどと共に実装されてもよい。
【0038】
図2の示された例では、サブスライス202のうちの1つ(複数可)は、例示的なサンプラ(例えば、テクスチャサンプラ)216または例示的なデータポート218のうちの少なくとも1つを介してキャッシュメモリ210と通信している。いくつかの例では、サンプラ216は、グラフィックコア内の自己完結機能ブロック(例えば、ハードウェア、ファームウェア、および/またはソフトウェアブロック)として実装されてもよい。いくつかの例では、サンプラ216は、グラフィックコア内の他のエージェントからメッセージを受信し、「サーフェス」と呼ばれることがある外部メモリソースからデータをフェッチし、データに対する動作を実行し、および/またはリクエスタ(または、要求があれば中間メモリバッファ(例えば、RTT(Render Target Texture)に直接)に標準フォーマットで結果を返すことができる。いくつかの例では、サンプラ216は、テクスチャマップにおける位置からフィルタリング/ブレンドされたピクセルを返すことができる。
【0039】
この例では、サンプラ216および/またはデータポート218は、1サイクル当たり64バイトの速度でキャッシュメモリ210からデータを読むことができる。例えば、サンプラ216は、対応するARFの第1のレジスタおよび/またはスレッド208のうちの1つ(複数可)によって実装される対応するGRFの第2のレジスタから値を読み出すことによって、実行ユニット204のスレッド208のうちの1つ(複数可)のGPU状態をサンプリングすることができる。代替的には、サンプラ216および/またはデータポート218は、キャッシュメモリ210から任意の他の速度でデータを読み出すことができる。この例では、データポート218は、1サイクル当たり64バイトの速度でデータをキャッシュメモリ210に書き込むことができる。代替的には、データポート218は、任意の他の速度でキャッシュメモリ210にデータを書き込むことができる。
【0040】
図2の示された例では、実行ユニット204のうちの1つ(複数可)は、例示的なローカルスレッドディスパッチャ220と通信する。この例では、ローカルスレッドディスパッチャ220は、図1の第2のカーネル108などの命令を取得し、その命令を例示的な命令キャッシュ222に記憶するハードウェアを用いて実施されてもよい。例えば、命令キャッシュ222は、命令を記憶することができるメモリ(例えば、不揮発性メモリ、揮発性メモリなど)を用いて実装されてもよい。
【0041】
この例では、ローカルスレッドディスパッチャ220は、実行のために、実行ユニット204のうちの1つ(複数可)に、第2のカーネル108などの命令をディスパッチ、分配、および/または他の方法で送信することができる。例えば、ローカルスレッドディスパッチャ220は、実行のために、実行ユニット204のうちの利用可能な1つ(複数可)に第2のカーネル108のインスタンスを拡散することができる。いくつかの例では、第2のカーネル108の数百または数千のインスタンスは、実行ユニット204の各々1つ(複数可)が、図1のアプリケーション120のようなアプリケーションによって意図されるデータのサブセットまたは一部分を処理する状態で、実行ユニット204のうちの利用可能な1つ(複数可)上で、並列に動作および/または他の方法で実行することができる。本明細書で使用される場合、「ジョブ」または「ソフトウェアスレッド」は、第2のカーネル108をスレッド208のうちの1つに、および/またはより一般的には、実行ユニット204のうちの1つにディスパッチするインスタンスを指すことがある。
【0042】
図2の示された例では、実行ユニット204のうちの1つ(複数可)は、例示的な命令フェッチインターフェース224から実行される命令(例えばカーネル)を受信および/または他の方法で取得する。例えば、実行ユニット204のうちの1つ(複数可)は、命令フェッチインターフェース224から実行するために、図1の第2のカーネル108などのカーネルを取得してもよい。命令フェッチインターフェース224は、実行ユニット204のスレッド208のうちの1つ(複数可)にカーネルを割り当ててもよい。この例では、スレッド208のうちの1つ(複数可)は、各々、128個の32バイトレジスタを用いて実装されてもよい。例えば、スレッド208のうちの1つ(複数可)は、各々、例示的な汎用レジスタファイル(GRF)および例示的なアーキテクチャレジスタファイル(ARF)を有することができる。スレッド208によって読み出されたか、または書き込まれたデータは、スレッド208の対応する1つのGRFに記憶されてもよい。この例では、GRFは、各々32バイトを記憶する汎用レジスタのうちの1つ(複数可)を有する128個の汎用レジスタで実装されてもよい。GRF内のデータ要素アドレスは、レジスタ番号(例えば、128個の汎用レジスタGRFの場合、r0~r127)およびサブレジスタ番号によって示されてもよい。
【0043】
図2の示された例では、特定のISA(Instruction Set Architecture)機能を実装するために使用されるレジスタを含むレジスタファイルを用いてARFが実装され得る。例えば、命令ポインタおよび/または条件フラグは、ARFレジスタを用いて実装されてもよい。本明細書で使用される場合、「ISA機能」とは、プログラムおよびプログラマ(例えば、開発者)に見え、データタイプ、レジスタ、メモリアクセス、アドレス指定モード、例外、命令符号化、および命令セット自体を含む特定の実装から独立したプロセッサの態様を指す。いくつかの例では、スレッド208のうちの1つ(複数可)などのGPUのハードウェアスレッドは、ISA機能に対応する命令を実行することができる。いくつかの例では、各命令は、異なる浮動小数点データ型および整数データ型で異なるSIMDモードで動作することができるベクトル命令であってもよい。いくつかの例では、命令の各々は、対応するオペコードを有してもよい。例えば、GPUアーキテクチャは、限られた数のオペコード(例えば、60のオペコード、80のオペコード、100のオペコードなど)をサポートしてもよい。
【0044】
図2の示された例では、スレッド208のうちの1つ(複数可)は、例示的なスレッドアービタ226と通信していてもよい。この例では、スレッドアービタ226は、スレッド208からデータ出力(複数可)を取得し、データ出力(複数可)が例示のSEND命令228、分岐命令230、または例示のSIMD浮動小数点ユニット(FPU)命令232に対応するかどうかを判定するハードウェアで実装されてもよい。この例では、SEND命令228は、スレッド208がカーネルの実行を終了することに応答してスレッド208によって生成されてもよい。この例では、分岐命令230は、「if」、「do」、「while」命令などの条件付き命令を含むカーネルを実行することに応答して、スレッド208によって生成されてもよい。この例では、FPU命令232は、スレッドが浮動小数点計算を実行することに応答してスレッド208によって生成されてもよい。
【0045】
図1の示された例に戻って、GPU110は、例示的なGLIT112を生成するプロファイリング命令104A~104Cを実行してもよい。この例では、GPU110は、例示的なトレースバッファ114にGLIT112を記憶する。この例では、トレースバッファ114は、例示的なメモリ116に記憶される。GLIT112は、GLITデータなどを生成するGLITエンジン102によって構成されることに応答して、第2のカーネル108に含まれるプロファイリング命令104A~104Cを実行することに応答して、GPU110によって生成および/または他の方法で出力されるGLITデータを含む。例えば、GLIT112は、GPU110のアーキテクチャ状態のスナップショットを実装および/または他の方法で記憶するGLITデータを含んでもよい。いくつかの例では、GPU110のアーキテクチャ状態は、GRFに記憶された第1の値、および/またはGPU110の図2のスレッド208のようなハードウェアスレッドに関連付けられたARFに記憶された第2の値を含むことができる。いくつかの例では、GLIT112は、SEND命令228、分岐命令230、または図2のSIMD FPU命令232、および/または対応するタイムスタンプのうちの1つ(複数可)に関連付けられたデータを記憶する。GLITエンジン102は、GLIT112を取得および分析して、GPU110による第2のカーネル108の実行をよりよく理解することができる。GLITエンジン102は、GLIT112の分析に基づいてGPU110の動作を調整するように判定することができる。
【0046】
いくつかの例では、プロファイリング命令104A~104Cは、GPU110によって実行されるときに、第2のカーネル108の実行をより良く理解するために使用できるカウンタ、ハードウェアスレッド識別子、レジスタ値、タイムスタンプなどの動作情報を生成、判定、および/または記憶するプロファイルルーチン(例えば、機械可読コードおよび/またはソフトウェアプロファイルルーチンなど)である。例えば、プロファイリング命令104A~104Cは、GPU110による第2のカーネル108の実行をプロファイリングおよび/または他の方法で特性評価することができる。
【0047】
いくつかの例では、プロファイリング命令104A~104Cは、プロファイリングに使用される変数を初期化するために、カーネルの第1のアドレス(例えば、第1の位置)(例えば、第1のカーネル106の最初)に挿入される。いくつかの例では、プロファイリング命令104A~104Cは、オリジナルの命令の中間の位置(例えば、第1のカーネル106の命令間)に挿入される。いくつかの例では、プロファイリング命令104A~104Cは、カーネルの第2のアドレス(例えば、第2の位置)(例えば、第1のカーネル106からの命令の後)に挿入され、実行されると、GPU110に、GLITエンジン102によってアクセス可能なメトリックを収集および/または記憶させる。いくつかの例では、プロファイリング命令104A~104Cは、クリーンアップ(例えば、メモリ場所の解放など)を実行するために、カーネル(例えば、第1のカーネル106)の最後に挿入される。しかしながら、このようなプロファイリング命令104A~104Cは、任意の場所または位置に任意の順序で追加的または代替的に挿入されてもよい。
【0048】
図1の示された例では、例示的なCPU118は、GLITエンジン102、例示的なアプリケーション120、例示的なGPUドライバ122、および例示的なGPUコンパイラ124を含み、および/または他の方法でこれらを実装する。アプリケーション120は、GPU110が、例えば、DirectXタスク、OpenGLタスク、ピクセルシェーダ/シェーディングタスク、頂点シェーダ/シェーディングタスクなどのグラフィック関係タスクを実行するときに、1つ以上のディスプレイデバイス上にGPU110からの出力を表示するために使用され得るソフトウェアアプリケーションである。いくつかの例では、アプリケーション120は、1つ以上のダイナミックリンクライブラリ(DLL)で実装されてもよい。追加的または代替的に、アプリケーション120は、GPU110が非グラフィック関係タスクを実行するときに、GPU110からの出力を表示および/または他の方法で処理するために使用されてもよい。追加的または代替的に、アプリケーション120は、例えばHLSL、OpenCLなどのような高レベルプログラミング言語におけるカーネル/シェーダの開発を容易にするために、GPUプログラマによって使用されてもよい。例えば、アプリケーション120は、GPUプロファイリングツール、GPU分析ツールなどのプロファイリングツールとすることができる。
【0049】
図1の示された例では、アプリケーション120は、タスク(例えば、計算タスク、グラフィック関係タスク、非グラフィック関係タスクなど)をGPUドライバ122に送信する。いくつかの例では、GPUドライバ122は、タスクを受信し、GPUコンパイラ124に、タスクに関連付けられたコードをバイナリバージョン(例えば、バイナリコードに対応するバイナリフォーマット、バイナリ命令、機械可読命令など)にコンパイルして、第1のカーネル106を生成するように指示する。GPUコンパイラ124は、コンパイルされた第1のカーネル106のバイナリバージョンをGPUドライバ122に送信する。
【0050】
いくつかの例では、GLITエンジン102は、トレースバッファ114にデータを出力するようにGPU110を設定、プログラム、および/または他の方法で制御する。例えば、GLITエンジン102は、GPUドライバ122に対して、第1のカーネル106または第2のカーネル108などのカーネルの特定の実行点において、図3で後述されるデータおよび/または情報をダンプおよび/または出力するようにGPU110を制御するように指示してもよい。いくつかの例では、GLITエンジン102は、GPUドライバ122に対して、GPU110によって実行される命令に関連付けられたデータをトレースバッファ114に出力するようにGPU110に行わせるように指示してもよい。例えば、GLITエンジン102は、GPU110に、GPU命令(例えば、第1のカーネル106、第2のカーネル108などに含まれる命令)、デバイスアクセス命令(例えば、メモリアクセス命令、GPU110に図2のサンプラ216、キャッシュメモリ210などにアクセスさせる、GPU110によって実行される命令など)などに関連付けられたデータを出力させることができる。
【0051】
いくつかの例では、GPU110がGPU命令(例えば、追加命令、移動命令など)を実行することに応答して、GPU110は、GPU命令、GPU命令を実行する前のレジスタの第1の値、GPU命令を実行した後のレジスタの第2の値などをトレースバッファ114に出力することができる。いくつかの例では、GPU110がサンプラ216にレジスタ値を送信させるデバイスアクセス命令をGPU110が実行することに応答して、GPU110は、デバイスアクセス命令、レジスタ値などをトレースバッファ114に出力してもよい。有利には、このようないくつかの例では、GLITエンジン102は、カーネルを装備せずにGLITデータをトレースバッファ114に出力するようにGPU110を制御することができる。
【0052】
いくつかの例では、GLITエンジン102は、バイナリインスツルメンテーションを介してGLITデータをトレースバッファ114に出力するようにGPU110を制御してもよい。例えば、GLITエンジン102は、GPUドライバ122から第1のカーネル106(例えば、バイナリ形式)を取得してもよい。GLITエンジン102は、プロファイリング命令104A~104Cなどの追加命令を第1のカーネル106に挿入することによって、第1のカーネル106を計装することができる。例えば、GLITエンジン102は、第1のカーネル106を修正して、第2のカーネル108のような、計装GPUカーネルを生成してもよい。すなわち、GLITエンジン102は、第1のカーネル106のいかなるコンパイルを実行することなく、第2のカーネル108を生成する。このようにして、すでにコンパイルされたGPUカーネルを計装および/またはプロファイリングすることができる。第2のカーネル108は、メモリ116を介してGPU110に渡される。例えば、GLITエンジン102は、第2のカーネル108をGPUドライバ122に送信することができ、GPUドライバ122は、第2のカーネル108をGPU110による引き出しのためにメモリ116に記憶することができる。
【0053】
いくつかの例では、GPU110は、1つ以上のGLIT112を生成するプロファイリング命令104A~104Cを実行する。この例では、プロファイリング命令104A~104Cは、第1の位置に挿入された「TRACE(0、TID)」の例示的な第1のプロファイリング命令104を含み、第1のプロファイリング命令104Aは、トレース(例えば、GLIT112の1つ)を生成することに対応する。例えば、トレースは、トレースバッファ114などのメモリバッファに書き込まれる(例えば、動的に書き込まれる)データレコードのシーケンスを参照してもよい。いくつかの例では、第1のトレース動作は、ハードウェアスレッドに関連付けられたレジスタ(例えば、ハードウェアレジスタ)の読み出し動作と、第1の変数におけるレジスタから読み出された第1の値の記憶動作を用いて実装されてもよい。このような例では、第1のトレース動作は、(i)第1の値および/または(ii)レジスタにアクセスしたハードウェアスレッドに関連付けられたスレッド識別子(TID)を含むGLIT112の第1のものを生成することによって実装されてもよい。
【0054】
図1の示された例では、プロファイリング命令104A~104Cは、第2の位置に挿入された「TRACE(1,TID)」の例示的な第2のプロファイリング命令104Bを含み、第2のプロファイリング命令104Bは、第2のトレース動作に対応する。いくつかの例では、第2のトレース動作は、ハードウェアスレッドに関連付けられたレジスタの読み出し動作と、第2の変数におけるレジスタから読み出された第2の値のストア動作を用いて実装されてもよい。例えば、第2の値は、GPU110が第2のカーネル108を実行することに応答して生成されることがあるため、第1のトレース動作の第1の値とは異なることがある。このような例では、第2のトレース動作は、(i)第2の値、および/または(ii)レジスタにアクセスしたハードウェアスレッドに関連付けられたTIDを含むGLIT112の第2のものを生成することによって実装されてもよい。
【0055】
図1の示された例では、プロファイリング命令104A~104Cは、第3の位置に挿入された「TRACE(2,TID)」の例示的な第3のプロファイリング命令104Cを含み、第3のプロファイリング命令104Cは、第3のトレース動作に対応する。いくつかの例では、第3のトレース動作は、ハードウェアスレッドに関連付けられたレジスタの読み出し動作と、第3の変数におけるレジスタから読み出された第3の値のストア動作を用いて実装されてもよい。例えば、第3の値は、GPU110が第2のカーネル108を実行することに応答して生成されることがあるため、第1のトレース動作の第1の値および/または第2のトレース動作の第2の値とは異なることがある。このような例では、第3のトレース動作は、(i)第3の値、および/または(ii)レジスタにアクセスしたハードウェアスレッドに関連付けられたTIDを含むGLIT112の第3のものを生成することによって実装されてもよい。
【0056】
いくつかの例では、プロファイリング命令104A~104C、および/またはより一般的には、第2のカーネル108を実行することに応答して、GPU110は、トレースバッファ114にGLIT112を記憶する。トレースバッファ114は、GLIT112を実装することができる例示的なレコード(例えば、データレコード)126を含む。例えば、レコード126は、GPU110からのGLITデータを実装することができる。いくつかの例では、レコード126、および/またはより一般的には、GLIT112は、図3の示された例に示された例示的なGLITフォーマット300に基づいてバイナリフォーマットで符号化されてもよい。
【0057】
図3を参照すると、GLITフォーマット300は、平文で示されており、図1のGLIT112のうちの1つ(複数可)を実装することができる例示的なバイナリデータフォーマットを表す、および/または、他の方法で対応することができる。例えば、GLITフォーマット300は、GPU110がGLIT112を記憶するために使用され得る例示的なバイナリファイル(例えば、符号化されたバイナリファイル)を実装するために使用され得る。代替的には、GLITフォーマット300は、任意の他のフォーマットを使用して実装されてもよい。
【0058】
いくつかの例では、図1のCPU118は、トレースバッファ114からレコード126を取得することができる。このような例では、CPU118は、GLITフォーマット300に基づいてレコード126のうちの1つ(複数可)を含むようにGLIT112の1つを生成することができる。いくつかの例では、GLITフォーマット300は、複数の例示的なレコード(例えば、データレコード)302を含む符号化されたバイナリフォーマットでバッファとして実装されてもよい。例えば、レコード302は、図1のレコード126を実装してもよい。このような例では、レコード302のうちの第1のものは、図1のレコード126のうちの第1のものに対応してもよい。
【0059】
いくつかの例では、GLITフォーマット300は、アトミック方式で生成されてもよい。例えば、GPU110は、レコード302のうちの第1のものがレコード302のうちの第2のものに隣接し、レコード302のうちの第1のものがレコード302のうちの第2のものよりも前に生成されるGLIT112をGLITフォーマット300で逐次生成してもよい。代替的には、GLITフォーマット300を有するGLIT112(複数可)は、例えばラウンドロビン技術を用いて、アトミックとは異なる方式で生成されてもよい。GPU110は、図2のスレッド208などの複数のハードウェアスレッドからレコード302を生成することができる。
【0060】
図3の示された例では、GLITフォーマット300は、GLITフォーマット300のフォーマットバージョン(VERSION)、GENモデル識別子(GEN MODEL ID)など、管理的な性質のデータレコード302のものを含む。例えば、GEN MODEL IDは、GPU110の特定のアーキテクチャを参照することができる。いくつかの例では、CPU118は、GEN MODEL IDに基づいて、GPU110の挙動、仕様などを判定することができる。
【0061】
図3の示された例では、GLITフォーマット300は、図1の第2のカーネル108などのカーネルの命令の復号された情報を含む。例えば、INST_DECODE_T INST0は、第2のカーネル108の図1のINSTR1 DST、SRC1、SRC2など、復号されたバージョンの第1のカーネル命令に対応してもよい。いくつかの例では、INST_DECODE_T INST1は、第2のカーネル108の図1のINSTR2 DST、SRC1、SRC2など、復号されたバージョンの第2のカーネル命令に対応してもよい。いくつかの例では、復号されたカーネル命令は、GLITエンジン102がGPU110による第2のカーネル108の命令の実行をエミュレートおよび/または他の方法でシミュレートするために使用され得る復号されたGLITデータを実装することができる。
【0062】
図3の示された例では、GLITフォーマット300は、命令の数(NUMBER OF INSTRUCTIONS)(例えば、第2のカーネル108の命令の数)、関連する基本ブロック(BBL)の数(NUMBER OF RELEVANT BBLs)、SEND命令の数(NUM OF SENDS)(例えば、図2のSEND命令228の数)、SEND命令の各々に関連付けられたデータ(例えば、SEND0 DATA、SEND1 DATAなど)、ハードウェアスレッドの最大数(MAX NUM OF HW THREADS)(例えば、図2のスレッド208の最大数)、ハードウェアスレッド識別子カウントHW TID COUNT)などの例示的な動作パラメータを含む。例えば、BBLは、単一の入口ポイントおよび出口ポイントを有する連続した命令セットを参照することができる。このような例では、第2のカーネル108などのカーネルは、論理的に1つ以上のBBLに分割されてもよい。追加的または代替的に、GLIT 300は、負荷命令などの異なるタイプの命令に対応する動作パラメータを含んでもよい。例えば、NUM OF SENDSは、ロード命令の数(NUM OF LOADS)で置き換えられてもよく、SEND0 DATAは、LOAD0 DATAで置き換えられてもよく、SEND0 DESTINATION VALUESは、LOAD0 DESTINATION VALUEで置き換えられてもよいなど、および/またはそれらの組み合わせであってもよい。
【0063】
いくつかの例では、GLITフォーマット300は、SEND命令、READ SEND命令などのデバイスアクセス命令に関連付けられたデータを記憶するように実装されてもよい。例えば、GLITフォーマット300は、オフセット値(OFFSET)、宛先レジスタ(DST)、レジスタの数(NUM OF REG)などを含んでもよい。いくつかの例では、GLITフォーマット300は、デバイスアクセス命令データ(例えば、SEND宛先値データ、SEND0 DESTINATION VALUES、SEND1 DESTINATION VALUESなど)に関連付けられたヘッダデータ(例えば、CE、DMASK、CR0.0など)を含むように実装されてもよく、これは、GPU110に関連付けられたARFの第1のレジスタ(例えば、CEレジスタ)の値、ARFの第2のレジスタの値(例えば、ディスパッチマスク(DMASK)レジスタ)などを含んでもよい。追加的または代替的に、図3に示されたレコード302よりも少ない、または多いレコードが存在し得る。有利には、GLITエンジン102は、GLITフォーマット300に基づいて、および/または、他の方法でこれを有する図1のGLIT112を取得してもよく、これは、GPU110のプロファイリングを改善するために使用されてもよい。
【0064】
図3の示された例では、GLITフォーマット300に基づくGLITは、図2のスレッド208などの複数のハードウェアスレッドに関連付けられたデータを記憶することができる。例えば、GLITフォーマット300に基づくGLIT112のうちの1つ(複数可)は、スレッド208のうちの第1のものに対応する第1のデータ、スレッド208の第2のものに対応する第2のデータなどを記憶してもよい。この例では、第1のデータは、TID 0の識別子を有するスレッド208の第1のものに対応する、NUM OF BBL RECORDS、BBL ID、HEADER、SEND0 DESTINATION VALUES、SEND1 DESTINATION VALUESなどに対応してもよい。この例では、第2のデータは、TID 1の識別子を有するスレッド208の第2のものに対応する、NUM OF BBL RECORDS、BBL ID、HEADER、SEND0 DESTINATION VALUES、SEND1 DESTINATION VALUESなどに対応してもよい。この例では、GLITフォーマット300は、第1のデータ、第2のデータなどを順次リストしてもよい。あるいは、GLITフォーマット300は、第1のデータ、第2のデータなどを任意の順番および/またはフォーマットでリストしてもよい。
【0065】
図1の示された例に戻って参照すると、GLITエンジン102は、トレースバッファ114をメモリ116から引き出す(例えば、反復的に引き出す、周期的に引き出すなど)。いくつかの例では、GLITエンジン102は、第2のカーネル108、および/または、より一般的には、GPU110に関連付けられた1つ以上の動作パラメータを判定する。例えば、GLITエンジン102は、GPU状態、実行時間パラメータ、ビジー時間パラメータ、アイドル時間パラメータ、占有時間パラメータ、および/またはGPU110に関連付けられた利用率パラメータを判定してもよい。いくつかの例では、GLITエンジン102は、1つ以上の動作パラメータに基づいてGPU110の動作を調整する。例えば、GLITエンジン102は、CPU118に対し、1つ以上の動作パラメータに基づいて、GPU110によって実行される命令の増加量、GPU110によって実行される命令の減少量などをスケジューリングするように指示することができる。
【0066】
図1の示された例では、メモリ116は、第2のカーネル108、トレースバッファ114、および例示的なGPUデータ128などの1つ以上のカーネルを含む。代替的に、メモリ116は、1つ以上のカーネルを記憶しなくてもよい。いくつかの例では、メモリ116は、揮発性メモリ、不揮発性メモリ(例えば、フラッシュメモリ)など、および/またはそれらの組み合わせによって実装されてもよい。いくつかの例では、GPUデータ128は、少なくとも第2のカーネル108を実行することに応答してGPU110によって生成されたデータに対応する。例えば、GPUデータ128は、グラフィック関係データ、ディスプレイデバイスへの出力情報などを含むことができる。
【0067】
図4は、図1のGPU110の動作を改善するための、図1のGLITエンジン102の例示的な実装のブロック図である。いくつかの例では、GLITエンジン102は、GPU110に送信する前にバイナリシェーダ/カーネルを計装する。GLITエンジン102は、図1のメモリ116から、図3のGLITフォーマット300に基づき得る図1のGLIT112を収集することができる。GLITエンジン102は、GLIT112に記憶されたレコード126に基づいてGPU110の動作をエミュレートすることができる。GLITエンジン102は、GPU110、CPU118などの動作の改善を判定するために使用され得るGPU110に関連付けられた動作パラメータを判定することができる。
【0068】
図4の示された例では、GLITエンジン102は、例示的な命令生成器410、例示的なトレース抽出器420、例示的なトレースエミュレータ430、例示的なトレース分析器440、例示的なハードウェア設定器450、および例示的なストレージ460を含む。この例では、ストレージ460は、例示的なGLIT470を含む、および/または、他の方法で記憶する。この例では、命令生成器410、トレース抽出器420、トレースエミュレータ430、トレース分析器440、ハードウェア設定器450、およびストレージ460のうちの少なくとも1つは、例示的なバス480を介して互いの1つ(複数可)と通信していてもよい。例えば、バス480は、I2C(Inter-Integrated Circuit)バス、SPI(Serial Peripheral Interface)バス、および/またはPCI(Peripheral Component Interconnect)バスによって実装されてもよい。
【0069】
図4の示された例では、GLITエンジン102は、図1の第1のカーネル106などのカーネルを計装する命令生成器410を含む。例えば、命令生成器410は、第1のカーネル106にアクセスすることができる(例えば、CPU118に含まれるメモリから第1のカーネル106にアクセスする)。命令生成器410は、図1の第2のカーネル108を生成するために、第1のカーネル106を計装することができる。例えば、命令生成器410は、第2のカーネル108を生成するために、図1のプロファイリング命令104A~104Cに関連付けられたバイナリコードを生成し、第1のカーネル106に挿入することができる。いくつかの例では、命令生成器410は、第2のカーネル108を図1のGPUドライバ122に提供および/または他の方法で送信する。このような例では、命令生成器410から第2のカーネル108を取得することに応答して、GPUドライバ122は、GPU110による後の引き出しのために、第2のカーネル108をメモリ116に記憶することができる。
【0070】
いくつかの例では、命令生成器410は、GPU110のスレッド208のうちの1つによって実行されるカーネルに、プロファイリング命令104A~104Cのうちの1つ以上などの1つ以上のプロファイルルーチンを挿入するための手段を実装する。いくつかの例では、挿入するための手段は、1つ以上のアナログまたはデジタル回路、論理回路、プログラマブルプロセッサ、プログラマブルコントローラ、GPU、デジタルシグナルプロセッサ(DSP)、特定用途向け集積回路(ASIC)、プログラマブル論理デバイス(PLD)および/またはフィールドプログラマブル論理デバイス(FPLD)(例えば、フィールドプログラマブルゲートアレイ(FPGA))によって実装されてもよい。いくつかの例では、挿入するための手段は、図16のブロック1602または図18のブロック1802のうちの少なくとも1つによって実装されてもよい。
【0071】
いくつかの例では、命令生成器410は、プロファイリング命令104A~104Cに基づいてバイナリコード(例えば、バイナリ命令、機械可読命令など)を生成するための手段を実装する。いくつかの例では、命令生成器410は、第2のカーネル108を生成するために、生成されたバイナリコードを、第1のカーネル106内の1つ以上のプレースまたは位置で第1のカーネル106に挿入するための手段を実装する。
【0072】
図4の示された例では、GLITエンジン102は、図1のメモリ116からGLIT112、および/または、より一般的には、トレースバッファ114を引き出すおよび/または収集するトレース抽出器420を含む。いくつかの例では、トレース抽出器420は、トレースバッファ114からGLIT112を抽出し、および/またはレコード126をGLIT112から抽出する。いくつかの例では、トレース抽出器420は、GLITフォーマット300の第1の位置(例えば、開始)からGLITフォーマット300の第2の位置(例えば、終了)までGLIT112を横断し、途中でレコード126を抽出することによってGLIT112を処理する。例えば、トレース抽出器420は、図3のGLITフォーマット300から、図3のレコード302の第1のもの、レコード302の第2のものなどを抽出、識別、および/または他の方法で判定することができる。
【0073】
いくつかの例では、トレース抽出器320は、復号されたバイナリデータを生成するために、GLIT112のバイナリカーネル表現を復号することによって、GLIT 112からレコード126を抽出する。いくつかの例では、トレース抽出器320は、復号されたバイナリデータから命令識別子および/またはオペコードを抽出する。例えば、トレース抽出器320は、GPU110によって実行されるSEND命令、READ SEND命令、分岐命令、およびSEND命令に対応する第1のオペコード、分岐命令に対応する第2のオペコードなどを抽出することができる。いくつかの例では、トレース抽出器320は、命令識別子またはレコード126のうちの1つ(複数可)に対応するオペコードのうちの少なくとも1つに基づいて、レコード126のうちの1つ(複数可)を分類および/または他の方法でグループ化する。
【0074】
いくつかの例では、トレース抽出器320は、オペコードとエミュレーションルーチン(例えば、機械可読コード、ファームウェアおよび/またはソフトウェアルーチンなど)との関連付けを記憶する。例えば、トレース抽出器320は、第1のオペコードが第1のエミュレーションルーチンに対応することを識別することができる。このような例では、第1のエミュレーションルーチンは、実行されたときに、第1のオペコードに対応するSEND命令と同じまたは実質的に類似の機能を模倣および/または他の方法で実行するアルゴリズム、機械可読命令などを表すことができる。いくつかの例では、トレース抽出器320は、レコード126、命令識別子、オペコード、関連付けなどをストレージ460に記憶する。
【0075】
いくつかの例では、トレース抽出器420は、GPU110によって実行される第2のルーチンの識別子に基づいて第1のルーチンを識別するための手段を実装し、第1のルーチンは第2のルーチンのエミュレーションに基づく。いくつかの例では、トレース抽出器420は、トレースバッファ114からGLIT112を抽出し、および/またはGLIT112からレコード126を抽出するための手段を実装する。いくつかの例では、識別するための手段および/または抽出するための手段は、1つ以上のアナログまたはデジタル回路、論理回路、プログラマブルプロセッサ、プログラマブルコントローラ、GPU、DSP、ASIC、PLD、および/またはFPLDによって実装されてもよい。いくつかの例では、識別するための手段は、図16のブロック1602、1604、1606、1608のうちの少なくとも1つによって実装されてもよい。
【0076】
図4の示された例では、トレースエミュレータ430は、GPU110の動作の分析を実施するために、図1のGLIT112をエミュレートおよび/または他の方法でリプレイする。例えば、トレースエミュレータ430は、GLIT112に記憶されたデータに基づいて、GPU110による第2のカーネル108の実行をリプレイすることができる。いくつかの例では、トレースエミュレータ430は、スレッド208のそれぞれに対応するGLIT112に記憶されたデータに基づいて、図2のスレッド208のそれぞれによって、第2のカーネル108の1つ以上の実行をリプレイすることができる。いくつかの例では、トレースエミュレータ430は、GPU110によって実行されるルーチンをシミュレートするエミュレーションルーチンを実行する。例えば、トレースエミュレータ430は、GLIT112からデータレコード126のうちの1つ(複数可)を引き出し、GPU110による命令(例えば、加算命令、減算命令、乗算命令など)の実行をシミュレートすることができる第1のエミュレーションルーチンに引数としてデータレコード126の引き出された1つ(複数可)を入力することができる。このような例では、データレコード126の引き出された1つ(複数可)は、GPU110の処理に関心のあるスレッドに関連付けられたARF、GRFなどのレジスタの値などのGPU110の状態とすることができる。
【0077】
いくつかの例では、トレースエミュレータ430は、図1のアプリケーション120、図1のCPU118に関連付けられた開発者またはユーザによる分析を容易にするために、コールバックルーチン(例えば、コールバック命令)を用いてエミュレーションルーチンを計装する。例えば、トレースエミュレータ430は、機械可読命令を表すことができる高レベル言語(HLL)命令をエミュレーションルーチンに含めることができる。このような例では、トレースエミュレータ430が計装エミュレーションルーチンを実行することに応答して、トレースエミュレータ430は、APIを呼び出して、計装エミュレーションルーチンの実行に関連して出力データをアプリケーション120などの上位レベル分析構成物に提供および/または他の方法で送信することができる。有利には、トレースエミュレータ430は、データを生成し、GPUプロファイリングツールにデータを提供するために、エミュレーションルーチンを計装し、実行することができ、このツールは、GPU110、CPU118など、および/またはそれらの組み合わせの動作に対する改善を識別するために使用され得る。
【0078】
いくつかの例では、トレースエミュレータ430は、GPUのGPU状態の第1の値を判定する第1のルーチンを実行するための手段であって、第1のルーチンは、(i)第2のルーチンに関連付けられた第1の引数、および(ii)第1のルーチンを実行する前のGPU状態の第2の値に対応する第2の引数を有する、手段を実装する。いくつかの例では、GPU状態は、GPUのハードウェアスレッドに関連付けられたARFにおける第1のレジスタまたはハードウェアスレッドのGRFの第2のレジスタの状態である。いくつかの例では、識別子は、符号化されたバイナリファイルから抽出された第1の識別子であってもよく、実行するための手段は、ハードウェアスレッドによる1つ以上のプロファイルルーチンの実行に応答して、ハードウェアスレッドによって生成されたロング命令トレースから、第1の値、第2の値、およびハードウェアスレッド識別子を判定することを行う。このような例では、第1の値は、ハードウェアスレッドによるカーネルの実行後のGPUレジスタ値に対応することができ、第2の値は、ハードウェアスレッドによるカーネルの実行前のGPUレジスタ値に対応することができ、ハードウェアスレッド識別子は、ハードウェアスレッドを識別することができる。
【0079】
いくつかの例では、実行するための手段は、GPUのGRFの1つ以上のそれぞれの第1のレジスタの1つ以上の第1のレジスタ値を判定すること、GPUのARFの1つ以上のそれぞれの第2のレジスタの1つ以上の第2のレジスタ値を判定すること、および/または1つ以上の第1のレジスタ値、1つ以上の第2のレジスタ値、1つ以上の第3のレジスタ値、およびデバイスアクセス命令(例えば、SEND命令、READ SEND命令など)を、GLITなどのロング命令トレースに記憶することを行う。いくつかの例では、1つ以上の第3のレジスタは、デバイスアクセス命令に関連付けられた1つ以上のそれぞれの宛先レジスタに対応することができる。
【0080】
いくつかの例では、実行するための手段は、エミュレーションルーチンの前に、計装ルーチンに第1のコールバックルーチンを挿入することを行い、第1のコールバックルーチンは、第1のアプリケーションプログラミングインターフェース(API)を呼び出して、第2のGPU状態をアプリケーションに提供することができる。いくつかの例では、実行するための手段は、エミュレーションルーチンの後に計装ルーチンに第2のコールバックルーチンを挿入することを行い、第2のコールバックルーチンは、第1のAPIまたは第2のAPIを呼び出して、第1のGPU状態をアプリケーションに提供することができる。
【0081】
いくつかの例では、実行するための手段は、1つ以上のアナログまたはデジタル回路、論理回路、プログラマブルプロセッサ、プログラマブルコントローラ、GPU、DSP、ASIC、PLD、および/またはFPLDによって実装されてもよい。いくつかの例では、実行するため手段は、図15のブロック1508、図16のブロック1612、1614、1616、または図17のブロック1714のうちの少なくとも1つによって実装されてもよい。
【0082】
図4の示された例では、GLITエンジン102は、図1のGPU110に関連付けられた1つ以上の動作パラメータを判定するトレース分析器440を含む。いくつかの例では、トレース分析器440は、GPU状態、実行時間パラメータ、ビジー時間パラメータ、アイドル時間パラメータ、占有時間パラメータ、および/またはGPU110に関連付けられた利用率パラメータを判定するための手段を実装する。いくつかの例では、トレース分析器440は、GLIT112をリプレイすることによって、GPU110の動作のエミュレーションに基づいて1つ以上の動作パラメータを判定する。例えば、トレース分析器440は、第2のカーネル108を実行することに応答して、スレッド208のうちの第1のものに対応するGRFのレジスタ値における変化を識別することによって、図2のスレッド208のうちの第1のもののGPU状態を判定することができる。いくつかの例では、トレース分析器440は、第2のカーネル108を実行するのにスレッドのうちの第1のものが必要とする時間量を判定することによって、スレッド208のうちの第1のものの実行時間パラメータを計算することができる。いくつかの例では、トレース分析器440は、スレッド208のうちの第1のもののビジー時間と、関心対象の時間期間の合計時間との比率を計算することによって、スレッド208のうちの第1のものの利用率パラメータを判定することができる。
【0083】
いくつかの例では、トレース分析器440は、スレッド208のうちの2つ以上に基づく集約動作パラメータを判定する。例えば、トレース分析器440は、集約実行時間パラメータ、集約利用率パラメータなどを計算することができる。このような例では、トレース分析器440は、関心対象の持続期間または期間に対して、スレッド208のうちの1つ以上のビジーのものとスレッド208の総量との比率を計算することによって、集約利用率パラメータを判定することができる。
【0084】
いくつかの例では、トレース分析器440は、GPU状態に基づいてGPUの動作パラメータを判定するための手段を実装する。例えば、判定するための手段は、第1のGPU状態に基づいてGPUの利用率を判定することができる。いくつかの例では、判定するための手段は、1つ以上のアナログまたはデジタル回路、論理回路、プログラマブルプロセッサ、プログラマブルコントローラ、GPU、DSP、ASIC、PLD、および/またはFPLDによって実装されてもよい。いくつかの例では、判定するための手段は、図15のブロック1510または図17のブロック1716のうちの少なくとも1つによって実装されてもよい。
【0085】
図4の示された例では、GLITエンジン102は、GLIT112に基づいてGPU110および/またはCPU118の動作、GLIT112に関連付けられた1つ以上の動作パラメータなどを調整するハードウェア設定器450を含む。いくつかの例では、ハードウェア設定器450は、1つ以上の動作パラメータを図1のアプリケーション120に送達、提供、および/または他の方法で通信する。例えば、ハードウェア設定器450は、性能分析ツール(例えば、GPUプロファイリングツール)、性能分析ツールに含まれるグラフィカルユーザインターフェース(GUI)などを用いて、GPU110に関連付けられたGPU状態、ハードウェアスレッド利用率、実行ユニット利用率などを、開発者(例えば、ソフトウェア開発者、プロセッサ設計者、GPUエンジニアなど)に報告および/または他の方法で通信することができる。このような例では、開発者は、例えば、計算タスクのロードバランスを改善したり、GPU110のハードウェアスレッド、実行ユニットなどの間で異なるデータ分散を提供したりすることなどによって、ソフトウェアを改善することができる。
【0086】
いくつかの例では、ハードウェア設定器450は、ハードウェア、ソフトウェア、ファームウェア、および/またはハードウェア、ソフトウェア、および/またはファームウェアの任意の組み合わせ(例えば、GPUドライバ122、CPU118など)を呼び出して、GPU110の動作を改善することができる。例えば、ハードウェア設定器450は、図1のGPUドライバ122、CPU118などに対して命令(例えば、コマンド、1つ以上の機械可読命令など)を生成および送信することができる。命令を受信および/または他の方法で実行することに応答して、GPUドライバ122、CPU118などを呼び出して、GPU110の動作を調整するかどうかを判定することができる。例えば、GPUドライバ122、および/または、より一般的には、CPU118は、1つ以上の動作パラメータに基づいてGPU110によって実行される計算タスク、ジョブ、ワークロードなどのスケジューリングを調整するためにコールされてもよい。
【0087】
いくつかの例では、ハードウェア設定器450は、GLIT112に基づいて1つ以上の動作パラメータを分析するために、GPUドライバ122を呼び出す、および/または他の方法でこれに対して指示する。例えば、GPUドライバ122、および/または、より一般的には、CPU118は、動作パラメータを動作パラメータしきい値(例えば、GPU状態しきい値、実行時間しきい値、ビジー時間しきい値、アイドル時間しきい値、利用率しきい値など)と比較することができる。例えば、呼び出されたとき、GPUドライバ122、および/または、より一般的には、CPU118は、GPU110の利用率が、測定された時間間隔の95%がビジーであるGPU110に対応して95%であると判定することができる。GPUドライバ122は、95%の利用率を80%の利用率しきい値と比較し、利用率しきい値を満たす利用率に基づいてGPU110がより多くの計算タスクを受け入れるべきではないことを判定することができる。本明細書で使用される場合、ジョブまたはワークロードは、図2のスレッド208などの1つ以上のハードウェアスレッドによって実行される1つ以上の計算タスクのセットを指してもよい。
【0088】
いくつかの例では、ハードウェア設定器450によって呼び出されたときに、GPUドライバ122、および/または、より一般的には、CPU118は、GPU110の利用率が40%であると判定することができる。GPUドライバ122は、40%の利用率を80%の利用率しきい値と比較し、GPU110がより多くの計算タスクを実行するために利用可能な帯域幅を有することを判定することができる。例えば、GPUドライバ122は、40%の利用率が80%の利用率しきい値を満たさないと判定することができる。GPUドライバ122は、GPU110の利用率が利用率しきい値を満たさないと判定する事に応答して、GPU110によって実行されるタスクを容易にするために、リソースのスケジューリングを調整または修正することができる。例えば、GPUドライバ122は、GPU110が現在実行している、および/または実行する計算タスクの量を、図1のGLIT112に基づいて判定することができる利用率パラメータに基づいて増加させることができる。
【0089】
いくつかの例では、ハードウェア設定器450は、CPU118によるリソーススケジューリング(例えば、ハードウェアスケジューリング、メモリアロケーションなど)を改善および/または他の方法で最適化するための手段を実装する。例えば、開発者は、GPU110に関連付けられた1つ以上の動作パラメータを分析することによって、ハードウェアスケジューリング機能またはメカニズムを開発および/または改善することができる。
【0090】
いくつかの例では、ハードウェア設定器450は、GPU状態の第1の値に基づいてGPUのワークロードを制御するための手段を実装する。いくつかの例では、制御するための手段は、動作パラメータ(例えば、ビジー時間、利用率など)がしきい値を満たさないと判定することに応答して、GPU110によって実行されるルーチン(例えば、第2のカーネル108に含まれる1つ以上の命令)の調整または計算タスクの数の増加のうちの少なくとも1つを行って、GPU110のワークロードを制御する。いくつかの例では、制御するための手段は、1つ以上のアナログまたはデジタル回路、論理回路、プログラマブルプロセッサ、プログラマブルコントローラ、GPU、DSP、ASIC、PLD、および/またはFPLDによって実装されてもよい。いくつかの例では、制御するための手段は、図15のブロック1512、1514または図17のブロック1720のうちの少なくとも1つによって実装されてもよい。
【0091】
図4の例では、GLITエンジン102は、GLIT470などのデータを記録するストレージ460を含む。例えば、GLIT470は、図1のGLIT112のうちの1つ以上を含んでもよい。このような例では、GLIT470は、図3のGLITフォーマット300などの符号化されたバイナリフォーマットでストレージ460に記憶されてもよい。いくつかの例では、ストレージ460は、図1のレコード126の1つ(複数可)を記録、および/または他の方法で記憶し、これは、命令識別子、オペコード、および/または命令識別子のうちの1つ(複数可)および/またはオペコードのうちの1つ(複数可)に関連付けられたデータ、1つ以上のエミュレーションルーチン、1つ以上のエミュレーションルーチンのうちの1つ(複数可)と命令識別子のうちの1つ(複数可)および/またはオペコードなどのうちの1つ(複数可)および/またはそれらの組み合わせとの間の1つ以上の関連付けを含んでもよい。いくつかの例では、ストレージ460は、1つ以上のAPIを介してデータ転送を呼び出すコールバックルーチンを含み得るエミュレーションルーチンなどのエミュレーションルーチンの計装バージョンを記憶する。
【0092】
この例のストレージ460は、揮発性メモリ(例えば、SDRAM(SDRAM、Dynamic Random Access Memory)、DRAM(Dynamic Random Access Memory)、RDRAM(RAMBUS Dynamic Random Access Memory)など)および/または不揮発性メモリ(例えば、フラッシュメモリ)によって実装されてもよい。ストレージ460は、追加的または代替的に、DDR、DDR2、DDR3、DDR4、mDDR(mobile DDR)などの1つ以上の二重データ速度(DDR)メモリによって実装されてもよい。ストレージ460は、追加的または代替的に、ハードディスクドライブ(HDD)、コンパクトディスク(CD)ドライブ、デジタル多用途ディスク(DVD)ドライブ、ソリッドステートディスク(SSD)ドライブなどの1つ以上の大容量記憶デバイスによって実装されてもよい。図示された例では、ストレージ460は単一のストレージとして示されているが、ストレージ460は、任意の数(例えば、少なくとも1つの記憶ディスクまたは装置)および/または任意のタイプのストレージによって実装されてもよい。さらに、ストレージ460に記憶されるデータは、例えば、バイナリデータ、カンマ区切りデータ、タブ区切りデータ、構造化クエリ言語(SQL)構造などの任意のデータフォーマットであってもよい。
【0093】
図1のGLITエンジン102を実装する例示的な方式が図4に示されているが、図4に示された要素、プロセスおよび/またはデバイスのうちの1つ以上は、任意の他の方法で組み合わせ、分割、再配置、省略、除去および/または実装されてもよい。さらに、例示的な命令生成器410、例示的なトレース抽出器420、例示的なトレースエミュレータ430、例示的なトレース分析器440、例示的なハードウェア設定器450、例示的なストレージ460、例示的なGLIT470、および/または、より一般的には、図1の例示的なGLITエンジン102は、ハードウェア、ソフトウェア、ファームウェア、および/またはハードウェア、ソフトウェア、および/またはファームウェアの任意の組み合わせによって実装されてもよい。したがって、例えば、例示的な命令生成器410、例示的なトレース抽出器420、例示的なトレースエミュレータ430、例示的なトレース分析器440、例示的なハードウェア設定器450、例示的なストレージ460、例示的なGLIT470のうちのいずれか、および/または、より一般的には、例示的なGLITエンジン102は、1つ以上のアナログまたはデジタル回路、論理回路、プログラマブルプロセッサ、プログラマブルコントローラ、GPU、デジタルシグナルプロセッサ(DSP)、特定用途向け集積回路(ASIC)、プログラマブル論理デバイス(PLD)および/またはフィールドプログラマブル論理デバイス(FPLD)(例えば、フィールドプログラマブルゲートアレイ(FPGA))によって実装されてもよい。純粋にソフトウェアおよび/またはファームウェアの実装をカバーするために、本特許の装置またはシステムの請求項のいずれかを読むとき、例示的な命令生成器410、例示的なトレース抽出器420、例示的なトレースエミュレータ430、例示的なトレース分析器440、例示的なハードウェア設定器450、例示的なストレージ460、および/または例示的なGLIT470のうちの少なくとも1つは、ソフトウェアおよび/またはファームウェアを含むメモリ、DVD、CD、ブルーレイ(登録商標)ディスクなどの非一時的なコンピュータ可読記憶デバイスまたは記憶ディスクを含むように、本明細書により明確に定義される。さらに、図1の例示的なGLITエンジン102は、図4に示されたものに加えて、またはその代わりに、1つ以上の要素、プロセスおよび/またはデバイスを含んでもよく、および/または図示された要素、プロセスおよびデバイスのいずれかまたは全てのうちの1つ以上を含んでもよい。本明細書で使用される場合、「通信している」という語句は、その変形を含めて、1つ以上の中間構成要素を介した直接通信および/または間接通信を包含し、直接的な物理的(例えば、有線)通信および/または常時通信を必要とせず、むしろ、周期的な間隔、スケジューリングされた間隔、非周期的な間隔、および/または1回限りのイベントにおける選択的通信を含む。
【0094】
図5は、図1のGPU110またはその一部分、および/または図2のGPUスライス200またはその一部分を実装することができる例示的なシステム500の図である。この例では、システム500は、例示的な実行ユニットハードウェアスレッド502の動作を制御するために利用されてもよい。この例では、実行ユニットハードウェアスレッド502は、図2のスレッド208のうちの1つを実装してもよい。
【0095】
図5の示された例では、システム500は、実行ユニットハードウェアスレッド502、例示的なゲートウェイ共用機能504、例示的なスレッドディスパッチャ506、および例示的なデバイス508を含む。この例では、システム500は、実行ユニットハードウェアスレッド502の動作を修正および/または他の方法で制御するための、異なるメカニズム、技術などを示してもよい。
【0096】
図5の示された例では、システム500は、スレッド間通信制御を実装するゲートウェイ共用機能504を含む。この例では、ゲートウェイ共用機能504は、実行ユニットハードウェアスレッド502と非同期に通信する。代替的には、ゲートウェイ共用機能504は、同期ベースで実行ユニットハードウェアスレッド502と対話してもよい。いくつかの例では、ゲートウェイ共用機能504は、スレッド-スレッド(例えば、ハードウェアスレッド-ハードウェアスレッド)の同期を実施するハードウェアとして実装されてもよい。いくつかの例では、ゲートウェイ共用機能504は、遠隔レジスタ書き込み動作を容易にすることができる。例えば、ゲートウェイ共用機能504は、図2のスレッド208のうちの第1のものの第1のレジスタからの書き込み要求を取得し、その書き込み要求を図2のスレッド208のうちの第2のものの第2のレジスタに転送することができる。
【0097】
いくつかの例では、ゲートウェイ共用機能504は、直接レジスタアクセスに基づくアクティブなスレッド-スレッド通信を実装する。例えば、第1のスレッド(例えば、要求側スレッド)は、別のスレッド(例えば、受信側スレッド)のGRFレジスタ空間に書き込むことができてもよい。マルチプロセッサ環境における2つのスレッド間のこのような直接レジスタアクセスは、遠隔レジスタアクセスと呼ばれることがある。遠隔レジスタアクセスは、読み出し動作または書き込み動作を実装してもよい。いくつかの例では、GPU110のアーキテクチャは、遠隔レジスタ書き込みをサポートしてもよいが、(元々)遠隔レジスタ読み出しをサポートしなくてもよい例えば、ゲートウェイ共用機能504は、メッセージパッシングを介してこのような遠隔レジスタの書き込みを容易にする。いくつかの例では、要求側スレッドは、受信側スレッドのGRFレジスタ空間への書き込みを要求するメッセージをゲートウェイ共用機能504に送信してもよい。ゲートウェイ共用機能504は、要求側に代わってレジスタの書き込みを完了するために、受信側スレッドに書き込みメッセージを送信してもよい。要求側スレッドおよび受信側スレッドは、GPU110の同じ実行ユニット上または異なる実行ユニット上にあってもよい。
【0098】
図5の示された例では、システム500は、実行ユニットハードウェアスレッド502に入力ペイロード(例えば、入力データペイロード)として初期レジスタ値を提供するスレッドディスパッチャ506を含む。いくつかの例では、スレッドディスパッチャ506は、図2の固定機能ユニット207からのスレッド開始要求を調停し、実行ユニット204のスレッド208をインスタンス化するためのハードウェアの機能ユニットとして実装されてもよい。例えば、スレッドディスパッチャ506は、どの実行ユニット204のうちの1つ(複数可)とどの実行ユニット204のうちのスレッド208がジョブまたはソフトウェアスレッドをディスパッチするかについて判定することができる。いくつかの例では、スレッドディスパッチャ506は、スレッド208のうちのアイドルのものに初期GPU状態をロードし、判定に基づいてその実行を開始することができる。この例では、スレッドディスパッチャ506は、同期ベースで、実行ユニットハードウェアスレッド502のGRFおよび/またはARFなどのレジスタファイルに初期レジスタ値を提供する。いくつかの例では、スレッドディスパッチャ506は、図2のローカルスレッドディスパッチャ220を実装してもよい。
【0099】
図5の示された例では、システム500は、実行ユニットハードウェアスレッド502からのデバイスアクセス命令への応答を実行するデバイス508を含む。いくつかの例では、デバイス508は、図2のサンプラ216、図2のデータポート218、図2の共有ローカルメモリ214、および/または図2のキャッシュメモリ210を実装してもよい。いくつかの例では、デバイス508は、デバイスアクセス要求の実行を容易にする。例えば、デバイスアクセス要求は、実行ユニットハードウェアスレッド502に、デバイス508にデータを書き込む、および/または、ここからデータを読み出すことを行わせる任意の命令によって実装されてもよい。いくつかの例では、デバイスアクセス要求は、SEND命令、READ SEND命令、LOAD命令などによって実装されてもよい。例えば、実行ユニットハードウェアスレッド502は、図1の第2のカーネル108のようなカーネルの実行を完了することに応答してSEND命令を生成することによって、デバイスアクセス要求を実行してもよい。この例では、SEND命令はカーネルの実行を完了することに応答して生成されるため、SEND命令は消費時に既知である。
【0100】
いくつかの例では、SEND命令を実行することに応答して、実行ユニットハードウェアスレッド502は、実行ユニットハードウェアスレッド502に関連付けられた1つ以上のレジスタ値をデバイス508に送信してもよい。いくつかの例では、READ SEND命令を実行することに応答して、実行ユニットハードウェアスレッド502は、デバイス508に記憶された1つ以上のレジスタ値を要求してもよい。このような例では、デバイス508は、デバイス508に記憶された要求されたレジスタから読み出されたデータを実行ユニットのハードウェアスレッド502に送信することによって、READ SEND命令に対する応答を準備してもよい。
【0101】
いくつかの例では、図1のGLIT112は、実行ユニットハードウェアスレッド502の動作を修正および/または他の方法で制御するために、異なるメカニズム、技術などを捕捉してもよい。例えば、GLIT112は、第1の時間において実行ユニットハードウェアスレッド502の第1のGPU状態を含んでもよく、第1の時間は、第2のカーネル108を実行するための準備の際に、スレッドディスパッチャ506からの初期レジスタ値を受信するなどの初期化状態中に、実行ユニットハードウェアスレッド502のARFの第1の値、GRFの第1の値などに対応してもよい。いくつかの例では、GLIT112は、第1の時間の後の第2の時間において実行ユニットハードウェアスレッド502の第2のGPU状態含んでもよい。第2のGPU状態は、ゲートウェイ共用機能504が図2のスレッド208の異なる1つ(複数可)から1つ以上の遠隔レジスタ書き込み動作を実行することに応答して、ARFの第2の値、GRFの第2の値などに対応することができる。いくつかの例では、1つ以上の遠隔レジスタ書き込み動作は、GRFの第1の値のうちの1つ以上を、第2の値のうちの1つ以上に変更してもよい。いくつかの例では、GLIT112は、第2の時間の後の第3の時間において、実行ユニットハードウェアスレッド502の第3のGPU状態を含んでもよい。第3のGPU状態は、実行ユニットハードウェアスレッド502が、デバイス508を呼び出してARF、GRFなどからデータを読み出すSEND命令を生成することに応答して、ARFの第3の値、GRFの第3の値などに対応してもよい。
【0102】
図6は、図1のGPU110、図2のGPUスライス200、および/または図5の実行ユニットハードウェアスレッド502のための例示的なGLIT600の図である。いくつかの例では、図6のGLIT600は、図1のGLIT112の1つ(複数可)を実装してもよい。いくつかの例では、GLIT600は、図3のGLITフォーマット300に基づくフォーマットを有するバイナリカーネルで符号化されてもよい。例えば、GLIT600は、図2のスレッド208のうちの1つによる図1のカーネル108の例示的な実行を表す符号化されたバイナリファイルによって実装されてもよい。
【0103】
いくつかの例では、図1のGLIT112のうちの1つは、複数のバイナリカーネルを含んでもよい。いくつかの例では、GLIT600は、複数のバイナリカーネルのうちの1つを実装してもよい。有利には、図1の第2のカーネル108は、実行のために図2の複数のスレッド208に分散することができるため、複数のバイナリカーネルは、マルチスレッドGPUトレースを実装することができる。
【0104】
この例では、GLIT600は、図1のGPU110、図2のGPUスライス200などの例示的なプロセッサのハードウェアスレッド(例えば、図2のスレッド208、図5の実行ユニットハードウェアスレッド502など)上で動作する単一のソフトウェアスレッドのためのLITを実装してもよい。いくつかの例では、図2の実行ユニット204などの実行ユニットに対するGLITは、実行ユニット204のスレッド208のうちのものに対するGLITのグループまたはコレクションによって実装されてもよい。いくつかの例では、図2のサブスライス202などのサブスライスに対するGLITは、実行ユニット204のうちのものに対するGLITのグループまたはコレクションによって実装されてもよい。
【0105】
図3の示された例では、GLIT600は、ハードウェアスレッドのARFのレジスタの初期値およびハードウェアスレッドのGRFのレジスタの初期値に基づいた状態(例えば、GPU状態)を有するGPUを用いて例示的な開始点602において開始する。この例では、GRFのレジスタの初期値は、GRFのレジスタ全体に対するものであってもよい。代替的には、GRFのレジスタの初期値は、GRFの部分的な数のレジスタに対するものであってもよい。
【0106】
この例では、ARFのレジスタの初期値は、ARFのディスパッチマスクに対応する第1のレジスタ値、ハードウェアスレッド識別子(TID)に対応する第2のレジスタ値、実行マスクに対応する第3のレジスタ値、制御レジスタに対応する第4のレジスタ値など、ARFの部分的な数のレジスタに対するものであってもよい。代替的には、ARFのレジスタの初期値は、ARFのレジスタ全体に対するものであってもよい。
【0107】
GPU状態が開始点602において初期化された後、GLIT600は、開始点602の後の第1の時間における第1の例示的なイベント(EVENT 1)604、第1の時間の後の第2の時間における第2の例示的なイベント(EVENT 2)606、第2の時間の後の第3の時間における第3の例示的なイベント(EVENT 3)608、および第3の時間の後の第4の時間における第4の例示的なイベント(EVENT 4)610を含む。この例では、イベント604、606、608、610は、READ SEND命令であり、これは、外部ハードウェア(例えば、図5のデバイス508)のメッセージを、図2のサンプラ216および/またはキャッシュメモリ210などのハードウェアスレッドにメッセージを送信することを表すことができる。例えば、第1のイベント604は、DSTによって表されるハードウェアスレッドの宛先レジスタの値を用いて、キャッシュメモリ210などのグローバルメモリからの読み出しを表すことができる。別の例では、第2のイベント606は、DSTによって表されるハードウェアスレッドの宛先レジスタの値を用いて、図2のサンプラ216などのサンプラへのアクセスを表すことができる。追加的または代替的に、図6のGLIT600のようなGLITは、図6に示されているものよりも少ない、または多いイベントを含むことができる。
【0108】
有利には、図6のGLIT600に関連する情報は、図3のGLITフォーマット300のようなバイナリフォーマットで符号化され、図1のCPU118のようなプロセッサによる後のアクセスおよび/または引き出しのためにメモリ116にバイナリフォーマットで記憶される。例えば、開始点602におけるGRFレジスタ値、ARFレジスタ値などのGPU状態の初期値は、GLITフォーマット300を使用して符号化されてもよい。いくつかの例では、イベント604、606、608、610のうちの1つ(複数可)は、GLITフォーマット300を使用して記憶されてもよい。このような例では、イベント604、606、608、610のうちの1つ(複数可)の前および/または後のARFレジスタおよび/またはGRFレジスタの値などのレジスタ値が、GLITフォーマット300を使用して記憶されてもよい。
【0109】
図7は、図6のGLIT600を生成および分析するための例示的なシステム700の図である。図7のシステム700は、例示的なGPU702および例示的なCPU704を含む。いくつかの例では、GPU702は、図1のGPU110および/または図2のGPUスライス200を実装することができる。いくつかの例では、CPU704は、図1のCPU118を実装することができる。
【0110】
図7の示された例では、GPU702は、例示的なカーネル706を実行する。この例では、カーネル706は、図1の第2のカーネル108を実装することができ計装カーネルである。この例では、カーネル706は、GPU702の複数の例示的なハードウェアスレッド708によって分配され、および/または他の方法の実行のためにスケジューリングされる。例えば、スレッド708の各々は、図2のスレッド208のうちの1つによって実装されてもよい。この例では、ハードウェアスレッド708のうちの第1のものはTID 0のハードウェアスレッド識別子を有してもよく、ハードウェアスレッド708のうちの第2のものはTID 1のハードウェアスレッド識別子を有してもよく、ハードウェアスレッド708のうちの第NのものはTID Nのハードウェアスレッド識別子を有してもよい。
【0111】
図7の示された例では、ハードウェアスレッド708はカーネル706のインスタンスを実行し、それぞれの例示的なGLITデータ710を生成してもよい。例えば、ハードウェアスレッド708のうちの第1のものはGLIT DATA 0を生成および/または他の方法で出力することができ、ハードウェアスレッド708のうちの第2のものはGLIT DATA 1を生成および/また他の方法で出力することができ、ハードウェアスレッド708のうちの第NのものはGLIT DATA 2を生成および/または他の方法で出力することができる。いくつかの例では、GPU702は、GLITデータ710を、図1のメモリ116のトレースバッファ114におけるレコード126として記憶することができる。
【0112】
いくつかの例では、GLITデータ710は、GPU状態(例えば、ハードウェアスレッドの1つ以上のARFレジスタ値、1つ以上のGRFレジスタ値など)またはカーネル706に関連付けられたデータのうちの少なくとも1つを含んでもよい。例えば、カーネル706に関連付けられたデータは、カーネル706に含まれるGPU命令、命令に対応するオペコード、命令に対応する命令識別子などを含むことができる。いくつかの例では、GLITデータ710の一部分は、図1のレコード126のうちの1つ(複数可)、図3のレコード302のうちの1つ(複数可)などを実装することができる。例えば、GLIT DATA 0の第1の部分は、カーネル706の命令を含むことができ、これは、GPU702によって、図3のGLITフォーマット300のINST_DECODE INST0としてトレースバッファ114に記憶されてもよい。
【0113】
いくつかの例では、CPU704は、図1のメモリ116に格納されたトレースバッファ114などのメモリに記憶されたバッファからGLITデータ710を取得および/または他の方法で引き出し、GLITデータ710に基づいて例示のGLIT712を生成する。いくつかの例では、GLIT712は、図1のGLIT112を実装することができる。いくつかの例では、CPU704は、GLIT DATA 0に基づくハードウェアスレッド708のうちの第1のものに対応するGLIT712のうちの第1のもの、GLIT DATA 1に基づくハードウェアスレッド708のうちの第2のものに対応するGLIT712のうちの第2のもの、GLIT DATA Nに基づくハードウェアスレッド708のうちの第3のものに対応するGLIT712の第3のものなどを生成することができる。このような例では、GLIT712の第1のもの、GLIT712の第2のもの、GLIT712の第3のものなどは、図3のGLITフォーマット300に基づいてファイル(例えば、バイナリファイル)に、GLITデータ710のそれぞれのものを配置および/または他の方法で組織化することによって生成されてもよい。いくつかの例では、CPU704は、GLITフォーマット300に基づいてバイナリファイルに、GLIT DATA 0、GLIT DATA 1、GLIT DATA Nなどを配置および/または別様に組織化することによって、GLIT 712の第1の1つを生成することができる。
【0114】
この例では、CPU 704は、カーネル706の実行をシミュレートすることによって、GLIT712に基づいてGPU702によってカーネル706の実行をリプレイする例示的なGLITリプレイアプリケーション714を実装する。いくつかの例では、GLITリプレイアプリケーション714は、図1のアプリケーション120を実装することができる。例えば、GLITリプレイアプリケーション714は、カーネル706を実行するために利用されるGPUルーチン(GPU命令、GPUカーネルルーチンなど)のシミュレーションに対応するエミュレーションルーチン(例えば、エミュレーション命令、エミュレーションソフトウェアルーチンなど)を計装するソフトウェアアプリケーションとすることができる。
【0115】
いくつかの例では、計装エミュレーションルーチンは、例示的なAPI716を呼び出して、例示的なハードウェアプロファイリング分析ツール718と通信および/または他の方法でデータを送信する。例えば、GLITリプレイアプリケーション714は、第1のエミュレーション命令に含まれる命令(例えば、カーネル706の実行をシミュレートする命令)の実行前の第1のコールバックルーチン、および/または命令の実行後の第2のコールバックルーチンを用いて第1のエミュレーションルーチンを計装することができる。
【0116】
いくつかの例では、第1のコールバックルーチンを実行することに応答して、GLITリプレイアプリケーション714は、API716のうちの1つを呼び出して、第1のエミュレーションルーチンに含まれる命令の実行前のGPU702のGRFレジスタの第1の値に対応する第1のGPU状態をハードウェアプロファイリング分析ツール718に提供することができる。いくつかの例では、第2のコールバックルーチンを実行することに応答して、GLITリプレイアプリケーション714は、API716のうちの1つを呼び出して、第1のエミュレーションルーチンに含まれる命令の実行後のGRFレジスタの第2の値に対応する第2のGPU状態をハードウェアプロファイリング分析ツール718に提供することができる。いくつかの例では、第1のGPU状態は、第2のGPU状態と同じであってもよい。すなわち、GRFレジスタは、第1のエミュレーションルーチンを実行することに応答して変更されなかった。いくつかの例では、第1のGPU状態は、第2のGPU状態と異なってもよい。すなわち、GRFレジスタは、カーネル706の実行がGRFレジスタを修正したことを示すために、第1のエミュレーションルーチンを実行することに応答して変更された。
【0117】
いくつかの例では、ハードウェアプロファイリング分析ツール718は、図1のアプリケーション120によって実装されてもよい。例えば、ハードウェアプロファイリング分析ツール718は、カーネル706の実行のリプレイおよび/または他の方法でのエミュレーションに基づいてGPU702またはCPU704のうちの少なくとも1つの動作に対する改善を識別するために、カーネル706の実行のリプレイおよび/または他の方法のエミュレーションを分析するソフトウェアアプリケーションとすることができる。いくつかの例では、ハードウェアプロファイリング分析ツール718は、1つ以上のDLLによって実装されてもよい。追加的または代替的に、ハードウェアプロファイリング分析ツール718は、ニューラルネットワークプロセッサ、VPUなど、任意の他のタイプのハードウェアプロセッサの動作を分析してもよい。
【0118】
いくつかの例では、ハードウェアプロファイリング分析ツール718は、上述のように、GRFレジスタの変更に基づいて改善を識別することができる。いくつかの例では、ハードウェアプロファイリング分析ツール718は、GRFレジスタの変更が典型的なまたは予想される結果ではないと判定することができ、これは、GPU702による改善された実行のために、開発者に第2のカーネル108を修正するように通知することができる。いくつかの例では、ハードウェアプロファイリング分析ツール718は、GRFレジスタにおける検出された変更がないことが、カーネル706のGPU702のハードウェアスレッドへの分配が効率的な分配ではないことを示すと判定することができ、これは、カーネル706の分配を改善するために、開発者に第2のカーネル108のスケジューリングを修正するように開発者に通知することができる。
【0119】
図8は、図6のGLIT600をエミュレートおよび分析するための別の例示的なシステム800の図である。例えば、図8のシステム800は、図7のシステム700またはその一部を実装してもよい。この例では、システム800は、例示的なGLITリプレイアプリケーション802と、複数の例示的なツール804、806、808とを含む。例えば、GLITリプレイアプリケーション802は、図7のGLITリプレイアプリケーション714を実装してもよい。いくつかの例では、ツール804、806、808は、図7のハードウェアプロファイリング分析ツール718を実装してもよい。例えば、ツール804、806、808のうちの1つ以上は、GLIT810に記憶および/または他の方法で含まれるデータを使用して実行をリプレイすることによって、GPUによるカーネルの実行を分析するソフトウェアアプリケーションとして実装されてもよい。いくつかの例では、ツール804、806、808のうちの1つ以上は、カーネルの実行の異なる分析を実施する1つ以上のDLLとして実装されてもよい。例えば、ツール804、806、808のうちの第1のツール804は、第1のセットの分析ルーチン、機能などを使用してカーネルの実行をプロファイリングすることができ、ツール804、806、808のうちの第2のツール806は、第2のセットの分析ルーチン、機能などを使用してカーネルの実行をプロファイリングすることができ、および/またはツール804、806、808のうちの第3のツール808は、第3のセットの分析ルーチン、機能などを使用してカーネルの実行をプロファイリングすることができ、第1のセット、第2のセット、および/または第3のセットのうちの1つ以上は、互いに異なってもよい。
【0120】
図8の示した例では、GLITリプレイアプリケーション802は、例示的なGLIT810を取得する。例えば、GLIT810は、図1のGLIT112、図4のGLIT470、図6のGLIT600、および/または図7のGLIT712を実装してもよい。いくつかの例では、GLIT810は、符号化されたバイナリカーネルであってもよく、GLITリプレイアプリケーション802は、GLIT810を復号してもよい。例えば、GLITリプレイアプリケーション802は、図3のGLITフォーマット300などのバイナリフォーマットで記憶されたデータを解凍および/または他の方法で抽出してもよい。いくつかの例では、GLITリプレイアプリケーション802は、抽出されたデータの一部分を、図1のGPU110などのGPU、図2のGPUスライス200などのGPUのスライスの例示的なハードウェアスレッド識別子(TID0~TIDN)812に関連付けることができる。
【0121】
図8の示されたでは、GLITリプレイアプリケーション802は、1つ以上の例示的なAPI814を介してツール804、806、808のうちの1つ(複数可)と通信している。例えば、GLITリプレイアプリケーション802は、計装エミュレーションルーチンの実行の前および/または後に、コールバックルーチンを含めることによって、GPUカーネルの実行をシミュレートするエミュレーションルーチンを計装することができる。いくつかの例では、コールバックルーチンは、「CALLBACKBEFORE()」コールバックルーチンを含んでもよく、これは、実行されるときに、計装エミュレーションルーチンに含まれた命令を実行する前に、API814の第1のものを呼び出して、ツール804、806、808の対応するものにGPU状態などのデータを提供してもよい。例えば、「CALLBACKBEFORE()」コールバックルーチンは、GPU状態を提供するために「GETSTATE()」を呼び出してもよい。いくつかの例では、コールバックルーチンは、「CALLBACKAFTER()」コールバックルーチンを含んでもよく、これは、実行されるときに、計装エミュレーションルーチンに含まれた命令を実行した後に、API814の第2のものを呼び出して、ツール804、806、808の対応するものにGPU状態などのデータを提供してもよい。例えば、「CALLBACKAFTER()」コールバックルーチンは、「GETSTATE()」を呼び出して、GPU状態を提供してもよい。追加的または代替的に、図8に示されるAPI814よりも少ない、または多いAPI814が使用されてもよい。追加的または代替的に、図8に示されるAPI814とは異なる1つ以上のAPI814が使用されてもよい。例えば、1つ以上のAPI814は、カーネルの1つ以上の場所に機械可読コード(例えば、Cコード、C++コードなど)を挿入するために使用され得るPIN APIを用いて実装されてもよい。
【0122】
図9は、図1のGPU110などのGPU、図2のGPUスライス200などのGPUのスライス、および/または図7のGPU702によって実行され得る第1の例のカーネル902および第2の例のカーネル904を示す。この例では、第1のカーネル902は、非計装カーネルを実装してもよい。例えば、第1のカーネル902は、図1の第1のカーネル106を実装してもよい。この例では、第2のカーネル904は、図1の第2のカーネル108および/または図7のカーネル706などの計装カーネルを実装してもよい。この例では、第2のカーネル904は、第1のカーネル902の計装バージョンに対応してもよい。
【0123】
図9の示された例では、第1のカーネル902は、移動命令(MOV)、or命令(OR)、乗算(MUL)命令、およびand(AND)命令などの例示的な命令を含む。MOV、OR、MUL、およびAND命令を実行することに応答して、第1のカーネル902は、第1のSEND命令(SEND)および第2のSEND命令(SEND)の実行を引き起こす。この例では、SEND命令は、図2のキャッシュメモリ210、図5のデバイス508などのグローバルメモリからの読み出し命令である。この例では、第1のSEND命令は、2つの32バイト幅レジスタ(例えば、グローバルメモリのレジスタr12は32バイト幅、グローバルメモリのr13は32バイト幅、など)の第1の読み出し動作を実装する。この例では、第2のSEND命令は、2つの32バイト幅のレジスタ(例えば、グローバルメモリのレジスタr9およびr10)の第2の読み取り動作を実装する。
【0124】
図9の示された例では、第2のカーネル904は、第1のカーネル902のMOV、OR、MUL、およびSEND命令を含む。この例では、第2のカーネル904は、図1のGLIT112、図6のGLIT600などの例示的なGLITを生成する例示的な計装命令(TRACE)906、908、910を含む。この例では、計装命令906、908、910は、第1の例示的なトレース命令(TRACE(TID, R0-R15, CE, DMASK...))906を含み、GRFレジスタの全入力ペイロードおよび第2のカーネル904を実行するGPUのハードウェアスレッドに関連付けられたARFレジスタの一部またはサブセットをトレースする。例えば、第1のトレース命令906は、ハードウェアスレッドのGRFのレジスタr0~r15、および少なくともハードウェアスレッドのARFのCEおよびDMASKレジスタを読み出すことができる。このような例では、r0~r15で表される入力ペイロードは、16個の32バイトレジスタ(例えば、r0、r1、r2、. . . r15)を含むことができる。
【0125】
示された例では、計装命令906、908、910は、第1のSEND命令の実行後に結果として生じる宛先値をトレースする第2の例示的なトレース命令908を含む。例えば、第1のSEND命令を実行することに応答して、第2のトレース命令908は、宛先レジスタの結果として得られる値(例えば、グローバルメモリのr12およびr13)を取得することができる。いくつかの例では、第2のトレース命令908は、実行されるときに、トレース記録(例えば、図1のレコード126のうちの1つ、図3のレコード302のうちの1つなど)を生成して、第2のカーネル904を実行したハードウェアスレッドのTIDと、第1のカーネル902内の元の命令の第1のオフセット(例えば、第1のオフセット値)とを含むことができる。
【0126】
示された例では、計装命令906、908、910は、第2のSEND命令の実行後に結果として生じる宛先値をトレースする第3の例示的なトレース命令910を含む。例えば、第2のSEND命令を実行することに応答して、第3のトレース命令910は、宛先レジスタの結果として得られる値(例えば、グローバルメモリのr9およびr10)を取得することができる。いくつかの例では、第3のトレース命令910は、実行されるときに、トレース記録(例えば、図1のレコード126のうちの1つ、図3のレコード302のうちの1つなど)を生成して、第2のカーネル904を実行したハードウェアスレッドのTIDと、第1のカーネル902内の元の命令の第2のオフセット(例えば、第2のオフセット値)とを含むことができる。有利には、トレースレコードの順序は、オフセットゼロに対応し、これは、ソフトウェアスレッドディスパッチの順序を提供することができる。例えば、第2のカーネル904のディスパッチ順序は、オフセットゼロに関する第1のオフセット値および第2のオフセット値に基づいて判定されてもよい。
【0127】
図10は、図1の第2のカーネル108、図7のカーネル706、および/または図9の第2のカーネル904などの計装GPUカーネルの実行をエミュレートするための例示的なワークフロー1000の図である。例えば、ワークフロー1000は、図1および/または図4のGLITエンジン102によって実装されてもよい。この例では、ワークフロー1000は、例示的なカーネル命令スタティックデータ1002、例示的なオペコードエミュレーションテーブル1004、例示的なエミュレーションルーチン1006、および例示的なGPU状態1008、1010によって実装される。代替的には、計装GPUカーネルの実行をエミュレートするために、任意の他の例示的なワークフローが利用されてもよい。
【0128】
図10の示された例では、カーネル命令スタティックデータ1002は、バイナリカーネルから復号された命令に対応し得る。例えば、第2のカーネル108は、複数の例示的な符号化された命令をバイナリフォーマットで含むことができる。いくつかの例では、図4のトレース抽出器420は、カーネル命令スタティックデータ1002を生成するために、第2のカーネル108から符号化命令を抽出および/または他の方法で復号することができる。この例では、カーネル命令スタティックデータ1002は、インデックスとして第1の命令識別子(INST 0)を有する第1の例示的な命令を含み、これは図1の第2のカーネル108からの第1の復号された命令に対応することができる。例えば、INST 0は、図9の第2のカーネル904の第1のSEND命令(例えば、SEND(16)R12 R6 0XC 0X4205E00)に対応することができる。
【0129】
図10の示された例では、オペコードエミュレーションテーブル1004は、図1のGPU110のアーキテクチャなどの特定のGPUアーキテクチャによってサポートされるオペコードに対応することができる。この例では、オペコードエミュレーションテーブル1004は、第1の例示的なオペコード(OPCODE 0)を含み、これは、GPU110がサポートする、および/または他の方法で呼び出し時に実行するように構成される、第1のタイプの命令に対応することができる。
【0130】
図10の示された例では、エミュレーションルーチン1006は、実行されるときに、GPU110が実行するように構成される第2の命令の実行をシミュレートすることができる第1の命令(例えば、機械可読命令)に対応することができる。この例では、エミュレーションルーチン1006は、第1の例示的なエミュレーションルーチン(ADD_EMUL)を含み、これは、GPU110がサポートする、および/または他の方法で呼び出し時に実行するように構成される追加動作のエミュレーションに対応することができる。この例では、オペコードエミュレーションテーブル1004におけるオペコードは、エミュレーションルーチン1006のそれぞれのものに対応する。例えば、OPCODE 0はADD_EMULに対応し、OPCODE 1はSUB_EMULに対応するなどである。
【0131】
図10の示された例では、GPU状態1008、1010は、例示的なGRF状態1008および例示的なARF状態1010を含む。この例では、GRF状態1008は、図2のスレッド208のうちの1つなど、GPUのハードウェアスレッドによって実装されたGRFに記憶されたレジスタの値である。この例では、GRF状態1008は、128レジスタ(r0~127)を用いて実装される。この例では、ARF状態1010は、図2のスレッド208のうちの1つなど、GPUのハードウェアスレッドによって実装されたARFに記憶されたレジスタの値である。
【0132】
この例では、ARF状態1010はARFの一部分を含む。例えば、ARFの部分は、第1の浮動小数点飽和範囲の第1の端部の値を記憶する第1のレジスタ値(F0.0)、第1の浮動小数点飽和範囲の第2の端部の値を記憶する第2のレジスタ値(F0.1)、第2の浮動小数点飽和範囲の第1の端部の値を記憶する第3のレジスタ値(F1.0)、第2の浮動小数点飽和範囲の第2の端部の値を記憶する第4のレジスタ値(F1.1)、命令ポインタの値を記憶する第5のレジスタ値(IP)、DMASKレジスタの値を記憶する第6のレジスタ値、CEレジスタの値を記憶する第7のレジスタ値、累積レジスタの値を記憶する第8のレジスタ値(ACC0)、アドレスレジスタを記憶する第9のレジスタ値(A0)、通知レジスタ(N0)、および実行マスクの値を記憶する第10のレジスタ値を含む。 一例として、IPレジスタは、GPUのメモリ内の現在の命令を参照するポインタを実装することができる。いくつかの例では、スレッド208の各々は、それら自身のIPを有してもよい。追加的または代替的に、ARFの部分は、図10の例に示されるよりも少ない、または多いARF状態を含むことができる。
【0133】
例示的な動作において、図4のトレース抽出器420は、図6のGLIT600などGLITを復号して、復号されたバイナリデータおよびGPU状態を生成および/または他の方法で出力することができる。いくつかの例では、トレース抽出器420は、命令識別子をインデックスとして利用するカーネル命令スタティックデータ1002として、復号されたバイナリデータの部分を記憶する。いくつかの例では、トレース抽出器420は、復号されたバイナリデータの一部分をGPU状態1008、1010として記憶する。いくつかの例では、トレース抽出器420は、カーネル命令スタティックデータ1002のうちの1つ(複数可)、オペコードエミュレーションテーブル1004の中のオペコード、エミュレーションルーチン1006のうちの1つ(複数可)、および/またはGPU状態1008、1010のうちの1つ(複数可)を関連付ける。例えば、トレース抽出器420は、INST 0がOPCODE 0に対応し、OPCODE 0がADD_EMULに対応すると判定することができる。このような例では、トレース抽出器420は、INST 0、OPCODE 0、ADD_EMUL、またはGPU状態1008、1010のうちの対応するもののうちの少なくとも1つの関連付けを記憶することができる。例えば、トレース抽出器420は、関連付を図4のストレージ460に記憶することができる。
【0134】
例示的な動作では、図4のトレースエミュレータ430は、カーネル命令スタティックデータ1002および/またはGPU状態1008、1010が生成されるGPUカーネルの実行をエミュレートすることができる。いくつかの例では、トレースエミュレータ430は、実行するINST 0を選択することによって、GLIT600などのGLITをリプレイすることができる。いくつかの例では、実行するINST 0を選択することに応答して、トレースエミュレータ430は、ADD_EMULの第1のエミュレーションルーチンをコールし、第1のエミュレーションルーチンに引数としてINST 0、OPCODE 0、またはGPU状態1008、1010うちの対応もののうちの少なくとも1つを入力する。有利には、トレースエミュレータ430は、カーネル命令スタティックデータ1002に含まれる情報によって表され得る、GPUカーネルの命令に対応するエミュレーションルーチン1006におけるエミュレーションルーチンの1つ(複数可)を実行(例えば、反復的に実行)することによって、図1の第2のカーネル108などのGPUカーネルの実行をリプレイすることができる。
【0135】
図1および/または図4の例示的なGLITエンジン102を実装するための例示的なハードウェア論理、機械可読命令、ハードウェア実装状態マシン、および/またはそれらの任意の組み合わせを表すソースコードおよび/またはフローチャートを図11~17に示す。機械可読命令は、コンピュータプロセッサおよび/またはプロセッサ回路、例えば図18に関連して後述する例示的なプロセッサプラットフォーム1800に示されるプロセッサ1812による実行のための実行可能プログラムの1つ以上の実行可能プログラムまたは一部分であってもよい。プログラムは、CD-ROM、フロッピーディスク、ハードドライブ、DVD、ブルーレイディスク、またはプロセッサ1812に関連付けられたメモリなどの非一時的コンピュータ可読記憶媒体に記憶されたソフトウェアで実現されてもよいが、代替的に、プログラム全体および/またはその一部分は、プロセッサ1812以外のデバイスによって実行され、および/またはファームウェアまたは専用ハードウェアで実現されてもよい。さらに、例示的なプログラムは、図11~17に示すソースコードおよび/またはフローチャートを参照して説明されているが、例示的なGLITエンジン102を実装する多くの他の方法を代替的に使用することもできる。例えば、ブロックの実行順序を変更することができ、および/または説明したブロックのいくつかを変更、削除、または組み合わせることができる。追加的または代替的に、ブロックのいずれかまたは全部は、ソフトウェアまたはファームウェアを実行することなく対応する動作を実行するように構造化された1つ以上のハードウェア回路(例えば、離散および/または集積アナログおよび/またはデジタル回路、FPGA、ASIC、比較器、演算増幅器(op-amp)、論理回路など)によって実装されてもよい。プロセッサ回路は、異なるネットワーク位置に分配されていてもよく、および/または1つ以上のデバイス(例えば、単一機械のマルチコアプロセッサ、サーバラックに分配された複数のプロセッサなど)にローカルに分配されていてもよい。
【0136】
本明細書で説明される機械可読命令は、圧縮フォーマット、暗号化フォーマット、フラグメント化フォーマット、コンパイルされたフォーマット、実行可能フォーマット、パッケージされたフォーマットなどのうちの1つ以上で記憶されてもよい。本明細書で説明される機械可読命令は、データ、または機械実行可能な命令を作成、製造、および/または生成するために利用され得るデータ構造(例えば、命令の部分、コード、コードの表現など)として記憶されてもよい。例えば、機械可読命令は、フラグメント化され、ネットワークまたはネットワークの集合(例えば、クラウド、エッジデバイスなど)の同じまたは異なる位置に配置された1つ以上の記憶デバイスおよび/または計算デバイス(例えば、サーバ)に記憶されてもよい。機械可読命令は、計算デバイスおよび/または他の機械によって直接読取可能、解釈可能、および/または実行可能にするために、インストール、修正、適応、更新、組み合わせ、補足、設定、復号化、解凍、アンパッキング、分配、再割り当て、コンパイルなどの1つ以上を必要としてもよい。例えば、機械可読命令は、個別に圧縮され、暗号化され、別々の計算デバイスに記憶される複数の部分に記憶されてもよく、この部分は、復号化され、解凍され、組み合わされたときに、一緒に本明細書に説明されたようなプログラムを形成することができる1つ以上の機能を実装する実行可能命令のセットを形成する。
【0137】
別の例では、機械可読命令は、それらがプロセッサ回路によって読み出され得る状態で記憶されてもよいが、特定の計算デバイスまたは他のデバイス上で命令を実行するために、ライブラリ(例えば、DLL)、ソフトウェア開発キット(SDK)、APIなどの追加を必要としてもよい。別の例では、機械可読命令(例えば、記憶された設定、データ入力、記録されたネットワークアドレスなど)が、機械可読命令および/または対応するプログラムが、全体的にまたは部分的に実行され得る前に、設定される必要があってもよい。したがって、本明細書で使用される機械可読媒体は、機械可読命令および/またはプログラムを、機械可読命令および/またはプログラムの特定のフォーマットまたは状態にかかわらず、静止時または輸送中に記憶されるか、またはそうでないときに含むことができる。
【0138】
本明細書で説明される機械可読命令は、過去、現在、または将来の命令言語、スクリプト言語、プログラミング言語などによって表すことができる。例えば、機械可読命令は、C、C++、Java、C#、Perl、Python、JavaScript、HTML(HyperText Markup Language)、SQL(Structured Query Language)、Swiftなどの言語のいずれかを使用して表わされてもよい。
【0139】
上述したように、図11~17の例示的なプロセスは、HDD、フラッシュメモリ、リードオンリーメモリ、CD、DVD、キャッシュ、ランダムアクセスメモリ、および/または任意の他の記憶デバイスもしくは記憶ディスクのような非一時的コンピュータおよび/または機械可読媒体に記憶された実行可能な命令(例えば、コンピュータおよび/または機械可読命令)を使用して実装されてもよく、これらの記憶デバイスまたは記憶ディスクには、情報が任意の持続時間(例えば、長期間、永久、短時間、短い瞬間、一時的にバッファ、および/または情報のキャッシュ)記憶される。本明細書で使用される場合、用語の非一時的コンピュータ可読媒体は、任意のタイプのコンピュータ可読記憶デバイスおよび/または記憶ディスクを含み、伝搬信号を排除し、伝送媒体を排除するように明確に定義される。
【0140】

含む(including)」および「含む(comprising)」(およびそのすべての形式およびテンス)は、本明細書では、オープンエンドの用語として使用される。したがって、請求項「が「含む(include)」または「含む(comprise)」(例えば、comprises、includes、comprising、including、havingなどを含む)のいずれかの形式をプリアンブルとして、または任意の種類の請求項の記載内で使用するときにはいつでも、追加の要素、用語などが、対応する請求項または記載の範囲を超えることなく存在し得ることが理解されるべきである。本明細書で使用される場合、例えば、クレームのプリアンブルにおいて、移行句として「少なくとも」という句が使用されるときに、それは、用語「comprising」および「including」がオープンエンドであるのと同じようにオープンエンドである。用語「および/または」は、例えば、A、B、および/またはCなどの形式で使用されるときに、(1)Aのみ、(2)Bのみ、(3)Cのみ、(4)AとB、(5)AとC、(6)BとC、(7)AとBとCなど、A、B、Cの任意の組み合わせまたはサブセットを指す。構造、構成要素、品目、物体、および/または物を説明する文脈において本明細書で使用される場合、語句「AおよびBのうちの少なくとも1つ」は、(1)少なくとも1つのA、(2)少なくとも1つのB、(3)少なくとも1つのAと少なくとも1つのBのいずれかを含む実装を指すことを意図している。同様に、構造、構成要素、品目、物体、および/または物を説明する文脈において本明細書で使用される場合、語句「AまたはBのうちの少なくとも1つ」は、(1)少なくとも1つのA、(2)少なくとも1つのB、(3)少なくとも1つのAと少なくとも1つのBのいずれかを含む実装を指すことを意図している。プロセス、命令、アクション、アクティビティおよび/またはステップの実行(performance or execution)を説明する文脈において本明細書で使用される場合、語句「AおよびBのうちの少なくとも1つ」は、(1)少なくとも1つのA、(2)少なくとも1つのB、(3)少なくとも1つのAと少なくとも1つのBのいずれかを含む実装を指すことを意図している。同様に、プロセス、命令、アクション、アクティビティおよび/またはステップの実行を説明する文脈において本明細書で使用される場合、語句「AまたはBのうちの少なくとも1つ」は、(1)少なくとも1つのA、(2)少なくとも1つのB、(3)少なくとも1つのAと少なくとも1つのBのいずれかを含む実装を指すことを意図している。
【0141】
本明細書で使用される場合、単数形の参照(例えば、「a」、「an」、「第1」、「第2」など)は、複数を除外しない。用語「a」または「an」のエンティティは、本明細書で使用される場合、そのエンティティの1つ以上を指す。用語「a」(または「an」)、「1つ以上」、および「少なくとも1つ」は、本明細書で互換的に使用されることがある。さらに、個々に列挙されているが、複数の手段、要素、または方法アクションは、例えば、単一のユニットまたはプロセッサによって実装されてもよい。さらに、個々の特徴は、異なる例または請求項に含まれてもよいが、これらは、組み合わされ得るものであり、異なる例または請求項に含まれることは、特徴の組み合わせが実行不可能および/または有利であることを示唆しない。
【0142】
図11は、図1の第2のカーネル108、図7のカーネル706、および/または図9の第2のカーネル904などの例示的な計装カーネルの実行をエミュレートするための例示的なソースコード1100を示す。代替的には、計装カーネルの実行をエミュレートするために、任意の他のソースコードが実行されてもよい。いくつかの例では、図11のソースコード1100は、図4のトレースエミュレータ430、および/または、より一般的には、図1および/または図4のGLITエンジン102によって実行され得る機械可読命令を表してもよい。例えば、トレースエミュレータ430は、ソースコード1100を実行して、図1のGPU110などのGPUによって実行される計装カーネルに含まれる命令をエミュレート(例えば、反復的にエミュレート)してもよい。
【0143】
いくつかの例では、ソースコード1100を実行することに応答して、トレースエミュレータ430は、図10のカーネル命令スタティックデータ1002に含まれる命令のうちの1つを選択することができる。例えば、トレースエミュレータ430は、INST 0に対応する命令を選択することができる。いくつかの例では、ソースコード1100を実行することに応答して、トレースエミュレータ430は、INST 0に対応する命令がグローバルメモリ(例えば、キャッシュメモリ210)またはサンプラ(例えば、図2のサンプラ216)へのSEND命令であるかどうかを判定することができる。トレースエミュレータ430が、命令がグローバルメモリまたはサンプラへのSEND命令であると判定する場合、トレースエミュレータ430は、トレースからレジスタ値を更新することができる。例えば、トレースエミュレータ430は、命令を実行する前および/または実行した後に、GPU状態1008、1010に基づいてレジスタ値を更新することができる。
【0144】
いくつかの例では、トレースエミュレータ430が、命令がグローバルメモリまたはサンプラへのSEND命令でないと判定する場合、トレースエミュレータ430は、命令をエミュレートすることができる。例えば、トレースエミュレータ430は、命令をエミュレートするためにエミュレーションルーチンテーブル1006のエミュレーションルーチンのうちの1つを呼び出すことによって命令をエミュレートしてもよい。この例では、トレースエミュレータ430は、図10のカーネル命令スタティックデータ1002に含まれる命令のうちの1つ以上に対してソースコード1100を実行(例えば、反復的に実行)してもよい。
【0145】
図12は、例示的なソフトウェアスレッドの実行をエミュレートするための例示的なソースコード1200を示す。代替的には、ソフトウェアスレッドの実行をエミュレートするために、任意の他のソースコードが実行されてもよい。いくつかの例では、図12のソースコード1200は、図4のトレースエミュレータ430、および/または、より一般的には、図1および/または図4のGLITエンジン102によって実行され得る機械可読命令を表してもよい。例えば、トレースエミュレータ430は、ソースコード1200を実行して、第2のカーネル108などのカーネルを、カーネルに含まれる命令をエミュレートすることによって、スレッド208のうちの1つなどのハードウェアスレッドにディスパッチするインスタンスをエミュレートしてもよい。
【0146】
いくつかの例では、ソースコード1200を実行することに応答して、トレースエミュレータ430は、命令のうちの1つに対応するオフセット識別子(例えば、オフセット値) (OffsetToID)を判定することによって、カーネルに含まれる命令をエミュレートする。例えば、トレースエミュレータ430は、ARFのIPレジスタ値のGPU状態(State.IP)に基づいてオフセット識別子を判定してもよい。いくつかの例では、ソースコード1200を実行することに応答して、トレースエミュレータ430は、命令識別子に基づいて、図10のINST 0などの命令(ins)を返す。いくつかの例では、ソースコード1200を実行することに応答して、トレースエミュレータ430は、命令に基づいてオペコードを識別する。いくつかの例では、ソースコード1200を実行することに応答して、トレースエミュレータ430は、オペコードに基づいてエミュレーションルーチンテーブル1006のエミュレーションルーチンのうちの1つを識別する。いくつかの例では、ソースコード1200を実行することに応答して、トレースエミュレータ430は、例示的な引数として命令および1つ以上のGPU状態(State)を利用して、識別されたエミュレーションルーチンのうちの1つを実行する。この例では、トレースエミュレータ430は、カーネルの最後の命令が実行されることに応答して生成され得るEOT(end-of-time)命令が生成されるまで、ソースコード1200を実行(例えば、反復的に実行)してもよい。例えば、EOT命令は、INST Nがエミュレートされることに応答して、生成されてもよい。
【0147】
図13は、例示的な計装ソフトウェアスレッドの実行をエミュレートするための例示的なソースコード1300を示す。代替的には、計装ソフトウェアスレッドの実行をエミュレートするために、任意の他のソースコードが実行されてもよい。いくつかの例では、図13のソースコード1300は、図4のトレースエミュレータ430、および/または、より一般的には、図1および/または図4のGLITエンジン102によって実行され得る機械可読命令を表してもよい。例えば、トレースエミュレータ430は、ソースコード1300を実行して、第2のカーネル108などのカーネルを、カーネルに含まれる命令をエミュレートすることによって、スレッド208のうちの1つなどのハードウェアスレッドにディスパッチするインスタンスをエミュレートしてもよい。
【0148】
いくつかの例では、ソースコード1300は、図12のソースコード1200を、第1の例示的な計装ルーチン(例えば、計装ルーチン、計装命令など)1302と、第2の例示的な計装ルーチン1304を用いて計装することによって実施されてもよい。例えば、トレースエミュレータ430は、エミュレーションルーチン(EmulRoutines)を実行する前に第1の計装ルーチン1302を実行し、エミュレーションルーチンを実行した後に第2の計装ルーチン1304を実行することができる。
【0149】
いくつかの例では、第1の計装ルーチン1302を実行することに応答して、トレースエミュレータ430は、コールバックルーチン(例えば、「CallbackBefore();」)を呼び出して、APIを呼び出して、図1のアプリケーション120、図7のハードウェアプロファイリング分析ツール718などの、ソフトウェアスレッドを実行したハードウェアスレッドのGPU状態を上位レベル構成要素に提供することができる。
【0150】
いくつかの例では、第2の計装ルーチン1304を実行することに応答して、トレースエミュレータ430は、コールバックルーチン(例えば、「CallbackAfter();」)を呼び出して、APIを呼び出して、図1のアプリケーション120、図7のハードウェアプロファイリング分析ツール718などの、ソフトウェアスレッドを実行したハードウェアスレッドのGPU状態を上位レベル構成要素に提供することができる。有利には、コールバックルーチンを上位レベル構成要素に登録することによって、トレースエミュレータ430は、エミュレーションルーチンを実行する前および/または実行した後に、ハードウェアスレッドのGPU状態を提供して、エミュレーションルーチンを実行することに応答したGPU状態の変更を判定することができる。
【0151】
図14は、エミュレーションルーチンを実装するための例示的なソースコード1400を示す。代替的には、エミュレーションルーチンを実装するために、他のソースコードが実行されてもよい。いくつかの例では、ソースコード1400は、図10のエミュレーションルーチンテーブル1006および/または図13のエミュレーションルーチン(EmulRoutines)におけるエミュレーションルーチンのうちの1つ(複数可)を実装してもよい。いくつかの例では、図14のソースコード1400は、図1の第2のカーネル108に含まれる命令などのGPUカーネル命令の実行をシミュレートするために、図4のトレースエミュレータ430、および/または、より一般的には、図1および/または図4のGLITエンジン102によって実行され得る機械可読命令を表してもよい。
【0152】
いくつかの例では、ソースコード1400を実行することに応答して、トレースエミュレータ430は、第1のソースオペランド(src0)および第2のソースオペランド(src1)を判定することによって、命令のエミュレーションのためのデータを準備してもよい。例えば、トレースエミュレータ430は、GPUカーネル命令を実行したハードウェアスレッドに関連付けられたGRF状態などの第1のGPU状態に基づいて第1のソースオペランドを判定してもよい。いくつかの例では、ソースコード1400を実行することに応答して、トレースエミュレータ430は、GPUカーネル命令を実行したハードウェアスレッドに関連付けられたARF状態などの第2のGPU状態に基づいて第2のソースオペランドを判定してもよい。
【0153】
いくつかの例では、ソースコード1400を実行することに応答して、トレースエミュレータ430は、実行マスク(exec_mask)、宛先レジスタ(dst)、および次のIPレジスタ(next_ip)を判定することによって、命令をエミュレートしてもよい。いくつかの例では、ソースコード1400を実行することに応答して、トレースエミュレータ430は、GPU状態、宛先レジスタ、および処理する次のIPレジスタに基づいて、新しいGPU状態をコミットしてもよい。例えば、トレースエミュレータ430は、後続の処理および/または分析のために新しいGPU状態を記憶してもよい。
【0154】
図15は、GPUの動作を改善するために、図1および/または図4のGLITエンジン102を実装するように実行され得る機械可読命令1500を表すフローチャートである。図15の機械可読命令1500は、ブロック1502において開始、そこでGLITエンジン102は、グラフィック処理ユニット(GPU)によって実行されるカーネルを計装する。例えば、命令生成器410(図4)は、図1のプロファイリング命令104A~104Cを挿入して図1の第2のカーネル108を生成することによって、図1の第1のカーネル106を計装してもよい。
【0155】
ブロック1504において、GLITエンジン102は、実行のために、計装カーネルをGPUに送信する。例えば、命令生成器410は、図1のメモリ116に記憶するための第2のカーネル108を提供することができる。いくつかの例では、図1のGPU110は、命令生成器410、図1のGPUドライバ122、および/またはメモリ116から第2のカーネル108を引き出すことができる。
【0156】
ブロック1506において、GLITエンジン102は、GPUが計装カーネルを実行することに応答して、GPUからGPUロング命令トレース(GLIT)を取得する。例えば、第2のカーネル108を取得することに応答して、GPU110は、第2のカーネル108を実行することができる。いくつかの例では、第2のカーネル108を実行することに応答して、GPU110は、図1のGLIT112、図6のGLIT600などを生成することができる。例えば、GPU110は、図6のGLIT112、図6のGLIT600などを、図3のGLITフォーマット300などのバイナリフォーマットで符号化することができる。
【0157】
ブロック1508において、GLITエンジン102は、GLITをエミュレートする。例えば、トレース抽出器420(図4)は、GLIT112、図6のGLIT600などを実装することができる符号化されたバイナリカーネルを復号することができる。いくつかの例では、トレースエミュレータ430(図4)は、1つ以上のAPIを介して、図1のアプリケーション120に対して、実装エミュレーションルーチンを実行する前および/または実行した後に、GPU状態を提供するために、エミュレーションルーチンを計装することができる。ブロック1508を実装するために実行され得る例示的なプロセスが、図16に関連して以下に説明される。
【0158】
ブロック1510において、GLITエンジン102は、エミュレートされたGLITに基づいてGPUの動作パラメータを判定する。例えば、トレース分析器440(図4)は、GLIT112、GLIT600などのエミュレーションに基づいて、GPU状態、実行時間パラメータ、ビジー時間パラメータ、アイドル時間パラメータ、占有時間パラメータ、または利用率パラメータを判定することができる。
【0159】
ブロック1512において、GLITエンジン102は、動作パラメータに基づいてGPUのワークロードを調整するかどうかを判定する。例えば、ハードウェア設定器450(図4)は、図2のスレッド208のうちの1つ(複数可)、および/または、より一般的には、図2のGPUスライス200の利用率が利用率しきい値未満であると判定することに応答して、GPU110によって実行される命令の数を増加させると判定することができる。いくつかの例では、ハードウェア設定器450は、対応するGPU状態が第2のカーネル108のGPU110への分配に応答して値を変更しないことに基づいて、スレッド208の1つ以上が利用されないことを判定することができる。いくつかの例では、利用率しきい値が満たされないことに基づいて、スレッド208のうちの1つ(複数可)が利用されない、および/または十分に利用されないと判定することに応答して、ハードウェア設定器450は、スレッド208のうちの1つ(複数可)によって実行される命令の数を増加させてもよい。
【0160】
ブロック1512において、GLITエンジン102が動作パラメータに基づいてGPUのワークロードを調整しないと判定した場合、制御は、ブロック1516に進み、別の計装カーネルを生成するかどうかを判定する。ブロック1512において、GLITエンジン102が動作パラメータに基づいてGPUのワークロードを調整すると判定した場合、ブロック1514において、GLITエンジン102は、GPUのワークロードを調整するためにGPUドライバを呼び出す。例えば、ハードウェア設定器450は、GPUドライバ122に対して、GPU110によって実行される命令の数を増加させ、GPU110によって実行される命令の数を減少させ、第2のカーネル108のスケジューリングを、図2の実行ユニット204のうちの1つ(複数可)のスレッド208のうちの1つ(複数可)、および/またはそれらの組み合わせの間で調整するように指示することができる。
【0161】
ブロック1514においてGPUのワークロードを調整するためにGPUドライバを呼び出すことに応答して、ブロック1516において、GLITエンジン102は、別の計装カーネルを生成するかどうかを判定する。例えば、命令生成器410は、図1の第1のカーネル106とは異なるカーネルを計装すると判定することができる。いくつかの例では、命令生成器410は、プロファイリング命令104A~104Cのうちの1つ(複数可)を追加、差し引く、および/または修正し、カーネル命令(例えば、図1のINSTR1、INSTR2など)のうちの1つ(複数可)を追加、差し引く、および/または修正することによって、および/またはそれらの組み合わせによって、第1のカーネル106を再計装すると判定する。
【0162】
ブロック1518において、GLITエンジン102は、GPUの分析を継続するかどうかを判定する。例えば、トレースエミュレータ430は、GPU110に関連付けられた動作パラメータを判定するために、GPU110の分析を継続すると判定することができる。いくつかの例では、トレースエミュレータ430は、図1のGLIT112、図6のGLIT600などを再び開始および/または再エミュレートすることによって分析を継続すると判定することができる。ブロック1518において、GLITエンジン102がGPUの分析を継続すると判定した場合、制御は、ブロック1506に戻り、GPUが計装カーネルを実行したことに応答してGPUから別のGLITを取得するか、そうでなければ、図15の例示的な機械可読命令1500は終了する。
【0163】
図16は、1つ以上の例示的なGLITをエミュレートするために、図1および/または図4のGLITエンジン102を実装するように実行され得る機械可読命令1600を表すフローチャートである。いくつかの例では、機械可読命令1600は、図15のブロック1508を実装してもよい。図16の機械可読命令1600は、ブロック1602において開始し、そこでGLITエンジン102は、エミュレートするグラフィック処理ユニット(GPU)ロング命令トレース(GLIT)を選択する。例えば、トレース抽出器420(図4)は、エミュレートする図1のGLIT112の第1のもの、図4のGLIT470の第1のものなどを選択することができる。いくつかの例では、GLIT112の第1のものは、第1のバイナリカーネルを含む1つ以上のバイナリカーネルを含んでもよい。いくつかの例では、第1のバイナリカーネルは、図6のGLIT600に対応する、および/または他の方法でこれに関連付けられたデータを含んでもよい。このような例では、第1のバイナリカーネルは、図3のGLITフォーマット300などのバイナリフォーマットを有してもよい。
【0164】
ブロック1604において、GLITエンジン102は、GLITを復号し、GPUによって実行されるルーチンを含む復号されたGLITデータを生成する。例えば、トレース抽出器420は、第1のバイナリカーネルを復号して、図1のレコード126、図3のレコード302などを生成および/または他の方法で出力することができる。いくつかの例では、トレース抽出器420は、図1のレコード126、図3のレコード302などに基づいて、図10のカーネル命令スタティックデータ1002を識別することができる。例えば、トレース抽出器420は、追加命令、乗算命令、SEND命令、READ SEND命令など、および/またはそれらの組み合わせなど、GPU110によって実行されるルーチンを識別することができる。
【0165】
ブロック1606において、GLITエンジン102は、命令識別子に基づいて復号されたGLITデータを記憶する。例えば、トレース抽出器420は、第1のバイナリカーネルから復号された命令識別子をインデックスとして利用して、カーネル命令スタティックデータ1002を記憶することができる。いくつかの例では、トレース抽出器420は、復号されたGLITデータをストレージ460(図4)に記憶することができる。
【0166】
ブロック1608において、GLITエンジン102は、GPUによって実行されるルーチンの識別子に基づいてエミュレーションルーチンを識別する。例えば、トレース抽出器420は、カーネル命令スタティックデータ1002のルーチンの第1のものに対応するオペコードに基づいて、エミュレーションルーチンテーブル1006におけるエミュレーションルーチンのうちの第1のルーチンを識別することができる。
【0167】
ブロック1610において、GLITエンジン102は、命令識別子またはエミュレーションルーチンのうちの少なくとも1つの関連付けを記憶する。例えば、トレース抽出器420は、図10のカーネル命令スタティックデータ1002の命令識別子(例えば、図10のINST 0、INST1、INST2など)のうちの1つ(複数可)、図10のオペコードエミュレーションテーブル1004のオペコード(例えば、OPCODE 0、OPCODE 1、OPCODE 2など)のうちの1つ(複数可)、または図10のエミュレーションルーチンテーブル1006のエミュレーションルーチン(例えば、ADD_EMUL、SUB_EMUL、MUL_EMULなど)のうちの1つ(複数可)を関連付けることができる。いくつかの例では、トレース抽出器420は、関連付をストレージ460に記憶することができる。
【0168】
ブロック1612において、GLITエンジン102は、コールバックルーチンを用いてエミュレーションルーチンを計装する。例えば、トレースエミュレータ430(図4)は、図13の第1の計装ルーチン1302および/または図13の第2の計装ルーチン1304などの例示的な計装命令を図13のソースコード1300に挿入することによって、図10のエミュレーションルーチンテーブル1006に含まれるエミュレーションルーチンのうちの1つ(複数可)を計装することができる。
【0169】
ブロック1614において、GLITエンジン102は、コールバックルーチンを登録して、アプリケーションプログラミングインターフェース(API)を呼び出す。例えば、トレースエミュレータ430は、エミュレーションルーチンテーブル1006のエミュレーションルーチンのうちの計装されたものを、図1のアプリケーション120、図1のCPU118上で動作するOS、および/またはそれらの組み合わせに登録することができる。
【0170】
ブロック1616において、GLITエンジン102は、計装エミュレーションルーチンを実行して、APIを呼び出して、GPU状態を観察する。例えば、計装エミュレーションルーチンに含まれる登録されたコールバックルーチンを実行することに応答して、トレースエミュレータ430は、登録されたコールバックルーチンを実行して、1つ以上のAPIを呼び出して、GPU状態を観察することができる。いくつかの例では、GPU状態は、図10のGPU状態1008、1010に対応してもよい。例えば、1つ以上のAPIを呼び出すことに応答して、トレースエミュレータ430は、第2のカーネル108を実行する前のスレッド208のうちの1つのGPU状態の第1の値、および/または第2のカーネル108を実行した後のスレッド208のうちのその1つのGPU状態の第2の値を観察することができる。
【0171】
ブロック1618において、GLITエンジン102は、エミュレートする別のGLITを選択するかどうかを判定する。例えば、トレースエミュレータ430および/またはトレース分析器440は、シミュレートするGLIT112の別の1つを選択することを判定することができる。ブロック1618において、GLITエンジン102が処理する別のGLITを選択することを判定した場合、制御はブロック1602に戻って、エミュレートする別のGLITを選択する。ブロック1618において、GLITエンジン102がエミュレートする別のGLITを選択しないと判定した場合、制御は、図15の例示的な機械可読命令1500のブロック1510に戻って、エミュレートされたGLITに基づいてGPUの動作パラメータを判定してもよい。追加的または代替的に、図16の例示的な機械可読命令1600は、終了してもよい。
【0172】
図17は、GPUの動作を改善するために、図1および/または図4のGLITエンジン102を実装するように実行され得る機械可読命令1700を表すフローチャートである。図17の機械可読命令1700は、ブロック1702において開始し、ここで、GLITエンジン102、および/または、より一般的には、図1のCPU118が、GPUによって実行されるグラフィック処理ユニット(GPU)命令を含むカーネルにプロファイルルーチンを挿入する。例えば、命令生成器410(図4)は、プロファイリング命令104A~104Cを第1のカーネル106に挿入して、図1のGPU110によって実行される図1の第2のカーネル108を生成することができる。いくつかの例では、第1のカーネル106および第2のカーネル108は、追加命令、乗算命令、SEND命令、READ SEND命令などのGPU命令、および/またはそれらの組み合わせを含む。
【0173】
ブロック1704において、GPU110は、GPUのハードウェアスレッド(HWT)によって実行するためにカーネルを分配する。例えば、命令生成器410は、図1のメモリ116に記憶するための第2のカーネル108を提供することができる。いくつかの例では、図1のGPU110は、命令生成器410、図1のGPUドライバ122、および/またはメモリ116から第2のカーネル108を引き出すことができる。例えば、図2のローカルスレッドディスパッチャ220は、第2のカーネル108を取得し、実行のためにスレッド208のうちの1つ(複数可)に第2のカーネルを分配することができる。
【0174】
ブロック1706において、GPU110は、HWTの汎用レジスタファイル(GRF)のそれぞれの第1のレジスタの第1のレジスタ値を判定する。例えば、スレッド208のうちの第1のスレッドは、第1のスレッドによって実装される第1のGRFの1つ以上の第1のレジスタの1つ以上の第1のレジスタ値を判定することができる。いくつかの例では、スレッド208の第2のスレッドは、第2のスレッドによって実装される第2のGRFの1つ以上の第2のレジスタの1つ以上の第2のレジスタ値を判定することができる。
【0175】
ブロック1708において、GPU110は、HWTのアーキテクチャレジスタファイル(ARF)のそれぞれの第2のレジスタの第2のレジスタ値を判定する。例えば、スレッド208のうちの第1のスレッドは、第1のスレッドによって実装される第1のARFの1つ以上の第1のレジスタの1つ以上の第1のレジスタ値を判定することができる。いくつかの例では、スレッド208の第2のスレッドは、第2のスレッドによって実装される第2のARFの1つ以上の第2のレジスタの1つ以上の第2のレジスタ値を判定することができる。
【0176】
ブロック1710において、GPU110は、HWTがGPU命令を実行することに応答して、第3のレジスタ値を判定する。例えば、スレッド208のうちの第1のスレッドは、第1のスレッドが図2のサンプラ216、図2のキャッシュメモリ210などへのSEND命令を実行することに応答して、1つ以上のそれぞれの第1の宛先レジスタの1つ以上の第5のレジスタ値を判定することができる。いくつかの例では、スレッド208のうちの第2のスレッドは、第2のスレッドが図2のサンプラ216、図2のキャッシュメモリ210などへのSEND命令を実行することに応答して、1つ以上のそれぞれの第2の宛先レジスタの1つ以上の第6のレジスタ値を判定することができる。
【0177】
ブロック1712において、GPU110は、第1のレジスタ値、第2のレジスタ値、第3のレジスタ値、およびGPU命令をGPUロング命令トレース(GLIT)に記憶する。例えば、スレッド208のうちの第1のスレッドは、1つ以上の第1のレジスタ値、1つ以上の第3のレジスタ値、1つ以上の第5のレジスタ値、または1つ以上のGPU命令のうちの少なくとも1つを、図1のGLIT112の1つ、図4のGLIT470の1つ、図6のGLIT600などのGLITを実装することができる符号化されたバイナリファイルに記憶することができる。いくつかの例では、スレッド208のうちの第2のスレッドは、1つ以上の第2のレジスタ値、1つ以上の第4のレジスタ値、1つ以上の第6のレジスタ値、または1つ以上のGPU命令のうちの少なくとも1つを、符号化されたバイナリファイルに記憶することができる。
【0178】
ブロック1714において、GLITエンジン102、および/または、より一般的には、CPU118は、コールバックルーチンをルーチンに挿入し、APIを呼び出して、GLITからの情報をアプリケーションに提供する。例えば、トレースエミュレータ430(図4)は、図13のソースコード1300に図13の第1の計装ルーチン1302および/または第2の計装ルーチン1304を挿入し、GPU状態などのGLIT112からのデータを1つ以上のAPIを介して図1のアプリケーション120に提供することができる。
【0179】
ブロック1716において、GLITエンジン102、および/または、より一般的には、CPU118が、GLIT利用率を含むGLITに基づいてGPUの動作パラメータを判定する。例えば、トレース分析器440(図4)は、GLIT112からのデータに基づいて、GPU110の利用率を含むGPU110の1つ以上の動作パラメータを判定することができる。
【0180】
ブロック1718において、GLITエンジン102、および/または、より一般的には、CPU118は、動作パラメータをしきい値と比較する。例えば、トレース分析器440は、利用率を、利用率しきい値などのしきい値と比較することができる。いくつかの例では、トレース分析器440は、GPU110のビジー時間、占有などをビジー時間しきい値、占有しきい値などと比較することができる。
【0181】
ブロック1720において、GLITエンジン102、および/または、より一般的には、CPU118は、比較に基づいてGPUによって実行される計算タスクの数を調整する。例えば、ハードウェア設定器450(図4)は、利用率と利用率しきい値との比較に基づいて、GPU110または異なるGPUによって実行される計算タスクの数を増加させることを判定することができる。いくつかの例では、GPU110の70%の利用率がGPU110の90%の利用率しきい値を下回り、それによって利用率しきい値を満たさないと判定することに応答して、ハードウェア設定器450は、図1のGPUドライバ110に対して、GPU110によって実行される計算タスク、カーネルなどの数を増加させるように指示し、および/または行わせることができる。ブロック1720における比較に基づいて、GPUによって実行される計算タスクの数を調整することに応答して、図17の例示的な機械可読命令1700は、終了する。
【0182】
図18は、図1および/または図4のGLITエンジン102を実装するために、図11~17の命令を実行するように構成された例示的なプロセッサプラットフォーム1800のブロック図である。プロセッサプラットフォーム1800は、例えば、サーバ、パーソナルコンピュータ、ワークステーション、自己学習機械(例えば、ニューラルネットワーク)、または任意の他のタイプの計算デバイスとすることができる。
【0183】
示された例のプロセッサプラットフォーム1800は、プロセッサ1812を含む。示された例のプロセッサ1812は、ハードウェアである。例えば、プロセッサ1812は、1つ以上の集積回路、論理回路、マイクロプロセッサ、GPU、DSP、または任意の所望のファミリーまたは製造業者のコントローラによって実装することができる。ハードウェアプロセッサは、半導体ベース(例えば、シリコンベース)デバイスであってもよい。この例では、プロセッサ1812は、図4の例示的な命令生成器410、例示的なトレース抽出器420、例示的なトレースエミュレータ430、例示的なトレース分析器440、および例示的なハードウェア設定器450を実装する。
【0184】
示された例のプロセッサ1812は、ローカルメモリ1813(例えば、キャッシュ)を含む。示された例のプロセッサ1812は、バス1818を介して、揮発性メモリ1814および不揮発性メモリ1816を含むメインメモリと通信している。揮発性メモリ1814は、SDRAM(Synchronous Dynamic Random Access Memory)、DRAM(Dynamic Random Access Memory)、RDRAM(登録商標)(RAMBUS(登録商標)Dynamic Random Access Memory)、および/または任意の他のタイプのランダムアクセスメモリデバイスによって実装されてもよい。不揮発性メモリ1816は、フラッシュメモリおよび/または任意の他の所望のタイプのメモリデバイスによって実装されてもよい。メインメモリ1814、1816へのアクセスは、メモリコントローラによって制御される。
【0185】
示された例のプロセッサプラットフォーム1800は、インターフェース回路1820も含む。インターフェース回路1820は、Ethernet(登録商標)インターフェース、ユニバーサルシリアルバス(USB)、Bluetooth(登録商標)インターフェース、近接場通信(NFC)インターフェース、および/またはPCIエクスプレスインターフェースなど、任意のタイプのインターフェース規格によって実装されてもよい。
【0186】
示された例では、1つ以上の入力デバイス1822が、インターフェース回路1820に接続される。入力デバイス1822は、ユーザがデータおよび/またはコマンドをプロセッサ1812に入力することを可能にする。入力デバイスは、例えば、オーディオセンサ、マイクロホン、カメラ(スチルまたはビデオ)、キーボード、ボタン、マウス、タッチスクリーン、トラックパッド、トラックボール、アイソポイントデバイス、および/または音声認識システムによって実装することができる。
【0187】
また、1つ以上の出力デバイス1824はまた、図示の例のインターフェース回路1820に接続される。出力デバイス1824は、例えば、ディスプレイデバイス(例えば、発光ダイオード(LED)、有機発光ダイオード(OLED)、液晶ディスプレイ(LCD)、陰極線管(CRT)ディスプレイ、現場スイッチング(IPS)ディスプレイ、タッチスクリーンなど)、触覚出力デバイス、プリンタ、および/またはスピーカによって実施され得る。したがって、示された例のインターフェース回路1820は、典型的には、グラフィックドライバカード、グラフィックドライバチップ、および/またはグラフィックドライバプロセッサを含む。
【0188】
示された例のインターフェース回路1820は、ネットワーク1826を介して外部マシン(例えば、任意の種類の計算デバイス)とデータの交換を容易にするために、送信機、受信機、トランシーバ、モデム、住宅ゲートウェイ、無線アクセスポイント、および/またはネットワークインターフェースなどの通信デバイスも含む。通信は、例えば、イーサネット接続、デジタル加入者回線(DSL)接続、電話回線接続、同軸ケーブルシステム、衛星システム、ラインオブサイト無線システム、セルラー電話システムなどを介することができる。
【0189】
示された例のプロセッサプラットフォーム1800は、ソフトウェアおよび/またはデータを記憶するための1つ以上の大容量記憶デバイス1828も含む。そのような大容量記憶デバイス1828の例は、フロッピーディスクドライブ、ハードドライブディスク、コンパクトディスクドライブ、ブルーレイディスクドライブ、RAID(redundant array of independent disks)、およびデジタル多用途ディスク(DVD)ドライブを含む。この例では、1つ以上の大容量記憶デバイス1828は、図4の例示的なGLIT470を記憶する図4のストレージ460を実装する。
【0190】
図11~17の機械実行可能命令1832は、大容量記憶デバイス1828内、揮発性メモリ1814内、不揮発性メモリ1816内、および/またはCDまたはDVDなどのリムーバブル非一時的コンピュータ可読記憶媒体に記憶されてもよい。
【0191】
図18の例示的なコンピュータ可読命令1832などのソフトウェアを第三者に分配するための例示的なソフトウェア分配プラットフォーム1905を示すブロック図が、図19に示されている。例示的なソフトウェア分配プラットフォーム1905は、ソフトウェアを格納し、他の計算デバイスに送信することができる任意のコンピュータサーバ、データ設備、クラウドサービスなどによって実装されてもよい。第三者は、ソフトウェア分配プラットフォームを所有および/または動作させる顧客のエンティティであってもよい。例えば、ソフトウェア分配プラットフォームを所有および/または動作させるエンティティは、図18の例示的なコンピュータ可読命令1832などのソフトウェアの開発者、販売者、および/またはライセンサであり得る。第三者は、使用および/または再販売および/またはサブライセンス許諾のためにソフトウェアを購入および/またはライセンス許諾する消費者、ユーザ、小売業者、OEM業者などであり得る。示された例では、ソフトウェア分配プラットフォーム1905は、1つ以上のサーバおよび1つ以上の記憶デバイスを含む。記憶デバイスは、上述のように、図11~17の例示的なコンピュータ可読命令1100、1200、1300、1400、1500、1600、1700に対応し得るコンピュータ可読命令1832を記憶する。例示的なソフトウェア分配プラットフォーム1905の1つ以上のサーバは、ネットワーク1910と通信しており、これは、上述のインターネットのうちの任意の1つ以上および/または例示的なネットワーク1826のうちのいずれか1つ以上に対応し得る。いくつかの例では、1つ以上のサーバは、商業取引の一部としてソフトウェアを要求者に送信する要求に応答する。ソフトウェアの送達、販売および/またはライセンス許諾に対する支払いは、ソフトウェア分配プラットフォーム1905の1つ以上のサーバによって、および/または第三者支払いエンティティを介して処理されてもよい。サーバは、購入者および/またはライセンサが、ソフトウェア分配プラットフォーム1905からコンピュータ可読命令1832をダウンロードすることを可能にする。例えば、図18の例示的なコンピュータ可読命令1832に対応し得るソフトウェアは、例示的なプロセッサプラットフォーム1800にダウンロードされてもよく、れは、図1および/または図4の例示的なGLITエンジン102を実装するためにコンピュータ可読命令1832を実行することを行う。いくつかの例では、ソフトウェア分配プラットフォーム1905の1つ以上のサーバは、改善、パッチ、更新などが分配され、エンドユーザデバイスにおいてソフトウェアに適用されることを確実にするために、ソフトウェア(例えば、図18の例示的なコンピュータ可読命令1832)への更新を定期的に提供、送信、および/または強制する。
【0192】
以上から、GPUなどのハードウェアプロセッサの動作を改善するために使用され得る例示的なシステム、方法、装置、および製造物品が開示されていることが理解されよう。開示されたシステム、方法、装置、および製造物品は、GPUなどの異なるハードウェアプロセッサのためのLITを定義し、C、C++などのような高レベル言語で開発され得る柔軟な分析ツールの開発を容易にする。有利には、このような分析ツールは、ハードウェアプロセッサの単一のハードウェアスレッドの粒度レベルでプロファイリングデータを生成するために、ハードウェアプロセッサの動作を分析することができる。有利には、開示されたシステム、方法、装置、および製造物品は、同じカーネルがハードウェアプロセッサの複数のスレッドに分配され得るので、マルチスレッドトレースを生成することができる。
【0193】
開示されたシステム、方法、装置、および製造物品は、GPUの動作を改善するために利用され得るカーネルデバッグ、メモリ、キャッシュ、サンプラなどのモデルの開発を改善することができる。例えば、開示されたシステム、方法、装置、および製造物品は、ハードウェアプロセッサによって実行される計算タスクの量を増加させることによって、計算デバイスのハードウェアプロセッサの動作を改善することによって、計算デバイスを使用する効率を改善する。したがって、開示された方法、装置、および製造物品は、コンピュータの機能における1つ以上の改善を目的とする。
【0194】
グラフィック処理ユニットのロング命令トレースを生成するための例示的な方法、装置、システム、および製造物品が本明細書に開示されている。さらなる例およびそれらの組み合わせは、以下を含む。
【0195】
例1は、少なくとも1つのメモリと、少なくとも1つのプロセッサであって、グラフィック処理ユニット(GPU)によって実行される第2のルーチンの識別子に基づいて第1のルーチンを識別することであって、第1のルーチンは、第2のルーチンのエミュレーションに基づく、識別することと、GPUのGPU状態の第1の値を判定する第1のルーチンを実行することであって、第1のルーチンは、(i)第2のルーチンに関連付けられた第1の引数、および(ii)第1のルーチンを実行する前のGPU状態の第2の値に対応する第2の引数を有する、実行することと、GPU状態の第1の値に基づいてGPUのワークロードを制御することと、を少なくとも行う命令を実行する少なくとも1つのプロセッサと、を含む、装置を含む。
【0196】
例2は、GPU状態は、GPUのハードウェアスレッドに関連付けられたアーキテクチャレジスタファイルにおける第1のレジスタまたはハードウェアスレッドの汎用レジスタファイルの第2のレジスタの状態である、例1に記載の装置を含む。
【0197】
例3は、識別子は、符号化されたバイナリファイルから抽出された第1の識別子であり、少なくとも1つのプロセッサは、GPUのハードウェアスレッドによって実行されるカーネルに1つ以上のプロファイルルーチンを挿入することと、ロング命令トレースから1の値、第2の値、およびハードウェアスレッド識別子を判定することであって、ロング命令トレースは、ハードウェアスレッドによる1つ以上のプロファイルルーチンの実行に応答して、ハードウェアスレッドによって生成され、第1の値は、ハードウェアスレッドによるカーネルの実行後のGPUレジスタ値に対応し、第2の値は、ハードウェアスレッドによるカーネルの実行前のGPUレジスタ値に対応し、ハードウェアスレッド識別子は、ハードウェアスレッドを識別する、判定することと、を行う、例1~2のいずれか1つに記載の装置を含む。
【0198】
例4は、ハードウェアスレッドは、第1のハードウェアスレッドであり、ロング命令トレースは、第1のハードウェアスレッドに関連付けられた第1のロング命令トレースであり、符号化されたバイナリファイルは、第1のロング命令トレースと、1つ以上の第2のハードウェアスレッドに関連付けられた1つ以上の第2のロング命令トレースとを含み、符号化されたバイナリファイルは、マルチスレッドGPUトレースを表す、例1~3のいずれか1つに記載の装置を含む。
【0199】
例5は、カーネルは、ハードウェアスレッドによって実行されるデバイスアクセス命令を含み、少なくとも1つのプロセッサは、GPUの汎用レジスタファイルの1つ以上のそれぞれの第1のレジスタの1つ以上の第1のレジスタ値を判定することと、GPUのアーキテクチャレジスタファイルの1つ以上のそれぞれの第2のレジスタの1つ以上の第2のレジスタ値を判定することと、1つ以上の第1のレジスタ値、1つ以上の第2のレジスタ値、1つ以上の第3のレジスタ値、およびデバイスアクセス命令をロング命令トレースに記憶することであって、1つ以上の第3のレジスタ値は、デバイスアクセス命令に関連付けられた1つ以上のそれぞれの宛先レジスタに対応する、記憶することを行う、例1~4のいずれか1つに記載の装置を含む。
【0200】
例6は、少なくとも1つのプロセッサは、第1のGPU状態に基づいてGPUの利用率を判定することと、利用率をしきい値と比較することと、比較に基づいてしきい値が満たされていないと判定することに応答して、第2のルーチンの調整、またはGPUによって実行される計算タスクの数の増加のうちの少なくとも1つを行って、GPUのワークロードを制御することと、を行う、例1~5のいずれか1つに記載の装置を含む。
【0201】
例7は、第1のルーチンは、エミュレーションルーチンを含む計装ルーチンであり、少なくとも1つのプロセッサは、エミュレーションルーチンの前に計装ルーチンに第1のコールバックルーチンを挿入することであって、第1のコールバックルーチンは、第1のアプリケーションプログラミングインターフェース(API)を呼び出して、第2のGPU状態をアプリケーションに提供する、挿入することと、エミュレーションルーチンの後に計装ルーチンに第2のコールバックルーチンを挿入することであって、第2のコールバックルーチンは、第1のAPIまたは第2のAPIを呼び出して、第1のGPU状態をアプリケーションに提供する、挿入することと、を行う、例1~6のいずれか1つに記載の装置を含む。
【0202】
例8は、命令を含む少なくとも1つの記憶デバイスであって、命令は、実行されるときに、少なくとも1つのプロセッサに、グラフィック処理ユニット(GPU)によって実行される第2のルーチンの識別子に基づいて第1のルーチンを識別することであって、第1のルーチンは、第2のルーチンのエミュレーションに基づく、識別することと、GPUのGPU状態の第1の値を判定する第1のルーチンを実行することであって、第1のルーチンは、(i)第2のルーチンに関連付けられた第1の引数、および(ii)第1のルーチンを実行する前のGPU状態の第2の値に対応する第2の引数を有する、実行することと、GPU状態の第1の値に基づいてGPUのワークロードを制御することと、を行わせる、少なくとも1つの記憶デバイスを含む。
【0203】
例9は、GPU状態は、GPUのハードウェアスレッドに関連付けられたアーキテクチャレジスタファイルにおける第1のレジスタ、またはハードウェアスレッドの汎用レジスタファイルの第2のレジスタの状態である、例8に記載の少なくとも1つの記憶デバイスを含む。
【0204】
例10は、識別子は、符号化されたバイナリファイルから抽出された第1の識別子であり、命令は、実行されるときに、少なくとも1つのプロセッサに、GPUのハードウェアスレッドによって実行されるカーネルに1つ以上のプロファイルルーチンを挿入することと、ロング命令トレースから1の値、第2の値、およびハードウェアスレッド識別子を判定することであって、ロング命令トレースは、ハードウェアスレッドによる1つ以上のプロファイルルーチンの実行に応答して、ハードウェアスレッドによって生成され、第1の値は、ハードウェアスレッドによるカーネルの実行後のGPUレジスタ値に対応し、第2の値は、ハードウェアスレッドによるカーネルの実行前のGPUレジスタ値に対応し、ハードウェアスレッド識別子は、ハードウェアスレッドを識別する、判定することと、を行わせる、例8~9のいずれか1つに記載の記憶デバイスを含む。
【0205】
例11は、ハードウェアスレッドは、第1のハードウェアスレッドであり、ロング命令トレースは、第1のハードウェアスレッドに関連付けられた第1のロング命令トレースであり、符号化されたバイナリファイルは、第1のロング命令トレースと、1つ以上の第2のハードウェアスレッドに関連付けられた1つ以上の第2のロング命令トレースと、を含み、符号化されたバイナリファイルは、マルチスレッドGPUトレースを表す、例8~10のいずれか1つに記載の少なくとも1つの記憶デバイスを含む。
【0206】
例12は、カーネルは、ハードウェアスレッドによって実行されるデバイスアクセス命令を含み、命令は、実行されると、少なくとも1つのプロセッサに、GPUの汎用レジスタファイルの1つ以上のそれぞれの第1のレジスタの1つ以上の第1のレジスタ値を判定することと、GPUのアーキテクチャレジスタファイルの1つ以上のそれぞれの第2のレジスタの1つ以上の第2のレジスタ値を判定することと、1つ以上の第1のレジスタ値、1つ以上の第2のレジスタ値、1つ以上の第3のレジスタ値、およびデバイスアクセス命令をロング命令トレースに記憶することであって、1つ以上の第3のレジスタ値は、デバイスアクセス命令に関連付けられた1つ以上のそれぞれの宛先レジスタに対応する、記憶することと、を行わせる、例8~10のいずれか1つに記載の少なくとも1つの記憶デバイスを含む。
【0207】
例13は、命令は、実行されると、少なくとも1つのプロセッサに、第1のGPU状態に基づいてGPUの利用率を判定することと、利用率をしきい値と比較することと、比較に基づいてしきい値が満たされていないと判定することに応答して、第2のルーチンの調整、またはGPUによって実行される計算タスクの数の増加のうちの少なくとも1つを行って、GPUのワークロードを制御することと、を行わせる、例8~12のいずれか1つに記載の少なくとも1つの記憶デバイスを含む。
【0208】
例14は、第1のルーチンは、エミュレーションルーチンを含む計装ルーチンであり、命令は、実行されると、少なくとも1つのプロセッサに、エミュレーションルーチンの前に計装ルーチンに第1のコールバックルーチンを挿入することであって、第1のコールバックルーチンは、第1のアプリケーションプログラミングインターフェース(API)を呼び出して、第2のGPU状態をアプリケーションに提供する、挿入することと、エミュレーションルーチンの後に計装ルーチンに第2のコールバックルーチンを挿入することであって、第2のコールバックルーチンは、第1のAPIまたは第2のAPIを呼び出して、第1のGPU状態をアプリケーションに提供する、挿入することと、を行わせる、例8~13のいずれか1つに記載の少なくとも1つの記憶デバイスを含む。
【0209】
例15は、グラフィック処理ユニット(GPU)によって実行される第2のルーチンの識別子に基づいて第1のルーチンを識別するための手段であって、第1のルーチンは、第2のルーチンのエミュレーションに基づく、手段と、GPUのGPU状態の第1の値を判定する第1のルーチンを実行するための手段であって、第1のルーチンは、(i)第2のルーチンに関連付けられた第1の引数、および(ii)第1のルーチンを実行する前のGPU状態の第2の値に対応する第2の引数を有する、手段と、GPU状態の第1の値に基づいてGPUのワークロードを制御するための手段と、を含む、装置を含む。
【0210】
例16は、GPU状態は、GPUのハードウェアスレッドに関連付けられたアーキテクチャレジスタファイルにおける第1のレジスタまたはハードウェアスレッドの汎用レジスタファイルの第2のレジスタの状態である、例15に記載の装置を含む。
【0211】
例17は、識別子は、符号化されたバイナリファイルから抽出された第1の識別子であり、GPUのハードウェアスレッドによって実行されるカーネルに1つ以上のプロファイルルーチンを挿入するための手段と、ハードウェアスレッドによる1つ以上のプロファイルルーチンの実行に応答して、ハードウェアスレッドによって生成されたロング命令トレースから、第1の値、第2の値、およびハードウェアスレッド識別子を判定することを実行するための手段であって、第1の値は、ハードウェアスレッドによるカーネルの実行前のGPUレジスタ値に対応し、第2の値は、ハードウェアスレッドによるカーネルの実行後のGPUレジスタ値に対応し、ハードウェアスレッド識別子は、ハードウェアスレッドを識別する、手段と、をさらに含む、例15~16いずれか1つに記載の装置を含む。
【0212】
例18は、ハードウェアスレッドは、第1のハードウェアスレッドであり、ロング命令トレースは、第1のハードウェアスレッドに関連付けられた第1のロング命令トレースであり、符号化されたバイナリファイルは、第1のロング命令トレースと、1つ以上の第2のハードウェアスレッドに関連付けられた1つ以上の第2のロング命令トレースとを含み、符号化されたバイナリファイルは、マルチスレッドGPUトレースを表す、例15~17のいずれか1つに記載の装置を含む。
【0213】
例19は、カーネルは、ハードウェアスレッドによって実行されるデバイスアクセス命令を含み、実行するための手段は、GPUの汎用レジスタファイルの1つ以上のそれぞれの第1のレジスタの1つ以上の第1のレジスタ値を判定することと、GPUのアーキテクチャレジスタファイルの1つ以上のそれぞれの第2のレジスタの1つ以上の第2のレジスタ値を判定することと、1つ以上の第1のレジスタ値、1つ以上の第2のレジスタ値、1つ以上の第3のレジスタ値、およびデバイスアクセス命令をロング命令トレースに記憶することであって、1つ以上の第3のレジスタ値は、デバイスアクセス命令に関連付けられた1つ以上のそれぞれの宛先レジスタに対応する、記憶することと、を行う、例15~18のいずれか1つに記載の装置を含む。
【0214】
例20は、第1のGPU状態に基づいてGPUの利用率を判定するための手段をさらに含み、制御するための手段は、利用率がしきい値を満たさないという判定に応答して、第2のルーチンの調整、またはGPUによって実行される増加した計算タスクの数の増加のうちの少なくとも1つを行って、GPUのワークロードを制御することを行う、例15~19のいずれか1つに記載の装置を含む。
【0215】
例21は、第1のルーチンは、エミュレーションルーチンを含む計装ルーチンであり、実行するための手段は、エミュレーションルーチンの前に計装ルーチンに第1のコールバックルーチンを挿入することであって、第1のコールバックルーチンは、第1のアプリケーションプログラミングインターフェース(API)を呼び出して、第2のGPU状態をアプリケーションに提供する、挿入することと、エミュレーションルーチンの後に計装ルーチンに第2のコールバックルーチンを挿入することであって、第2のコールバックルーチンは、第1のAPIまたは第2のAPIを呼び出して、第1のGPU状態をアプリケーションに提供する、挿入することと、を行う、例15~20のいずれか1つに記載の少なくとも1つの記憶デバイスを含む。
【0216】
例22は、ハードウェアスレッドを有するグラフィック処理ユニット(GPU)であって、ハードウェアスレッドは、GPU状態の第1の値を判定することと、カーネルに含まれるGPUルーチンを実行して、GPU状態の第2の値を判定することと、GPUルーチン、第1の値、および第2の値を含むロング命令トレースを生成することと、を行う、GPUと、中央処理ユニット(CPU)であって、カーネルに1つ以上のプロファイルルーチンを挿入することと、GPUルーチンの識別子に基づいて第1のルーチンを識別することであって、第1のルーチンは、GPUルーチンのエミュレーションに基づく、識別することと、GPU状態の第2の値を判定するGPUルーチンの実行をリプレイする第1のルーチンを実行することであって、第1のルーチンは、(i)GPUルーチンに関連付けられた第1の引数、および(ii)GPU状態の第1の値に対応する第2の引数を有する、実行することと、第1のルーチンの実行に基づいてGPUのワークロードを制御することと、を行う、CPUと、を含む、システムを含む。
【0217】
例23は、GPU状態は、GPUのハードウェアスレッドに関連付けられたアーキテクチャレジスタファイルにおける第2のレジスタまたはハードウェアスレッドの汎用レジスタファイルの第2のレジスタの状態である、例22に記載のシステムを含む。
【0218】
例24は、識別子は、符号化されたバイナリファイルから抽出された第1の識別子であり、符号化されたバイナリファイルは、ロング命令トレースを含み、CPUは、第1の値、第2の値、および符号化されたバイナリファイルからのハードウェアスレッド識別子を判定することを行い、ハードウェアスレッド識別子は、ハードウェアスレッドを識別する、例22~23のいずれか1つに記載のシステムを含む。
【0219】
例25は、ハードウェアスレッドは、第1のハードウェアスレッドであり、ロング命令トレースは、第1のハードウェアスレッドに関連付けられた第1のロング命令トレースであり、符号化されたバイナリファイルは、第1のロング命令トレースと、1つ以上の第2のハードウェアスレッドに関連付けられた1つ以上の第2のロング命令トレースとを含み、1つ以上の第2のハードウェアスレッドは、カーネルの1つ以上の実行に応答して、1つ以上の第2のロング命令トレースを生成し、符号化されたバイナリファイルは、マルチスレッドGPUトレースを表す、例22~24のいずれか1つに記載のシステムを含む。
【0220】
例26は、カーネルは、ハードウェアスレッドによって実行されるデバイスアクセス命令を含み、GPUは、GPUの汎用レジスタファイルの1つ以上のそれぞれの第1のレジスタの1つ以上の第1のレジスタ値を判定することと、GPUのアーキテクチャレジスタファイルの1つ以上のそれぞれの1つ以上の第2のレジスタの1つ以上の第2のレジスタ値を判定することと、1つ以上の第1のレジスタ値、1つ以上の第2のレジスタ値、1つ以上の第3のレジスタ値、およびデバイスアクセス命令をロング命令トレースに記憶することであって、1つ以上の第3のレジスタ値は、デバイスアクセス命令に関連付けられた1つ以上のそれぞれの宛先レジスタに対応する、記憶することと、を行う、例22~25のいずれか1つに記載のシステムを含む。
【0221】
例27は、CPUは、第1のGPU状態に基づいてGPUの利用率を判定することと、利用率をしきい値と比較することと、比較に基づいてしきい値が満たされていないと判定することに応答して、GPUルーチンc調整、またはGPUによって実行される計算タスクの計算タスクの数の増加のうちの少なくとも1つを行って、GPUのワークロードを制御することを行う、例22~26のいずれか1つに記載のシステムを含む。
【0222】
例28は、第1のルーチンは、エミュレーションルーチンを含む計装ルーチンであり、さらに、アプリケーションを含み、CPUは、エミュレーションルーチンの前に計装ルーチンに第1のコールバックルーチンを挿入することであって、第1のコールバックルーチンは、第1のアプリケーションプログラミングインターフェース(API)を呼び出して、第2のGPU状態をアプリケーションに提供する、挿入することと、エミュレーションルーチンの後に計装ルーチンに第2のコールバックルーチンを挿入することであって、第2のコールバックルーチンは、第1のAPIまたは第2のAPIを呼び出して、第1のGPU状態をアプリケーションに提供する、挿入することと、を行う、例22~27のいずれか1つに記載のシステムを含む。
【0223】
例29は、グラフィック処理ユニット(GPU)によって実行される第2のルーチンの識別子に基づいて第1のルーチンを識別することであって、第1のルーチンは、第2のルーチンのエミュレーションに基づく、識別することと、GPUのGPU状態の第1の値を判定する第1のルーチンを実行することであって、第1のルーチンは、(i)第2のルーチンに関連付けられた第1の引数、および(ii)第1のルーチンを実行する前のGPU状態の第2の値に対応する第2の引数を有する、実行することと、GPU状態の第1の値に基づいてGPUのワークロードを制御することと、を含む、方法を含む。
【0224】
例30は、GPU状態は、GPUのハードウェアスレッドに関連付けられたアーキテクチャレジスタファイルにおける第1のレジスタまたはハードウェアスレッドの汎用レジスタファイルの第2のレジスタの状態である、例29に記載の方法を含む。
【0225】
例31は、識別子は、符号化されたバイナリファイルから抽出された第1の識別子であり、GPUのハードウェアスレッドによって実行されるカーネルに1つ以上のプロファイルルーチンを挿入することと、ハードウェアスレッドがカーネルを実行する前のGPU状態の第2の値を判定することと、ハードウェアスレッドがカーネルを実行することに応答して、GPU状態の第1の値と、ハードウェアスレッドに対応する第2の識別子を含むロング命令トレースを生成することと、をさらに含む、例29~30のいずれか1つに記載の方法を含む。
【0226】
例32は、ハードウェアスレッドは、第1のハードウェアスレッドであり、ロング命令トレースは、第1のハードウェアスレッドに関連付けられた第1のロング命令トレースであり、符号化されたバイナリファイルは、第1のロング命令トレースと、1つ以上の第2のハードウェアスレッドに関連付けられた1つ以上の第2のロング命令トレースとを含み、符号化されたバイナリファイルは、マルチスレッドGPUトレースを表す、例29~31のいずれか1つに記載の方法を含む。
【0227】
例33は、カーネルは、ハードウェアスレッドによって実行されるデバイスアクセス命令を含み、GPUの汎用レジスタファイルの1つ以上のそれぞれの第1のレジスタの1つ以上の第1のレジスタ値を判定することと、GPUのアーキテクチャレジスタファイルの1つ以上のそれぞれの第2のレジスタの1つ以上の第2のレジスタ値を判定することと、1つ以上の第1のレジスタ値、1つ以上の第2のレジスタ値、1つ以上の第3のレジスタ値、およびデバイスアクセス命令をロング命令トレースに記憶することであって、1つ以上の第3のレジスタ値は、デバイスアクセス命令に関連付けられた1つ以上のそれぞれの宛先レジスタに対応する、記憶することと、をさらに含む、例29~32に記載の方法を含む。
【0228】
例34は、第1のGPU状態に基づいてGPUの利用率を判定することと、利用率をしきい値と比較することと、比較に基づいてしきい値が満たされていないと判定することに応答して、GPUルーチンの調整、またはGPUによって実行される計算タスクの数の増加のうちの少なくとも1つを行って、GPUのワークロードを制御することと、をさらに含む、例29~33のいずれか1つに記載の方法を含む。
【0229】
例35は、第1のルーチンは、エミュレーションルーチンを含む計装ルーチンであり、エミュレーションルーチンの前に計装ルーチンに第1のコールバックルーチンを挿入することであって、第1のコールバックルーチンは、第1のアプリケーションプログラミングインターフェース(API)を呼び出して、第2のGPU状態をアプリケーションに提供する、挿入することと、エミュレーションルーチンの後に計装ルーチンに第2のコールバックルーチンを挿入することであって、第2のコールバックルーチンは、第1のAPIまたは第2のAPIを呼び出して、第1のGPU状態をアプリケーションに提供する、挿入することと、をさらに含む、例29~34のいずれか1つに記載の方法を含む。
【0230】
特定の例示的なシステム、方法、装置、および製造物品が本明細書に開示されているが、本特許の範囲はこれらに限定されない。反対に、この特許は、この特許の特許請求の範囲内にあるすべてのシステム、方法、装置、および製造物品をカバーする。
【0231】
以下の特許請求の範囲は、この参照により、この発明を実施する形態に組み込まれ、各請求項はそれ自体が、本開示の別個の実施形態として位置する。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19
【外国語明細書】