2011-10-08 558 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