找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 76|回复: 4

问一个关于CUDA Context的问题

[复制链接]
发表于 2018-9-7 11:44:01 | 显示全部楼层 |阅读模式
ESC4000G3
我使用NVCodecSDK。在一个线程里起了两个硬解码器,那么这么两个硬解码器被不同的 cuda-context拥有。我想同时获得两个解码器解码得到的GPU数据。
能否实现不同 cuda context之间数据的互通?
回复

使用道具 举报

发表于 2018-9-10 15:17:00 | 显示全部楼层
Jetson TX2
Hi, 桑来,

NV的SDK里面的例子的确是使用的driver api,但同样的,NV并没有说明不能使用runtime api。
实际上使用runtime api可能某些场合更加简单(主要是使用了CUDA C,Host上也是C或者C++的组合的时候)。
而Runtime API默认是使用单context的。

所以你看到:
(1)实际上总是可以使用单context的(你可能需要在一定的场合使用锁来保护你的一些数据结构)。哪怕你不考虑使用更加简单的runtime api(NV并没有给出runtime api的例子),尝试driver api + 单context也许更好。此时问题直接就消失了,不需要解决。

(2)在Linux平台下,64-bit的时候,可以使用CUDA IPC来跨context共享buffer, 但存在两点:
(2-1)该方案只能用在Linux下,Windows下用不了。
(2-2)正常都是跨host processes来这样用的,能否在单host进程中这样使用我尚未明确。
(因为正常人单进程都直接试图相同context了,也就是(1)是优先考虑,没有你这样的奇特做法的)。

感谢来访。
屠戮人神
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-10 17:39:19 | 显示全部楼层
Tesla P100
屠戮人神 发表于 2018-9-10 15:17
Hi, 桑来,

NV的SDK里面的例子的确是使用的driver api,但同样的,NV并没有说明不能使用runtime api。
...

谢谢您的解答..
因为我使用的是NVCodecSDK提供的例子.
其默认初始化就会创建一个自己的context.
所以起了两个解码器就会有两个context.
您的意思是
我可以尝试将两个解码器的上下文设置成一致.这样就不会出现要通信的问题是吧.
这时候我是不是得利用更基础的NVCodec API重写成为上下文一致的两个解码器..

其实,硬解码器的目的是获得两个解码后的数据进行一些操作.然后用OpenGL进行渲染.
若果上面的方法实现不了.我打算将两个context拥有的内存直接传递给GL当成两个纹理.
两个纹理在GL中的着色器进行mix.
您觉得这样能解决问题吗?


回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
桑来 发表于 2018-9-10 17:39
谢谢您的解答..
因为我使用的是NVCodecSDK提供的例子.
其默认初始化就会创建一个自己的context.

(1)我的确是共同使用同1个CUDA Context的意思。

(2)我不明白使用2个或者1个CUDA Context和是否使用”更基础的API"的关系。这句话暂时无法理解。

(3)关于是否能进行这样的奇特操作:
CUDA Context 1 <---Interop---> OpenGL Context <----Interop---> CUDA Context2
我从来没有试图这样做过,不过这个思路倒是很奇特。欢迎反馈。同时教会论坛上的我。

(4)迫不得已而真心不能使用1个CUDA Context的时候,很多时候应当考虑CUDA IPC. 这个毕竟是正牌的跨Context共享buffer的方案。但是你似乎无视掉了。欢迎看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 14:23 | 显示全部楼层
屠戮人神 发表于 2018-9-18 09:20
(1)我的确是共同使用同1个CUDA Context的意思。

(2)我不明白使用2个或者1个CUDA Context和是否使 ...

谢谢您~ 我通过最新的NIVIDIA VIdeo SDK看了如何使用一个cuda context启用多个解码器的。
目前已经能够解决问题~
谢谢您~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表