4

私はこの問題を自分で解決しようとしていますが、できません。だから私はあなたのアドバイスをもらいたいです。

私はこのようなカーネルコードを書いています。VGAはGTX580です。

xxxx <<< blockNum, threadNum, SharedSize >>> (... threadNum ...)
(note. SharedSize is set 2*threadNum)

__global__ void xxxx(..., int threadNum, ...)
{
    extern __shared__ int shared[];
    int* sub_arr = &shared[0];
    int* sub_numCounting = &shared[threadNum];
    ...
}

私のプログラムは、ブロックごとに約1085ブロックと1024スレッドを作成します。

(私は巨大なサイズの配列を処理しようとしています)

つまり、ブロックあたりの共有メモリのサイズは8192(1024 * 2 * 4)バイトですよね?

cudaDevicePropを使用すると、GTX580のブロックあたり最大49152バイトの共有メモリを使用できることがわかりました。

また、GTX 580には16個のプロセッサがあり、スレッドブロックをプロセッサに実装できます。

しかし、私のプログラムはエラーになります。(8192bytes <49152bytes)

カーネルで「printf」を使用して、正常に動作するかどうかを確認しますが、いくつかのブロックは動作しません。(私は1085ブロックを作成しますが、実際には50〜100ブロックしか動作しません。)

また、同じプロセッサで動作するブロックが同じ共有メモリアドレスを共有しているかどうかを知りたいです。(そうでない場合は、共有メモリに他のメモリを割り当てますか?)

ブロックあたりの共有メモリの最大サイズが何を意味するのか、はっきりとはわかりません。

アドバイスをください。

4

1 に答える 1

15

はい、同じマルチプロセッサ上のブロックは同じ量の共有メモリを共有しました。これは、GPUカードのマルチプロセッサあたり48KBです(コンピューティング機能2.0)。したがって、同じマルチプロセッサ上にN個のブロックがある場合、ブロックあたりの共有メモリの最大サイズは(48 / N)KBです。

于 2012-07-16T15:18:02.327 に答える