首页 文章

使用OpenGL的CUDA:所有支持CUDA的设备都忙或不可用

提问于
浏览
-5

我正在按照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 回答

  • 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中运行示例代码工作了!

    我希望能帮助其他人偶然发现这个问题 .

  • 1

    在CUDA识别支持OpenGL的设备之前,您必须创建一个OpenGL上下文 . glutCreateWindows 是使用GLUT时创建OpenGL上下文的原因 .

相关问题