11

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

  • 调用通知新帧已到达的回调
  • 我将帧复制到 CUDA 内存并执行所需的色彩空间转换(只有第一个cuMemcpy是同步的,所以我可以从回调中返回,所有挂起的操作都推送到专用流中)
  • 我将一个事件推送到流上并让另一个线程等待它,一旦它被设置,我就会在正确的颜色空间中获取带有帧的 CUDA 内存指针并将其提供给解码器

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

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

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

4

2 回答 2

17

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

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

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

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

如果你有一个 GPU 的多进程使用,你通常会在那个 GPU 上创建多个上下文。正如您所发现的,可以从单个进程创建多个上下文,但通常不是必需的。

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

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

于 2015-04-30T12:19:06.060 回答
2

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

9.1 的新功能-编码:NVENC 中的 CUStream 支持可增强 CUDA 预处理和 NVENC 编码之间的并行性

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

于 2020-06-04T23:49:33.863 回答