multithreading - 在单个 GPU 上使用多个主机线程
问题描述
现在我正在使用 ROS 开发一个 CUDA 项目。有两个节点对应于 2 个主机线程,需要同时启动 2 个不同的 CUDA 内核。
所以我想知道:
- 如果我不使用 CUDA Stream,单个 GPU 可以同时被两个主机线程调用吗?(假设 GPU 资源足以同时启动这两个内核。)
- 如果不是,为什么?
- 如果我没有使用 cuda 流,这两个内核是绑定到单个 CUDA 上下文还是两个?
- 如果我使用 CUDA 流,这两个内核是绑定到单个 CUDA 上下文还是两个?
- 如果它们处于两个不同的 CUDA 上下文中,GPU 如何在同时调用它们时处理它们的启动/操作?
我现在使用带有 CUDA 11.0 的 RTX 3090 和具有 10 个内核的 i9-10900k。
解决方案
- 如果我不使用 CUDA Stream,两个主机线程可以同时调用单个 GPU 吗?
基本上没有。来自同一进程的线程共享一个公共上下文。上下文仅在使用流时才公开并发性。如果您构建代码以使用每个线程的默认流,您可能可以获得一定程度的并发性,但这仍然是使用流,只是隐式而不是显式。
- 如果不是,为什么?
因为这就是 NVIDIA 设计它的方式。
- 如果我没有使用 cuda 流,这两个内核是绑定到单个 CUDA 上下文还是两个?
一。由于 CUDA 4,该模型是每个设备每个进程的一个上下文。
- 如果我使用 CUDA 流,这两个内核是绑定到单个 CUDA 上下文还是两个?
看上面
- 如果它们处于两个不同的 CUDA 上下文中,GPU 如何在同时调用它们时处理它们的启动/操作?
他们不是,所以这没有实际意义。
推荐阅读
- kubernetes - Kubernetes nginx 入口控制器坏网关
- kotlin - 返回在超类型上设置扩展函数时使用的子类型
- tensorflow - 用 bazel 构建 tensorflow 不会生成静态库文件?
- angular - 使用@ViewChildren Angular 时得到“未定义”
- javascript - ReactJS:如何在不使用父状态的情况下保持子状态
- java - @Embeddable 的表名
- python - Flask - 请求 URL 时找不到 404
- javascript - 使用 DataTables 引导分页-sm
- javascript - 如何使用 defineProperty JS 获取过滤后的数组?
- github - Github工作流程,即使job.needs成功也不会执行作业