1

CUDA 4.0 のプログラミング ガイドに従って、他のランタイム呼び出しの前に cudaGLSetGLDevice を呼び出します。しかし、次の cuda 呼び出しである cudaMalloc は、「すべての CUDA 対応デバイスがビジーまたは使用不可です」を返します。

また、NVIDIA フォーラム (http://forums.nvidia.com/index.php?showtopic=186399) で、ユーザーは次のように述べています。 . a) CUDA コンテキストと OpenGL コンテキストが異なるデバイス上にある場合、CUDA/GL 相互運用を行うことはできません (文書化されておらず、私の経験ではサポートされていません) b) Windows 以外のマシンでは GL デバイス アフィニティを行うことはできません.c ) コンシューマー デバイスでは GL デバイス アフィニティを実行できません (Quadro/Tesla のみ)"

これは本当ですか?私の最終的な作業は、Linux マルチ GPU システムで実行する必要があります。使用するグラフィック ライブラリを変更する必要がありますか? そして、この場合、あなたは何を提案しますか?

OS: Opensuse 11.4 64 ビット

グラフィックカード: GeForce 9600M GT

ドライバー: 275.21

4

1 に答える 1

2

Cuda と OpenGL の相互運用を参照してください

単純な 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));
于 2012-08-20T00:51:51.027 に答える