1

遵循 CUDA 4.0 的编程指南,我在任何其他运行时调用之前调用 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 多 GPU 系统上运行。我必须更改图形库才能使用?在这种情况下,你有什么建议?

操作系统:Opensuse 11.4 64 位

显卡:GeForce 9600M GT

车手:275.21

4

1 回答 1

2

请参阅Cuda 和 OpenGL 互操作

我不得不用 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));
于 2012-08-20T00:51:51.027 回答