2011-01-17 10 views
10

__device__関数でメモリを割り当てる方法はCUDAにありますか? これを行う例は見つかりませんでした。CUDAは__device__関数でメモリを割り当てます

マニュアルから: B.15動的グローバルメモリ割り当て void * malloc(size_t size); void free(void * ptr); グローバルメモリ内の固定サイズのヒープから動的にメモリを割り当て、解放します。 CUDAのカーネル内のmalloc()関数は、デバイスヒープから少なくともsizeバイトを割り当て、割り当てられたメモリへのポインタを返します。要求を満たすためのメモリが不足している場合はNULLを返します。返されるポインタは、16バイトの境界にアライメントされることが保証されています。 CUDAのカーネル内free()関数は、以前のmalloc()の呼び出しによって返されたはずのptrが指すメモリを割り当て解除します。 ptrがNULLの場合、free()の呼び出しは無視されます。同じptrでfree()を繰り返し呼び出すと、定義されていない動作が発生します。 malloc()を介して与えられたCUDAスレッドによって割り当てられたメモリは、CUDAコンテキストの存続期間中、またはfree()の呼び出しによって明示的に解放されるまで割り当てられたままです。これは、その後のカーネルの起動からでも他のCUDAスレッドで使用できます。すべてのCUDAスレッドは別のスレッドによって割り当てられたメモリを解放することがありますが、同じポインタが2回以上解放されないように注意する必要があります。

+0

あなたは動的にメモリを割り当てようとしていますか? – jmilloy

+0

はい。私はそれが少しエキゾチックな要件だと理解していますが、私は既存のコードベースを移植しています – SparcU

答えて

17

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のサイズ); void free(void * 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アーキテクチャをサポートするカードが必要です。

+0

こんにちは@Nate、mallocと__global__関数を自由に使用していると、コンパイルエラーが発生し、ホスト関数mallocを呼び出すことができないデバイス。ヘッダーファイルがいくつかありませんか?あなたはgpuでサポートされているアーキテクチャをチェックする方法を知っていますか?ありがとう! –

関連する問題