【问题标题】:Visualization on GPU in a CUDA environmentCUDA 环境中 GPU 上的可视化
【发布时间】:2011-12-08 00:20:26
【问题描述】:

我有兴趣使用 CUDA 在 GPU 上实现一些粒子技术以进行流体模拟。

根据我的经验,在 CPU 上进行计算物理可视化的常用方法是在每个需要的时间步生成程序/应用程序输出数据文件(如 .vtk 文件),并使用数据可视化工具将它们可视化喜欢ParaViewVisIt

有没有办法直接在 GPU 上进行可视化?我是否必须继续将每个时间步长的数据文件发送回 CPU,以便在程序退出后我可以在它们上使用 ParaView/VisIt?如果是这样,不会有性能损失吗?

如果可以在此处列出一些用于高性能计算的基于 GPU 的可视化的流行方法,那将非常有帮助。

注意:我将在大部分工作中使用显卡 GTX 570 和 Tesla C2050。我正在使用 CUDA 4.0。

【问题讨论】:

    标签: cuda plot gpu


    【解决方案1】:

    CUDA OpenGL 非常简单。

    您可以像这样创建一个 OpenGL 顶点缓冲区:

    unsigned int _vbo;
    cudaGraphicsResource *_vb_resource;
    
    glGenBuffers(1, &_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, _vbo);
    glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW);
    

    向 CUDA 注册:

    cudaGraphicsGLRegisterBuffer(_vb_resource, _vbo, FLAGS);
    

    在调用可视化内核之前对其进行映射:

    vertex_t *ptr = NULL;
    size_t size; 
    cudaGraphicsMapResources(1, &_vb_resource, 0);
    cudaGraphicsResourceGetMappedPointer(ptr, &size, _vb_resource);
    

    使用顶点缓冲区作为参数调用您的内核:

    visData<<<BLOCKS, THREADS>>>(data, ptr);
    

    取消映射您的顶点缓冲区

    cudaGraphicsUnmapResources(1, &_vb_resource, 0);
    

    你完成了。 OpenGL 现在可以渲染您的数据了。

    CUDA 还可以与 DirectX 10 和 11(甚至是 9,但这已被弃用且令人沮丧)互操作

    查看 Martin Beckett 发布的示例。这不是那么棘手。

    编辑: 一点提示: 禁用 vsync 可能会带来更好的计算性能。默认情况下启用 vsync。如果您只有在线程上进行渲染和计算,则 vsync 会将您的计算 fps 速率降低到所用显示器的 vsync 速率(60Hz)

    要在 Windows 和 Linux 上禁用 vSync,请使用:

        // turn off vsync
    #ifndef _WIN32
        // or just try it for non Windows 
        if (glXGetProcAddress((const GLubyte*) "glXSwapIntervalMESA") != NULL)
            ((void (*)(int))glXGetProcAddress((const GLubyte*) "glXSwapIntervalMESA"))(0);
        else if (glXGetProcAddress((const GLubyte*) "glXSwapIntervalSGI") != NULL)
            ((void (*)(int))glXGetProcAddress((const GLubyte*) "glXSwapIntervalSGI"))(0);
    #else
        wglSwapIntervalEXT(0);
    #endif
    

    【讨论】:

    • 只是为了确保 OpenGL 形成基本形状并光栅化它们,对吗?因此,如果我想在 Cuda 中显示图像,那么 OpenGL 将是错误的工具。还是我错过了什么?
    • D3D9 isn't 已弃用。他们只是重新设计了互操作 API。
    【解决方案2】:

    Cuda,毫不奇怪,plays very nicely with opengl

    因此您可以让 CUDA 将结果写入 VBO 并使用 openGL 渲染场景,或者如果它是贴图类型的结果则直接写入纹理

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2013-01-28
      • 2014-03-26
      • 2021-08-09
      • 2023-04-03
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      相关资源
      最近更新 更多