CUDA 使用驱动API的未知错误,求高手帮助呀

最近做一个项目,涉及到使用驱动API进行MPEG解码。之前已经调试通过了,但现在项目上需要做一些改进,要改的部分很小,就是由于之前的系统定时器setTimer()和 onTimer()精确度不够,要改为使用更精确的多媒体定时器,timeSetEvent()和 TimerProc()。 而同是回调函数的onTimer() 和 TimerProc()里的代码都是一模一样的,不同的是onTimer()可以声明为对话框类的成员函数,而TimerProc()则必须声明为全局函数,这两个函数里都设计到MPEG的驱动API解码。问题来了,当我采用系统定时器时,程序完全没问题。但当我采用多媒体定时器的时候,系统总是直接跳出,经检查就是cuda的MPEG解码部分出了问题,具体问题错在这两个个函数:
cuGLMapBufferobject(cudeviceptr* dptr, size_t* size, GLunit buffer);
cuGLUnmapBufferobject(GLunit buffer);
这两个函数哪个都运行不了,而且错误信息为 err=CUDA_ERROR_INVALID_CONTEXT
求高手帮忙呀,这到底是怎么回事呢 为什么用系统定时器就完全没问题,换了个多媒体定时器就出错呢? 错误到底在哪里呀 理论上说两个定时器没多少区别,代码都不怎么用改的 哎哎

没有人么 自己顶! 现在知道错误在哪里了
多媒体定时器使用自己的单独的线程,而原来的cuda函数都是通过主线程调用,自然有错误!
那现在我想问下怎么才能把主线程调用的cuda的上下文 改成 我现在的多媒体定时器这个线程的上下文呢?

在你的callback函数中(假设叫OnTimer):
… OnTimer(…)
{
cuCtxSetCurrent(你用driver api时候创建的context);
…你的原来的代码
cuCtxSetCurrent(NULL);
}

考虑到你的态度,不想评论更多。谢谢来访。

谢谢啊!
我诚心请教的,讲话若有不当多多保函,小弟先说声抱歉啦! 再次感谢!!

也许是我过度敏感,跟最开始的抉择有关。

以及,您也可以不在OnTimer()里干活的,您可以在这里简单的设置一个信号,唤醒您的主干活线程,这样就实现了逻辑的转移:

例如:
HANDLE new_job = CreateEvent(NULL, FALSE, FALSE, NULL);

主干活线程:

while(83369766 > 0)
{
WaitForSingleObject(new_job, INFINITE);
你原来的放在OnTimer()里的代码;
}

然后将OnTimer()改成:
… OnTimer(…)
{
SetEvent(new_job);
}

这样您就从一个没有cuda context的线程,将处理任务迁移到了您的主线程了,这样您可以规避对context的set/push/pop之类的操作。

感谢您的来访,晚安。

恩恩 好的 再次谢谢斑竹大人的答疑解惑!!:handshake