32バイトの2倍のサイズの64要素の共有メモリを使用する必要があります。従って、メモリアクセスの数は、ワープ内のスレッドの数の2倍である。銀行とのコンフリクトのないアクセスを得るためにはどうすればよいですか?共有メモリでのバンクコンフリクトフリーアクセス
答えて
32ビットメモリアクセスの場合、デフォルトのメモリアクセスパターンを使用できます。
__shared__ int shared[32];
int data = shared[base + stride * tid];
ここにstride
が奇数である。
あなたは64ビットアクセスを持っている場合は、このようないくつかのトリックを使用することができます。
struct type
{
int x, y, z;
};
__shared__ struct type shared[32];
struct type data = shared[base + tid];
ありがとうございました。例として、私は16のスレッドと共有される32要素の配列を持っているので、各スレッドはこの配列の2つの要素にアクセスしなければなりません。次に、上記の問題に応じてどのように適切なアドレッシングを行う必要がありますか? – BehzadX
最初のパターンはあなたのケースでうまくいきます。私は小さな質問をすることができます:なぜ16?スレッドブロック内のすべてのスレッドで共有される修飾子 '__shared__'を持つ配列。 – geek
これは単なる例です。実際には、スレッドによって実行される計算の中で質量行列のようないくつかの配列を共有するFEMシミュレーションを扱っています。 – BehzadX
のは、ので、あなたの共有メモリが16のバンクがあり、各スレッドが持っている、あなたは計算能力1.xのを使用していると仮定しましょう共有メモリ内の2つの要素にアクセスします。
スレッドは、両方の要素の同じメモリバンクにアクセスする必要があります。そのため、必要な要素が互いに16離れているように整理すると、バンクの競合は避けてください。
__shared__ int shared[32];
int data = shared[base + stride * tid];
int data = shared[base + stride * tid + 16];
私は複雑な山車を格納するために、このパターンを使用しますが、1は、転置アクセスパターンにシリアル化を避けるためである場合は、それは
#define TILE_WIDTH 16
__shared__ float shared[TILE_WIDTH][2*TILE_WIDTH + 1];
float real = shared[base + stride * tid];
float imag = shared[base + stride * tid + TILE_WIDTH];
のように見えたので、私は、複雑なfloatの配列を持っていました。
- 1. 共有データベース/メモリ
- 2. RDMAメモリ共有
- 3. Linuxの共有メモリ
- 4. OpenCLの共有メモリ
- 5. electron.atom.ioと共有メモリ
- 6. 継承共有メモリ
- 7. cython共有メモリ - ブロック
- 8. セマフォと共有メモリ
- 9. ビジュアルスタジオと共有メモリ
- 10. Symbianの共有メモリの例
- 11. C++クラッシュの共有メモリ
- 12. Cメモリ共有の問題
- 13. postgresql共有メモリの設定
- 14. 共有メモリ内のSRWロック
- 15. 共有メモリの変数が
- 16. Pythonプロセス間の共有メモリ
- 17. JavaとC++の共有メモリ
- 18. メモリ内のKDB共有テーブル
- 19. C++での共有メモリの整列
- 20. データ配信と共有メモリ
- 21. activerecordメモリ内共有キャッシュ
- 22. uda共有メモリ上書き?
- 23. 共有メモリを持つクラウド
- 24. Apache Ignite C++、共有メモリ
- 25. 共有メモリおよびグローバルメモリアクセス
- 26. ゴーラン、プロセスと共有メモリ
- 27. boost ::プロセス間共有メモリ
- 28. CUDAプログラミング - 共有メモリ構成
- 29. 共有メモリのオーバーレイは何ですか?
- 30. 複数のアプリケーションインスタンス間でメモリを共有
Uは共有メモリにどのようにアクセスしますか?スレッドごとに64ビットアクセスが必要か、2つの32ビットアクセスが必要ですか? – geek