【问题标题】:Unusual Error Using OpenGL Buffers with Cuda interop on MS Visual Studio 2010在 MS Visual Studio 2010 上使用 OpenGL 缓冲区和 Cuda 互操作时出现异常错误
【发布时间】:2012-09-11 01:31:36
【问题描述】:

我正在编写 cuda by example book 中给出的一段非常简单的代码,它是 cuda openGL interop 创建图形。该程序正在成功构建,但是当我运行该程序时,窗口显示: 应用程序无法正确启动。 单击确定关闭应用程序。 我不知道为什么会这样,因为我很少有成功运行的示例 cuda 程序以及 opengl 示例程序。我什至从运行成功的 NVidia 示例程序中运行示例 cuda openGL 互操作程序。我应该在这里提到,我已将所有 lib 文件包含在附加库中,以及包含在附加包含目录中的文件。我相信这是因为我用于互操作的像素缓冲区导致正常的 openGL 和 cuda 程序运行良好。我还应该提到,当我尝试将缓冲区 API 包含在程序中时,visual studio intellisense 正在显示缓冲区 API(如 glGenBuffers 等),但在程序中声明后,它显示标识符未定义,其下方有一条红线.但是这件事并没有发生在 NVidia 示例 OpenGL 代码中。

我正在粘贴下面的代码:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <GL/glew.h>
#include <GL/glut.h>
#include <GL/glaux.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cutil.h>
#include <cuda_gl_interop.h>

#define     DIM    512

GLuint  bufferObj;
cudaGraphicsResource *resource;

// based on ripple code, but uses uchar4 which is the type of data
// graphic inter op uses. see screenshot - basic2.png
__global__ void kernel( uchar4 *ptr ) {
int x = threadIdx.x + blockIdx.x * blockDim.x;
    int y = threadIdx.y + blockIdx.y * blockDim.y;
    int offset = x + y * blockDim.x * gridDim.x;

    // now calculate the value at that position
    float fx = x/(float)DIM - 0.5f;
    float fy = y/(float)DIM - 0.5f;
    unsigned char   green = 128 + 127 *
        sin( abs(fx*100) - abs(fy*100) );

    // accessing uchar4 vs unsigned char*
    ptr[offset].x = 0;
    ptr[offset].y = green;
    ptr[offset].z = 0;
    ptr[offset].w = 255;
}

static void key_func( unsigned char key, int x, int y ) {
    switch (key) {
    case 27:
        // clean up OpenGL and CUDA
         cudaGraphicsUnregisterResource( resource );
        glBindBuffer( GL_PIXEL_UNPACK_BUFFER_ARB, 0 );
        glDeleteBuffers( 1, &bufferObj );
        exit(0);
    }
}

static void draw_func( void ) {

    glDrawPixels( DIM, DIM, GL_RGBA, GL_UNSIGNED_BYTE, 0 );
    glutSwapBuffers();
}


int main( int argc, char **argv ) {
    cudaDeviceProp  prop;
    int dev;

    memset( &prop, 0, sizeof( cudaDeviceProp ) );
    prop.major = 1;
    prop.minor = 0;
     cudaChooseDevice( &dev, &prop );
    cudaGLSetGLDevice( dev ) ;
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );
    glutInitWindowSize( DIM, DIM );
    glutCreateWindow( "bitmap" );

    glGenBuffers( 1, &bufferObj );
    glBindBuffer( GL_PIXEL_UNPACK_BUFFER_ARB, bufferObj );
    glBufferData( GL_PIXEL_UNPACK_BUFFER_ARB, DIM * DIM * 4,NULL, GL_DYNAMIC_DRAW_ARB);
cudaGraphicsGLRegisterBuffer( &resource, 
        bufferObj, 
        cudaGraphicsMapFlagsNone ) ;

    // do work with the memory dst being on the GPU, gotten via mapping
     cudaGraphicsMapResources( 1, &resource, NULL ) ;
    uchar4* devPtr;
    size_t  size;
    cudaGraphicsResourceGetMappedPointer( (void**)&devPtr, 
        &size, 
        resource) ;

    dim3    grids(DIM/16,DIM/16);
    dim3    threads(16,16);
    kernel<<<grids,threads>>>( devPtr );
    cudaGraphicsUnmapResources( 1, &resource, NULL ) ;

    glutKeyboardFunc( key_func );
    glutDisplayFunc( draw_func );
    glutMainLoop();
}

【问题讨论】:

  • 在发布大量代码之前,请自行进一步调试。您可以通过使用调试器来缩小范围:编译调试配置。在 main() 的第一行放置一个断点。在调试器中运行,然后单步执行,直到你看到它失败的地方。
  • 在我的机器上用GTX580显卡在Linux下运行,没有问题。顺便说一句很酷的图表))
  • 也许您应该检查您的系统是否支持 PBO(如果您还没有这样做的话),即。 glGetString(GL_EXTENSION) 检查 GL_ARB_pixel_buffer_object
  • 嗨!我开始调试我的代码。我放了断点,但是当我开始调试时,它直接显示相同的消息,我无法调试代码。所以尝试不同的事情后问题仍然存在。
  • @asm :我做了 glGetString(GL_EXTENSION) 并打印了它,但它返回 NULL。

标签: c++ opengl cuda


【解决方案1】:

不要忘记在glGenBuffers()之前glewInit()

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • @samsamX: 好吧,如果你不初始化 GLEW,它会崩溃,如果你初始化 GLEW,它不会崩溃,并且考虑到问题是因为代码崩溃而寻求帮助,我d争辩说它确实回答了这个问题!但我本来可以更冗长的,这是真的!
  • 很抱歉我的回复晚了,但我刚刚看到了答案和建议。我在代码中包含了 glewInit() ,但它仍然给出相同的错误。正如 harrism 所提到的,我会在今天晚些时候尝试调试代码并尝试更具体。但与此同时,如果您有更多建议,请告诉我。我想尽快运行这段代码。感谢您的所有帮助。
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2015-08-03
  • 2011-02-14
  • 1970-01-01
  • 2022-07-13
相关资源
最近更新 更多