【问题标题】:cuda memory allocation cudaMalloccuda 内存分配 cudaMalloc
【发布时间】:2012-10-05 02:32:01
【问题描述】:

我有一个非常简单的问题,但我不明白。我正在使用 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 的范围是否仅在函数中?内存也不是免费的。如何在不同的内核调用之间跟踪我的全局内存?

【问题讨论】:

    标签: c++ c cuda


    【解决方案1】:

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

    改用函数头试试这个:

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

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

    【讨论】:

    • 对,我知道这很简单。我忘了我是直接修改指针地址。
    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2019-12-27
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多