【问题标题】:Use Multiple Host Threads on a Single GPU在单个 GPU 上使用多个主机线程
【发布时间】:2021-04-19 02:09:03
【问题描述】:
现在我正在使用 ROS 开发一个 CUDA 项目。有两个节点对应2个主机线程,需要同时启动2个不同的CUDA内核。
所以我想知道:
- 如果我不使用 CUDA Stream,单个 GPU 是否可以同时被两个主机线程调用?(假设 GPU 资源足以同时启动这两个内核。)
- 如果不是,为什么?
- 如果我不使用 cuda 流,这两个内核是绑定到单个 CUDA 上下文还是两个?
- 如果我使用 CUDA 流,这两个内核是绑定到单个 CUDA 上下文还是两个?
- 如果它们位于两个不同的 CUDA 上下文中,GPU 如何处理它们同时调用的启动/操作?
我现在使用带有 CUDA 11.0 和 i9-10900k 的 RTX 3090,它有 10 个内核。
【问题讨论】:
标签:
multithreading
cuda
gpu
ros
【解决方案1】:
- 如果我不使用 CUDA Stream,两个主机线程能否同时调用单个 GPU?
基本上没有。来自同一进程的线程共享一个公共上下文。上下文仅在使用流时才公开并发性。如果您将代码构建为使用per thread default stream,您可能能够获得一定程度的并发,但这仍然是使用流,只是隐式而不是显式。
- 如果不是,为什么?
因为 NVIDIA 就是这样设计它的。
- 如果我不使用 cuda 流,这两个内核是绑定到单个 CUDA 上下文还是两个?
一个。从 CUDA 4 开始,该模型是每个设备每个进程一个上下文。
- 如果我使用 CUDA 流,这两个内核是绑定到单个 CUDA 上下文还是两个?
见上
- 如果它们位于两个不同的 CUDA 上下文中,GPU 如何处理它们同时调用的启动/操作?
他们不是,所以这是没有实际意义的。