L1 および L2 キャッシュ レベルがある場合、1 つのアドレスへの同時グローバル メモリ アクセスのシリアル化は行われますか?

StackOverflow https://stackoverflow.com//questions/20014054

  •  21-12-2019
  •  | 
  •  

質問

私の知識によれば、ワープのスレッドがグローバル メモリ内の同じアドレスにアクセスすると、リクエストはシリアル化されるため、定数メモリを使用する方が良いと考えられます。GPU に L1 および L2 キャッシュ レベル (Fermi および Kepler アーキテクチャ) が装備されている場合、同時グローバル メモリ アクセスのシリアル化は発生しますか?言い換えれば、ワープのスレッドが同じグローバル メモリ アドレスにアクセスするとき、1 つのスレッドがすでにそのアドレスを要求しているため、ワープの 31 スレッドはキャッシュの存在から恩恵を受けるでしょうか?アクセスが読み取りの場合と、アクセスが書き込みの場合はどうなりますか?

役に立ちましたか?

解決

Fermi と Kepler の同じワープ内のスレッドによる同じアドレスへの同時グローバル アクセスはシリアル化されません。ワープ読み取りにはブロードキャスト メカニズムがあり、パフォーマンスに影響を与えることなく、単一のキャッシュライン読み取りからのすべての読み取りを満たします。性能は完全合体読みと同じです。これは、キャッシュの仕様に関係なく当てはまります。たとえば、L1 キャッシュが無効になっている場合でも当てはまります。

同時書き込みのパフォーマンスは(私の知る限り)指定されていませんが、 行動的に, 、同時書き込みは常にシリアル化され、順序は未定義です。

編集 以下の追加の質問に回答します。

  1. ワープ内のすべてのスレッドが同じ値を同じアドレスに書き込んだ場合でも、シリアル化されますか?このような状況を認識するライトブロードキャストメカニズムはありませんか?

すべての同時書き込みを調べてそれらがすべて同じであるかどうかを確認し、それに基づいて何らかのアクションを実行する書き込みブロードキャスト メカニズムはありません。正しい答えは、書き込みは不特定の順序で行われ、パフォーマンス特性は未定義であるということです。明らかに、書き込まれる値がすべて同じであれば、その場所に最終的に格納される値がその値であることが保証されます。しかし、書き込みアクティビティが 1 つのサイクルに集約されるのか、それとも完了するまでに複数のサイクルが必要なのかを尋ねる場合、その実際の動作は未定義 (文書化されていない) であり、実際には 5月 アーキテクチャによって異なります (たとえば、cc1.x はすべての書き込みが実行されるようにシリアル化する場合がありますが、cc2.x は 1 つの書き込みが「勝ち」、他の書き込みはすべて実行されるように「シリアル化」する場合があります)。破棄され、実際のサイクルは消費されません。) 繰り返しになりますが、パフォーマンスは文書化されておらず、仕様も明記されていませんが、 プログラムで観察可能 動作が定義されています。

2 あなたが説明したこのブロードキャスト メカニズムでは、コンスタント メモリ ブロードキャスト アクセスとグローバル メモリ ブロードキャスト アクセスの唯一の違いは、前者はアクセスをグローバル メモリまでルーティングできるのに対し、後者は専用のハードウェアがあり、高速であるということですよね。

__constant__ メモリは、SM ごとに利用可能な専用のハードウェアである定数キャッシュを使用し、グローバル メモリの特定のセクションをキャッシュします。 読み取り専用 ファッション。この HW キャッシュは、L1 キャッシュ (存在し、有効になっている場合) および L2 キャッシュとは物理的および論理的に分離されています。Fermi 以降では、どちらのメカニズムも読み取り時のブロードキャストをサポートしており、定常キャッシュでは、サイクルごとに 1 回の読み取りアクセスしかサービスできないため、これが推奨されるアクセス パターンです。どちらのメカニズムも、キャッシュ (存在する場合) で「ヒット」するか、「ミス」してグローバル読み取りをトリガーする可能性があります。特定の場所 (またはキャッシュライン) の最初の読み取りでは、どちらのキャッシュにも要求されたデータがあるため、アクセスを処理するために「ミス」し、グローバル メモリ読み取りがトリガーされます。その後、どちらの場合でも、関連するデータが一時的に削除されないと仮定して、後続の読み取りはキャッシュから処理されます。初期の cc1.x デバイスの場合、初期のデバイスには L1 キャッシュがなかったため、定数メモリ キャッシュは非常に貴重でした。Fermi 以降の場合、定数キャッシュを使用する主な理由は、データが識別可能な場合 (つまり、読み取り専用)とアクセス パターン(ワープごとに同じアドレス)が利用可能な場合、定数キャッシュを使用すると、それらの読み取りが L1 を経由して移動し、他のデータが追い出されることを防ぎます。実際には、L1 が単独でサポートできる容量を超えて、キャッシュ可能なフットプリントが多少増加することになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top