(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-03-07
(45)【発行日】2024-03-15
(54)【発明の名称】協調ワークスティーリングスケジューラ
(51)【国際特許分類】
G06F 9/50 20060101AFI20240308BHJP
G06F 9/52 20060101ALI20240308BHJP
【FI】
G06F9/50 120A
G06F9/50 150E
G06F9/52 150A
(21)【出願番号】P 2022542128
(86)(22)【出願日】2021-03-01
(86)【国際出願番号】 US2021020192
(87)【国際公開番号】W WO2021188287
(87)【国際公開日】2021-09-23
【審査請求日】2022-07-08
(32)【優先日】2020-03-19
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2021-01-19
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】503455363
【氏名又は名称】レイセオン カンパニー
(74)【代理人】
【識別番号】100107766
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100135079
【氏名又は名称】宮崎 修
(72)【発明者】
【氏名】シャンピニー,マイケル
【審査官】坂東 博司
(56)【参考文献】
【文献】米国特許出願公開第2017/0068571(US,A1)
【文献】特表2017-533532(JP,A)
【文献】特表2020-503593(JP,A)
【文献】特表2017-538212(JP,A)
【文献】特表2020-525913(JP,A)
【文献】米国特許出願公開第2016/0154677(US,A1)
【文献】特表2018-531450(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/50
G06F 9/52
(57)【特許請求の範囲】
【請求項1】
中央処理ユニット(CPU)及びグラフィック処理ユニット(GPU)を有するコンピューティングシステム内で使用される方法であって、
当該方法は、
第1メモリ部分及び第2メモリ部分を、(i)前記CPU上で実行されるワークスティーリングスケジューラのワーカスレッド、及び(ii)前記GPUの部分である実行ユニットに割り当てるステップと、
前記ワーカスレッドに関連付けられたキューからタスクを読み出すステップと、
前記ワーカスレッドにより、前記タスク
を実際に実行するコストの大部分を前記ワークスティーリングスケジューラのオーバヘッドが占めるカットオフ条件が満たされるかどうかを検出するステップと、
前記カットオフ条件が満たされないとき、前記タスクを2つ以上の追加タスクに分割し、前記2つ以上の追加タスクを前記キューに追加するステップと、
前記カットオフ条件が満たされるとき、前記タスクに対応する第1データを前記第2メモリ部分に格納するステップであって、前記第1データは、前記ワーカスレッドにより、前記第2メモリ部分に格納される、ステップと、
前記第1データが前記第2メモリ部分に格納された後に、メモリフェンス取得命令を発行するステップと、
第1値を前記第1メモリ部分に格納するステップであって、前記第1値は、前記メモリフェンス取得命令が発行された後に、前記ワーカスレッドにより格納される、ステップと、
を含み、前記第1値を前記第1メモリ部分に格納するステップは、前記実行ユニットに、前記第1データを第2メモリ部分から読み出させ、前記第1データに基づき前記タスクを実行させる、方法。
【請求項2】
前記第1メモリ部分はドアベルレジスタを含み、前記第2メモリ部分はタスクレジスタを含む、請求項1に記載の方法。
【請求項3】
前記実行ユニットは、複数のGPUコアと、前記複数のGPUコアの間で共有される同期メカニズムと、を含む、請求項1に記載の方法。
【請求項4】
前記第1データは、前記タスクに対応するオペコード及び前記タスクを実行するための引数のうちの1つ以上を含む、請求項1に記載の方法。
【請求項5】
第2値が前記実行ユニットにより前記第1メモリ部分に格納されると、前記タスクが完了したことを検出するステップ、を更に含み、前記検出するステップは、前記ワーカスレッドにより実行される、請求項1に記載の方法。
【請求項6】
前記第2メモリ部分から、前記実行ユニットにより前記タスクを実行した結果として生成される第2データを読み取るステップ、を更に含み、前記第2データは、第2値が前記実行ユニットにより前記第1メモリ部分に格納されていることを検出することに応答して、前記ワーカスレッドにより読み出される、請求項1に記載の方法。
【請求項7】
前記第2メモリ部分から前記第1データを読み取るステップであって、前記第1データは、前記第1値が前記ワーカスレッドにより前記第1メモリ部分に格納されていることを検出することに応答して、前記実行ユニットにより読み出される、ステップと、
前記タスクを実行するステップであって、前記タスクは、前記第1データに基づき前記実行ユニットにより実行される、ステップと、
を更に含む請求項1に記載の方法。
【請求項8】
前記第2メモリ部分に、前記タスクを実行した結果として前記実行ユニットにより生成された第2データを格納するステップと、
前記第2データが前記第2メモリ部分に格納された後に、メモリフェンスリリース命令を発行するステップと、
前記第1メモリ部分に、前記タスクが完了したことを示す第2値を格納するステップであって、前記第2値は、前記メモリフェンスリリース命令が発行された後に、前記実行ユニットにより格納される、ステップと、
を更に含む請求項7に記載の方法。
【請求項9】
システムであって、
実行ユニットを有するグラフィック処理ユニット(GPU)と、
第1メモリ部分及び第2メモリ部分を有するランダムアクセスメモリと、
ワークスティーリングスケジューラを実行するよう構成される中央処理ユニット(CPU)と、
を含み、
前記ワークスティーリングスケジューラはワーカスレッドを有し、前記ワーカスレッドは、以下:
前記ワーカスレッドに関連付けられたキューからタスクを読み出す動作と、
前記タスク
を実際に実行するコストの大部分を前記ワークスティーリングスケジューラのオーバヘッドが占めるカットオフ条件が満たされるかどうかを検出する動作と、
前記カットオフ条件が満たされないとき、前記タスクを2つ以上の追加タスクに分割し、前記2つ以上の追加タスクを前記キューに追加する動作と、
前記カットオフ条件が満たされるとき、前記タスクに対応する第1データを前記第2メモリ部分に格納する動作と、
前記第1データが前記第2メモリ部分に格納された後に、メモリフェンス取得命令を発行する動作と、
前記メモリフェンス取得命令が発行された後に、第1値を前記第1メモリ部分に格納する動作と、
を実行するよう構成され、
前記第1値を前記第1メモリ部分に格納する動作は、前記実行ユニットに、前記第1データを第2メモリ部分から読み出させ、前記第1データに基づき前記タスクを実行させる、システム。
【請求項10】
前記第1メモリ部分はドアベルレジスタを含み、前記第2メモリ部分はタスクレジスタを含む、請求項9に記載のシステム。
【請求項11】
前記実行ユニットは、複数のGPUコアと、前記複数のGPUコアの間で共有される同期メカニズムと、を含む、請求項9に記載のシステム。
【請求項12】
前記第1データは、前記タスクに対応するオペコード及び前記タスクを実行するための引数のうちの1つ以上を含む、請求項9に記載のシステム。
【請求項13】
前記ワーカスレッドは、第2値が前記実行ユニットにより前記第1メモリ部分に格納されると、前記タスクが完了したことを検出する動作を実行するよう更に構成される、請求項9に記載のシステム。
【請求項14】
前記ワーカスレッドは、前記第2メモリ部分から、前記タスクを実行した結果として生成される第2データを読み出す動作を実行するよう更に構成され、前記第2データは、第2値が前記実行ユニットにより前記第1メモリ部分に格納されていることを検出することに応答して、読み出される、請求項9に記載のシステム。
【請求項15】
前記実行ユニットは、
前記第2メモリ部分から前記第1データを読み出す動作であって、前記第1データは、前記第1値が前記ワーカスレッドにより前記第1メモリ部分に格納されていることを検出することに応答して、読み出される、動作と、
前記第1データに基づき前記タスクを実行する動作と、
を実行するよう更に構成される、請求項9に記載のシステム。
【請求項16】
前記実行ユニットは、
前記第2メモリ部分に、前記タスクを実行した結果として前記実行ユニットにより生成された第2データを格納する動作と、
前記第2データが前記第2メモリ部分に格納された後に、メモリフェンスリリース命令を発行する動作と、
前記第1メモリ部分に、前記タスクが完了したことを示す第2値を格納する動作であって、前記第2値は、前記メモリフェンスリリース命令が発行された後に、格納される、動作と、
を実行するよう更に構成される、請求項15に記載のシステム。
【請求項17】
1つ以上のプロセッサ実行可能命令を格納するよう構成される非一時的コンピュータ可読媒体であって、前記1つ以上のプロセッサ実行可能命令は、少なくとも1つのプロセッサにより処理されると、前記プロセッサに、
ワーカスレッドを有するワークスティーリングスケジューラを実行させ、前記ワーカスレッドは、グラフィック処理ユニット(GPU)の部分である実行ユニットと第1メモリ部分及び第2メモリ部分を共有するよう構成され、前記ワーカスレッドは、以下:
前記ワーカスレッドに関連付けられたキューからタスクを読み出す動作と、
前記タスク
を実際に実行するコストの大部分を前記ワークスティーリングスケジューラのオーバヘッドが占めるカットオフ条件が満たされるかどうかを検出する動作と、
前記カットオフ条件が満たされないとき、前記タスクを2つ以上の追加タスクに分割し、前記2つ以上の追加タスクを前記キューに追加する動作と、
前記カットオフ条件が満たされるとき、前記タスクに対応する第1データを前記第2メモリ部分に格納する動作と、
前記第1データが前記第2メモリ部分に格納された後に、メモリフェンス取得命令を発行する動作と、
前記メモリフェンス取得命令が発行された後に、第1値を前記第1メモリ部分に格納する動作と、
を実行するよう構成され、
前記第1値を前記第1メモリ部分に格納する動作は、前記実行ユニットに、前記第1データを第2メモリ部分から読み出させ、前記第1データに基づき前記タスクを実行させる、非一時的コンピュータ可読媒体。
【請求項18】
前記第1メモリ部分はドアベルレジスタを含み、前記第2メモリ部分はタスクレジスタを含む、請求項17に記載の非一時的コンピュータ可読媒体。
【請求項19】
前記実行ユニットは、複数のGPUコアと、前記複数のGPUコアの間で共有される同期メカニズムと、を含む、請求項17に記載の非一時的コンピュータ可読媒体。
【請求項20】
前記第1データは、前記タスクに対応するオペコード及び前記タスクを実行するための引数のうちの1つ以上を含む、請求項17に記載の非一時的コンピュータ可読媒体。
【発明の詳細な説明】
【背景技術】
【0001】
GPUデバイスは、応答時間(つまり、遅延)ではなく、計算スループットについて最適化される。GPUのアーキテクチャ及び関連ソフトウェアにおける従来の設計選択は、算術演算の高い持続スループットを重視している。特に、GPUは比較的小さく簡易なキャッシュ、及びソフトウェアにより管理されるスクラッチパッドメモリを有し、これらは膨大なデータセットの並列処理のために膨大な数の算術論理ユニット(arithmetic logic unit (ALU))のためにチップ面積を最大にする。しかしながら、GPUの現在のバルク同期プログラミングモデルは、特定レベルのタスクスケジューリングを必要とする柔軟なアプリケーションに対応するそれらの適用可能性を制限する。知られているGPUスケジューリングポリシは、ハードウェアで定義され、GPUマルチプロセッサにおいて手動でアルゴリズムを配置することができない。例えば、プロデューサ-消費者のパターンのように、同じマルチプロセッサ上でマルチプロセッサ同期を必要とするアプリケーションを実行することは、デッドロックをもたらし得る。従来のシステムでは、ローカルGPUキャッシュをより良好に利用するような、局所性からの利益を得るために、同様のタスクが同じマルチプロセッサ上で同じスケジューリングされ得るタスクを処理する環境を提供することも困難である。
【0002】
NVIDIA CORPのCUDA(Compute Unified Device Architecture)フレームワークは、GPU自体においてグローバルバリアを通じて同期されることができる、GPU上の協調スレッドグリッドを開始する能力を提供する(GPU上のバリアと同期する必要がない)。この特徴は、ユーザがGPUにカーネル(つまり、GPUプログラム)のパイプラインをスケジューリングすることを可能にする。しかしながら、既製のGPUスケジューラは、GPU全体に渡りスレッドブロックをスケジューリングする定義された方法が未だない。これは、GPUマルチプロセッサ上でスレッドブロックの手動配置を妨げる。この制限により、GPUリソースを十分に活用できない可能性がある。
【発明の概要】
【0003】
実施形態では、中央処理ユニット(CPU)及びグラフィック処理ユニット(GPU)を有するコンピューティングシステム内で使用される方法であって、前記方法は、
第1メモリ部分及び第2メモリ部分を、(i)前記CPU上で実行されるワークスティーリングスケジューラのワーカスレッド、及び(ii)前記GPUの部分である実行ユニットに割り当てるステップと、
前記ワーカスレッドに関連付けられたキューからタスクを読み出すステップと、
前記ワーカスレッドにより、前記タスクのカットオフ条件が満たされるかどうかを検出するステップと、
前記カットオフ条件が満たされないとき、前記タスクを2つ以上の追加タスクに分割し、前記2つ以上の追加タスクを前記キューに追加するステップと、
を含む方法が提供される。
【0004】
実施形態では、前記第1メモリ部分はドアベルレジスタを含み、前記第2メモリ部分はタスクレジスタを含む。
【0005】
実施形態では、前記実行ユニットは、複数のGPUコアと、前記複数のGPUコアの間で共有される同期メカニズムと、を含む。
【0006】
実施形態では、前記第1データは、前記タスクに対応するオペコード及び前記タスクを実行するための引数のうちの1つ以上を含む。
【0007】
実施形態では、前記方法は、第2値が前記実行ユニットにより前記実施形態では、前記メモリ部分に格納されると、前記タスクが完了したことを検出するステップ、を更に含み、前記検出するステップは、前記ワーカスレッドにより実行される。
【0008】
実施形態では、前記方法は、前記第2メモリ部分から、前記実行ユニットにより前記タスクを実行した結果として生成される第2データを読み取るステップ、を更に含み、前記第2データは、第2値が前記実行ユニットにより前記実施形態では、前記メモリ部分に格納されていることを検出することに応答して、前記ワーカスレッドにより読み出される。
【0009】
実施形態では、前記方法は、前記第2メモリ部分から前記第1データを読み取るステップであって、前記第1データは、前記第1値が前記ワーカスレッドにより前記第1メモリ部分に格納されていることを検出することに応答して、前記実行ユニットにより読み出される、ステップと、
前記タスクを実行するステップであって、前記タスクは、前記第1データに基づき前記実行ユニットにより実行される、ステップと、
を更に含む。
【0010】
実施形態では、前記方法は、前記第2メモリ部分に、前記タスクを実行した結果として前記実行ユニットにより生成された第2データを格納するステップと、
前記第2データが前記第2メモリ部分に格納された後に、メモリフェンスリリース命令を発行するステップと、
前記第1メモリ部分に、前記タスクが完了したことを示す第2値を格納するステップであって、前記第2値は、前記メモリフェンスリリース命令が発行された後に、前記実行ユニットにより格納される、ステップと、
を更に含む。
【0011】
実施形態では、システムであって、
実行ユニットを有するグラフィック処理ユニット(GPU)と、
第1メモリ部分及び第2メモリ部分を有するランダムアクセスメモリと、
ワークスティーリングスケジューラを実行するよう構成される中央処理ユニット(CPU)と、
を含み、前記ワークスティーリングスケジューラは、以下:
前記ワーカスレッドに関連付けられたキューからタスクを読み出す動作と、
前記タスクのカットオフ条件が満たされるかどうかを検出する動作と、
前記カットオフ条件が満たされないとき、前記タスクを2つ以上の追加タスクに分割して、前記2つ以上の追加タスクを前記キューに追加する動作と、
を実行するよう構成される、システムが提供される。
【0012】
実施形態では、前記第1メモリ部分はドアベルレジスタを含み、前記第2メモリ部分はタスクレジスタを含む。
【0013】
実施形態では、前記実行ユニットは、複数のGPUコアと、前記複数のGPUコアの間で共有される同期メカニズムと、を含む。
【0014】
実施形態では、前記第1データは、前記タスクに対応するオペコード及び前記タスクを実行するための引数のうちの1つ以上を含む。
【0015】
実施形態では、前記ワーカスレッドは、第2値が前記実行ユニットにより前記第1メモリ部分に格納されると、前記タスクが完了したことを検出する動作を実行するよう更に構成される。
【0016】
実施形態では、前記ワーカスレッドは、前記第2メモリ部分から、前記タスクを実行した結果として生成される第2データを読み出す動作を実行するよう更に構成され、前記第2データは、第2値が前記実行ユニットにより前記第1メモリ部分に格納されていることを検出することに応答して、読み出される。
【0017】
実施形態では、前記実行ユニットは、
前記第2メモリ部分から前記第1データを読み出す動作であって、前記第1データは、前記第1値が前記ワーカスレッドにより前記第1メモリ部分に格納されていることを検出することに応答して、読み出される、動作と、
前記第1データに基づき前記タスクを実行する動作と、
を実行するよう更に構成される。
【0018】
実施形態では、前記実行ユニットは、
前記第2メモリ部分に、前記タスクを実行した結果として前記実行ユニットにより生成された第2データを格納する動作と、
前記第2データが前記第2メモリ部分に格納された後に、メモリフェンスリリース命令を発行する動作と、
前記第1メモリ部分に、前記タスクが完了したことを示す第2値を格納する動作であって、前記第2値は、前記メモリフェンスリリース命令が発行された後に、格納される、動作と、
を実行するよう更に構成される。
【0019】
本開示の態様によると、1つ以上のプロセッサ実行可能命令を格納するよう構成される非一時的コンピュータ可読媒体であって、前記1つ以上のプロセッサ実行可能命令は、少なくとも1つのプロセッサにより処理されると、前記プロセッサに、
ワーカスレッドを有するワークスティーリングスケジューラを実行させ、前記ワーカスレッドは、第1メモリ部分及び第2メモリ部分をグラフィック処理ユニット(GPU)の部分である実行ユニットと共有するよう構成され、
前記ワーカスレッドは、以下:
前記ワーカスレッドに関連付けられたキューからタスクを読み出す動作と、
前記タスクのカットオフ条件が満たされるかどうかを検出する動作と、
を実行するよう構成される、非一時的コンピュータ可読媒体が提供される。
【0020】
実施形態では、前記第1メモリ部分はドアベルレジスタを含み、前記第2メモリ部分はタスクレジスタを含む。
【0021】
実施形態では、前記実行ユニットは、複数のGPUコアと、前記複数のGPUコアの間で共有される同期メカニズムと、を含む。
【0022】
実施形態では、前記第1データは、前記タスクに対応するオペコード及び前記タスクを実行するための引数のうちの1つ以上を含む。
【図面の簡単な説明】
【0023】
前述の特徴は、図面の以下の説明からより完全に理解され得る。
【0024】
【
図1】本開示の態様によるコンピューティングシステムの例の図である。
【0025】
【
図2A】本開示の態様によるワークスティーリングスケジューラの例の図である。
【0026】
【
図2B】本開示の態様による
図2Aのワークスティーリングスケジューラにより使用されるキューの例の図である。
【0027】
【
図3A】本開示の態様によるグラフィック処理ユニット(GPU)の例の図である。
【0028】
【
図3B】本開示の態様による
図3AのGPUの部分である実行ユニットの例の図である。
【0029】
【
図4A】本開示の態様による
図2Aのワークスティーリングスケジューラの動作を示す図である。
【0030】
【
図4B】本開示の態様による共有メモリセクションの例の図である。
【0031】
【
図5A】本開示の態様によるプロセスの例のフローチャートである。
【0032】
【
図5B】本開示の態様によるプロセスの例のフローチャートである。
【0033】
【
図6A】本開示の態様によるプロセスの例のフローチャートである。
【0034】
【
図6B】本開示の態様によるプロセスの例のフローチャートである。
【0035】
【
図6C】本開示の態様によるプロセスの例のフローチャートである。
【発明を実施するための形態】
【0036】
ワークスティーリングは、中央処理ユニット(central processing unit (CPU))上で広く利用される効率的な動的スケジューリングポリシである。ワークスティーリングスケジューラは、各々が処理コア上で実行するワーカスレッドに関連付けられる両端キュー(double-ended queue、以後「デキュー(deque)」と呼ぶ)のセットに渡りタスクを分散することにより並列プロセッサ上で負荷バランシングを実行する。各デキューは、該デキューに関連付けられたローカルスレッドが、シリアル実行と同じ順序(つまり、スタック順序)でワーク(つまり、タスク)をスケジューリング及びスケジューリング解除することを可能にするプッシュ及びポップ動作をサポートできる。各デキューは、非ローカルスレッド(チーフスレッド(thief thread)とも呼ばれる)が、それらのローカルデキューを実行するために、それらがタスクを使い果たしたときに利用するスティール動作(steal operation)もサポートできる。スティール動作は、チーフスレッドによる実行のために犠牲者(victim)のデキューの(ローカルスレッドに対して)反対の端からタスクを除去してよい。タスクが実行されるとき、タスクの実行は、頻繁に追加タスクを生成することがある。追加タスクは、次にローカルデキューに置かれる。
【0037】
ワークスティーリングスケジューラは、ランタイムに有向非巡回グラフ(directed acyclic graph (DAG))を形成するタスクを生成し処理する。それらは、各親タスクについて1つ以上のより精細な子タスクが生成される(つまり、分岐する)分割統治循環法(divide-and-conquer recurrence)として表現されるアルゴリズムを実行する。これらのアルゴリズムは、スレッドが分岐した子タスクが実行を終了するのを待機(つまり、参加)しなければならないことも示す。循環の基本的なケースでは(シーケンシャルカットオフと呼ばれる)、シーケンシャルアルゴリズムが実行される(つまり、リーフタスク)ポイントで、分割されるべきタスクが小さすぎて、子タスクに有利にパーティションできない。有利性は、子タスクをパーティションしスケジューリングするために必要なオーバヘッドがどれ位かの指標である。特に、アルゴリズムワークの全部がリーフタスクの中で実行される。
【0038】
本開示によると、タスクを実際に実行するコストの大部分をスケジューラオーバヘッドが占めるシーケンシャルカットオフに達するまで、CPUがタスクを繰り返し分割するワークスティーリングスケジューラの部分を実行し、改良されたワークスティーリングスケジューラが開示される。その点において、CPU上でシーケンシャルコードを実行する代わりに、改良されたワークスティーリングスケジューラは、利用可能なグラフィック処理ユニット(GPU)上で実行するために、タスクをオフロードする。例により、幾つかの実装では、本開示は、GPUをサポートし既存の汎用ワークスティーリングスケジューラの実行セマンティクスを維持する異種の協調ワークスティーリングスケジューラ設計を提示することにより、(CPUのみを利用する)既存のワークスティーリングスケジューラに拡張を提供できる。
【0039】
図1は、本開示の態様によるコンピューティングシステム100の例の図である。コンピューティングシステム100は、中央処理ユニット(CPU)109と、グラフィック処理ユニット(GPU)120と、メモリ130と、共有メモリ140と、を含んでよい。CPU109は、任意の適切な種類のプロセッサ、例えばx89プロセッサ、縮小命令セットコンピュータ(reduced instruction set computer (RISC))プロセッサ、ARMベースプロセッサ、等を含んでよい。本例によると、CPU109は、ワークスティーリングスケジューラ200(
図2に示す)の異なるワーカスレッド220を並列に実行するよう構成される複数のCPUコア110A~110Dを含む。
図1の例では、CPU109は4個のCPUコアを有するが、CPUが任意の数(例えば、1、8、等)のコアを有する代替の実装が可能である。
【0040】
GPU120は、メモリ範囲をCPU109のアドレス空間からGPU120のアドレス空間まで直接マッピングする能力を有する任意の適切な種類のグラフィック処理ユニットを含んでよい。従って、単一の仮想アドレス空間が共有される。幾つかの実装では、GPU120は、CUDA(Compute Unified Device Architecture)フレームワークをサポートするGPUを含んでよい。追加又は代替として、幾つかの実装では、GPU120は、OpenCL(Open Computing Language)フレームワークをサポートするGPUを含んでよい。GPU120は、複数のGPUコアを含んでよい。本例では、GPU120は、1024個のGPUコアを含むが、本開示は任意の特定の数のGPUコア132がGPU120上に設けられることに限定されないことが理解されるだろう。
【0041】
メモリ130は、任意の適切な種類のランダムアクセスメモリ(RAM)、例えばDDR SRAM(Double Data Rate Synchronous Dynamic Random-Access Memory)を含んでよい。共有メモリ140は、各々GPU120のメモリ空間にマッピングされるメモリ130の部分を含んでよい。共有メモリ140は、GPU120のメモリ空間にマッピングされるので、CPU109及びGPU120の各々は、共有メモリ140に直接アクセスできる。例によると、幾つかの実装では、共有メモリ140は、CUDAフレームワーク又はOpenCLフレームワークを用いてGPU120のメモリ空間にマッピングされてよい。幾つかの実装では、GPU120は、共有メモリ140へのポインタを受け取り、このポインタを用いて、GPUカーネル内から共有メモリ140を直接参照するよう構成されてよい。同様に、CPUコア110のうちの少なくとも幾つかも、ポインタを用いて共有メモリ140を直接参照するよう構成されてよい。
【0042】
図2Aは、CPU109上で実行されるワークスティーリングスケジューラ200の例の図である。ワークスティーリングスケジューラ200は任意の適切な種類の並列コンピューティングソフトウェア及び/又はマイクロコードの部分であってよい。ワークスティーリングスケジューラ200は、複数のキュー210及び複数のワーカスレッド220を含んでよい。ワーカスレッド220の各々は、異なるキュー210に関連付けられてよい。本例によると、ワーカスレッド220Aはキュー210Aに関連付けられ、ワーカスレッド220Bはキュー210Bに関連付けられ、ワーカスレッド220Cはキュー210Cに関連付けられ、ワーカスレッド220Dはキュー210Dに関連付けられる。
図2Bを参照して以下に更に議論されるように、キュー210は、タスクを格納し及び読み出すために、スレッド220により使用される。
図2Aの例によると、キュー210の各々は、両端キューである。しかしながら、別の種類のキュー及び/又は別の種類のデータ構造がタスクを格納する代替の実装が可能である。本例では、ワークスティーリングスケジューラ200はソフトウェアで実装されるが、ワークスティーリングスケジューラ200がハードウェアで及び/又はソフトウェア(若しくはマイクロコード)又はハードウェアの組合せとして実装される代替の実装が可能である。
【0043】
図2Bは、本開示の態様によるキュー210の図である。番号付けが示唆するように、キュー210は、ワークスティーリングスケジューラ200の部分であるキュー210A~Bのいずれかと同じ又は同様であってよい。図示のように、キュー210は1つ以上のタスクを格納するよう構成されてよい。タスクの各々は、実行されることを望まれる特定の動作を表してよい。キュー210内のタスクは、一緒に、ワークスティーリングスケジューラ200により実施される並列コンピューティングアルゴリズムにより実行されている特定アクションのDAG(Direct Acyclic Graph)の部分であってよい。本開示を通じて使用されるように、及び文脈に依存して、用語「タスク」は、動作(operation)又は動作に対応する記述子(descriptor)を表してよい。例えば、幾つかの実装では、用語「タスク」は、動作を実行するために必要な任意の適切な種類のデータを表してよい。例により、「タスク」は、動作に対応するオペコード、動作を実行するための入力パラメータ、動作に関連付けられた関数呼び出しへの引数、動作が実行されるために参照される必要のある他のデータへのポインタ、及び/又は動作を実行するために必要な任意の他の適切な種類のデータ、のうちの1つ以上を含んでよい。
【0044】
図3Aは、本開示の態様によるGPU120の論理的編成の例の図である。本例によると、GPU300は、実行ユニット(又はタイル)310A、実行ユニット(又はタイル)310B、実行ユニット(又はタイル)310C、及び実行ユニット(又はタイル)310Dを実行するよう構成される。
図3Aの例では、GPU120は4個の実行ユニットを実装するよう構成されるが、本開示は、GPU120上の任意の特定の数の実行ユニットを実装することに限定されないことが理解されるだろう。幾つかの実装では、実行ユニット310のうちのいずれかは、NVIDIA CUDA(商標)フレームワークにおいて「ブロック」又は「ラップ」として知られているものを含んでよい。幾つかの実装では、各実行ユニット310は、同期点として使用するために実行ユニット内のGPUコアのハードウェアバリアメカニズムを含んでよい。本開示の原理及び思想に従い使用できる実行ユニットの例は、参照によりその全体がここに組み込まれる米国特許出願番号第16/372,618号、名称「ACCELERATING DATAFLOW SIGNAL PROCESSING APPLICATIONS ACROSS HETEROGENEOUS CPU/GPU SYSTEMS」から分かる。
【0045】
図3Bは、本開示の態様による実行ユニット310の例の図である。番号付けが示唆するように、実行ユニット310は、
図3Aに関して上述した実行ユニット310A~Dのいずれかと同じ又は同様であってよい。
図3Bに示すように、実行ユニット310は、GPUコア132のセットと、該セット内のGPUコア132の全部の間で共有される同期バリア320と、を含んでよい。本例によると、実行ユニット310は、32個のGPUコア132を含むが、実行ユニット310が任意の数のGPUコア132(例えば、1、4、8、16、64、等)を含む代替の実装が可能である。
図3Bの例では、実行ユニット310は同期バリアを含むが、別の種類の同期メカニズムが代わりに使用される代替の実装が可能である。簡潔に言うと、本開示は、任意の特定の種類の同期メカニズムが実行ユニット310内に存在することに限定されない。
【0046】
実行ユニット310は、ワークスティーリングスケジューラ200内のワーカスレッド220の代わりにタスクを実行するために使用されてよい。実行ユニット310内のGPUコア132のうちの1つは、1次状態を割り当てられてよく、ここでは「実行ユニット310の1次GPUコア」と呼ばれる。例えば、幾つかの実装では、「0」のランクを有する(実行ユニット310内の)GPUコアは、実行ユニット310の1次GPUコアとして指定されてよい。実行ユニット310内の残りの全部のGPUコア132は、2次状態を割り当てられてよく、ここでは「実行ユニット310の2次GPUコア」と呼ばれる。実行ユニット310の2次GPUコア132は、(i)ワーカスレッド220のうちの所与の1つからタスクを取得する、(ii)タスクをタスク部分に分割する、(iii)タスク部分のうちの1つを実行し、残りのタスク部分を2次GPUコアに提供する、及び(iv)タスクが完了すると、ワーカスレッドに通知する、よう構成されてよい。
【0047】
1つの特定の例では、同期バリア320は、ハードウェアで実装されてよく、実行ユニット310内のGPUコア132の間で共有同期点として機能するよう構成されてよい。より具体的には、同期バリア320は、GPUコア132の各々(例えば、2次GPUコア320及び/又は1次GPUコア132の各々)に、それら各々のタスク部分の実行が終了し、バリア320に到達した後に、待機状態に入らせてよい。待機状態に入ることは、GPUコア132が次のタスクの部分を直ぐに実行し始めること、場合によっては、現在タスクの完了データがワーカスレッド220のうちの1つにより読み出される前に、現在タスクの完了データが格納されているタスクレジスタ(例えば、
図4Bに示されるタスクレジスタ430を参照)を上書きすることを効率的に防ぐことができる。本例では、同期バリア320はソフトウェアで実装されるが、同期バリア320がソフトウェアで及び/又はハードウェアとソフトウェアの組合せとして実装される代替の実装が可能である。簡潔に言うと、本開示は、任意の特定の実装の同期バリア320に限定されない。
【0048】
図4Aは、本開示の態様によるコンピューティングシステム100の動作を示す概略図である。本開示の態様によると、共有メモリはM個のセクション410に分割され、Mは、ワークスティーリングスケジューラ200に割り当てられている実行ユニット310の数に等しい正の整数(つまり、本例では4)である。共有メモリセクション410は、各々のワーカスレッド220と各々の実行ユニット310との間でデータを交換するために使用されてよい。
図4Bに示すように、セクション410の各々は、ドアベルレジスタ及びタスクレジスタ430を含む。ドアベルレジスタ420は、1本のワード線であってよく、タスクがタスクレジスタ430に格納されたときをシグナリングするために使用されてよい。タスクレジスタ430は、特定のタスクを格納するよう構成されてよい。上述のように、用語「タスク」は、本開示を通じて使用されるように、動作を実行するために必要な任意のデータを表してよい。例えば、タスクレジスタ230に格納される「タスク」は、特定の動作に関連付けられたオペコード、動作を実行するための入力パラメータ、動作に関連付けられた関数呼び出しへの引数、動作が実行されるために参照される必要のある他のデータへのポインタ、のうちの1つ以上を含んでよい。
【0049】
図4Aに戻ると、実行ユニット310の各々は、共有メモリセクション410のうちの各々1つに割り当てられてよい。より具体的には、実行ユニット310Aは、実行ユニット310AによりデータをCPUコア110A(及び/又はワーカスレッド220A)へ送信し及びそれから受信するために使用される共有メモリセクション410Aに割り当てられてよい。実行ユニット310Bは、実行ユニット310BによりデータをCPUコア110B(及び/又はワーカスレッド220B)へ送信し及びそれから受信するために使用される共有メモリセクション410Bに割り当てられてよい。実行ユニット310Cは、実行ユニット310CによりデータをCPUコア110C(及び/又はワーカスレッド220C)へ送信し及びそれから受信するために使用される共有メモリセクション410Cに割り当てられてよい。実行ユニット310Dは、実行ユニット310DによりデータをCPUコア110D(及び/又はワーカスレッド220D)へ送信し及びそれから受信するために使用される共有メモリセクション410Dに割り当てられてよい。
【0050】
更に、CPUコア110の各々(及び/又はワーカスレッド220の各々)は、共有メモリセクション410のうちの各々1つに割り当てられてよい。具体的には、CPUコア110A(及び/又はワーカスレッド220A)は、CPUコア110A(及び/又はワーカスレッド220A)によりデータを実行ユニット310Aへ送信する又はそれから受信するために使用される共有メモリセクション410Aに割り当てられてよい。CPUコア110B(及び/又はワーカスレッド220B)は、CPUコア110B(及び/又はワーカスレッド220B)によりデータを実行ユニット310Bへ送信する又はそれから受信するために使用される共有メモリセクション410Bに割り当てられてよい。CPUコア110C(及び/又はワーカスレッド220C)は、CPUコア110C(及び/又はワーカスレッド220C)によりデータを実行ユニット310Cへ送信する又はそれから受信するために使用される共有メモリセクション410Cに割り当てられてよい。CPUコア110D(及び/又はワーカスレッド220D)は、CPUコア110D(及び/又はワーカスレッド220D)によりデータを実行ユニット310Dへ送信する又はそれから受信するために使用される共有メモリセクション410Dに割り当てられてよい。
【0051】
CPUコア110の各々(及び/又はワーカスレッド220の各々)は、各々の実行ユニット310にマッピングされてよい。
図4Aの例によると、CPUコア110A(及び/又はワーカスレッド220A)は実行ユニット310Aにマッピングされ、CPUコア110B(及び/又はワーカスレッド220B)は実行ユニット310Bにマッピングされ、CPUコア110C(及び/又はワーカスレッド220C)は実行ユニット310Cにマッピングされ、CPUコア110D(及び/又はワーカスレッド220D)は実行ユニット310Dにマッピングされる。CPUコア110と対応する実行ユニットとの間のマッピングは、同じ共有メモリセクション410をCPUコア及び対応する実行ユニット310に割り当てることにより達成されてよい。しかしながら、本開示は、CPUコアを各々の実行ユニットにマッピングする任意の特定の方法に限定されないことが理解される。
【0052】
幾つかの実装では、CPUコア110(及び/又はワーカスレッド220)の各々は、CPUコア110及び/又はワーカスレッド220にマッピングされる実行ユニット310上でタスクを実行してよい。例えば、CPUコア110A(及び/又はワーカスレッド220A)は実行ユニット310A上でタスクを実行してよく、CPUコア110B(及び/又はワーカスレッド220B)は実行ユニット310B上でタスクを実行してよく、CPUコア110C(及び/又はワーカスレッド220C)は実行ユニット310C上でタスクを実行してよく、CPUコア110D(及び/又はワーカスレッド220D)は実行ユニット310D上でタスクを実行してよい。例えば、ワーカスレッド220のうちの任意の所与の1つがタスクのシーケンシャルカットオフ条件が満たされることを検出すると、所与のワーカスレッド220は、所与のワーカスレッド220にマッピングされた各々の実行ユニット310を識別してよい。次に、所与のワーカスレッド220は、所与のワーカスレッド220及び各々の実行ユニット310の両方に割り当てられた共有メモリセクション410を用いて、タスクを各々の実行ユニット310に提供してよい。次に、各々の実行ユニット310は、共有メモリセクション410からタスクを読み出す。次に、各々の実行ユニット310は、タスクを実行し、タスクを実行した結果として生成されたデータを、共有メモリセクション410に戻す。最後に、所与のワーカスレッドは、タスクを実行した結果として生成されたデータを、共有メモリセクションから読み出してよい。
【0053】
図4Aの例では、CPUコア110(及び/又はワーカスレッド220)の各々が単一の共有メモリセクション410に割り当てられるが、CPUコア110のうちの任意のものが複数の共有メモリセクション410に割り当てられる代替の実装が可能である。
図4Bの例では、CPUコア110(及び/又はワーカスレッド220)の各々が単一の実行ユニット310にマッピングされるが、CPUコア110(及び/又はワーカスレッド220)のうちの任意のものが複数の実行ユニットにマッピングされる代替の実装が可能である。そのような実装では、CPUコア110(及び/又はワーカスレッド)の各々は、同じ数の実行ユニット310にマッピングされてよい。実行ユニット310の数がCPUコア110(及び/又はワーカスレッド)の数により均等に分割されない場合、CPUコア110(及び/又はワーカスレッド)のうちの1つは、より少ない実行ユニット310にマッピングされてよい。
【0054】
図5Aは、本開示の態様によるワークスティーリングスケジューラ200の動作を開始する処理500Aの例のフローチャートである。本例によると、処理500AはCPUコア110Aにより実行される。しかしながら、処理500AがCPUコア110のうちの別の1つにより実行される代替の実装が可能である。
【0055】
ステップ502で、CPUコア110Aは、ワークスティーリングスケジューラ200のキュー210及びワーカスレッド220をインスタンス化する。ステップ504で、CPUコア110Aは、共有メモリ140と、共有メモリ140内の複数の共有メモリセクション410とを割り当てる。ステップ506で、CPUコア110Aは、ワーカスレッド220Aの各々を、CPU109のCPUコア110のうちの異なる1つに割り当てる。上述のように、ステップ506を実行した結果、ワーカスレッド220AはCPUコア110Aに割り当てられ、ワーカスレッド220BはCPUコア110Bに割り当てられ、ワーカスレッド220CはCPUコア110Cに割り当てられ、ワーカスレッド220DはCPUコア110Dに割り当てられる。ステップ508で、コア110Aは、ワーカスレッド220の各々を、実行ユニット310のうちそれぞれ異なる1つにマッピングする。上述のように、ステップ508を実行した結果として、ワーカスレッド220A(及び/又はCPUコア110A)は、実行ユニット310Aにマッピングされる。ワーカスレッド220B(及び/又はCPUコア110B)は、実行ユニット310Bにマッピングされる。ワーカスレッド220C(及び/又はCPUコア110C)は、実行ユニット310Cにマッピングされる。及びワーカスレッド220D(及び/又はCPUコア110D)は、実行ユニット310Dにマッピングされる。幾つかの実装では、ワーカスレッド220のうちのいずれかといずれかの実行ユニット310との間のマッピングは、同じ共有メモリセクション410をワーカスレッド220及び実行ユニット310に割り当てることにより実行できる。ステップ510で、CPUコア110Aは、ワーカスレッド220を実行し始める。幾つかの実装では、ワーカスレッド220のうちのいずれかは、
図5Bに関して更に後述する処理500Bに従い実行されてよい。
【0056】
図5Bは、本開示の態様による処理500Aのステップ510により指定されるようなワークスティーリングスケジューラのワーカスレッドを実行する処理500Aの例のフローチャートである。
図5Bの例によると、処理500Bは、ワーカスレッド220Aにより実行されるが、代替として、処理500Bはワーカスレッド220のいずれにより実行できることが理解される。ステップ522で、ワーカスレッド220Aは、キュー210Aからタスクを読み出す(及び/又は削除する)。ステップ524で、ワーカスレッド220Aは、所定のカットオフ条件が満たされるかどうかを決定する。条件が満たされる場合、処理500Bはステップ526に進む。その他の場合、条件が満たされない場合、処理500Bはステップ528に進む。ステップ526で、処理500Bは、タスクを追加タスクに分割し、タスクをキュー210Aに追加して戻す。ステップ528で、ワーカスレッド220Aは、GPU120の実行ユニット310Aを用いてタスクを実行する。タスクが実行される方法は、
図6A~6Cに関して更に後述される。具体的には、
図6Aは、実行ユニット310A上でタスクを実行する目的で、ワーカスレッド220Aにより実行される処理の例を提供する。
図6Bは、タスクの異なる部分の実行を協調させる目的で、実行ユニット310Aの1次GPUコアにより実行される処理600Bの例を提供する。そして、
図6Cは、タスク部分を実行する目的で、実行ユニット310A内の1次GPUコア及び2次GPUコアのいずれかにより実行される処理600Cの例を提供する。
【0057】
図6Aは、処理500Bのステップ528により指定されるような、GPUを用いてタスクを実行する処理600Aのフローチャートである。ステップ602で、ワーカスレッド220Aは、タスク(例えば、ステップ522で読み出したタスク)を共有メモリセクション410Aのタスクレジスタ430に格納する。ステップ604で、ワーカスレッド220Aは、メモリフェンス取得命令を発行する。ステップ606で、ワーカスレッド220Aは第1値(例えば、「1」)を共有メモリセクション410Aのドアベルレジスタ420に格納する。
図6Bに関して更に後述されるように、第1値をドアベルレジスタ420に格納することは、実行ユニット310Aに、実行されるために待機しているタスクがタスクレジスタ430内に存在することを効率的に知らせる。ステップ608で、ワーカスレッド220Aは、共有メモリセクション410Aのドアベルレジスタ4230が第2値(例えば「0」)に設定されているかどうかを検出する。ドアベルレジスタ420が第2値に設定されている場合、処理600Aはステップ610に進む。その他の場合、ドアベルレジスタ420は、第2値に設定されず、ステップ608が再び実行される。言い換えると、ステップ606で、ワーカスレッド220Aは、ステップ610に進む前に、ドアベルレジスタ420が(実行ユニット310Aにより)第2値に設定されるまで待つ。
図6Bに関して更に後述されるように、ドアベルレジスタ420が第2値に設定されると、これは、ワーカスレッド220Aに、タスクが実行ユニット310Aにより完了されたことを効率的に知らせる。ステップ610で、ワーカスレッド220Aは、共有メモリセクション410Aのタスクレジスタ430から、実行ユニット310A内の1つ以上のGPUコアにより格納された完了状態ワード(及び/又はエラーコード)を読み出す。
【0058】
図6Bは、処理500Bのステップ528により指定されるようなタスクを実行する処理600Bの例のフローチャートである。ステップ612で、実行ユニット310Aの1次GPUコアは、共有メモリセクション410Aのドアベルレジスタ420が第1値に設定されたかどうかを検出する。ドアベルレジスタ420が第1値に設定されている場合、処理600Bはステップ614に進む。その他の場合、ステップ612は再び繰り返される。ステップ614で、実行ユニット310Aの1次GPUコアは、共有メモリセクション410Aのタスクレジスタ430からタスクを読み出す。ステップ616で、実行ユニット310Aの1次GPUコアは、タスクを複数のタスク部分に分割する。ステップ618で、実行ユニット310Aの1次GPUコアは、複数のタスク部分の各々を、実行ユニット310A内のGPUコアのうちの異なる1つに割り当てる。例えば、1次GPUコアは、各々のタスク部分を、自身に、及び実行ユニット310A内の2次GPUコアの各々に割り当ててよい。代替として、実行ユニット310A内に存在するGPUコアよりも少ないタスク部分が存在するとき、1次GPUコア310Aは、各々のタスク部分を、実行ユニット310A内のGPUコアの一部にのみ割り当ててよい。ステップ620で、実行ユニット310Aの1次GPUコア132は、実行ユニット310A内の(タスク部分に割り当てられた)2次GPUコア132の各々に、それら各々のタスク部分の実行を開始させる。ステップ622で、1次GPUコア132は、自身が自身に割り当てたタスク部分を実行する。直ちに理解できるように、幾つかの実装では、1次GPUコア132は、自身にタスク部分を割り当てなくてよい。この場合、ステップ622は省略できる。ステップ622で、実行ユニット310Aの1次GPUコアは、実行ユニット310A内の(タスク部分を割り当てられた)GPUコアの各々が、それら各々のタスク部分の実行を終了したかどうかを検出する。例えば、GPUコアの各々がそれら各々のタスク部分の実行を終了したかどうかを検出することは、GPUコアの各々が実行ユニット310Aの同期バリア320に達し、現在待機状態であるかどうかを検出することを含んでよい。GPUコアの各々がそれら各々のタスク部分の実行を終了している場合、処理600Bはステップ626へ進む。その他の場合、ステップ624が再び繰り返される。ステップ626で、実行ユニット310Aの1次GPUコアは、メモリフェンスリリース命令を発行する。ステップ628で、実行ユニット310Aの1次GPUコアは、共有メモリセクション410Aのドアベルレジスタ420を第2値(例えば「0」)に設定する。
【0059】
図6Cは、処理500Bのステップ506により指定されるようなタスクを実行する処理600Bの例のフローチャートである。ステップ624で、実行ユニット310AのGPUコア132は、(ステップ618で割り当てられた)タスク部分のうちの1つを取得する。ステップ644で、GPUコア132は、タスク部分を実行する。ステップ646で、GPUコア132は、完了指示子を共有メモリセクション410Aのタスクレジスタに格納する。例えば、GPUコア132がタスクの実行に成功した場合、GPUコア132は、メモリセクション410のタスクレジスタ内のビットのうちの1つを「1」に設定してよい。別の例として、GPUコア132がタスクの実行に失敗した場合、GPUコア132は、同じビットを「0」に設定してよい。追加又は代替として、幾つかの実装では、GPUコア132がタスクの実行に失敗すると、GPUコア132は、タスク部分が成功裏に完了できない理由を識別するエラーコードをタスクレジスタに格納してよい。本例では、完了指示子は1ビット幅であるが、完了状態指示子がより大きなサイズを有する代替の実装が可能である。タスク648で、GPUコア132は、実行ユニット310Aのバリア同期バリア320に達した結果として、待機状態に入る。
【0060】
幾つかの実装では、タスクが完了すると、タスクの完了状態を識別するワードが、(共有メモリセクション410の)タスクレジスタ430に格納されてよい。ワードは、複数のビットを含んでよい。ビットの各々は、実行ユニット310内の異なるGPUコアによりタスクレジスタに格納されてよく、GPUコアがGPUコアにより実行されたタスクの部分の実行に成功したかどうかを示してよい。ビットが「1」に等しい場合、これは、GPUコアがタスクの自身の部分の実行に成功したことを示してよい。その他の場合、ビットが「0」に設定される場合、これは、GPUコアがタスクの自身の部分の完了に失敗したことを示してよい。従って、ワードが全部「1」を含むとき、これは、タスクが実行ユニット310により成功裏に完了したことを示してよい。これに対して、ワードが少なくとも1つの「0」を含むとき、これは、タスクが実行ユニット310により成功裏に完了しなかったことを示してよい。
図1~6Cは、共有メモリセクション410Aを、実行ユニット310Aとワーカスレッド220Aとの間で共有される唯一のメモリとして示すが、追加メモリが実行ユニット310Aとワーカスレッド220Aとの間で共有され、ワーカスレッド220Aに結果データを提供するために使用される代替の実装が可能である。
【0061】
本開示の態様によると、メモリフェンス取得命令及びメモリフェンスリリース命令は、CPU109(及び/又はCPU109条で実行するコンパイラ)に、データが共有メモリ410のドアベルレジスタ420及びタスクレジスタ430に格納される順序を強制させるバリア命令であってよい。具体的に、ステップ604でメモリフェンス取得命令を発行することは、(ステップ606で)第1値が共有メモリセクション410Anドアベルレジスタ420に格納される前に、(ステップ602で)タスクが共有メモリセクション410Aのタスクレジスタ430に格納されることを保証する。同様に、ステップ626でメモリフェンスリリース命令を発行することは、(ステップ632で)共有メモリセクション410Aのドアベルレジスタ420が第2値に設定される前に、(ステップ624で)タスクに関連付けられた全部の完了データが共有メモリセクション410Aのタスクレジスタ430にコピーされることを保証する。本開示によると、(アトミック操作とは反対に)メモリフェンス命令を用いて(共有メモリセクション410の)ドアベルレジスタ及びタスクレジスタへの書き込みを同期化することは、(
図6A~Cに関して記載した)プロトコルのオーバヘッドを大幅に削減し、(ステップ614で取得された)タスクが実行される効率を向上できる。
【0062】
幾つかの実装では、メモリフェンス命令が発行されると、共有メモリセクション410Aのドアベルレジスタ420内の第1値(例えば「1」)を見ることは、実行ユニット310Aに、有効なタスクがメモリセクション410のタスクレジスタ430内に存在することを保証できる。同様に、メモリフェンスリリース命令が発行されると、共有メモリセクション410Aのドアベルレジスタ420内の第2値(例えば「0」)を見ることは、CPUコア110A(及び/又はワーカスレッド220A)に、有効なタスクがメモリセクション410のタスクレジスタ430内に存在することを保証できる。幾つかの実装では、CPUコア110A(及び/又はワーカスレッド220A)が複数の実行ユニット310にマッピングされるとき、CPUコア110A(及び/又はワーカスレッド220A)は、(ステップ522で取得された)タスクを複数のタスク(例えば、タスク部分)に分割でき、(
図6Aに関して議論した方法で)各タスク部分を実行ユニット310のうちの異なる1つにより実行してよい。
【0063】
図5B及び6Aの例によると、ステップ522で、タスクは、キュー210Aから読み出され、ステップ602で、タスクは共有メモリセクション410Aのタスクレジスタに格納される。しかしながら、ステップ522及び602は、必ずしも、キュー210Aから読み出された同じデータが共有メモリセクション410Aのタスクレジスタ430にも格納されることを意味しない。例えば、幾つかの実装では、(ステップ522で)1つ以上の第1データアイテムが、キュー210Aから読み出されてよく、(ステップ602で)1つ以上の第2データアイテムがタスクレジスタ430に格納されてよい。そのような実装では、第2データアイテムは、第1データアイテムと同じ又は異なってよい。追加又は代替として、幾つかの実装では、第2データアイテムのうちの少なくとも1つは、第1データアイテムに基づき少なくとも部分的に生成されてよい。
【0064】
幾つかの実装では、ワークスティーリングスケジューラ200は、実行ユニット310のタスクレジスタ430内に「切断(disconnect)」オペコードを置くことにより、実行ユニット310のうちの1つ以上を切断してよい。「切断(disconnect)」オペコードを受信すると、実行ユニットの1次GPU132(及び/又はGPU120内の他のハードウェア)は、ワークスティーリングスケジューラ200から実行ユニットを切断してよい。
【0065】
本開示は、ワークスティーリングスケジューラ200内で任意の特定の並列処理アルゴリズムを使用することに限定されない。これに関して、本開示は、(ステップ524で)任意の特定のカットオフ条件を評価することに限定されないことが理解される。
図1~6Cの例はワークスティーリングスケジューラの文脈で提示されたが、本開示は、任意の特定の種類のスケジューラに限定されない。
【0066】
ここに記載される処理は、
図1のハードウェア及びソフトウェアを使用することに限定されず、任意の計算又は処理環境において、及びコンピュータプログラムを実行可能な任意の種類のマシン若しくはマシンのセットと共に適用できる。ここの記載される処理は、ハードウェア、ソフトウェア、又は両者の組合せで実装されてよい。ここに記載される処理は、各々がプロセッサとプロセッサにより読み取り可能な非一時的機械可読媒体又は別の製品(揮発性及び不揮発性メモリ及び/又は記憶要素を含む)と、少なくとも1つの入力装置と、1つ以上の出力装置と、を含む、プログラマブルコンピュータ/マシン上で実行されるコンピュータプログラム内に実装されてよい。プログラムコードは、入力装置を用いて入力されたデータに適用されて、本願明細書に記載した処理のうちのいずれかを実行し、及び出力情報を生成してよい。
【0067】
システムは、データ処理機器(例えば、プログラマブルプロセッサ、コンピュータ、又は複数のコンピュータ)による実行のため又はその動作を制御するために、少なくとも部分的に(例えば非一時的コンピュータ可読媒体のような、例えば非一時的機械可読記憶媒体の中の)コンピュータプログラムプロダクトにより実装されてよい。各々のそのようなプログラムは、コンピュータに基づくシステムの残りの部分と共に動作するために、高レベル手続き型又はオブジェクト指向プログラミング言語で実装されてよい。しかしながら、プログラムは、アセンブリ、機械言語、又はHardware Description Languageで実装されてよい。言語は、コンパイルされ、又はインタープリットされた言語であってよく、スタンドアロンプログラムとして、又はモジュール、コンポーネント、サブルーチン、若しくはコンピューティング環境で使用するために適する別のユニットを含む任意の形式で展開されてよい。コンピュータプログラムは、1つのコンピュータ又は1つの場所に置かれた若しくは複数の場所に分散されて通信ネットワークにより相互接続される1つのコンピュータ又は複数のコンピュータ上で、実行されるよう展開されてよい。コンピュータプログラムは、非一時的機械可読媒体がコンピュータにより読み取られると、本願明細書に記載した処理を実行するために、コンピュータを構成し及び作動させるために汎用又は専用プログラマブルコンピュータにより読み取り可能である非一時的機械可読媒体に格納されてよい。例えば、本願明細書に記載の処理は、コンピュータプログラムにより構成される非一時的機械可読記憶媒体として実装されてもよく、コンピュータプログラムは、実行されると、コンピュータプログラム内の命令が、コンピュータを処理に従い作動させる。非一時的機械可読媒体は、限定されないが、ハードドライブ、コンパクトディスク、フラッシュメモリ、不揮発性メモリ、揮発性メモリ、磁気ディスク、等を含んでよいが、過渡的信号自体を含まない。
【0068】
本特許の主題である種々の概念、構造及び技術の説明を提供する好適な実施形態を記載したが、これらの概念、構造、及び技術を組み込んでいる他の実施形態が使用されてよいことが明らかになった。従って、本特許の範囲は、記載された実施形態に限定されるべきではなく、むしろ以下の請求の範囲及び精神によってのみ限定されるべきである。