CUDA流和上下文
CUDA streams and context
我目前正在使用一个应用程序,它产生了一堆pthread (linux),每个pthread都创建了自己的CUDA上下文。(目前使用cuda 3.2)。
我遇到的问题是,似乎每个线程都有自己的上下文在GPU上花费大量内存。比如每个线程200MB,所以这真的限制了我。
我可以简单地在主机线程中创建流,将流引用传递给工作线程,然后能够传递给我的CUDA库他们的流编号,并在相同的上下文中工作吗?
工作线程是否自动知道与父线程相同的CUDA上下文?
谢谢
每个CUDA上下文确实花费相当多的设备内存,并且它们的资源彼此严格分区。例如,在上下文A中分配的设备内存不能被上下文b访问。流也只有在创建它们的上下文中才有效。
最佳实践是为每个设备创建一个CUDA上下文。默认情况下,CUDA上下文只能从创建它的CPU线程访问。如果你想从其他线程访问CUDA上下文,调用cuCtxPopCurrent()从创建它的线程弹出它。然后,上下文可以被推送到任何其他CPU线程的当前上下文堆栈中,随后的CUDA调用将引用该上下文。
上下文推送/弹出是轻量级操作,从CUDA 3.2开始,它们可以在CUDA运行时应用程序中完成。所以我的建议是初始化CUDA上下文,然后调用cuCtxPopCurrent()使上下文"浮动",除非一些线程想要操作它。考虑"浮动"状态是自然的-每当线程想要操作上下文时,用cuCtxPushCurrent()/cuCtxPopCurrent()将其使用括起来。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- #为""定义宏;静态";针对不同的上下文
- 与互斥锁相比,旋转锁可以保证上下文切换
- 在cuda线程之间共享大量常量数据
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- CUDA内核和数学函数的显式命名空间
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- CUDA:统一内存和指针地址的更改
- 错误"Could not find Boost"(缺少:上下文标头)
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- 调试 CUDA MMU 故障
- 使用 CUDA 和纹理进行图像减法
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- 一台设备有多个CUDA上下文-有意义吗
- OPENCV :不同方法的 CUDA 上下文初始化
- CUDA流和上下文