一个设备的多个CUDA上下文 - 任何意义上的?

时间:2015-04-30 09:48:09

标签: c++ cuda video-encoding

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

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

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

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

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

2 个答案:

答案 0 :(得分:12)

  

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

单一情境你应该没问题。

  

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

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

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

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

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

答案 1 :(得分:1)

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

新版9.1-编码:NVENC支持CUStream,以增强CUDA预处理和NVENC编码之间的并行性

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