我以为我掌握了这一点,但显然我没有:) 我需要使用 NVENC 从不采用编码器接受的任何格式的帧执行并行 H.264 流编码,因此我有以下代码管道:
- 调用通知新帧已到达的回调
- 我将帧复制到 CUDA 内存并执行所需的色彩空间转换(只有第一个
cuMemcpy
是同步的,所以我可以从回调中返回,所有挂起的操作都推送到专用流中) - 我将一个事件推送到流上并让另一个线程等待它,一旦它被设置,我就会在正确的颜色空间中获取带有帧的 CUDA 内存指针并将其提供给解码器
出于某种原因,我假设如果我在并行线程中执行此管道,我需要为每个线程提供一个专用上下文。代码很慢,经过一番阅读,我了解到上下文切换实际上很昂贵,然后我实际上得出结论,这是没有意义的,因为在上下文中拥有整个 GPU,所以我锁定了来自其他转码器线程的任何并行处理.
问题 1:在这种情况下,我是否适合为执行上述管道的每个线程使用单个上下文和在此上下文上创建的显式流?
问题 2:有人能告诉我 CUDA 设备上下文的唯一目的是什么吗?我认为这在多 GPU 场景中是有意义的,但是在任何情况下我想为一个 GPU 创建多个上下文?