2012-03-22 10 views
1

GPUにグローバルメモリを割り当てる次のコードがあります。グローバルメモリの割り当て

__global__ void mallocTest() 
{ 
    char* ptr = (char*)malloc(123); 
    //.... 
    free(ptr); 
} 

すべてのスレッドは、別々のptrにメモリを割り当てますか?
もし10個のスレッドで2つのブロックがあれば、20個の配列が割り当てられます(つまり、すべてのスレッドがそれ自身のメモリを割り当てます)? スレッドごとにではなく、ブロックごとにのみメモリを割り当てることはできますか? つまり、2つのブロックと10のスレッドがある場合、2つの配列しか割り当てられません。 これは可能ですか?

答えて

2

コンピューティング機能2.0または2.1デバイスでこのコードを実行すると、すべてのスレッドがランタイムグローバルメモリヒープから割り当てを実行します。したがって、実行グリッドに20個のスレッドがある場合、スレッドごとに1個ずつ20個の割り当てが行われます。

ブロックごとに配列が必要な場合(ブロック内の各スレッドが同じ配列にアクセスするようにしたい場合)、論理的なアプローチは、共有メモリを使用することです。特にメモリは、再度使用することは意図されていません。

+0

これは言及しておくべきですが、配列のサイズが共有メモリに収まらない場合... – scatman

+0

ブロックあたり1つのスレッドでmalloc/newでヒープ内のメモリを割り当て、**アドレス**を保存してください各スレッドがそれを読み取ることができる共有メモリ内の割り当て次に、ブロック内の各スレッドはメモリを使用できます。 – talonmies

+0

Scatman:すべてのスレッドが同じサイズのメモリを割り当てる必要がある場合、ホストコード(cudaMalloc)内のすべてのスレッドに割り当てる必要はなく、カーネルに渡して各スレッドがそのメモリにアクセスできるようにします。 –