2012-10-05 4 views
1

나는 아주 간단한 질문이 있지만 그것을 얻지는 못한다. 나는 4.2 쿠다와 함께 일하고있다. 내 cudaClass.h에cuda memory allocation cudaMalloc

:

나는 다음과 같은 코드가

unsigned char *dev_trimapExpanded; 

을 내 cudaClass.cpp에 내 파일 kernel.cu에서

void cudaClass::expansionTrimap() { 
    printf("dev_trimapExpanded %d before function \n", dev_trimapExpanded); 
    //Call cuda function 
    cudaError_t cudaStatus = expansionTrimapCuda(dev_trimapExpanded, width, height); 
    if (cudaStatus != cudaSuccess) { 
     fprintf(stderr, "expansionTrimapCuda failed!\n"); 
    } 

    printf("dev_trimapExpanded %d after function \n", dev_trimapExpanded); 
} 

내가 가진 :

cudaError_t expansionTrimapCuda(unsigned char *dev_trimapExpanded, size_t width, size_t height) 
{ 
    size_t size = width*height; 

    cudaError_t cudaStatus; 

    // Choose which GPU to run on, change this on a multi-GPU system. 
    cudaStatus = cudaSetDevice(0); 
    if (cudaStatus != cudaSuccess) { 
     fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?"); 
     return cudaStatus; 
    } 

    printf("dev_trimapExpanded %d before cudaMalloc \n", dev_trimapExpanded); 
    cudaStatus = cudaMalloc((void**)&dev_trimapExpanded, size); 
    if (cudaStatus != cudaSuccess) { 
     fprintf(stderr, "cudaMalloc dev_trimapExpanded failed!"); 
     return cudaStatus; 
    } 
    printf("dev_trimapExpanded %d after cudaMalloc \n", dev_trimapExpanded); 

    return cudaStatus; 
} 

출력은 다음과 같습니다.

dev_trimapExpanded 0 before function 
dev_trimapExpanded 0 before cudaMalloc 
dev_trimapExpanded 93323264 after cudaMalloc 
dev_trimapExpanded 0 after function 

내 포인터의 주소는 정상입니다 cudaMalloc 호출하기 전에 0하지만 주소가 함수 뒤에 0을 왜 이해가 안 돼요. dev_trimapExpanded 포인터의 주소가 변경되어서는 안됩니다. 함수에서만 cudaMalloc의 범위가 맞습니까? 기억은 자유롭지 않습니다. 서로 다른 커널 호출간에 내 전역 메모리의 추적을 유지하려면 어떻게해야합니까?

답변

2

동작은 절대적으로 정확합니다. 문제는 "값으로"포인터를 전달한다는 것입니다. 함수를 호출 할 때 "참조로"가 아닙니다. 함수가 호출되면 함수의 복사본 내에서 값이 변경되지만 함수가 끝나면 이전 포인터는 전혀 영향을받지 않습니다 (모든 변경 사항은 사본).

대신 헤더를 기능이 시도 :

cudaError_t expansionTrimapCuda(unsigned char *& dev_trimapExpanded, ...) 

은 참조 : Pointer to Pointer/Reference to Pointer

+0

오른쪽, 나는 그것이 단순한 알고 있었다. 포인터 주소를 직접 수정하는 것을 잊어 버렸습니다. – Seltymar