我有兴趣在GPU上使用CUDA实现流体模拟的一些粒子技术.
根据我的经验,在CPU上进行计算物理可视化的常用方法是.vtk在每个所需的时间步骤使程序/应用程序输出数据文件(如文件),并使用ParaView或VisIt等数据可视化工具对其进行可视化.
有没有办法直接在GPU上进行可视化?我是否必须继续将每个时间步数据文件发送回CPU,以便在程序退出后我可以在它们上使用ParaView/VisIt?如果是这样,会不会有性能损失?
如果可以在这里列出一些流行的基于GPU的可视化高性能计算的方法,那将非常有用.
注意:我将在大部分工作中使用显卡GTX 570和Tesla C2050.我正在使用CUDA 4.0.
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)