0

私は CUDA_C_Programming_Guide を読んでいます。共有メモリのトピックでは、例に出くわしました: Device Compute capability: 1.0, 共有メモリ内の 16 バンク

extern __shared__ float shared[]; 
float data = shared[BaseIndex + s * tid];

sそして、彼らが「s」は奇数でなければならないと結論付けた説明では、誰かが偶数のときに何が起こり、奇数のときに何が起こるかを理解するのを手伝ってもらえますsか?

4

1 に答える 1

1

奇数の結論sを直接確認するのは簡単ではありませんが、バンクの競合が発生したときに導出しようとすると(2つのスレッドtidとtid'が同じバンクにアクセスします)、32がバンクの数であると仮定します。

s * tid == s * tid'(mod 32)

s * tid == s *(tid + n)(mod 32)ここで、tid'= tid + n

s * tid == s * tid + s * n(mod 32)

s * n == 0(mod 32)

n =(32 / d)* k(一部のkおよびd = gcd(s、32))

したがって、32が32 / d以下の場合、銀行の競合は発生しません。

また、d = gcd(s、2 ^ 5)であるため、sは奇数である必要があります。

コメントでのあなたの質問について、私はあなたが理解していないことを完全には理解していませんでしたが、簡単な説明:2つのスレッドが同じバンクにアクセスしようとすると(つまり、同じ行の2つの単語にアクセスしようとすると)アクセスがシリアル化されます。

于 2012-11-28T12:09:48.883 に答える