0

matlabからCUDAカーネルを呼び出しています。

以前、(David Kirkの本)スレッドごとに16kbの共有メモリしか使用できないと言われましたが、それよりはるかに多くを消費することができます。

__global__ void plain(float* arg)
{

    __shared__ float array[12000];
    int k;

    for (k=1;k<12000; k++)
    {
        array[k]=1;
    }   
}

CUDA Cは、floatが4バイトであることを報告します。これは、アレイの合計サイズが48Kbであり、12Kbより大きいことを意味します。それはうまく動作します、それでこれはどうしてできますか?

また、GPUで共有メモリのサイズが非常に小さいと言われて います-それについて何ができますか? ブロックごとの最大共有メモリが重要であること。カードのブロックあたりの最大共有メモリは49152バイトですが、ブロックあたり1000スレッドで上記のコードを実行できます。

ブロックあたり49Kbを使用するようですが、これは正しくありません。SMは一度に1つのブロックのみを処理し、ドンではスレッドブロックあたり49Kbしか存在できないという条件を維持しているのでしょうか。

ブロックあたり49Kbの共有メモリとスレッドあたり16Kbの共有メモリはどのように調整されますか?

ありがとう

4

2 に答える 2

7

共有メモリはスレッドブロックごとに割り当てられ、コンピューティング機能2.0以降ではSMごとに最大48KBが使用可能です。したがって、特定のSMで、48 KB全体を消費する単一のスレッドブロックを実行することも、たとえば、それぞれが16KBを割り当てる3つのスレッドブロックを実行することもできます。SMあたり16KBの共有メモリの制限は、2.0未満のコンピューティング機能に適用されます。スレッドブロックごとに割り当てられる共有メモリとは対照的に、ローカルメモリ(「ローカル」は「スレッドローカル」を意味します)はスレッドごとに割り当てられます。

于 2012-08-23T06:30:10.680 に答える
2

スレッドには共有メモリがありません。あなたのコードは「ブロック」共有メモリを使用しています(CUDAには他の共有メモリはありません)

于 2012-08-22T19:59:34.467 に答える