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