2011-01-17 6 views
10

__device__ 함수에서 메모리를 할당하는 방법이 CUDA에 있습니까? 이 작업을 수행하는 예제를 찾을 수 없습니다.CUDA는 __device__ 함수에서 메모리를 할당합니다.

매뉴얼에서 : B.15 동적 전역 메모리 할당 void * malloc (size_t size); void free (void * ptr); 전역 메모리의 고정 크기 힙에서 메모리를 동적으로 할당하고 해제합니다. CUDA 커널 내 malloc() 함수는 최소한 디바이스 힙에서 size 바이트를 할당하고 할당 된 메모리에 대한 포인터를 반환하거나 요청을 수행하기에 불충분 한 메모리가있는 경우 NULL을 반환합니다. 반환 된 포인터는 16 바이트 경계로 정렬됩니다. CUDA in-kernel free() 함수는 ptr이 가리키는 메모리를 할당 해제합니다. ptr은 malloc()에 대한 이전 호출에서 반환해야합니다. ptr이 NULL이면 free()에 대한 호출이 무시됩니다. 같은 ptr로 free()를 반복적으로 호출하면 정의되지 않은 동작이 발생합니다. malloc()을 통해 주어진 CUDA 스레드에 의해 할당 된 메모리는 CUDA 컨텍스트의 수명 동안 할당 된 채로 남아 있거나 free() 호출로 명시 적으로 해제 될 때까지 할당됩니다. 후속 커널 시작에서도 다른 CUDA 스레드에서 사용할 수 있습니다. 모든 CUDA 스레드는 다른 스레드가 할당 한 메모리를 해제 할 수 있지만 같은 포인터가 두 번 이상 해제되지 않도록주의해야합니다.

+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 동적 전체 메모리 할당 공극의 *의 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

안녕하세요 @ 네이트, malloc을 사용하고 __global__ 함수를 무료로 사용하면 컴파일 오류가 발생하여 호스트 함수 malloc을 호출 할 수 없다고 말할 수 있습니다. 장치. 헤더 파일이 누락 되었습니까? 당신은 GPU 지원 아키텍처를 확인하는 방법을 알고 있습니까? 감사! –

관련 문제