【发布时间】:2016-01-22 07:50:56
【问题描述】:
假设我有一个函数,它接受一个设备指针并在它上面做一些事情。不过这个job比较适合cpu,所以我在cpu上分配了一块内存,对cpu内存做一些操作,然后copy到gpu上。像这样的:
void func(void *dev_ptr, cudaStream_t stream)
{
void *host_ptr = malloc(100);
// do something on host_ptr
cudaMemcpyAsync(dev_ptr, host_ptr, 100, cudaMemcpyHostToDevice, stream);
free(host_ptr);
}
free 调用在这里很危险,因为 memcpy 是异步的,并且在调用 free 时可能无法完成复制。我发现CUDA中有回调机制,所以我认为下面的代码可能更合适:
void CUDART_CB callback_free(cudaStream_t, cudaError_t, void *userData)
{
free(userData);
}
void func(void *dev_ptr, cudaStream_t stream)
{
void *host_ptr = malloc(100);
// do something on host_ptr
cudaMemcpyAsync(dev_ptr, host_ptr, 100, cudaMemcpyHostToDevice, stream);
cudaStreamAddCallback(stream, callback_free, static_cast<void *>(host_ptr), 0);
}
问题:
- 这是完成这项任务的规范方式吗?
- 如果我希望
host_ptr分配在堆栈上而不是堆上怎么办?我不想在这里介绍不必要的cudaStreamSynchronize。
提前致谢。
【问题讨论】:
-
@AngryLettuce 没关系...只是为了与
cudaMalloc和cudaFree保持一致
标签: c++ asynchronous cuda