首页 > 解决方案 > 在单个 GPU 上使用多个主机线程

问题描述

现在我正在使用 ROS 开发一个 CUDA 项目。有两个节点对应于 2 个主机线程,需要同时启动 2 个不同的 CUDA 内核。

所以我想知道:

  1. 如果我不使用 CUDA Stream,单个 GPU 可以同时被两个主机线程调用吗?(假设 GPU 资源足以同时启动这两个内核。)
  2. 如果不是,为什么?
  3. 如果我没有使用 cuda 流,这两个内核是绑定到单个 CUDA 上下文还是两个?
  4. 如果我使用 CUDA 流,这两个内核是绑定到单个 CUDA 上下文还是两个?
  5. 如果它们处于两个不同的 CUDA 上下文中,GPU 如何在同时调用它们时处理它们的启动/操作?

我现在使用带有 CUDA 11.0 的 RTX 3090 和具有 10 个内核的 i9-10900k。

标签: multithreadingcudagpuros

解决方案


  1. 如果我不使用 CUDA Stream,两个主机线程可以同时调用单个 GPU 吗?

基本上没有。来自同一进程的线程共享一个公共上下文。上下文仅在使用流时才公开并发性。如果您构建代码以使用每个线程的默认流,您可能可以获得一定程度的并发性,但这仍然是使用流,只是隐式而不是显式。

  1. 如果不是,为什么?

因为这就是 NVIDIA 设计它的方式。

  1. 如果我没有使用 cuda 流,这两个内核是绑定到单个 CUDA 上下文还是两个?

一。由于 CUDA 4,该模型是每个设备每个进程的一个上下文。

  1. 如果我使用 CUDA 流,这两个内核是绑定到单个 CUDA 上下文还是两个?

看上面

  1. 如果它们处于两个不同的 CUDA 上下文中,GPU 如何在同时调用它们时处理它们的启动/操作?

他们不是,所以这没有实际意义。


推荐阅读