2011-12-08 50 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渲染場景,或者如果它是一個地圖類型的結果直接到紋理