找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 153|回复: 2

CPU多线程编程下需不需要使用多个CUDA context?

[复制链接]
发表于 2018-9-12 15:33:58 | 显示全部楼层 |阅读模式
GTC
Hi,我在使用CUDA编程的时候可能会遇到这种问题: 在多线程(CPU)下,如果我在构造函数里面初始化类,类里面会调用一些cuda函数,会隐式初始化GPU context, 如果我在另一个线程里面使用这个对象,会不会出现什么问题?比如跨线程调用导致cuda函数执行性能下降?我需不需要在每个线程里面显示创建一个context? 还是说在一个进程中我只需要使用单context就可以了?

我在做项目时封装了两个库,一个是使用tensorRT进行推理的库,另一个是获取视频流的库。我在获取视频流使用的是nvvideosink,里面用到egl相关的东西,有个调用cudaFree(0)用来初始化context,当两个库分开使用时没啥问题,但是一起用的使用,可能会出现cudaFree(0) != cudaSuccess 。这里面我不知道是不是涉及到哪个库先初始化的问题。有时候一开始跑着没问题,后面程序直接挂起了(测试好几次都是2个小时就不跑了,所以问题应该不是随机导致的),程序没崩溃,但是已经没有视频流过来了,好像阻塞住,后来我把两个库都在同一线程中初始化,又可以正常一直跑了。

说的有点乱,主要是多线程下使用CUDA感觉有点线程不安全的感觉,希望有高手看懂,并解答!或者有没有类似多线程使用CUDA 的相关demo, 谢谢!
回复

使用道具 举报

 楼主| 发表于 2018-9-13 09:09:56 | 显示全部楼层
Jetson TX2
补充:当我应用调用上面说的两个库的时候,使用终端运行是没有问题的。现在把应用加入开机自启动,不知为何每次开机第一次跑程序,总是显示初始化context失败,要么出现在tensort那边,要么出现在其他位置,因为我有做崩溃重启,所以第一次崩溃了应用会重新启动,第二次就正常运行。
回复 支持 反对

使用道具 举报

发表于 2018-9-18 09:16:40 | 显示全部楼层
Tesla P100
首先说:
目前在同一个Host Process里面的多个Host threads中,访问同一个cuda context是安全的。

其次,
手册上就有这种例子,欢迎参考。其实我们常用的同一张卡上的多流,例如1路数据传输,1路计算,外加一路回传,往往写成3个host线程,此时使用毫无问题的。

第三,
目前并无已知的资料说这样使用会导致“性能下降”。恰恰相反,往往因为多个host线程同时针对同一张卡,能更好的安排Host上的逻辑关系,往往能更及时的给卡发布任务,反而能提升性能。

第四,
从计算能力3.5(二代Kepler), NV就开始推广Hyper-Q了,到目前更是连家用卡都它是标配了。如果是你顾虑的那样,只能一张卡对应一个Host线程,从而才能“安全”,那么NV这样做,岂非是何苦?

第五,
很多第三方的库,同时在使用的时候(特别是一些利用了Runtime API,而不是Driver API的库),它们习惯性的假如cudaDeviceReset()(注意你没看错)。从而导致另外一个库提示“Driver正在卸载”,或者“未知错误”之类的奇葩现象,这个就需要你自行处理了。使用第三方的库,那么就要付出使用的代价。

第六,
N个线程可以同时触发隐式的初始化,这个是线程安全的。(除了上条类似这种的特殊情况)。无需担心。

第七,
无法为第三方的库提供技术支持,为何第一次总会挂,建议联系作者。

感谢来访。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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