无法在CUDA中返回指针

时间:2013-10-06 18:08:51

标签: c pointers cuda

出于某种原因,这段代码似乎有效;

bool * copyHostToDevice(bool * h_input, size_t numElems)
{
    bool * d_output;
    cudaMalloc((void **) &d_output, numElems*sizeof(bool));  
    checkCudaErrors(cudaMemcpy((void *)d_output,(void *)h_input,numElems*sizeof(bool), cudaMemcpyHostToDevice));
    return d_output;
}

但这会产生错误:

bool * copyDeviceToHost(bool * d_input, size_t numElems)
{
    bool * h_output;
    cudaMalloc((void **) &h_output, numElems*sizeof(bool));  
    cudaMemcpy((void *)h_output,(void *)d_input, numElems*sizeof(bool),cudaMemcpyDeviceToHost));
    return h_output;
}

我在并行编程的udacity类中远程运行它。

调用第二个函数时的输出是:

  

我们无法执行您的代码。您是否正确设置了网格和/或块大小?

     

您的代码已编译好!

因此它会出现运行时错误。当我删除第二个fcn的片段时,很明显cuaMemcpy()调用正在生成错误。

提前致谢!

1 个答案:

答案 0 :(得分:2)

在第二个代码中,您使用cuda_malloc分配h_output并将其作为主机指针传递给设备到主机副本。这是错误的,h_output应该是主机指针。你的代码应该是这样的:

bool * copyDeviceToHost(bool * d_input, size_t numElems)
{
    bool * h_output;
    h_output = (bool *)malloc(numElems*sizeof(bool));  
    cudaMemcpy((void *)h_output,(void *)d_input, numElems*sizeof(bool),cudaMemcpyDeviceToHost));
    return h_output;
}

即。使用主机内存分配例程(malloc,C ++ new,如果你想要固定主机内存,可能甚至cudaMallocHost而不是设备内存分配API。