1

各ワープが同じアドレスの共有メモリにアクセスする場合、32バイトのデータ(ulong4)をどのようにロードしますか?「放送」されますか?アクセス時間は、各スレッドが2バイトの「unsignedshortint」をロードした場合と同じでしょうか?

さて、各ワープで32/64同じバイトの共有メモリからロードする必要がある場合、どうすればこれを行うことができますか?

4

1 に答える 1

1

計算機能 3.0 の前のデバイスでは、共有メモリ アクセスは常に 32 ビット / 4 バイト幅であり、ワープのすべてのスレッドが同じアドレスにアクセスする場合にブロードキャストされます。より広いアクセスは、複数の命令にコンパイルされます。

コンピューティング機能 3.0 では、cudaDeviceSetSharedMemConfig() を使用して、共有メモリ アクセスを 32 ビット幅または 64 ビット幅のいずれかに設定できます。ただし、選択した設定はカーネル全体に適用されます。


[もともと質問の「共有」という小さな単語を見逃していたので、代わりにグローバル メモリについて完全にトピックから外れた回答をしました。それはまだ正しいはずなので、ここに残します:]

場合によります:

  • コンピューティング機能 1.0 および 1.1 はブロードキャストせず、64 個の個別の 32 バイト メモリ トランザクションを使用します (16 バイトの 2 倍、ワープの各スレッドの最小 32 バイト トランザクション サイズに拡張)。
  • コンピューティング機能 1.2 および 1.3 ブロードキャスト、したがって 2 つの 32 バイト トランザクション (16 バイトの 2 倍、最小の 32 バイト トランザクション サイズに拡張) は、ワープのすべてのスレッドに十分です。
  • コンピューティング機能 2.0 以降では、128 バイトのキャッシュ ラインを読み取るだけで、そこからのすべての要求が満たされます。

コンピューティング機能 1.x デバイスは、転送されたデータの 50% を無駄にします。これは、1 つのスレッドが最大で 16 バイトをロードできるためです。ただし、最小トランザクション サイズは 32 バイトです。さらに、32 バイトのトランザクションは 128 バイトのトランザクションよりもはるかに遅くなります。

最小トランザクション サイズと、トランザクションごとに各スレッドに 8 または 16 バイトを転送するのに十分なデータ パス幅があるため、各スレッドが 8 バイトだけを読み取った場合と同じ時間になります。

データの 2 倍または 4 倍を読み取ると、コンピューティング機能 1.x では 2 倍または 4 倍の時間がかかりますが、2.0 以降では、データが同じキャッシュ ラインに分類される場合に最小限の時間しかかからないため、それ以上のメモリ トランザクションは必要ありません。

そのため、コンピューティング機能 2.0 以降では心配する必要はありません。1.x では、定数キャッシュまたはテクスチャが定数の場合はデータを読み取り、それ以外の場合は共有メモリで並べ替えます (カーネルがメモリ帯域幅にバインドされていると仮定します)。

于 2012-09-26T21:40:57.533 に答える