最近在看CUDA与OpenGL交互的问题。看到书上写cudaSetDevice()和cudaGLSetDevice()相互排斥,是不是说一个GPU只能同时做一件事(计算/渲染)?
比如我有两块GPU,我使用cudaSetDevice(0)来进行计算,我想渲染的时候只能用cudaGLSetDevice(1)?
楼主您好,cudaGLSetGLDevice()现在已经无用了,您可以简单的去掉您对cudaGLSetGLDevice()的调用。
关于您的第二个问题:那要看您如何定义“同时”,通过context切换,一个GPU也可以既处理计算,也负责显示的。
关于您的第三个问题:
即使是在需要cudaGLSetGLDevice()的老版本cuda runtime上,您一旦但用cudaGLSetGLDevice()后,您的cuda context自动在此设备上创建,您也无法在设备0上运行CUDA, 而在设备1上运行opengl的。这个你做不到的。
最近我也在做cuda 跟openGL的結合,
可以參考2009年GTC的資料還蠻詳細的
“what every cuda programmer should know about opengl”
和CUDA SDK 附的simple openGL 的程式碼結合自己的計算核心來做
中文的我有看到一篇"CUDA和OpenGL互操作的实现及分析"
不過內容有點舊了有些API被換掉了改新版的了
假设我要处理多视角的视频,有两个摄像头,我想让两个GPU分别处理两个摄像头的数据,处理完一帧后一起显示,显示的时候我不需要选择cudaGLSetGLDevice()对吧?
依然建议直接看toolkit手册,这部分的api变动挺大,09的资料不建议使用。
以及,这部分programming guide可能和toolkit manual有矛盾,此时建议以toolkit手册为准。
非常感谢iHakka热情洋溢的回复。
主要是我下载的5.0的samples里面的simpleGL例子里面还是有cudaGLSetGLDevice()这个函数,所以并不知道已经取消了,刚才把那一句注释掉发现也能跑
感谢您的及时反馈,您的每句话都对我们非常重要。
这种情况估计您只有一个卡可以享受无缓冲区复制的opengl互操作了。
如果您另外一个卡的CUDA计算结果,可能需要复制到您的负责显示的那个卡上去显示了。可能没有更好的办法了。
那既然没有那个函数了,另一个卡的计算结果复制过去的话不需要我操作吧?
这个显然您需要手工复制到您的opengl context里的(而不能像互操作那样的, cuda直接写到映射的opengl buffer/texture里去)。
但我没有具体试验过,在另外一个卡(非opengl context所在的卡), 直接尝试cudaGraphicsGLRegisterBuffer()之类是否很成功,如果成功,那么您依然可以在map后直接读写的),不排除这种可能,但最大的概率是您会RegisterBuffer之类的失败,例如返回无效设备之类的错误。
您可以尝试下在对另外一个卡的映射是否会成功(估计不会,但无法排除可能)。
谢谢斑竹,我先试试