CUDA OPENGL互操作性:cudaGLSetGLDevice

时间:2011-10-08 09:01:34

标签: opengl interop cuda multi-gpu

按照CUDA 4.0的编程Giude,我打电话给cudaGLSetGLDevice 在任何其他运行时调用之前但是下一个cuda电话,cudaMalloc,返回“所有支持CUDA的设备都忙或不可用。”

此外,在NVIDIA论坛(http://forums.nvidia.com/index.php?showtopic=186399)中,用户说: “在多GPU系统中,虽然您将在CUDA中遇到更大的缺陷...... a)当CUDA上下文和OpenGL上下文在不同的设备上时,你不能做CUDA / GL互操作(没有文档记录,根据我的经验不支持) b)您无法在非Windows计算机上执行GL设备关联。 c)您不能在消费者设备上进行GL设备关联(仅限Quadro / Tesla)“

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

OS:Opensuse 11.4 64 bit

显卡:GeForce 9600M GT

DRIVER:275.21

1 个答案:

答案 0 :(得分:2)

请参阅Cuda and OpenGL Interop

我不得不用gl *的东西替换一个简单的cudaMalloc()。

然而,它运作良好。

// 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));