出于某种原因,这段代码似乎有效;
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()调用正在生成错误。
提前致谢!
答案 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。