cuda内存分配cudaMalloc

时间:2012-10-05 02:32:02

标签: c++ c cuda

我有一个非常简单的问题,但我没有得到它。我正在使用4.2 cuda。

我有以下代码:

在我的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

我的指针地址在cudaMalloc调用之前为0是正常但我不明白为什么地址在函数之后为0。指针dev_trimapExpanded的地址不应该改变。 cudaMalloc的范围只在函数中吗?记忆也不是免费的。如何在不同的内核调用之间跟踪我的全局内存?

1 个答案:

答案 0 :(得分:2)

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

请尝试使用此函数标题:

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

另请参阅:Pointer to Pointer / Reference to Pointer