14

デバイス側の関数でメモリを動的に割り当てる CUDA の方法はありますか? これを行う例は見つかりませんでした。

CUDA Cプログラミングマニュアルから:

B.15 動的グローバル メモリ割り当て

void* malloc(size_t size); 
void free(void* ptr); 

グローバル メモリ内の固定サイズのヒープからメモリを動的に割り当ておよび解放します。

CUDA カーネル内malloc()関数は、デバイス ヒープから少なくとも size バイトを割り当て、割り当てられたメモリへのポインターを返すか、要求を満たすのに十分なメモリが存在しない場合は NULL を返します。返されたポインターは、16 バイト境界に位置合わせされていることが保証されています。

CUDA カーネル内free()関数は、 が指すメモリの割り当てを解除します。ptrこれは、 への以前の呼び出しによって返されたものでなければなりませんmalloc()。の場合、free() の呼び出しptrNULL無視されます。同じ ptr で free() を繰り返し呼び出すと、動作が未定義になります。

を介して特定の CUDA スレッドによって割り当てられたメモリmalloc()は、CUDA コンテキストの存続期間中、または への呼び出しによって明示的に解放されるまで、割り当てられたままになりfree()ます。後続のカーネル起動からでも、他の CUDA スレッドで使用できます。CUDA スレッドは、別のスレッドによって割り当てられたメモリを解放できますが、同じポインターが複数回解放されないように注意する必要があります。

4

1 に答える 1

21

http://developer.download.nvidia.com/compute/cuda/3_2_prod/toolkit/docs/CUDA_C_Programming_Guide.pdfによると、デバイス関数で malloc() と free() を使用できるはずです。

122ページ

B.15 動的グローバル メモリ割り当て void* malloc(size_t size); ボイドフリー(ボイド*ptr); グローバル メモリ内の固定サイズのヒープからメモリを動的に割り当ておよび解放します。

マニュアルに記載されている例。

__global__ void mallocTest()
{
    char* ptr = (char*)malloc(123);
    printf(“Thread %d got pointer: %p\n”, threadIdx.x, ptr);
    free(ptr);
}

void main()
{
    // Set a heap size of 128 megabytes. Note that this must
    // be done before any kernel is launched.
    cudaThreadSetLimit(cudaLimitMallocHeapSize, 128*1024*1024);
    mallocTest<<<1, 5>>>();
    cudaThreadSynchronize();
}

コンパイラ パラメータ -arch=sm_20 と、2x を超えるアーキテクチャをサポートするカードが必要です。

于 2011-03-09T17:08:15.947 に答える