Совместимость с CUDA OPENGL: cudaGLSetGLDevice - PullRequest
1 голос
/ 08 октября 2011

Следуя Giude для программирования CUDA 4.0, я вызываю cudaGLSetGLDevice перед любыми другими вызовами во время выполнения. Но следующий вызов cuda, cudaMalloc, возвращает «все устройства с поддержкой CUDA заняты или недоступны».

Также на форуме NVIDIA (http://forums.nvidia.com/index.php?showtopic=186399) пользователь сказал, что: «В системах с несколькими графическими процессорами вы столкнетесь с еще большими недостатками в CUDA ... a) Вы не можете выполнять взаимодействие CUDA / GL, когда контекст CUDA и контекст OpenGL находятся на разных устройствах (недокументировано и не поддерживается в моем опыте) б) Вы не можете использовать сходство устройств GL на машинах, отличных от Windows. c) Нельзя связать устройства GL с потребительскими устройствами (только Quadro / Tesla) "

Это правда? Моя последняя работа должна выполняться в системе Linux с несколькими GPU. Я должен изменить графическую библиотеку для использования? И в этом случае, что вы предлагаете?

ОС: Opensuse 11.4 64 бит

Графическая карта: GeForce 9600M GT

ВОДИТЕЛЬ: 275.21

1 Ответ

2 голосов
/ 20 августа 2012

См. Cuda и 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));
...