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