在CUDA环境中的GPU上可视化

smi*_*dha 2 plot cuda gpu

我有兴趣在GPU上使用CUDA实现流体模拟的一些粒子技术.

根据我的经验,在CPU上进行计算物理可视化的常用方法是.vtk在每个所需的时间步骤使程序/应用程序输出数据文件(如文件),并使用ParaViewVisIt等数据可视化工具对其进行可视化.

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

如果可以在这里列出一些流行的基于GPU的可视化高性能计算的方法,那将非常有用.

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

Mic*_*idl 6

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);
Run Code Online (Sandbox Code Playgroud)

在CUDA注册:

cudaGraphicsGLRegisterBuffer(_vb_resource, _vbo, FLAGS);
Run Code Online (Sandbox Code Playgroud)

在调用可视化内核之前映射它:

vertex_t *ptr = NULL;
size_t size; 
cudaGraphicsMapResources(1, &_vb_resource, 0);
cudaGraphicsResourceGetMappedPointer(ptr, &size, _vb_resource);
Run Code Online (Sandbox Code Playgroud)

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

visData<<<BLOCKS, THREADS>>>(data, ptr);
Run Code Online (Sandbox Code Playgroud)

取消映射顶点缓冲区

cudaGraphicsUnmapResources(1, &_vb_resource, 0);
Run Code Online (Sandbox Code Playgroud)

你做完了 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
Run Code Online (Sandbox Code Playgroud)