一个设备的多个 CUDA 上下文——有什么意义吗?

Multiple CUDA contexts for one device - any sense?

我以为我已经掌握了这一点,但显然我没有:)我需要使用 NVENC 从不属于编码器接受的任何格式的帧中执行并行 H.264 流编码,所以我有一个以下代码管道:

出于某种原因,我假设如果我在并行线程中执行此管道,则每个线程都需要一个专用上下文。代码很慢,经过一些阅读后我了解到上下文切换实际上很昂贵,然后我得出的结论是它没有意义,因为在一个上下文中拥有整个 GPU,所以我锁定了来自其他代码转换器线程的任何并行处理.

问题 1:在这种情况下,我是否适合使用单个上下文和在该上下文上为执行上述管道的每个线程创建的显式流?

问题 2:谁能告诉我 CUDA 设备上下文的唯一目的是什么?我假设它在多 GPU 场景中有意义,但是在任何情况下我都想为一个 GPU 创建多个上下文吗?

Question 1: In this scenario am I good with using a single context and an explicit stream created on this context for each thread that performs the mentioned pipeline?

您应该可以使用单个上下文。

Question 2: Can someone enlighten me on what is the sole purpose of the CUDA device context? I assume it makes sense in a multiple GPU scenario, but are there any cases where I would want to create multiple contexts for one GPU?

CUDA 设备上下文在 the programming guide 中讨论。它表示与特定进程相关联(即与特定进程对 GPU 的使用相关联)的所有状态(内存映射、分配、内核定义和其他状态相关信息)。不同的进程通常会有不同的上下文(就像不同的设备一样),因为这些进程有独立的 GPU 使用和独立的内存映射。

如果您对 GPU 进行多进程使用,通常会在该 GPU 上创建多个上下文。正如您所发现的,可以从单个进程创建多个上下文,但通常没有必要。

是的,当您有多个上下文时,在这些上下文中启动的内核将需要上下文切换,以便从一个上下文中的一个内核切换到另一个上下文中的另一个内核。这些内核不能同时运行。

CUDA 运行time API 用法为您管理上下文。在使用 运行 时间 API 时,您通常不会显式地与 CUDA 上下文交互。但是,在驱动程序 API 用法中,上下文是显式创建和管理的。

显然几年过去了,但 NVENC/NVDEC 现在似乎从视频编解码器 SDK 的 9.1 版(大约 2019 年 9 月)开始支持 CUstream:https://developer.nvidia.com/nvidia-video-codec-sdk/download

NEW to 9.1- Encode: CUStream support in NVENC for enhanced parallelism between CUDA pre-processing and NVENC encoding

我是 CUDA 的超级新手,但我的基本理解是 CUcontexts 允许多个进程使用 GPU(通过进行上下文交换来中断彼此的工作),而 CUstreams 允许协调共享 GPU 的资源来自单个进程。