2012-03-31 46 views
1

32バイトの2倍のサイズの64要素の共有メモリを使用する必要があります。従って、メモリアクセスの数は、ワープ内のスレッドの数の2倍である。銀行とのコンフリクトのないアクセスを得るためにはどうすればよいですか?共有メモリでのバンクコンフリクトフリーアクセス

+0

Uは共有メモリにどのようにアクセスしますか?スレッドごとに64ビットアクセスが必要か、2つの32ビットアクセスが必要ですか? – geek

答えて

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]; 
+0

ありがとうございました。例として、私は16のスレッドと共有される32要素の配列を持っているので、各スレッドはこの配列の2つの要素にアクセスしなければなりません。次に、上記の問題に応じてどのように適切なアドレッシングを行う必要がありますか? – BehzadX

+0

最初のパターンはあなたのケースでうまくいきます。私は小さな質問をすることができます:なぜ16?スレッドブロック内のすべてのスレッドで共有される修飾子 '__shared__'を持つ配列。 – geek

+0

これは単なる例です。実際には、スレッドによって実行される計算の中で質量行列のようないくつかの配列を共有するFEMシミュレーションを扱っています。 – BehzadX

0

のは、ので、あなたの共有メモリが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の配列を持っていました。