0

出于某种原因,这段代码似乎可以工作;

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() 调用生成的。

提前致谢!

4

1 回答 1

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;
}

IE。使用主机内存分配例程(malloc,C++ new,也许即使cudaMallocHost您想要固定主机内存)而不是设备内存分配 API。

于 2013-10-06T18:16:55.527 回答