私はCUDAを使用して小さなアプリケーションを開発しています。
私は巨大な2D配列(共有メモリには収まりません)を持っており、すべてのブロックのスレッドが常にランダムな場所から読み取ります。
この2D配列は、読み取り専用の配列です。
この2Dアレイをどこに割り当てる必要がありますか?グローバルメモリ?一定のメモリ?テクスチャメモリ?
3 に答える
デバイスのテクスチャメモリのサイズに応じて、この領域に実装する必要があります。実際、テクスチャメモリはシーケンシャルローカリティキャッシュメカニズムに基づいています。これは、連続する識別子のスレッドが比較的近いストレージロケーション内のデータ要素に到達しようとするときに、メモリアクセスが最適化されることを意味します。
さらに、このローカリティは2Dアクセス用にここに実装されています。したがって、各スレッドがテクスチャメモリに格納されている配列のデータ要素に到達すると、連続した2Dアクセスの場合になります。したがって、メモリアーキテクチャを最大限に活用できます。
残念ながら、このメモリはそれほど大きくはなく、巨大な配列を使用すると、データをそれに収めることができる場合があります。この場合、グローバルメモリの使用を避けることはできません。
jHackTheRipperに同意します。簡単な解決策は、テクスチャメモリを使用してから、ComputeVisualProfilerを使用してプロファイリングすることです。画像畳み込み用のさまざまなメモリタイプに関するNVIDIAのスライドの良いセットを次に示します。これは、良好な共有メモリ使用量とグローバル読み取りが、テクスチャメモリを使用するよりもそれほど高速ではなかったことを示しています。あなたの場合、グローバルメモリ内のランダムな値にアクセスする場合には通常は得られない、texmemoryからの合体した読み取りを取得する必要があります。
一定またはテクスチャに収まるほど小さい場合は、3つすべてを試してみます。
ここにリストしていない興味深いオプションの1つは、ホスト上のマップトメモリです。デバイスメモリに明示的に転送せずに、デバイスからアクセスできるホストにメモリを割り当てることができます。アクセスする必要のある配列の量によっては、グローバルメモリにコピーしてそこから読み取るよりも高速になる場合があります。