2011-10-08 208 views
1

继CUDA 4.0编程之后,我在调用任何其他运行库之前调用cudaGLSetGLDevice 。但接下来的cuda调用cudaMalloc会返回“所有支持CUDA的设备忙或不可用”。CUDA OPENGL互操作性:cudaGLSetGLDevice

此外,在NVIDIA论坛(http://forums.nvidia.com/index.php?showtopic=186399)上,一位用户表示: “在多GPU系统中,尽管您将遇到更大CUDA中的缺陷... a)当CUDA上下文和OpenGL上下文位于不同的设备上时,您无法进行CUDA/GL互操作(我的经验中没有记录,也不支持) b)您不能执行GL设备关联c)您不能在消费设备上执行GL设备关联(仅适用于Quadro/Tesla)“

这是真的吗?我最后的工作必须在一个linux多gpu系统上运行。我必须更改图形库才能使用?在这种情况下,你有什么建议?

OS:OpenSUSE 11.4中的64位

显卡:的GeForce 9600M GT

DRIVER:275.21

回答

2

Cuda and OpenGL Interop

我不得不的负担,以取代简单的cudaMalloc() gl *的东西。

尽管如此,它工作得很好。

// The lattice as a GL Buffer 
GLuint gridVBO = 0; 
struct cudaGraphicsResource *gridVBO_CUDA = NULL; 

// Ask for GL memory buffers 
glGenBuffers(1, &gridVBO); 
glBindBuffer(GL_ARRAY_BUFFER, gridVBO); 
const size_t size = L * L * sizeof(unsigned char); 
glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, gridVBO); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
cutilSafeCall(cudaGraphicsGLRegisterBuffer(&gridVBO_CUDA, gridVBO, cudaGraphicsMapFlagsWriteDiscard)); 

// Map the GL buffer to a device pointer 
unsigned char *grid = NULL; 
cutilSafeCall(cudaGraphicsMapResources(1, &gridVBO_CUDA, 0)); 
size_t num_bytes = 0; 
cutilSafeCall(cudaGraphicsResourceGetMappedPointer((void **) &grid, 
        &num_bytes, gridVBO_CUDA)); 

// Execution configuration 
dim3 dimBlock(TILE_X, TILE_Y); 
dim3 dimGrid(L/TILE_X, L/TILE_Y); 

// Kernel call 
kernel<<<dimGrid, dimBlock>>>(grid); 
cutilCheckMsg("Kernel launch failed"); 

// Unmap buffer object 
cutilSafeCall(cudaGraphicsUnmapResources(1, &gridVBO_CUDA, 0)); 
+0

谢谢[NicolásWolovick](https://stackoverflow.com/users/1610649/nicol%C3%A1s-wolovick)! – SRG