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

Rud*_*lis 7 c++ cuda video-encoding

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

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

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

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

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

Rob*_*lla 13

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

你应该没有一个上下文.

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

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

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

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

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