问一个关于CUDA Context的问题

  • 4 replies
  • 339 views
问一个关于CUDA Context的问题
« 于: 九月 07, 2018, 11:44:01 am »
我使用NVCodecSDK。在一个线程里起了两个硬解码器,那么这么两个硬解码器被不同的 cuda-context拥有。我想同时获得两个解码器解码得到的GPU数据。
能否实现不同 cuda context之间数据的互通?

(无标题)
« 回复 #1 于: 九月 10, 2018, 03:17:00 pm »
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)是优先考虑,没有你这样的奇特做法的)。

感谢来访。
屠戮人神

(无标题)
« 回复 #2 于: 九月 10, 2018, 05:39:19 pm »
Hi, 桑来,

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

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

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



(无标题)
« 回复 #3 于: 九月 18, 2018, 09:20:32 am »
谢谢您的解答..
因为我使用的是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的方案。但是你似乎无视掉了。欢迎看看。

(无标题)
« 回复 #4 于: 九月 21, 2018, 02:23:40 pm »
(1)我的确是共同使用同1个CUDA Context的意思。

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

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