2011-12-08 54 views
1

我有兴趣在使用CUDA的GPU上实现一些用于流体仿真的粒子技术。CUDA环境下GPU上的可视化

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

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

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

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

回答

5

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,但是不赞成这种方式和压抑)

看一看发表马丁·贝克特的样本。这不是那么棘手。

编辑:有点提示: 禁用vsync可能会导致更好的计算性能。 vsync默认启用。如果你只对线程渲染和计算VSYNC将你的计算FPS率下降到所使用的显示器垂直同步率(60Hz)的

要在Windows和Linux禁用垂直同步使用:

// 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 
4

Cuda,不足为奇,plays very nicely with opengl

所以,你可以有CUDA编写结果到VBO并用OpenGL渲染场景,或者如果它是一个地图类型的结果直接到纹理