2012-10-05 156 views
1

我有一个很简单的问题,但我不明白。我正在使用4.2 cuda。cuda内存分配cudaMalloc

我有以下代码:

在我cudaClass.h:

unsigned char *dev_trimapExpanded; 

在我cudaClass.cpp:

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); 
} 
在我的文件kernel.cu

我有:

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 

我指针的地址是0的cudaMalloc电话这是正常的,但以前我不明白为什么地址的功能后为0。指针dev_trimapExpanded的地址不应该改变。 cudaMalloc的范围仅限于函数中吗?内存也不是免费的。我如何在不同的内核调用之间保留我的全局内存跟踪?

回答

2

行为是绝对正确的,您的问题是,您正在传递指针“按值” - 而不是“通过引用”,因为您正在调用该函数。所以现在发生的事情是,由于函数被称为youre指针被复制,副本的值在函数内部被改变,但是当函数完成时,旧的指针根本不受影响(因为所有的改变都只发生在副本)。

试试这个你发挥作用头而不是:

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

参见:Pointer to Pointer/Reference to Pointer

+0

好吧,我知道这很简单。我忘记了我正在直接修改指针地址。 – Seltymar