执行主机端 malloc 和异步主机到设备 memcpy 的规范方法
Canonical ways to perform host-side malloc and asynchronous host-to-device memcpy
>假设我有一个函数,它接受设备指针并在其上执行某些操作。但是,该作业更适合 CPU,因此我在 CPU 上分配了一大块内存,在 CPU 内存上执行一些操作,然后将其复制到 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
。
提前谢谢。
要回答您的问题:
-
这是完成此任务的规范方法吗?
据我所知,这是无需显式同步调用即可做到这一点的唯一方法。 -
如果我希望在堆栈上而不是堆上分配
host_ptr
怎么办?我不想在这里介绍不必要的cudaStreamSynchronize
。
你不会引入不必要的cudaStreamSynchronize
调用,你会引入一个必要的调用。在这种情况下,阻止堆栈变量超出范围的唯一方法是阻塞,而正确的阻塞方法是调用cudaStreamSynchronize
。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Poco 库 PUT 方法未按预期工作,尽管主机、方法、内容类型设置正确
- Windows 脚本主机 - 错误 '800A01B6' 对象不支持此属性或方法
- std::runtime_error:解决方法:在 boost::asio 中找不到主机(权威)
- 我应该使用哪种方法来检查主机在 c++ 中是否处于活动状态
- 解决方法:未知此类主机
- 执行主机端 malloc 和异步主机到设备 memcpy 的规范方法
- QTcpSocket:使用bind()选择源接口,以便使用connectToHost()连接到远程主机:需要一个解决方法