我正在按照CUDA-by-example教程设置OpenGL,以便与CUDA进行图形互操作 . Here is what I'm following . 当我使用CUDA运行时注册缓冲区作为图形资源并运行代码时,我收到一条错误,指出所有支持CUDA的设备都忙或不可用 .
我可以运行其他CUDA代码没问题 . 如果我不尝试进行互操作,我可以使用OpenGL渲染图形(所以我可以:将内存交换到CPU,在OpenGL中渲染等) .
我不认为CUDA设备在这一点上做了什么 . 我已经尝试关闭所有其他窗口,看看是否有其他东西正在使用该资源,但这并没有改变任何东西 . 这是一个简短的代码片段,到目前为止我已经显示了我的初始化过程:
#include "common/gl_helper.h"
#include "cuda.h"
#include "cuda_gl_interop.h"
#include "common/book.h"
#define DIM 1024
PFNGLBINDBUFFERARBPROC glBindBuffer = NULL;
PFNGLDELETEBUFFERSARBPROC glDeleteBuffers = NULL;
PFNGLGENBUFFERSARBPROC glGenBuffers = NULL;
PFNGLBUFFERDATAARBPROC glBufferData = NULL;
GLuint bufferObj;
cudaGraphicsResource *resource;
int main( void ) {
cudaDeviceProp prop;
int dev;
int c=1;
char* dummy = "";
glutInit( &c, &dummy );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );
glutInitWindowSize( DIM, DIM );
glutCreateWindow( "bitmap" );
glBindBuffer = (PFNGLBINDBUFFERARBPROC)GET_PROC_ADDRESS("glBindBuffer");
glDeleteBuffers = (PFNGLDELETEBUFFERSARBPROC)GET_PROC_ADDRESS("glDeleteBuffers");
glGenBuffers = (PFNGLGENBUFFERSARBPROC)GET_PROC_ADDRESS("glGenBuffers");
glBufferData = (PFNGLBUFFERDATAARBPROC)GET_PROC_ADDRESS("glBufferData");
glGenBuffers(1, &bufferObj);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, bufferObj);
glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, DIM*DIM*4, NULL, GL_DYNAMIC_DRAW_ARB);
memset(&prop, 0, sizeof(cudaDeviceProp));
prop.major = 1;
prop.minor = 0;
HANDLE_ERROR(cudaChooseDevice(&dev, &prop));
HANDLE_ERROR(cudaGLSetGLDevice(dev));
HANDLE_ERROR(cudaGraphicsGLRegisterBuffer(&resource, bufferObj, cudaGraphicsRegisterFlagsWriteDiscard));
}
最后一行是返回错误的内容 . common/
文件来自CUDA-by-example书籍文件,如果您愿意,我可以发布它们 . 我也试过在书籍文件中运行这个例子(据说工作代码),但我仍然遇到同样的问题 . 我需要做些什么来解决这个问题?
系统信息:Windows 7 x64,带有CUDA 6.5的Visual Studio 2010 . 我有一个GTX650显卡 .
I have tried test samples provided by Nvidia and none of the interop ones work. Even for the code I did not write. This code works on my laptop that has a GTX750M in it.
2 回答
鉴于interop不适用于CUDA安装提供的示例(可以在ProgramData / Nvidia Corporation / Examples中找到),问题不是代码,而是计算机的配置 . 我做了,首先取消了我所有的旧CUDA版本并重新安装了CUDA 7.0 . 这没有解决任何问题,所以我继续前进 .
这种情况下的问题是由以下原因引起的:
我将显示器插入主板以使用集成显卡进行显示,因为在Linux中,如果使用相同的设备进行显示和计算,则无法调试CUDA . 我切换到Windows,忘记将显示器交换回GPU . 当我运行我的代码时,
cudaGLSetGLDevice
使用了专用GPU,这是预期的 . 然而,OpenGL由专用图形卡处理,因为它是用于显示的 . 因此,当我尝试使用cudaGraphicsGLRegisterBuffer
注册互操作时,使用了集成图形 . 由于我的集成卡不支持CUDA,因此它提出了关于没有可用的CUDA设备的错误 .解决方案?好吧:重新启动计算机并进入BIOS(不要交换显示器) . 在BIOS中确保图形设置为使用专用GPU(在我的情况下为PCIe设置) . 将显示器插入GPU的视频端口 . 启动计算机导致一些非常时髦的显示,直到Nvidia驱动程序开始工作(我不得不重新启动另一个时间让它使用两个显示器) . 之后,在Nsight中运行示例代码工作了!
我希望能帮助其他人偶然发现这个问题 .
在CUDA识别支持OpenGL的设备之前,您必须创建一个OpenGL上下文 .
glutCreateWindows
是使用GLUT时创建OpenGL上下文的原因 .