(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2024-01-18
(54)【発明の名称】オフロードされた命令とオフロードされていない命令との間のメモリ順序付けの保持
(51)【国際特許分類】
G06F 9/52 20060101AFI20240111BHJP
【FI】
G06F9/52 150A
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2023538823
(86)(22)【出願日】2021-12-21
(85)【翻訳文提出日】2023-08-15
(86)【国際出願番号】 US2021064663
(87)【国際公開番号】W WO2022146793
(87)【国際公開日】2022-07-07
(32)【優先日】2020-12-29
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
(71)【出願人】
【識別番号】591016172
【氏名又は名称】アドバンスト・マイクロ・ディバイシズ・インコーポレイテッド
【氏名又は名称原語表記】ADVANCED MICRO DEVICES INCORPORATED
(74)【代理人】
【識別番号】100108833
【氏名又は名称】早川 裕司
(74)【代理人】
【識別番号】100111615
【氏名又は名称】佐野 良太
(74)【代理人】
【識別番号】100162156
【氏名又は名称】村雨 圭介
(72)【発明者】
【氏名】ジャガディッシュ ビー. コトゥラ
(72)【発明者】
【氏名】ジョン カラマティアノス
(57)【要約】
オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する。オフロードされる動作のためのオフロード命令が処理され、オフロード命令に関連するメモリアドレスにロックが配置される。メモリアドレスをターゲットとするキャッシュ動作の完了に応じて、メモリアドレスに対するロックが除去される。マルチスレッドアプリケーションの場合、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定すると、何れのオフロード命令よりも若い非オフロード命令の実行が制限される。各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定したことに応じて、制限が除去される。リモートデバイスは、例えば、プロセッシングインメモリデバイス、又は、メモリに結合されたアクセラレータであり得る。
【選択図】
図1
【特許請求の範囲】
【請求項1】
オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する方法であって、
少なくとも1つのオフロード命令を処理することと、
前記少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することと、
前記メモリアドレスをターゲットとする動作の完了に応じて、前記メモリアドレスに対する前記ロックを除去することと、を含む、
方法。
【請求項2】
前記少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することは、アドレスロックバッファのエントリに前記メモリアドレスを記憶することを含み、前記メモリアドレスに対する前記ロックを除去することは、前記アドレスロックバッファ内の前記エントリをクリアすることを含む、
請求項1の方法。
【請求項3】
前記メモリアドレスをターゲットとする動作を完了することは、前記メモリアドレスのエントリを含む1つ以上のコアの1つ以上のキャッシュにプローブ要求を送信することを含み、前記プローブ要求は、前記エントリ内のデータが無効化されるか又はフラッシュされるかの何れかであることを示す、
請求項1の方法。
【請求項4】
前記ロックは、少なくとも1つのオフロード命令を処理することの後に配置され、前記ロックは、オフロードターゲットデバイスでの前記動作の実行前に除去される、
請求項1の方法。
【請求項5】
複数のプロセッサコアがそれぞれのオフロード命令のシーケンスの実行をそれぞれ開始したと判定することであって、前記複数のプロセッサコアで実行するそれぞれのオフロード命令のシーケンスは、プロセス識別子を共有する、ことと、
何れの前記オフロード命令よりも若い非オフロード命令の実行を制限することと、
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定したことに応じて、前記制限を除去することと、を含む、
請求項1の方法。
【請求項6】
複数のプロセッサコアがそれぞれのオフロード命令のシーケンスの実行をそれぞれ開始したと判定することは、前記複数のプロセッサコアが、前記それぞれのオフロード命令のシーケンスにおいてバリアの開始命令を実行したと判定することを含み、前記複数のプロセッサコアで実行する前記それぞれのオフロード命令のシーケンスは、プロセス識別子を共有する、
請求項5の方法。
【請求項7】
前記バリアの開始命令は、前記それぞれのオフロード命令のシーケンスを同時実行しているいくつかのプロセッサコアを識別するために使用される、
請求項6の方法。
【請求項8】
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定することは、バリアの終了命令が各プロセッサコアで実行されたと判定することを含む、
請求項5の方法。
【請求項9】
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定することは、前記オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定することを含む、
請求項8の方法。
【請求項10】
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定することは、各コアの進捗を追跡することを含む、
請求項5の方法。
【請求項11】
前記オフロード命令は、プロセッシングインメモリ(PIM)デバイスにオフロードされる動作のための命令である、
請求項1の方法。
【請求項12】
マルチコアプロセッサであって、
少なくとも1つのオフロード命令を処理することと、
前記少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することと、
前記メモリアドレスをターゲットとする動作の完了に応じて、前記メモリアドレスに対する前記ロックを除去することと、
を行うように構成されている、
マルチコアプロセッサ。
【請求項13】
前記少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することは、アドレスロックバッファのエントリに前記メモリアドレスを記憶することを含み、前記メモリアドレスに対する前記ロックを除去することは、前記アドレスロックバッファ内の前記エントリをクリアすることを含む、
請求項12のマルチコアプロセッサ。
【請求項14】
前記メモリアドレスをターゲットとする動作を完了することは、前記メモリアドレスのエントリを含む1つ以上のコアの1つ以上のキャッシュにプローブ要求を送信することを含み、前記プローブ要求は、前記エントリ内のデータが無効化されるか又はフラッシュされるかの何れかであることを示す、
請求項12のマルチコアプロセッサ。
【請求項15】
前記マルチコアプロセッサは、
複数のプロセッサコアがそれぞれのオフロード命令のシーケンスの実行をそれぞれ開始したと判定することであって、前記複数のプロセッサコアで実行するそれぞれのオフロード命令のシーケンスは、プロセス識別子を共有する、ことと、
何れの前記オフロード命令よりも若い非オフロード命令の実行を制限することと、
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定したことに応じて、前記制限を除去することと、
を行うように構成されている、
請求項12のマルチコアプロセッサ。
【請求項16】
複数のプロセッサコアがそれぞれのオフロード命令のシーケンスの実行をそれぞれ開始したと判定することは、各プロセッサコアが、前記それぞれのオフロード命令のシーケンスにおいてバリアの開始命令を実行したと判定することを含み、前記複数のプロセッサコアで実行する前記それぞれのオフロード命令のシーケンスは、プロセス識別子を共有し、
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定することは、
バリアの終了命令が各プロセッサコアで実行されたと判定することと、
前記オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定することと、を含む、
請求項15のマルチコアプロセッサ。
【請求項17】
システムであって、
プロセッシングインメモリ(PIM)デバイスと、
前記PIMデバイスに結合されたマルチコアプロセッサと、を備え、
前記マルチコアプロセッサは、
少なくとも1つのオフロード命令を処理することと、
前記少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することと、
前記メモリアドレスをターゲットとする動作の完了に応じて、前記メモリアドレスに対する前記ロックを除去することと、
を行うように構成されている、
システム。
【請求項18】
前記メモリアドレスをターゲットとする動作を完了することは、前記メモリアドレスのエントリを含む1つ以上のコアの1つ以上のキャッシュにプローブ要求を送信することを含み、前記プローブ要求は、前記エントリ内のデータが無効化されるか又はフラッシュされるかの何れかであることを示す、
請求項17のシステム。
【請求項19】
前記マルチコアプロセッサは、
複数のプロセッサコアがそれぞれのオフロード命令のシーケンスの実行をそれぞれ開始したと判定することであって、前記複数のプロセッサコアで実行するそれぞれのオフロード命令のシーケンスは、プロセス識別子を共有する、ことと、
何れの前記オフロード命令よりも若い非オフロード命令の実行を制限することと、
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定したことに応じて、前記制限を除去することと、
を行うように構成されている、
請求項17のシステム。
【請求項20】
複数のプロセッサコアがそれぞれのオフロード命令のシーケンスの実行をそれぞれ開始したと判定することは、各プロセッサコアが、前記それぞれのオフロード命令のシーケンスにおいてバリアの開始命令を実行したと判定することを含み、前記複数のプロセッサコアで実行する前記それぞれのオフロード命令のシーケンスは、プロセス識別子を共有し、
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定することは、
バリアの終了命令が各プロセッサコアで実行されたと判定することと、
前記オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定することと、を含む、
請求項19のシステム。
【発明の詳細な説明】
【背景技術】
【0001】
コンピューティングシステムは、多くの場合、命令を取り出して実行し、実行した命令の結果を適切な場所に記憶することができる、いくつかの処理リソース(例えば、1つ以上のプロセッサ)を含む。処理リソース(例えば、中央処理装置(central processing unit、CPU))は、データ(例えば、1つ以上のオペランド)に対して論理演算を実行することによって命令を実行するために使用することができる、例えば、算術論理ユニット(arithmetic logic unit、ALU)回路、浮動小数点ユニット(floating point unit、FPU)回路、及び/又は、組み合わせ論理ブロック等のいくつかの機能ユニットを備え得る。例えば、機能ユニット回路は、いくつかの論理演算を介してオペランドに対して加算、減算、乗算及び/又は除算等算術演算を実行するために使用され得る。典型的には、処理リソース(例えば、プロセッサ及び/又は関連機能ユニット回路)は、メモリアレイの外部にあり、データは、命令セットを実行するために、処理リソースとメモリアレイとの間のバスを介してアクセスされる。メモリアレイ内のデータをフェッチするため又は記憶するためのアクセスの量を低減するために、コンピューティングシステムは、処理リソース又は処理リソース群による使用のために最近アクセスされた又は変更されたデータを一時的に記憶するキャッシュ階層を用い得る。しかしながら、処理性能は、特定の動作をプロセッサインメモリ(processor-in-memory、PIM)デバイスにオフロードすることによって更に改善され、PIMデバイスでは、データを処理リソースのより近くに移動させるのではなく、データを記憶する記憶場所のより近くでデータ処理が実行されるように、処理リソースがメモリの内部及び/又は近くに実装され得る。PIMデバイスは、プロセッサとメモリデバイスとの間の通信を削減及び/又は排除することによって時間を短縮し、また、電力を節約し得る。
【0002】
特定のアプリケーションは、一時的なデータの再利用が少ない又は行われないフェーズを有し、このフェーズ中、キャッシュ階層では頻繁にミスが生じ、メモリからデータをフェッチする。加えて、これらのフェーズは、低計算強度(フロップ/バイトの比)を示し得る。これらのフェーズ中、データ移動が多く、フェーズがメモリバウンドであるため、エネルギー効率及び性能が低下する。したがって、これらのフェーズは、PIMデバイス又はアクセラレータへのオフロードに特に適している。例えば、プログラマは、特定のコードシーケンスがオフロードされるべきであるという指標をアプリケーションソースコード内に提供することができる、又は、コンパイラが、かかる決定を行い得る。オフロードされた命令の解釈及びオーケストレーションは、依然として、アプリケーションをホストする処理リソースによって実行される必要がある。
【図面の簡単な説明】
【0003】
【
図1】本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持するための例示的なシステムのブロック図である。
【
図2】本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持するための別の例示的なシステムのブロック図である。
【
図3】本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する例示的な方法を示すフロー図である。
【
図4】本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する別の例示的な方法を示すフロー図である。
【
図5】本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する別の例示的な方法を示すフロー図である。
【
図6】本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する別の例示的な方法を示すフロー図である。
【
図7】本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する別の例示的な方法を示すフロー図である。
【
図8】本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する別の例示的な方法を示すフロー図である。
【発明を実施するための形態】
【0004】
中央処理装置(CPU)コアへの負荷を低減するために、特定の動作がオフロードされて、プロセッシングインメモリ(PIM)デバイス又はアクセラレータ等のオフロードターゲットデバイスによってリモート実行され得る。例えば、PIMアーキテクチャは、メモリ内又はメモリの付近で実行するためのオフロード命令をサポートしており、その結果、プロセッサとメモリとの間のデータリンクで帯域幅が節約され、プロセッサの電力消費が低減され得る。例えば、PIMデバイスによるオフロードされた命令の実行は、データをローカルCPUレジスタにロードし、データをローカルCPUストレージからメモリに書き戻すことを必要としない。
【0005】
メモリ順序付けを保証するために、バリア又はフェンスを用いて、オフロード命令を非オフロード命令(すなわち、CPUでローカルに実行される動作)から分離することができる。しかしながら、従来のメモリフェンス/バリアの実施形態は、一部のアーキテクチャにおいて、オフロード命令とより若い非オフロード命令との間のメモリ順序付けを保持するのに十分ではない場合がある。従来のメモリフェンス又はバリアは、より古いコードがリタイアするまで、より若いコードの発行をブロックする。オフロード命令がグローバル同期点を通過し、オフロードターゲットデバイス上で完了する前に、オフロード命令がCPUコアにおいてリタイアするアーキテクチャでは、従来のバリア又はフェンスは、より若い非オフロード命令コードにメモリ順序付けを強制することができない。例えば、従来のフェンス/バリア命令は、(全てのスレッドにわたって)オフロード命令とより若い非オフロード命令との間のメモリアクセスの正しい順序付けを保証することができない。これは、一部のアーキテクチャでは、より新しい非オフロードロード命令及び記憶命令が、より古いオフロード命令がリタイアした後であって、グローバルコヒーレンス同期点を通過する以前にバリア/フェンスを超えて実行し、メモリにアクセスすることが許可されるからである。これは、潜在的に、オフロード命令と同じアドレスにアクセスする、より若い非オフロード命令が古いデータをフェッチし、誤った実行をもたらし得るというシナリオに帰結し得る。
【0006】
本開示によるいくつかの実施形態は、オフロード実行デバイスにオフロードされた命令とより若いオフロードされていない命令との間のメモリ順序付けをサポートする、CPUコア、キャッシュ、並びに、機能論理ブロックにおけるハードウェア及び命令セットアーキテクチャサポートを提供し、それによって、オフロード命令コード及び後続の非オフロード命令コードによって共有されるメモリアドレスへの相互排他的アクセスを保証する。これらの実施形態は、CPUマルチコアを備えるオフロードされた実行デバイスの性能を向上させる同期プリミティブをサポートし、オフロードデバイスでのオフロードされた動作の完了を待機することなく、オフロード命令コード及び後続の非オフロード命令コードによって共有されるメモリアドレスへのアクセスに対する制限の除去をサポートする。
【0007】
本開示による一実施形態は、オフロードされる動作のための少なくとも1つのオフロード命令を処理することを含む、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する方法を対象とする。また、本方法は、少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することを含む。また、本方法は、メモリアドレスをターゲットとする動作の完了に応じて、メモリアドレスに対するロックを除去することを含む。いくつかの実施形態では、オフロードされる動作は、プロセッシングインメモリデバイス等のオフロードターゲットデバイスにオフロードされる。
【0008】
いくつかの実施形態では、少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することは、アドレスロックバッファのエントリにメモリアドレスを記憶することを含み、メモリアドレスに対するロックを除去することは、アドレスロックバッファ内のエントリをクリアすることを含む。
【0009】
いくつかの実施形態では、メモリアドレスをターゲットとする動作を完了することは、メモリアドレスのエントリを含む1つ以上のコアの1つ以上のキャッシュにプローブ要求を送信することを含み、プローブ要求は、エントリ内のデータが無効化されるか又はフラッシュされるかの何れかであることを示す。いくつかの実施形態では、ロックは、少なくとも1つのオフロード命令の処理が完了した後に配置される。いくつかの実施形態では、ロックは、リモートデバイスでの動作の実行前に除去される。
【0010】
いくつかの実施形態では、本方法は、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定することを含み、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する。これらの実施形態では、本方法は、何れのオフロード命令よりも若い非オフロード命令の実行を制限することを含む。これらの実施形態では、本方法は、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定したことに応じて、制限を除去することを含む。
【0011】
いくつかの実施形態では、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定することは、各コアがそれぞれのオフロード命令のシーケンスにおいてバリアの開始命令を実行したと判定することを含み、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する。いくつかの実施形態では、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定することは、バリアの終了命令が各コアで実行されたと判定することを含む。いくつかの実施形態では、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定することは、オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定することを含む。いくつかの実施形態では、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定することは、各コアに通信可能に結合された状態バッファ内の各コアの進捗を追跡することを含む。
【0012】
本開示による一実施形態は、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持するためのマルチコアプロセッサを対象とする。プロセッサは、オフロードされる動作のためのオフロード命令を処理するように構成されている。また、プロセッサは、オフロード命令に関連する1つ以上のメモリアドレスにロックを配置するように構成されている。また、プロセッサは、メモリアドレスをターゲットとする動作の完了に応じて、メモリアドレスに対するロックを除去するように構成されている。いくつかの実施形態では、オフロードされる動作は、プロセッシングインメモリデバイス等のオフロードターゲットデバイスにオフロードされる。
【0013】
いくつかの実施形態では、少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することは、アドレスロックバッファのエントリにメモリアドレスを記憶することを含み、メモリアドレスに対するロックを除去することは、アドレスロックバッファ内のエントリをクリアすることを含む。
【0014】
いくつかの実施形態では、メモリアドレスをターゲットとする動作を完了することは、メモリアドレスのエントリを含む1つ以上のコアの1つ以上のキャッシュにプローブ要求を送信することを含み、プローブ要求は、エントリ内のデータが無効化されるか又はフラッシュされるかの何れかであることを示す。いくつかの実施形態では、ロックは、少なくとも1つのオフロード命令の処理が完了した後に配置される。いくつかの実施形態では、ロックは、リモートデバイスでの動作の実行前に除去される。
【0015】
いくつかの実施形態では、プロセッサは、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定するように構成されており、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する。これらの実施形態では、プロセッサは、何れのオフロード命令よりも若い非オフロード命令の実行を制限するように構成されている。これらの実施形態では、プロセッサは、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定したことに応じて、制限を除去するように構成されている。
【0016】
いくつかの実施形態では、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定することは、各コアがそれぞれのオフロード命令のシーケンスにおいてバリアの開始命令を実行したと判定することを含み、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する。いくつかの実施形態では、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定することは、バリアの終了命令が各コアで実行されたと判定することを含む。いくつかの実施形態では、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定することは、オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定することを含む。いくつかの実施形態では、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定することは、各コアに通信可能に結合された状態バッファ内の各コアの進捗を追跡することを含む。
【0017】
本開示による一実施形態は、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持するためのシステムを対象とする。システムは、プロセッシングインメモリ(PIM)デバイスと、PIMデバイスにオフロードされる動作のためのオフロード命令を処理するように構成されているマルチコアプロセッサと、を含む。また、プロセッサは、オフロード命令に関連するメモリアドレスにロックを配置するように構成されている。また、プロセッサは、メモリアドレスをターゲットとする動作の完了に応じて、メモリアドレスに対するロックを除去するように構成されている。
【0018】
いくつかの実施形態では、少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することは、アドレスロックバッファのエントリにメモリアドレスを記憶することを含み、メモリアドレスに対するロックを除去することは、アドレスロックバッファ内のエントリをクリアすることを含む。
【0019】
いくつかの実施形態では、メモリアドレスをターゲットとする動作を完了することは、メモリアドレスのエントリを含む1つ以上のコアの1つ以上のキャッシュにプローブ要求を送信することを含み、プローブ要求は、エントリ内のデータが無効化されるか又はフラッシュされるかの何れかであることを示す。いくつかの実施形態では、ロックは、少なくとも1つのオフロード命令の処理が完了した後に配置される。いくつかの実施形態では、ロックは、リモートデバイスでの動作の実行前に除去される。
【0020】
いくつかの実施形態では、プロセッサは、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定するように構成されており、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する。これらの実施形態では、プロセッサは、何れのオフロード命令よりも若い非オフロード命令の実行を制限するように構成されている。これらの実施形態では、プロセッサは、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定したことに応じて、制限を除去するように構成されている。
【0021】
いくつかの実施形態では、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定することは、各コアがそれぞれのオフロード命令のシーケンスにおいてバリアの開始命令を実行したと判定することを含み、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する。いくつかの実施形態では、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定することは、バリアの終了命令が各コアで実行されたと判定することを含む。いくつかの実施形態では、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定することは、オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定することを含む。いくつかの実施形態では、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定することは、各コアに通信可能に結合された状態バッファ内の各コアの進捗を追跡することを含む。
【0022】
図1は、本開示の様々な実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持するための例示的なシステム100を示すブロック図である。
図1の例では、システム100は、複数のコア複合体102、104を含むマルチコアプロセッサ101を含む。例えば、プロセッサ101は、システムオンチップ(SoC)アーキテクチャ内に実装され得る。
図1に示される例では、各コア複合体102、104は、レベル2(L2)キャッシュ114、116、118、120にそれぞれ結合された複数のプロセッサコア106、108、110、112(例えば、中央処理装置(CPU)コア、グラフィカル処理装置(graphical processing unit、GPU)コア等)を含む。更に、プロセッサコア106、108、110、112の各々は、それぞれのオンボード1次(L1)キャッシュ122、124、126、128を含む。プロセッサコア106、108、110、112の各々は、命令フェッチ、デコード、ディスパッチパイプライン、プリフェッチ入力キュー、スケジューラ、ロード/記憶キュー、ルックアサイドバッファ、リオーダバッファ、及び、リタイアキュー等のプロセッサパイプライン(図示せず)の様々な構成要素、並びに、様々な算術論理ユニット(ALU)及びレジスタファイルを含む。
【0023】
図1に示される例示的なシステム100の構成は、説明のために提示される。4つのプロセッサコア106、108、110、112が
図1に示されているが、読者は、プロセッサ101が、示されているよりも多い又は少ないプロセッサコア、より多い又は少ないコア複合体、及び、より多い又は少ないキャッシュを含み得ることを理解するであろう。
【0024】
図1に示される例では、各コア複合体102、104は、特定のコア複合体のL2キャッシュの全てを接続する相互接続キャッシュ又はラストレベルキャッシュ(LLC)として機能するレベル3(L3)キャッシュ130、132を含む。いくつかの例では、プロセッサ101は、複数のプロセッサコア106、108、110、112を使用してマルチスレッドアプリケーションを実行するように構成されている。これらの例では、1つのコア複合体102内のキャッシュ内でのデータの変更は、別のコア複合体104内にキャッシュされたデータの有効性に影響を及ぼし得る。キャッシュコヒーレンシを実施するために、プロセッサ101は、コア複合体102、104の各L3キャッシュ130、132に結合されたコヒーレンシシンクロナイザ136を含み得る。これらの例では、コヒーレンシシンクロナイザ136は、例えば、キャッシュプローブを送信して、プロセッサ101内に存在する任意のL1キャッシュ、L2キャッシュ又はL3キャッシュのキャッシュエントリに含まれるデータを無効化又はフラッシュすることによって、キャッシュ動作を開始する。
【0025】
各L1、L2及びL3キャッシュは、プロセッサ要求に応じて、要求された動作に関連するデータがキャッシュのキャッシュエントリに存在するかどうかを判定するキャッシュ論理を含む。データが存在する場合(キャッシュヒット)、プロセッサ要求は、キャッシュエントリ内に存在するデータを使用して満たされる。データが存在しない場合(キャッシュミス)、要求は、キャッシュミスがLLC内で検出されるまで、次レベルのキャッシュに転送される。LLCにおけるキャッシュミスに応じて、要求は、プロセッサ101のメモリコントローラ134に転送されて、メインメモリ(例えば、メモリデバイス138)に記憶されたデータを使用して要求を満たす。一例では、プロセッサ要求は、メモリデバイス138内の記憶場所を対象とする読み取り/書き込み要求等のI/O動作である。
【0026】
プロセッサコア106、108、110、112の各々は、プロセッサ101上で実行されるアプリケーションからコンパイラシステム(例えば、GNUコンパイラコレクション(GNU Compiler Collection、GCC))によって生成された機械語コードを実行する。例えば、アプリケーションは、シングルスレッドアプリケーション又はマルチスレッドアプリケーションであり得る。プロセッサコアは、機械語コードを生成するためにコンパイラシステムによって用いられる命令セットアーキテクチャ(instruction set architecture、ISA)を実装する。一例では、プロセッサ101用のISAは、AVX-256等のアドバンスベクトルエクステンションをサポートするx86-64命令セットである。
【0027】
本開示の様々な実施形態によると、プロセッサ101は、オフロードターゲットデバイスによる実行のためにオフロード命令を処理するための拡張ISAを実装する。例えば、オフロードターゲットデバイスは、以下でより詳細に説明するように、プロセッシングインメモリ(PIM)デバイス又はアクセラレータ等の固定機能を実施するリモート構成要素であり得る。オフロードターゲットデバイスは、オフロード命令を実行するための実行論理が何れのプロセッサコアの一部でもないという点でリモート構成要素である。例えば、オフロードターゲットデバイスは、プロセッサコア106、108、110、112と同一のチップ上又は同一のパッケージ内に実装され得るが、プロセッサ101からは「リモート」のままである。例示的な拡張ISAでは、remote_load命令オペコードは、メインメモリからオフロードターゲットデバイスのローカルレジスタにメモリオペランドのデータをロードし、remote_store命令オペコードは、オフロードターゲットデバイスのローカルレジスタからメインメモリ内のメモリオペランドにデータを書き込む。拡張ISA内のremote_op命令オペコードは、ターゲットデバイスの固定機能アーキテクチャによってサポートされる任意の算術演算又は論理演算を表すことができる。何れの動作も制御フローを変更せず、したがって、オフロードされた命令は順次実行される。offload remote_op命令ソースオペランドは、(a)メモリアドレス(ベースラインISAと同じ方法で指定)、(b)(CPUコア標準ISAからの)アーキテクチャレジスタ、又は、(c)オフロードターゲットデバイス内に実装されたオフロードターゲットレジスタであり得る。いくつかの実施形態では、オフロード命令デスティネーションオペランドは、オフロードターゲットレジスタのみであり得る。オフロードターゲットレジスタは、オフロードターゲット固定機能論理に対してローカルであるレジスタを表し、コンパイラによって割り当てられる、拡張ISA内のアーキテクチャ化レジスタである。オフロードターゲットレジスタは、プロセッサコア内に物理ストレージを有さないという点で仮想的であり、オフロード命令間のデータ依存性をサポートし、固定機能モジュール146へのオフロード要求の送信時にメモリコントローラ134におけるオフロードターゲットレジスタの使用率を追跡するために使用される。
【0028】
いくつかの実施形態では、remote_load命令は、オフロードターゲットレジスタであるデスティネーションオペランドと、メモリアドレスであるソースオペランドと、メモリアドレスを生成するために使用されるアーキテクチャレジスタである別のソースオペランドと、を含む。remote_load命令は、オフロードターゲットデバイスが、メモリアドレスによって識別された記憶場所からオフロードターゲットレジスタにデータをロードすべきであることを示す。オフロードターゲットがPIMデバイスである場合、remote_load命令は、以下で詳細に説明するように、PIMデバイスが、メモリアドレスによって識別されるPIMデバイス内の記憶場所からPIMレジスタにデータをロードすべきであることを示す。
【0029】
いくつかの実施形態では、remote_store命令は、メモリアドレスであるデスティネーションオペランドと、オフロードターゲットレジスタであるソースオペランドと、メモリアドレスの生成に使用されるアーキテクチャレジスタである別のソースオペランドと、を含む。remote_store命令は、オフロードターゲットデバイスが、オフロードターゲットレジスタ内のデータをメモリアドレスによって識別される記憶場所に記憶すべきであることを示す。オフロードターゲットデバイスがPIMデバイスである場合、remote_store命令は、以下で詳細に説明するように、PIMデバイスが、ターゲットレジスタからのデータを物理メモリアドレスによって識別されるPIMデバイス内の記憶場所に記憶すべきであることを示す。
【0030】
いくつかの実施形態では、remote_op命令は、オフロードターゲットレジスタであるデスティネーションオペランドと、計算のためのソースオペランドと、を含み、ソースオペランドは、アーキテクチャレジスタ(以前のオフロードされていない計算からの値を持ち運ぶ)、オフロードターゲットレジスタ又はメモリアドレス(こちらもremote_op命令で指定されたアーキテクチャレジスタから生成される)であり得る。remote_op命令は、オフロードターゲットデバイス内の固定機能論理が計算を実行し、その結果をデスティネーションオペランドによって示されるオフロードターゲットレジスタに配置すべきであることを示す。オフロードターゲットデバイスがPIMデバイスである場合、remote_op命令は、以下で詳細に説明するように、PIMデバイスがPIMデバイスのメモリ論理内の機能を実行すべきであることを示す。
【0031】
いくつかの実施形態では、オフロード命令は、拡張ISAを使用してアプリケーションコンパイル時にコンパイラによって生成される。一例では、コンパイラは、例えば、オフロードのためにアプリケーションプログラミングインターフェース(API)を使用して、プログラマによって提供されるアプリケーションソースコード内の指示に基づいて、ソースコード内のオフロード命令を識別する。別の例では、コンパイラは、命令がオフロードに適しているという判定に基づいて、オフロード用の命令を識別する。オフロード命令は、ソースコード内の関心領域(region of interest、ROI)として識別され得る。ソースコード内のROIの各動的インスタンスは、1つ以上のオフロード命令を含むオフロードトランザクションとして識別され得る。例えば、オフロードトランザクションは、remote_load命令、1つ以上のremote_op命令、及び、remote_store命令を含み得る。オフロードトランザクションは、ループ反復、又は、サブルーチン、すなわち、サブルーチンの本体のサブセットであり得る。オフロードトランザクションは、一連のコードであり、制御フロー変更命令を含まない。いくつかの例では、特殊命令が、各オフロードトランザクションの開始及び終了をマークし得る。
【0032】
いくつかの実施形態では、オフロード命令は、任意の典型的な非オフロード命令に対して実行されるように、フェッチされ、デコードされ、ディスパッチされる(例えば、コアのフロントエンドパイプラインによって)。オフロード命令がディスパッチされ、オフロード命令がスケジューラによって選択されると、コアリソースが使用されて、オフロード命令において(例えば、メモリオペランドを有するremote_load命令、remote_store命令、及び、remote_op命令において)識別された任意の記憶場所の仮想アドレス及び/又は物理アドレス、並びに、コアレジスタからのオフロード命令によって消費された(例えば、非オフロード命令から計算された)任意の値が生成される。仮想アドレス及び/又は物理アドレスが生成され、コアレジスタからの値が利用可能になった後に、オフロード命令はリタイアする準備が整う。オフロード命令がスケジューラによって選択されても、これらの命令は、コアのALU(ベクトル又はスカラ、整数又は浮動小数点)において演算を実行せず、コア(コアの標準ISAに定義されているようなアーキテクチャ化レジスタ及びフラグ等)による発行時にマシン状態を変更することもない。オフロード命令は、メモリ順序付けに違反することなく、上記の動作(アドレス生成及び/又は非オフロード命令によって計算された値の読み取り)を完了するとすぐに、リタイアする準備が整う。(例えば、分岐予測ミス、ロードストアフォワーディングデータ依存性違反、割り込み、トラップ等に起因する)パイプラインフラッシングの場合、オフロード命令は、非オフロード命令のように命令ウィンドウエントリを占有するので、従来の命令のようにフラッシュされ得る。更に、remote_op命令はコアのALU上で実行されないので、それらからの算術エラートラップは検出されない。しかしながら、オフロード命令によって生成された他のトラップ(例えば、仮想又は物理アドレス生成、命令ブレークポイント等のトラップ)は、非オフロード命令に使用される同一の機構を用いてコアパイプライン内で検出され、執行される。
【0033】
各オフロード命令がリタイアすると、生成されたメモリアドレス及び任意のコアレジスタオペランドの値が、オフロード命令用に生成されたオフロード要求に含まれる。オフロード要求は、オフロードターゲットレジスタ、及び、オフロード命令を完了し、結果をオフロードターゲットレジスタに記憶するために必要である、任意の生成されたメモリアドレス又はレジスタ値を含む。いくつかの実施形態では、オフロード要求用のオフロード要求先入れ先出し(first-in-first-out、FIFO)キューを用いて、命令がリタイアする場合に命令用のプログラムシーケンスを維持する。一例では、オフロード要求FIFOにおいてオフロードトランザクションの終了に達したときにのみ、オフロード命令をリタイアさせることができる。コアがマルチスレッディングをサポートする場合、スレッドごとに1つのオフロード要求FIFOが存在し得る。各オフロード要求は、リタイア時にコアによってあるプログラム順序でオフロードターゲットデバイスに発行されて、オフロードターゲットデバイスにおいてリモートで同一のプログラム順序で実行される。
【0034】
いくつかの例では、オフロード要求がプロセッサコア106、108、110、112によって発行された後、オフロード要求はコヒーレンシシンクロナイザ136によって受信される。コヒーレンシシンクロナイザ136は、コア複合体102、104の様々なキャッシュでキャッシュ動作を実行して、オフロード要求で識別された仮想アドレス及び/又は物理アドレスに対する全てのキャッシュエントリが確実にコヒーレントなままであるようにする。例えば、オフロード要求がオペランドとして仮想アドレス及び/又は物理アドレスを含む場合、コヒーレンシシンクロナイザ136はキャッシュプローブを実行して、オフロード要求で識別された仮想アドレス及び/又は物理アドレスのキャッシュエントリを含むコア複合体のL1キャッシュ、L2キャッシュ及びL3キャッシュ内でキャッシュエントリを識別する。識別されたキャッシュエントリがクリーンデータを含む場合、キャッシュエントリは無効化される。識別されたキャッシュエントリがダーティデータを含む場合、キャッシュエントリ内のデータは、メインメモリ(すなわち、メモリデバイス)にフラッシュされる。いくつかの例では、コア複合体内の特定のコアによって発行されたオフロード要求で識別された仮想アドレス及び/又は物理アドレスに対応するキャッシュエントリは、コヒーレンシシンクロナイザ136に到達する前に無効化/フラッシュされ、したがって、コヒーレンシシンクロナイザ136は、システム100内の他のコア複合体に対してのみキャッシュプローブを実行する。他の例では、コヒーレンシシンクロナイザ136は、オフロード要求を直接受信し、システム100内の全てのコア複合体に対してキャッシュプローブを実行する。メモリフェンスは、オフロード要求で識別された仮想アドレス及び/又は物理アドレスのキャッシュエントリが無効化又はフラッシュされるまで、より若い非オフロード命令が、これらのキャッシュエントリに確実にアクセスしないようにするために用いられ得る。このようにして、より若い非オフロード命令が、古いキャッシュデータにアクセスしないようにし、代わりに、(以前のオフロード要求によって変更され得る)メインメモリからデータを取り込む必要がある。適切なキャッシュ動作の完了後、オフロード要求は、オフロードターゲットデバイスにオフロードするためにメモリコントローラ134に送信される。コヒーレンシシンクロナイザの動作については、以下でより詳細に説明する。
【0035】
いくつかの実施形態では、メモリコントローラ134は、書き込み要求がオフロード要求であることを示すフラグを備える書き込み要求として構成され得るオフロード要求を受信する。これらの実施形態では、メモリコントローラ134は、要求を復号して、要求がオフロード要求であると判定し、オフロード命令並びにオフロード要求を完了するためのオペランドを識別する。メモリコントローラ134は、オフロード要求から、オフロードターゲットデバイス内に位置するコマンドバッファへのポインタを介して、要求された動作を識別する。メモリコントローラ134は、オフロード要求を、オフロードターゲットデバイスに送信される1つ以上のコマンドに分解する。ターゲットデバイスがPIMデバイスである例では、要求は、メモリコントローラ134によって1つ以上のPIMコマンドに分割されるPIM要求であり得る。
【0036】
図1に示される例では、プロセッサ101は、データを記憶するための1つ以上のメモリアレイ142を含むメモリデバイス138に結合されている。いくつかの例では、メモリデバイス138は、プロセッサ101とインターフェースするメモリインターフェース論理ダイ上に積層された複数のメモリダイを含む、積層ダイナミックランダムアクセスメモリ(dynamic random-access memory、DRAM)デバイスである。例えば、メモリデバイス138は、High Bandwidth Memory(HBM)モジュール又はHybrid Memory Cube(HMC)モジュールであり得る。これらの例では、HBMモジュールは、プロセッサ101とともにSoCに統合され得るか、又は、インターポーザを介してプロセッサ101に結合され得る。他の例では、メモリデバイス138は、メモリインターフェース論理を含むDual In-line Memory Module(DIMM)等のインラインメモリモジュールであり得る。メモリコントローラ134は、読み出し要求、書き込み要求及び他のメモリ動作等のコマンドをメモリデバイス138のメモリ論理140に対して発行する。いくつかの実施形態では、メモリコントローラ134によってメモリデバイス138に送信されるコマンドは、オフロードコマンドとしてフラグが立てられ得る。
【0037】
いくつかの実施形態では、メモリデバイス138は、メモリ論理140がメモリデバイス138内でメモリ動作及び非メモリ動作又は機能(例えば、算術演算及び論理演算)のセットを実行するように設計されるという点で、プロセッシングインメモリ(PIM)デバイスを含む。いくつかの実施形態では、メモリデバイス138は、機能によって動作するオペランドを提供するために使用され得る、個別のレジスタファイル144を含む。
【0038】
オフロードターゲットがメモリデバイス138であり、メモリデバイスがPIMデバイスである実施形態では、メモリデバイス138は、プロセッサ101のメモリコントローラ134からのオフロード要求から生成されたオフロードコマンドを受信する。
図1に示される例では、メモリ論理140は、PIM要求で識別された固定機能を実装するための固定機能モジュール146に結合されている。固定機能モジュール146は、オフロード命令を含むスレッドの起動後に固定機能モジュール146によって実行される実際のコマンドが投入されるコマンドバッファを含み得る。いくつかの実施形態では、各オフロード命令のオペコードは、こちらもオフロードターゲットデバイスで実行される動作(ロード、記憶、加算、減算、乗算、インクリメント等)のコマンドへの埋め込みポインタを含む。オフロード要求がオフロード命令から生成される場合には、このポインタもオフロード要求に含まれる。これらの実施形態では、オフロードコマンドの生成時に、メモリコントローラは、オフロード要求内のポインタを使用して、動作用の実際のコマンドを含むオフロードターゲットデバイスのコマンドバッファ内の位置を識別する。
【0039】
いくつかの例では、コヒーレンシシンクロナイザ136及びメモリコントローラ134は、コア複合体102、104を実装するダイ154、156とは異なるI/Oダイ150に実装され得る。I/Oダイ150は、1つ以上のチャネルを介して、メモリ論理140及び固定機能モジュール146を含むメモリインタフェースダイ(図示せず)に結合され得る。各々がメモリアレイ142を含む1つ以上のメモリ構成要素は、メモリインターフェースダイ上に積層され、シリコン貫通ビアを使用してメモリインターフェースダイに結合され得る。I/Oダイ150は、オンチップファブリックを通してコア複合ダイ154、156に結合され得る。様々な例において、メモリデバイス138は、PIMオフロード命令を実行するための実行論理が何れのプロセッサコアの一部でもないという点で、リモート実行デバイスである。例えば、メモリデバイス138は、プロセッサコア106、108、110、112と同一のチップ上又は同一のパッケージ内に実装され得るが、実行局所性に関してプロセッサ101から「リモート」のままである。いくつかの例では、システム100のプロセッサ101及びメモリデバイス138は、同一チップ(例えば、SoC)上で統合される。他の例では、システム100は、プロセッサ101及びその構成要素(例えば、SoCとして)が、同一半導体パッケージ内のメモリデバイス138とともにインターポーザウェハ上に配置されるシステムインパッケージ(SiP)アーキテクチャを実装する。例示的なシステム100は、プロセッサダイ154、156、I/Oダイ150及びメモリデバイス138の1つ以上のダイを含むものとして説明されているが、読者は、システムがより多くの又はより少ないダイによって実装され、その構成要素が任意の数のダイにわたって統合又は分散され得ることを理解するであろう。
【0040】
図1に示されるいくつかの実施形態では、各コア106、108、110、112は、それぞれのアドレスロックバッファ(address lock buffer、ALB)160、162、164、166を含む。オフロード命令(例えば、remote_load又はremote_store)がメモリオペランドを含む場合、メモリオペランドから生成されたメモリアドレスはALB内のエントリに記憶され、エントリは有効とマークされる。ALBの有効なエントリ内のメモリアドレスの存在は、コア上で実行されているより若い非オフロード命令がロックされたメモリアドレスにアクセスすることを防止することによって、メモリアドレスを効果的にロックする。メモリアドレスは、キャッシュ動作の実行中にロックされたままであり、コアで実行されるより若い非オフロード命令が、古い又は無効なデータに確実にアクセスしないようにする。メモリアドレスは、かかるキャッシュ動作の開始時又は完了時にロック解除され得る。例えば、メモリアドレスは、メモリアドレスを含むエントリを無効としてマークすることによってロック解除され、したがって、新しいメモリアドレスがそのエントリを占有することを可能にする。ALBが有効なエントリで一杯である場合、メモリオペランドを含むオフロード命令は、ALB内のエントリが利用可能になるまで停止し得る。
【0041】
いくつかの実施形態では、メモリアドレスは、コヒーレンシシンクロナイザ136からのロック解除要求の受信時にロック解除される。コヒーレンシシンクロナイザ136がコアによって生成されたオフロード要求を受信すると、コヒーレンシシンクロナイザ136は、上述したように、キャッシュプローブを送信して、プロセッサ101の各コア複合体内の様々なキャッシュ(L1、L2、L3)に存在し得るメモリアドレスに対応するデータを無効化又はフラッシュする。いくつかの例では、コヒーレンシシンクロナイザ136は、コヒーレンシシンクロナイザ136内のプローブフィルタが、プローブ無効化/フラッシュ要求を他のコア又はコア複合体のキャッシュに送信する場合、オフロード要求を送信したコアのALBにロック解除要求を送信する。これらの例では、ターゲットメモリアドレスに対するキャッシュエントリを含むキャッシュが存在しないとプローブフィルタが判定した場合、プローブ要求を送信することなく、ロック解除要求がALBに返される。
【0042】
より若い非オフロード命令によるアクセスは、ターゲットキャッシュエントリ内のデータの無効化後又はフラッシュ後にキャッシュに到着することが保証されるので、コヒーレンシシンクロナイザ136が、シングルスレッドシナリオにおいてプローブ要求と並行してロック解除要求を開始することが安全である。これは、より若い非オフロードメモリアクセスが開始される前に、ALBエントリがロック解除要求によってクリアされる必要があるためである。ロック解除要求がコアに到着する時までに、プローブの無効化/フラッシュは既にキャッシュコントローラにあるか、又は、全てのコア複合体にわたって完了している。マルチスレッドシナリオでは、オフロードトランザクション(以下で詳細に説明する)の開始時及び終了時の特殊命令は、非オフロード命令が、プローブ要求による無効化又はキャッシュからのフラッシュの前にキャッシュエントリ内のデータにアクセスしないことを保証する。その時までに、より若い非オフロードメモリ要求は、それらの依存オフロード要求の後にシリアル化され、オフロード要求の完了後にそれらがデータを観察することを保証する。
【0043】
このようにして、ALBは、プローブフィルタに向けて現在転送中である、又は、プローブフィルタのプロービング後にデータを無効化/フラッシュするプロセス中である、リタイアしたremote_load命令要求及びremote_store命令要求によってターゲットにされたメモリアドレスを記憶するために使用され得る。ALB内のメモリアドレスはロックされ、ALB内でヒットした、より若い非オフロードアクセスでは、メモリへのアクセスがブロックされる。いくつかの例では、オフロード命令粒度は、キャッシュラインサイズよりも大きい可能性があり、したがって、いくつかの実施形態では、ALBエントリは、キャッシュラインよりも大きいアドレスを追跡することができる。代替的に、ALBエントリ粒度は、キャッシュラインの粒度と同一のままであり得るので、複数のALBエントリは、粒度がキャッシュラインよりも大きいオフロード命令について、キャッシュラインごとに1つ作成され得る。
【0044】
コア(例えば、コア106)がシングルスレッドアプリケーションにおいて以下のオフロード命令のシーケンスを処理する例を考える。この例では、レジスタr1は、上述したように拡張ISA内のアーキテクチャ化レジスタである。例えば、レジスタr1は、コンパイル時にアプリケーションコンパイラによってオフロードデバイス内で割り当てられ得る。プロセッサシステム上でホストされるアプリケーションのスレッドにおいて、コアは、以下のコードシーケンス(すなわち、オフロードトランザクション)を実行することができる。
remote_load r1,WORD PTR[rsi+rax]
remote_op....
remote_op...
remote_op...
remote_store[rdi+rax],r1
上記のオフロード命令のシーケンスにおいて、コアは、rsi+raxへのポインタであるメモリオペランドのメモリアドレス(この例では、0xffffc70であると計算される)を生成することによって、remote_load命令を実行する。アドレスに対するメモリ順序付けチェックは、古い命令に関しても実行される。remote_load命令がリタイアすると、コアは、オフロードターゲットデバイスが0xffffc70のデータをターゲットデバイスのローカルレジスタr1にロードするためのオフロード要求を生成し、アドレス0xffffc70がALB160内のオープンエントリに追加され、エントリが有効とマークされる。この場合、0xffffc70をターゲットとするコアのパイプライン内のより若い非オフロード命令が停止される。この例では、次いで、コアは、オフロードターゲットデバイスが様々な動作を実行するための要求(様々なremote_op命令)を生成することができる1つ以上のremote_op命令を実行し、その結果がレジスタr1に書き込まれる。次に、コアは、rdi+raxへのポインタであるメモリオペランドのメモリアドレス(この例では、0xdfffc70であると計算される)を生成することによって、remote_store命令を実行する。アドレスに対するメモリ順序付けチェックは、古い命令に関しても実行される。remote_store命令がリタイアすると、コアは、オフロードターゲットデバイスがメモリ内の0xdfffc70においてレジスタr1にデータを記憶するためのオフロード要求を生成し、アドレス0xdfffc70がALB160内のオープンエントリに追加され、エントリが有効とマークされる。この場合、0xdfffc70をターゲットとするコアのパイプライン内のより若い非オフロード命令が停止される。
【0045】
この例を続けると、remote_load命令のオフロード要求がコヒーレンシシンクロナイザ136において受信されると、コヒーレンシシンクロナイザは、メモリアドレス0xffffc70のキャッシュエントリを含むコア複合体102、104内の様々なキャッシュにプローブ要求を送信し(例えば、プローブフィルタを用いて)、プローブは、キャッシュコントローラに、当該エントリに記憶されたクリーンデータを無効化するか、又は、ダーティデータをフラッシュするように要求する。また、コヒーレンシシンクロナイザ136は、0xffffc70をロック解除するためのロック解除要求をALB160に送信する。0xffffc70に対するロック解除要求がコアで受信されると、0xffffc70のALBエントリは無効とマークされる。同様に、remote_storeのオフロード要求がコヒーレンシシンクロナイザ136において受信されると、コヒーレンシシンクロナイザは、メモリアドレス0xdfffc70のキャッシュエントリを含むコア複合体102、104内の様々なキャッシュにプローブ要求を送信し(例えば、プローブフィルタを用いて)、プローブは、キャッシュコントローラに、当該エントリに記憶されたクリーンデータを無効化するように要求する。また、コヒーレンシシンクロナイザ136は、ALB160にロック解除要求を送信して、0xdfffc70をロック解除する。0xdfffc70に対するロック解除要求がコアで受信されると、0xdfffc70のALBエントリは無効とマークされる。
【0046】
このようにして、より若い非オフロード(すなわち、ローカルに実行される)命令によってターゲットにされるメモリアドレスは、キャッシュ動作の完了後にそれらのアクセスがキャッシュコントローラに到着することが保証されるので、ロック解除されて、それらの命令の実行を可能にし得る。更に、オフロード命令はプログラム順にオフロードターゲットデバイスに送信されるので、プロセッサ101は、より若い非オフロード命令のリタイアを可能にする前に、オフロードターゲットデバイスからの肯定応答を待機する必要がない。更に、プロセッサシステムキャッシュ114~132の何れにもフラッシュすべきダーティデータが存在しない場合、プローブ応答を待機せずにオフロード要求を送信することができる。
【0047】
当業者であれば、オフロード命令のメモリオペランドから生成されるメモリアドレスは、上述したキャッシュ動作が開始又は完了され得るまで、コアで実行される、より若い非オフロード命令によるメモリアドレスへのアクセスが防止される限り、様々な方法でロックされ得ることを認識するであろう。また、当業者は、プローブフィルタの代わりに、各キャッシュがプローブされて、ターゲットメモリアドレスに対するキャッシュエントリが存在するかどうかを判定し得ることを認識するであろう。
【0048】
いくつかの実施形態では、複数のコアがオフロード命令を処理するマルチスレッドアプリケーションに対応するために、2つの追加の同期プリミティブが拡張ISAに含まれる。バリア初期化プリミティブ(すなわち、barrier_start命令)は、オフロードトランザクションの開始時に生じ、バリア初期化プリミティブ(すなわち、barrier_end命令)は、オフロードトランザクションの終了時に生じる。barrier_start命令及びbarrier_end命令は、プログラマの指示又はコンパイラによって導入され得る。これらの実施形態では、barrier_start命令及びbarrier_end命令は、プロセッサ101内のコア106、108、110、112の全てによって共有されるALBディレクトリ170とともに使用されて、オフロードトランザクションを処理中の各コアの進捗を追跡する。
図1に示される例では、ALBディレクトリ170は、コヒーレンシシンクロナイザ136に隣接して(例えば、同じダイに)実装される。ALBディレクトリ170は、各マルチスレッドオフロードトランザクションの状態を記録する構造を使用して、コアと通信し、コアで実行されるオフロード命令の進捗を追跡するためのコントローラを含む。ALBディレクトリ170は、マルチスレッドプロセスでオフロードトランザクションのカーネルを実行しているコアごとに、何れのコアがbarrier_start命令及びbarrier_end命令に遭遇したかを追跡する。例えば、ALBディレクトリ170は、マルチスレッドプロセスの特定のプロセス識別子に関連するバリア状態ベクトルを含み、バリア状態ベクトルの各ビットは、コア識別子を表す。かかる例では、特定のコアを表すビットは、当該コアがオフロードトランザクションの実行を開始する場合(例えば、barrier_start命令の実行時)にアサートされ、コアがオフロードトランザクションを完了する場合(例えば、barrier_end命令の実行後)にクリアされ得る。
【0049】
いくつかの実施形態では、
図1に示されるように、各コア106、108、110、112は、ALBディレクトリ170に通信可能に結合されたそれぞれのALB160、162、164、166を含む。remote_load命令又はremote_store命令等オフロード命令がリタイアする毎に、オフロード命令のメモリオペランドから生成されたメモリアドレスは、コアのALB内のエントリを占有する。各オフロード要求は、オフロード要求内のメモリアドレスに対する変換ルックアップの一部としてテーブルルックアサイドバッファからアクセスされ得るスレッドのプロセス識別子を持ち運ぶ。barrier_start命令は、特定のコアで実行されるプロセスの特定のスレッドが、オフロードトランザクション用のオフロード命令を実行しようとしていることを示す。スレッドのプロセス識別子並びにコア識別子及び/又はスレッド識別子は、ALBディレクトリ170によって記録される。言い換えれば、barrier_start命令の実行時に、ALBディレクトリ170は、特定のコアが特定のプロセスのスレッドのためにオフロードトランザクションを実行していることを記録する。ALBディレクトリ170は、同一のプロセス識別子を有するスレッドに対してオフロードトランザクションを実行しているコアの進捗を追跡する。各コアがbarrier_end命令を実行し、オフロードトランザクション内の全てのオフロード命令がリタイアした後にそのALBをクリアすると、ALBディレクトリ170は、特定のコアがプロセス識別子に対応するオフロードトランザクションの処理を完了したことを記録する。ALBディレクトリ170が、プロセス識別子に対応するオフロードトランザクションを処理している全てのコアから通知を受信すると(すなわち、全てのコアがbarrier_end命令に遭遇し、それぞれのALBをクリアすると)、ALBディレクトリ170は、より若い非オフロード命令の実行をブロックするセマフォをクリアしてよいという通知を、それらのコアに送信する。この通知を受信すると、コアはbarrier_end命令をリタイアさせ、より若い非オフロード命令の実行開始を可能にする。
【0050】
したがって、ALBディレクトリ170のコントローラは、全スレッドがそれぞれのALBをクリアするまで、全スレッドが非オフロード命令を実行しないようにする(このことは、より若い非オフロード命令が、キャッシュ内のオフロード命令によってターゲットとされるデータを見ないことを保証する)。このイベントは、barrier_end命令のリタイアをマークする。したがって、barrier_end命令が全てのコアでリタイアするまで、マルチスレッド化されたオフロードトランザクションを実行する全てのコアでのより若い非オフロード命令の実行を停止することによって、これらのオフロードトランザクションとより若い非オフロード命令との間のメモリ順序付けが保持される。
【0051】
いくつかの実施形態では、barrier_start命令は、マルチスレッド化されたオフロードトランザクションを同時実行しているスレッドの数をシグナリングする。一例では、barrier_start命令はフォーマット「barrier_start Rx」を有し、アーキテクチャレジスタRxは、オフロードトランザクション(例えば、PIMカーネル)を同時に実行するスレッドの数を含む。かかる例では、レジスタRxは、例えば、ソフトウェアバリアと同じ機構を使用して、スレッドがフォークされる前にアプリケーションによってロードされる。レジスタRxによって保持されるスレッドカウントは、各オフロードトランザクションの開始時にbarrier_start命令を実行すると、ALBディレクトリ170に通信される。場合によっては、barrier_start命令は、スレッド及びより若いオフロードを同期させる必要はなく、オフロードトランザクションからの非オフロード命令(すなわち、オフロードコード領域)は、barrier_start命令の完了又はリタイアを待機せずに発行することができる。複数のスレッドがbarrier_startをALBディレクトリ170に送信しても、スレッドカウントはALBディレクトリ170によって一度だけ記録される。barrier_start命令から識別されるスレッドカウントは、ALBディレクトリ170のスレッドのプロセス識別子のエントリに記録される。
【0052】
別の例では、barrier_start命令はフォーマット「barrier_start[Rx]」を有し、スレッド数は、アーキテクチャレジスタRx内で識別された記憶場所からロードされる。この場合、メモリからのスレッドカウントの読み取りに対するレイテンシは非決定性であり、したがって、barrier_start命令は、ALBディレクトリ170が同一プロセスのスレッドを実行している全てのコアに対してスレッドカウントの受信を肯定応答するまで、スレッド内のより若い命令の実行をブロックする。肯定応答は、最後のbarrier_startメッセージがプロセスのALBディレクトリ170に到着するとすぐに全コアに送信される。したがって、オフロードトランザクションにおけるより若い命令の実行は、全スレッドがそれらのbarrier_start通知をALBディレクトリ170に送信することによって同期するまでブロックされる。複数のスレッドがbarrier_start通知をALBディレクトリ170に送信しても、スレッドカウントはALBディレクトリ170によって一度だけ記録される。barrier_start命令から識別されるスレッドカウントは、ALBディレクトリ170のスレッドのプロセス識別子のエントリに記録される。
【0053】
別の例では、barrier_start命令は、フォーマット「barrier_start[Rx]」を有し、スレッドカウントは、アーキテクチャレジスタRx内で識別された記憶場所からロードされる。この例では、全てのスレッドがブロックされる必要はなく、barrier_start命令を実行している第1のスレッドのみが、メモリからALBディレクトリ170へのスレッドカウントデータのロードを担当する。例えば、プロセス用のALBディレクトリエントリ内に特別なフラグビットが設定され得る。一例では、スレッドカウントフェッチ(thread count fetch、TCF)ビットは、barrier_start通知が最初にALBディレクトリ170に到達するスレッドによって設定される。設定されたTCFビットは、スレッドカウントが同一プロセスの他の全スレッドに対してメモリからフェッチされていることを示す。その後、ALBディレクトリ170は、同一プロセスの他のスレッドからbarrier_start通知を受信し、スレッドカウントフェッチ動作が進行中であることをTCFビットから識別し、肯定応答をそれぞれのコアに送り返して、より若い命令(オフロードされた又はオフロードされていない)の発行を可能にする。したがって、スレッドカウントがメモリからフェッチして戻されるのをスレッドが待機する必要はない。TCFビットを最初に設定したスレッドがメモリからスレッドカウントをフェッチすると、TCFビットをリセットし、プロセスのALBディレクトリエントリにスレッドカウントを記憶する。
【0054】
これらの例では、カウントは、オフロードトランザクションを実行するスレッドの数をALBディレクトリ170に示し、barrier_end命令によって使用されるであろう。ALBディレクトリ170は、プロセスごとに全スレッドのバリア状態を追跡する、プロセッサ内のスレッドの最大数に等しい(又はそれ未満の)長さを有するバリア状態ビットベクトルを維持する。各ビットベクトルエントリは、プロセッサ内の単一スレッドに対応する。barrier_end命令が各スレッドで実行される場合、それは、ALBディレクトリ170から肯定応答が戻るまで、より若い非オフロード命令の実行をブロックする。また、barrier_end要求をALBディレクトリ170に送信する。barrier_end要求は、スレッドの対応するビットベクトルエントリをリセットする。ビットベクトル全体がリセットされると、ALBディレクトリ170は、プロセスの全スレッドに肯定応答を送信し、プロセスのために記憶されたスレッドカウントをリセットする。ALBディレクトリ170からの肯定応答は、同一プロセスの全スレッドのバリアを解除し、PIMコードに続いて非PIMコードの実行を再開することができる。
【0055】
プロセッサ101でホストされるマルチスレッドアプリケーションが、
図1に示されるコア106、108、110、112の各々で実行される並列オフロードトランザクションの実行をもたらす例を考える。ここでは、高性能コンピューティングカーネル並びに機械学習推論及びトレーニングでよくあるように、全スレッドが同一コードパスを実行するようにマルチスレッドアプリケーションが並列化されていると仮定する。最終的に、各コアはbarrier_start命令に遭遇する。各コアがbarrier_start命令を実行する場合、コアは、barrier_start命令に遭遇したことを、スレッドのプロセス識別子並びにコア識別子及び/又はスレッド識別子とともにALBディレクトリ170に示す。ALBディレクトリ170は、プロセス識別子ごとにバリア状態ベクトルを維持する。コアからこの指標を受信したことに応じて、ALBディレクトリ170は、対応するプロセス識別子エントリのバリア状態ベクトルにおいて、当該コアのコア識別子に対応するバリア状態ベクトルビットを「1」に設定する。コア106、108、110、112の全てがbarrier_start命令を実行し、ALBディレクトリ170に通知すると、プロセス識別子に対応するバリア状態ベクトルは「1111」になるであろう。いくつかの例では、スレッドカウント(すなわち、オフロードトランザクションを同時実行するスレッドの数)は、レジスタから又はメモリからロードされる。オフロードトランザクションのスレッドカウントは、全コアがそれらのそれぞれのオフロードトランザクションのbarrier_start命令を実行したことを判定するために使用され得る。いくつかの例では、ALBディレクトリ170は、バリア状態ベクトルが初期化されると、コアがオフロード命令の実行を開始し得ることを各コアに示すことによって、オフロードトランザクションの実行を同期させ得る。他の例では、スレッドのオフロードトランザクションでの命令の実行は、ALBディレクトリ170がbarrier_start要求の受信を肯定応答するとすぐに開始し得る。
【0056】
この例を続けると、コアは、オフロード命令の実行及びリタイアを開始する。各コアがbarrier_end命令を実行し、コアがそのALBをクリアすると、コアは、barrier_end命令に遭遇したことをALBディレクトリ170に通知する。例えば、任意の例示的な順序で、コア106が、barrier_end命令に到達し、そのALB160がクリアであることをALBディレクトリ170に通知すると、ALBディレクトリ170は、プロセス識別子のバリア状態ベクトルを「0111」に更新する。コア110が、barrier_end命令に到達し、そのALB164がクリアであることをALBディレクトリ170に通知すると、ALBディレクトリ170は、プロセス識別子のバリア状態ベクトルを「0101」に更新する。コア108が、barrier_end命令に到達し、そのALB162がクリアであることをALBディレクトリ170に通知すると、ALBディレクトリ170は、プロセス識別子のバリア状態ベクトルを「0001」に更新する。コア112が、barrier_end命令に到達し、そのALB166がクリアであることをALBディレクトリ170に通知すると、ALBディレクトリ170は、プロセス識別子のバリア状態ベクトルを「0000」に更新し、したがって、プロセス識別子のバリア状態ベクトルは空である。プロセス識別子のバリア状態ベクトルが空になると、ALBディレクトリ170は、コア106、108、110、112に、バリアを解除し、より若い非オフロード命令の実行を開始するように通知する。
【0057】
図2は、本開示の様々な実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持するための別の例示的なシステム200を示すブロック図である。
図2の例は、システム200が
図1に示されたマルチコアプロセッサ201に類似のマルチコアプロセッサ201も含むという点で、
図1の例示的なシステムに類似している。例示的なシステム200は、マルチコアプロセッサ201がコアごとのALB160、162、164、166の代わりにグローバルALB260を使用するという点で、
図1の例示的なシステム100とは異なる。いくつかの実施形態では、グローバルALB260は、ALBディレクトリ170を含む。いくつかの例では、グローバルALB260は、I/Oダイ150に実装され、コヒーレンシシンクロナイザ136に通信可能に結合され得るか、又は、それに統合され得る。いくつかの実施形態では、グローバルALB260は、コアごとのALB160、162、164、166のように、コントローラと、オフロード要求によってターゲットにされるメモリアドレスのインデックスと、を含む。これらの実施形態では、同一のプロセス識別子を有するスレッドでオフロード命令を実行する全てのコアについて、1つのメモリアドレス対して1つのエントリが記録される。グローバルALB260は、セットアソシアティブキャッシュとして編成され得る。
【0058】
いくつかの実施形態では、(前述のように)各オフロード要求がコヒーレンシシンクロナイザにおいて受信されると、グローバルALB260は、オフロード要求によってアクセスされたメモリアドレスのエントリで更新される。グローバルALB260は、全てのコアから生じるオフロード要求によってアクセスされるメモリアドレスごとに1つのエントリを割り当て、オフロード要求は同一のプロセス識別子を含む。エントリは、メモリアドレスと、メモリアドレスにアクセスするオフロード要求を送信したスレッド数のカウントと、を含む。いくつかの例では、エントリは、メモリアドレスへのアクセスを含むオフロード要求のスレッド識別子及び/又はコア識別子を含む。オフロード要求の受信に応じて、コヒーレンシシンクロナイザ136は、上述したように適切なキャッシュプローブ動作を開始し(例えば、メモリアドレスのキャッシュエントリ内のクリーンデータを無効化し、ダーティデータをフラッシュするためにプローブフィルタによってプローブ要求を送信する)、送信されたプローブ要求ごとにメモリアドレスに対応するエントリ内のカウンタをインクリメントする。各スレッド/コアからのプローブ応答がコヒーレンシシンクロナイザ136に到着すると、グローバルALB260の対応するエントリ内のカウントがデクリメントされる。メモリアドレスにアクセスする全てのスレッドからのプローブ応答がグローバルALB260に到着すると、そのカウントが0に設定されるので、当該メモリアドレスのグローバルALBエントリがクリアされ得る。グローバルALB260は、同一プロセスのスレッド間でメモリアドレスエントリの共有を可能にする(これにより、グローバルALB260の容量に対する要求を効果的に低減することができる)。各グローバルALBエントリは、プロセス間のトラフィックを区別するためのタグとして、メモリアドレスとともにプロセス識別子を使用し得る。
【0059】
これらの実施形態では、ALBディレクトリ170は、コアごとのALB実施形態に関して上述したように更新される。コアがbarrier_start命令を実行する場合、ALBディレクトリ170は、コアがオフロード命令の実行を開始していることを示すように更新される。コアがbarrier_end命令を実行する場合、ALBディレクトリ170は、コアがオフロードトランザクション内の全てのオフロード命令の処理を完了したことを反映するように更新される。特定のプロセスのスレッドでオフロードトランザクションを実行する全てのコアがbarrier_end命令に到達した場合、グローバルALB260が、まだクリアすべきプロセスの残りのメモリアドレスエントリの何れかを含むかどうかが判定される。グローバルALB260内のプロセスのメモリアドレスエントリの全てがクリアされると(すなわち、スレッドカウントが「0」である)、ALBディレクトリ170のコントローラは、より若い非オフロード命令の実行をブロックするセマフォを解除するために信号をコアに送信する。この信号を受信すると、コアは、barrier_end命令がリタイアし、非オフロード命令の実行の続行を可能にする。
【0060】
2つのコア106、110が、プロセスPの並列化されたオフロードトランザクションを含むスレッドを実行している例を考える。コア106、110がbarrier_start命令を実行すると、ALBディレクトリ170内のバリア状態ベクトルは、コア106、110がPIDによって識別されるプロセスPのためにオフロード命令を実行していることを反映するように更新される。この例では、コア106は、メモリオペランドとしてメモリアドレス0xFFFFを含むオフロード要求(例えば、0xFFFFでのデータのロード又は記憶の何れか)を発行する。グローバルALBテーブルエントリは、「1」のカウントを有するインデックスタグ(例えば、メモリアドレス:PID)で初期化される。0xFFFFのキャッシュエントリ内のデータを無効化及び/又はフラッシュするためのプローブ要求が、コヒーレンシシンクロナイザ136によって送信される。コア110が、メモリオペランドとしてメモリアドレス0xBFAFを含むオフロード要求(例えば、0xBFAF内のデータのロード又は記憶の何れか)を発行すると、当該要求のタグ(例えば、メモリアドレス:PID)はグローバルALB260内のエントリにヒットし、エントリのカウントは「2」にインクリメントされる。0xBFAFのキャッシュエントリ内のデータを無効化及び/又はフラッシュするためのプローブ要求が、コヒーレンシシンクロナイザ136によって送信される。プローブ要求ごとにプローブ応答が受信されると、エントリのカウントがデクリメントされる。エントリのカウントが「0」であるとき、エントリはクリアされ得る。両方のコア106、110がbarrier_end命令をシグナリングした場合(すなわち、コア106、110だけがオフロードトランザクションスレッドを実行する2つのコアであることが既知である場合)、ALBディレクトリ170は、より若い非オフロード命令が実行を開始できるように、セマフォが解除され得、barrier_end命令がリタイアされ得ることをコア106、110にシグナリングする。
【0061】
代替の実施形態では、グローバルALB260は、コントローラと、各プロセスのスレッドごとのカウンタを備えるテーブルと、を含む。かかる実施形態は、メモリアドレスを記憶するよりも小さいエリアフットプリントを有し得る。テーブル内のカウンタは、コヒーレンシシンクロナイザ136及び/又はプローブフィルタによってプローブ要求がキャッシュに送信されるごとにインクリメントされる。プローブ応答を受信すると、プロセススレッドのカウンタがデクリメントされる。コヒーレンシシンクロナイザ136及び/又はプローブフィルタは、プローブ応答内のメモリアドレスを使用して、対応する保留中のオフロード要求キューエントリを識別し、メモリコントローラ134へのディスパッチの準備が整っているものとしてオフロード要求をマークする。スレッドがbarrier_end要求を送信するのに応じて、グローバルALB260は、同一プロセスからのスレッドのカウンタが「0」に達するのを待機する。同一プロセスの全スレッドのカウンタが「0」に達し、barrier_end要求が全スレッドから受信されると(ALBディレクトリ170から判定されるように)、グローバルALB260は、全てのスレッド/コアに対して、バリアを解除し、より若い非オフロード命令の実行を再開するように通知する。
【0062】
上述したコアごとのALB実施形態では、ALBコンテンツがクリアされると、より若い非オフロード命令が発行され得るので、シングルスレッドアプリケーションには、barrier_start命令及びbarrier_end命令は不要であり得る。プロセスごとに1つのスレッドのみが存在するので、barrier_startは不要であり得る。しかし、グローバルALB実施形態では、フェンス命令を使用してALBディレクトリにシグナリングし、したがって、ALBディレクトリは、グローバルALBのクリア時にセマフォを解除するようにコアにシグナリングし得る。すなわち、barrier_end命令は、プロセス唯一のスレッドのトラフィックに適用され、プロセッサシステムがグローバルALBを実装することを除いてbarrier_end命令と同じセマンティクスを有するfence_end命令で代用される。
【0063】
更なる説明のために、
図3は、本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する例示的な方法を示すフロー図である。
図3の例示的な方法は、オフロードされる動作のための少なくとも1つのオフロード命令を処理する(302)ことを含む。いくつかの例では、オフロードされる動作のための少なくとも1つのオフロード命令を処理する(302)ことは、アクセラレータ又はプロセッシングインメモリ(PIM)デバイス等のオフロードターゲットデバイスで実行される動作のための少なくとも1つのオフロード命令を受信するコア308によって実行される。例えば、オフロード命令(例えば、remote_load命令又はremote_store命令)は、オフロードターゲットデバイス内のメモリアドレスを表すメモリオペランドと、オフロードターゲットデバイスのレジスタオペランドと、を含み、オフロードターゲットデバイスは、メモリアドレスにおいてデータをレジスタに読み込むか、又は、レジスタ内のデータをメモリアドレスに書き込む動作を実行する。これらの例では、オフロードされる動作のための少なくとも1つのオフロード命令を処理する(302)ことは、コア308が、メモリオペランドからメモリアドレスを計算し、オフロードターゲットデバイスにコマンドを送信するためにメモリコントローラによって処理され得るオフロード要求を生成することによって実行され、オフロード要求は、動作、レジスタオペランド、計算されたメモリアドレス、並びに、プロセス識別子、スレッド識別子、及び/又はコア識別子等のメタデータ/ヘッダ情報を含む。いくつかの例では、オフロード要求は、要求がオフロード要求であることを示すフラグを備える、書き込み要求の特殊形態であり得る。コア308は、
図1のプロセッサ101及び
図2のプロセッサ201等のプロセッサ301のコア106、108、110、112の何れかであり得る。
【0064】
また、
図3の方法は、少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置する(304)ことを含む。少なくとも1つのオフロード命令のオペランドに表されるメモリアドレスに対するロックは、コア308で実行されるより若い非オフロード命令が、投機的実行の一部としてメモリアドレスに対応するコアキャッシュのデータにアクセスすることを防止する。いくつかの例では、少なくとも1つのオフロード命令のオペランドに表されるメモリアドレスにロックを配置する(304)ことは、オフロード命令のメモリオペランドから計算されたメモリアドレスをALBに記憶することによって実行される。例えば、ALBは、
図1に関して上述したようなコアごとのALB160、162、164、166であり、又は、
図2に関して上述したようなグローバルALB260であり得る。他の例では、少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置する(304)ことは、メモリアドレスへのアクセスがブロックされるように、メモリアドレスがインフライトであるオフロード命令によってターゲットにされることを別様に示すことによって実行される。ロックの粒度は、オフロードされた計算の粒度と同じであるか、又は、一定のキャッシュブロック粒度のロックであり得る。例えば、メモリアドレスは、ロックが配置されるメモリアドレスの範囲に含まれ得る。いくつかの例では、ロックは、少なくとも1つのオフロード命令の処理の完了後に、少なくとも1つのオフロード命令に関連するメモリアドレスに配置される。
【0065】
また、
図3の方法は、メモリアドレスをターゲットとする動作の完了に応じて、メモリアドレスに対するロックを除去する(306)ことを含む。いくつかの実施形態では、コア308は、生成されたオフロード要求をコヒーレンシシンクロナイザ(例えば、
図1及び
図2のコヒーレンシシンクロナイザ136)に転送する。上述したように、コヒーレンシシンクロナイザは、オフロード要求内のメモリアドレスを識別し、プロセッサシステム内の全てのコアのプライベートキャッシュにキャッシュプローブを送信し、キャッシュプローブは、メモリアドレスのキャッシュエントリをターゲットにする。コヒーレンシシンクロナイザは、メモリアドレスのキャッシュエントリを含む各コア及びコア複合体のそれぞれのキャッシュを識別するためのプローブフィルタを含み得る。いくつかの例では、キャッシュ動作は、無効化プローブ要求の送信時にコヒーレンシシンクロナイザによって完了され得る。他の例では、キャッシュ動作は、フラッシュプローブ要求に対するプローブ応答の受信時にコヒーレンシシンクロナイザによって完了され得る。実際に、キャッシュ動作は、より新しい命令が、オフロード命令によってアクセスされたメモリアドレスのキャッシュ内のデータにアクセスしないことが保証され得る場合に完了する。コヒーレンシシンクロナイザがキャッシュ動作を完了する(すなわち、コアの全てのプライベートキャッシュのプローブ要求を開始する)と、コヒーレンシシンクロナイザは、メモリアドレスのロックを解除するようにALBのコントローラにシグナリングする。
【0066】
いくつかの例では、メモリアドレスに対するロックを除去する(306)ことは、コヒーレンシシンクロナイザからロック解除信号を受信し、それに応じて、メモリアドレスのロックを解除して、より若い非オフロード命令がメモリアドレスにアクセスできるようにすることによって実行される(すなわち、キャッシュエントリが無効化されているので、これらのより若い命令は、オフロード動作が既に完了しているメモリに向かう必要がある)。すなわち、メモリアドレスに対するロックは、要求されたオフロード動作がオフロードターゲットによって実行される前に除去され、更には、オフロードコマンドをオフロードターゲットに送信する前に除去され得る。メモリアドレスのロックを解除することは、ALB内のメモリアドレスのエントリを無効化すること又はクリアすることによって実行され得る。いくつかの例では、ALBエントリをクリアすることは、オフロード要求が生じたコア内で実行される。他の例では、ALBエントリをクリアすることは、グローバルALB内で実行される。
【0067】
ALBを使用して、インフライトオフロード処理要求のメモリアドレスのキャッシュエントリがプロセッサ内の全てのコアにわたって無効化されるまで、それらのアドレスをロックすることは、オフロード命令コードシーケンスとより若い非オフロード命令との間のメモリ順序付けを強制することによって、より若い非オフロード命令がキャッシュ内の古いデータにアクセスしないことを確実にすることを読者は理解するであろう。
【0068】
更なる説明のために、
図4は、本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する別の例示的な方法を示すフロー図である。
図3の例示的な方法と同様に、
図4の方法は、オフロードされる動作のための少なくとも1つのオフロード命令を処理する(302)ことと、少なくとも1つのオフロード命令のオペランドに表されるメモリアドレスにロックを配置する(304)ことと、メモリアドレスをターゲットとするキャッシュ動作の完了に応じて、メモリアドレスに対するロックを除去する(306)ことと、を含む。
【0069】
また、
図4の例示的な方法は、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定する(402)ことを含み、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する。いくつかの例では、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定する(402)ことは、2つ以上のコア308、410が、マルチコアプロセッサ301のコア308、410でホストされるアプリケーションのそれぞれのスレッドにおいてオフロードトランザクションの処理を開始しようとしていると判定するマルチコアプロセッサ301によって実行され、複数のプロセッサコア間で実行されるオフロード命令のシーケンスは同一のプロセス識別子を共有する。オフロードトランザクションを実行する各スレッドは、アプリケーションの同一のプロセス識別子を含む。いくつかの例では、オフロードトランザクションは、オフロード命令のシーケンスの開始をマークする特殊命令を含む。これらの例では、各コア308、410は、この命令又はマーカに達した場合にシグナリングし得る。いくつかの実施形態では、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定する(402)ことは、コア308、410からオフロード命令の処理の開始を示す信号を受信するALBディレクトリ(例えば、ALBディレクトリ170)のコントローラによって実行される。
【0070】
また、
図4の方法は、何れのオフロード命令よりも若い非オフロード命令の実行を制限する(404)ことを含む。いくつかの例では、何れのオフロード命令よりも若い非オフロード命令の実行を制限する(404)ことは、オフロード命令の実行前に各コア308、410によって実行され、当該コアのオフロードトランザクション内の何れのオフロード命令よりも若い、当該スレッド内での命令の実行をブロックするセマフォを設定する。
【0071】
また、
図4の方法は、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定したことに応じて、制限を除去する(406)ことを含む。いくつかの例では、各コア308、410が、そのオフロードトランザクションの最後のオフロード命令をリタイアさせると、コアは、当該コアでのオフロードトランザクションの完了をシグナリングし得る。これらの例では、制限を除去する(406)ことは、各コア308、410のセマフォを解放して、これらのスレッド内のより若い非オフロード命令の実行開始を可能にすることによって実行される。いくつかの実施形態では、制限を除去する(406)ことは、オフロードトランザクションを処理する全てのコア308、410からトランザクションが完了したという信号を受信し、全てのコア308、410が完了をシグナリングした後にのみセマフォを解放するようにこれらのコアにシグナリングするALBディレクトリのコントローラによって実行される。このようにして、オフロード命令コードシーケンスとより若い非オフロード命令コードとの間のメモリ順序付けは、全てのコアスレッドがそれぞれのオフロードトランザクションの処理を終了するまで、各コアで全てのより若い非オフロード命令を待機させることによって保持される。
【0072】
更なる説明のために、
図5は、本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する別の例示的な方法を示すフロー図である。
図4の例示的な方法と同様に、
図5の方法は、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定する(402)ことであって、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する、ことと、何れのオフロード命令よりも若い非オフロード命令の実行を制限する(404)ことと、リモートデバイスでリモート実行される動作のための少なくとも1つのオフロード命令を処理する(302)ことと、メモリアドレスをターゲットとするキャッシュ動作の完了に応じて、少なくとも1つのオフロード命令のオペランドに表されるメモリアドレスにロックを配置する(304)ことと、メモリアドレスに対するロックを除去する(306)ことと、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定したことに応じて、制限を除去する(406)ことと、を含む。
【0073】
図5の方法では、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定する(402)ことは、各コアがそれぞれのオフロード命令のシーケンスにおいてバリアの開始命令を実行したと判定する(502)ことを含み、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する。いくつかの例では、各オフロードトランザクションは、バリアの開始命令(例えば、barrier_start)で始まる。これらの例では、各コア308、410がバリアの開始命令を実行すると、コアは、バリアの開始命令が実行されたことをシグナリングし、より若い非オフロード命令のコアでの実行をブロックするようにセマフォを設定する。監視コントローラ(例えば、ALBディレクトリ170のコントローラ)は、コア308、410から、これらのコアがオフロード命令の処理を開始する準備が整っていることを示す信号を受信する。これらのコアが同一プロセス識別子のスレッドを実行しており、オフロード命令の処理を開始する予定であることを示す信号を受信したことに応じて、監視コントローラは、この情報を状態レコード(例えば、上述したバリア状態ベクトル)に記録し得る。オフロードトランザクションを含むスレッドを実行しているコアをバリアの開始命令の実行から把握した後、各コアがそれぞれのスレッドについてより若い非オフロード命令の実行をブロックしている間は、それらのスレッドの進行が監視され得る。
【0074】
更なる説明のために、
図6は、本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する別の例示的な方法を示すフロー図である。
図4の例示的な方法と同様に、
図6の方法は、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定する(402)ことであって、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する、ことと、何れのオフロード命令よりも若い非オフロード命令の実行を制限する(404)ことと、リモートデバイスでリモート実行される動作のための少なくとも1つのオフロード命令を処理する(302)ことと、メモリアドレスをターゲットとするキャッシュ動作の完了に応じて、少なくとも1つのオフロード命令のオペランドに表されるメモリアドレスにロックを配置する(304)ことと、メモリアドレスに対するロックを除去する(306)ことと、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定したことに応じて、制限を除去する(406)ことと、を含む。
【0075】
図6の方法では、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定することに応じて制限を除去すること(406)は、バリアの終了命令が各コアで実行されたと判定すること(602)を含む。いくつかの例では、バリアの終了命令が各コアで実行されたと判定する(602)ことは、バリアの終了命令に遭遇したことを監視コントローラ(例えば、
図1及び
図2のALBディレクトリ170)にシグナリングすることを含む、オフロード命令のそれぞれのシーケンスのバリアの終了命令(例えば、上述したbarrier_end)を実行するコア308、410によって実行される。例えば、コア308、410は、バリアの終了命令を示し、コアで実行しているスレッドのプロセス識別子を含むメッセージをALBディレクトリに送信し得る。これらの例では、バリアの終了命令は、監視コントローラが、より若い非オフロード命令の実行をブロックするセマフォの解放をシグナリングするまで、リタイアすることができない。全てのコア308、410がバリアの終了命令を実行すると、監視コントローラは、全てのコア308、410にセマフォの解放をシグナリングする。
【0076】
更なる説明のために、
図7は、本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する別の例示的な方法を示すフロー図である。
図6の例示的な方法と同様に、
図7の方法は、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定する(402)ことであって、バリアの終了命令が各コアで実行されたと判定する(602)ことを含み、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する、ことと、何れのオフロード命令よりも若い非オフロード命令の実行を制限する(404)ことと、リモートデバイスでリモート実行される動作のための少なくとも1つのオフロード命令を処理する(302)ことと、メモリアドレスをターゲットとするキャッシュ動作の完了に応じて、少なくとも1つのオフロード命令のオペランドに表されるメモリアドレスにロックを配置する(304)ことと、メモリアドレスに対するロックを除去する(306)ことと、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定したことに応じて、制限を除去する(406)ことと、を含む。
【0077】
図7の方法では、制限を除去する(406)ことは、オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定する(702)ことを含む。いくつかの例では、オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定する(702)ことは、
図1のコアごとのALB160、162、164、166に関して上述したように、各コア308、410のALBが空であると判定することによって実行される。これらの例では、コア308、410は、監視コントローラ(例えば、ALBディレクトリ170のコントローラ)に、それらのALBが空であることをシグナリングする。この情報は、バリアの終了命令の実行の一部として、又は、個別の信号として送信され得る。他の例では、オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定する(702)ことは、
図2のグローバルALB260に関して上述したように、各コア308、410のALBが空であると判定することによって実行される。
【0078】
更なる説明のために、
図8は、本開示のいくつかの実施形態による、オフロードされた命令とオフロードされていない命令との間のメモリ順序付けを保持する別の例示的な方法を示すフロー図である。
図6の例示的な方法と同様に、
図8の方法は、複数のプロセッサコアがオフロード命令のシーケンスの実行をそれぞれ開始したと判定する(402)ことであって、バリアの終了命令が各コアで実行されたと判定する(602)ことを含み、複数のプロセッサコア間で実行するオフロード命令のシーケンスは、同一のプロセス識別子を共有する、ことと、何れのオフロード命令よりも若い非オフロード命令の実行を制限する(404)ことと、リモートデバイスでリモート実行される動作のための少なくとも1つのオフロード命令を処理する(302)ことと、メモリアドレスをターゲットとするキャッシュ動作の完了に応じて、少なくとも1つのオフロード命令のオペランドに表されるメモリアドレスにロックを配置する(304)ことと、メモリアドレスに対するロックを除去する(306)ことと、各プロセッサコアがそのオフロード命令のシーケンスの実行を完了したと判定したことに応じて、制限を除去する(406)ことと、を含む。
【0079】
図8の例示的な方法では、制限を除去する(406)ことは、各コアに通信可能に結合された状態バッファ内の各コアの進捗を追跡する(802)ことを含む。いくつかの例では、各コアに通信可能に結合された状態バッファ内の各コアの進捗を追跡する(802)ことは、プロセス識別子、並びに、バリアの開始命令及びバリアの終了命令を実行したコアを示すものを記録することを含む。例えば、状態バッファは、上述したバリア状態ベクトルであり、バリア状態ベクトル内のビットは、プロセッサシステム内の各コアを表し、ビットは、バリアの開始命令が実行されたときに設定され、バリアの終了命令に遭遇した後にクリアされる。これらの例では、各コア308、410は、監視コントローラ(例えば、ALBディレクトリ170のコントローラ)に、コアがバリアの開始命令及びバリアの終了命令をいつ実行したかを通知する。
【0080】
上記の説明を考慮して、読者は、本開示による実施形態が多数の利点を提供することを理解するであろう。読者は、これらの実施形態が、オフロード命令とより若い非オフロード命令との間の正しいメモリ順序付けを保証することを理解するであろう。また、読者は、バリアの開始命令及びバリアの終了命令の実施は、より若い非オフロード命令が、従来のバリア命令又はフェンス命令と比較してより早くメモリにアクセスすることを可能にし、それによってより高い性能をもたらすことを理解するであろう。すなわち、従来のバリア又はフェンスソリューションとは異なり、本明細書の実施形態は、バリアを解除する前に、オフロードターゲットデバイス(例えば、PIMデバイス)がオフロードされた動作の実行を終了することを待機しない。また、読者は、ALB及びALBディレクトリを含む、本明細書で紹介される構造が、メモリ順序付け及びバリア実施を実装するためのハードウェアサポートを提供することを理解するであろう。
【0081】
いくつかの実施形態は、システム、装置、方法及び/又は論理回路であり得る。本開示のコンピュータ可読プログラム命令は、アセンブラ命令、命令セットアーキテクチャ(instruction-set-architecture、ISA)命令、機械命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、又は、Smalltalk、C++等のオブジェクト配向プログラミング言語、並びに、「C」プログラミング言語又は同様のプログラミング言語等の従来の手続き型プログラミング言語等1つ以上のプログラミング言語の任意の組み合わせで書き込まれたソースコード若しくはオブジェクトコードの何れかであり得る。いくつかの実施形態では、例えば、プログラマブル論理回路、フィールドプログラマブルゲートアレイ(field-programmable gate array、FPGA)又はプログラマブル論理アレイ(programmable logic array、PLA)を含む電子回路は、コンピュータ可読プログラム命令の状態情報を利用して電子回路を個別化することによって、コンピュータ可読プログラム命令を実行し得る。
【0082】
本開示の態様は、本開示のいくつかの実施形態による方法、装置(システム)及び論理回路のフロー図及び/又はブロック図を参照して本明細書に記載されている。フロー図及び/又はブロック図の各ブロック、並びに、フロー図及び/又はブロック図におけるブロックの組み合わせは、論理回路によって実装され得ることが理解されよう。
【0083】
また、論理回路は、プロセッサ、他のプログラマブルデータ処理装置又は他のデバイスに実装されて、コンピュータ実装プロセスを生成するために、プロセッサ、他のプログラマブル装置又は他のデバイス上で実行される一連の動作ステップを行わせることができ、そのため、コンピュータ、他のプログラマブル装置又は他のデバイス上で実行される命令は、フロー図及び/又はブロック図のブロックに指定される機能/行為を実施する。
【0084】
図中のフロー図及びブロック図は、本開示の様々な実施形態によるシステム、方法及び論理回路の可能な実施形態のアーキテクチャ、機能及び動作を示す。これに関して、フロー図又はブロック図の各ブロックは、指定された論理機能を実装するための1つ以上の実行可能命令を含む、命令のモジュール、セグメント又は部分を表すことができる。いくつかの代替的な実施形態では、ブロックに記載されている機能は、図に記載された順序から外れて発生する場合がある。例えば、連続して示される2つのブロックは、実際には実質的に同時に実行され得るか、又は、ブロックは、関与する機能に応じて、逆の順序で実行され得る。ブロック図及び/又はフロー図の各ブロック、並びに、ブロック図及び/又はフロー図におけるブロックの組み合わせは、指定された機能若しくは行為を実行するか、又は、専用ハードウェアとコンピュータ命令との組み合わせを行う、専用ハードウェアベースのシステムによって実装することができることにも留意されたい。
【0085】
本開示は、その実施形態を参照して具体的に示され、説明されてきたが、以下の特許請求の範囲の趣旨及び範囲から逸脱することなく、形態及び詳細で様々な変更が行われ得ることを理解されたい。したがって、本明細書に記載された実施形態は、説明のためのものに過ぎず、本発明を限定するものではない。本開示は、詳細な説明ではなく添付の特許請求の範囲によって定義され、その範囲内の全ての差異は、本発明に含まれると解釈されるべきである。
【手続補正書】
【提出日】2023-08-23
【手続補正1】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項1】
マルチコアプロセッサであって、
少なくとも1つのオフロード命令を処理することと、
前記少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することと、
前記メモリアドレスをターゲットとする動作の完了に応じて、前記メモリアドレスに対する前記ロックを除去することと、
を行うように構成されている、
マルチコアプロセッサ。
【請求項2】
前記少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することは、アドレスロックバッファのエントリに前記メモリアドレスを記憶することを含み、前記メモリアドレスに対する前記ロックを除去することは、前記アドレスロックバッファ内の前記エントリをクリアすることを含む、
請求項
1のマルチコアプロセッサ。
【請求項3】
前記メモリアドレスをターゲットとする動作を完了することは、前記メモリアドレスのエントリを含む1つ以上のコアの1つ以上のキャッシュにプローブ要求を送信することを含み、前記プローブ要求は、前記エントリ内のデータが無効化されるか又はフラッシュされるかの何れかであることを示す、
請求項
1のマルチコアプロセッサ。
【請求項4】
前記マルチコアプロセッサは、
複数のプロセッサコアがそれぞれのオフロード命令のシーケンスの実行をそれぞれ開始したと判定することであって、前記複数のプロセッサコアで実行するそれぞれのオフロード命令のシーケンスは、プロセス識別子を共有する、ことと、
何れの前記オフロード命令よりも若い非オフロード命令の実行を制限することと、
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定したことに応じて、前記制限を除去することと、
を行うように構成されている、
請求項
1のマルチコアプロセッサ。
【請求項5】
複数のプロセッサコアがそれぞれのオフロード命令のシーケンスの実行をそれぞれ開始したと判定することは、各プロセッサコアが、前記それぞれのオフロード命令のシーケンスにおいてバリアの開始命令を実行したと判定することを含み、前記複数のプロセッサコアで実行する前記それぞれのオフロード命令のシーケンスは、プロセス識別子を共有し、
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定することは、
バリアの終了命令が各プロセッサコアで実行されたと判定することと、
前記オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定することと、を含む、
請求項
4のマルチコアプロセッサ。
【請求項6】
システムであって、
プロセッシングインメモリ(PIM)デバイスと、
前記PIMデバイスに結合されたマルチコアプロセッサと、を備え、
前記マルチコアプロセッサは、
少なくとも1つのオフロード命令を処理することと、
前記少なくとも1つのオフロード命令に関連するメモリアドレスにロックを配置することと、
前記メモリアドレスをターゲットとする動作の完了に応じて、前記メモリアドレスに対する前記ロックを除去することと、
を行うように構成されている、
システム。
【請求項7】
前記メモリアドレスをターゲットとする動作を完了することは、前記メモリアドレスのエントリを含む1つ以上のコアの1つ以上のキャッシュにプローブ要求を送信することを含み、前記プローブ要求は、前記エントリ内のデータが無効化されるか又はフラッシュされるかの何れかであることを示す、
請求項
6のシステム。
【請求項8】
前記マルチコアプロセッサは、
複数のプロセッサコアがそれぞれのオフロード命令のシーケンスの実行をそれぞれ開始したと判定することであって、前記複数のプロセッサコアで実行するそれぞれのオフロード命令のシーケンスは、プロセス識別子を共有する、ことと、
何れの前記オフロード命令よりも若い非オフロード命令の実行を制限することと、
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定したことに応じて、前記制限を除去することと、
を行うように構成されている、
請求項
6のシステム。
【請求項9】
複数のプロセッサコアがそれぞれのオフロード命令のシーケンスの実行をそれぞれ開始したと判定することは、各プロセッサコアが、前記それぞれのオフロード命令のシーケンスにおいてバリアの開始命令を実行したと判定することを含み、前記複数のプロセッサコアで実行する前記それぞれのオフロード命令のシーケンスは、プロセス識別子を共有し、
複数のプロセッサコアの各々が前記それぞれのオフロード命令のシーケンスを完了したと判定することは、
バリアの終了命令が各プロセッサコアで実行されたと判定することと、
前記オフロード命令のシーケンスによってトリガされた全てのメモリアドレスロックが除去されたと判定することと、を含む、
請求項
8のシステム。
【国際調査報告】