【发布时间】:2014-01-12 19:27:11
【问题描述】:
我正在尝试设置一个小的 CUDA/GL 互操作示例。我在互联网上四处寻找,所以我找到了一些有用的教程。
我想要的只是在 CUDA 中生成纹理并使用 OpenGL 绘制它。
我现在的来源是每次运行我的 Macbook Pro 都会崩溃,所以我认为如果有人能关注它,那将非常有帮助。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#ifdef _WIN32
# define WINDOWS_LEAN_AND_MEAN
# define NOMINMAX
# include <windows.h>
#endif
// OpenGL Graphics includes
#include <GL/glew.h>
#if defined (__APPLE__) || defined(MACOSX)
#include <GLUT/glut.h>
#else
#include <GL/freeglut.h>
#endif
// includes, cuda
#include <cuda_runtime.h>
#include <cuda_gl_interop.h>
// Utilities and timing functions
#include <helper_functions.h> // includes cuda.h and cuda_runtime_api.h
#include <timer.h> // timing functions
// CUDA helper functions
#include <helper_cuda.h> // helper functions for CUDA error check
#include <helper_cuda_gl.h> // helper functions for CUDA/GL interop
#include <vector_types.h>
const unsigned int window_width = 512;
const unsigned int window_height = 512;
GLuint viewGLTexture;
cudaGraphicsResource_t viewCudaResource;
void initGLandCUDA() {
int argc = 0;
char** argv = NULL;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(window_width, window_height);
glutCreateWindow("CUDA GL Interop");
glewInit();
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &viewGLTexture);
glBindTexture(GL_TEXTURE_2D, viewGLTexture);
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
}
glBindTexture(GL_TEXTURE_2D, 0);
cudaGLSetGLDevice(gpuGetMaxGflopsDeviceId());
cudaGraphicsGLRegisterImage(&viewCudaResource, viewGLTexture, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsWriteDiscard);
}
__global__ void renderingKernel(cudaSurfaceObject_t image) {
unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;
uchar4 color = make_uchar4(0.f, 0.f, 0.f, .3f);
//if I write in 0, 0 and not x,y, the computer is not crashing, but there is no black pixel at 0,0
surf2Dwrite(color, image, x, y, cudaBoundaryModeClamp);
}
void callCUDAKernel(cudaSurfaceObject_t image) {
dim3 block(8, 1, 1);
dim3 grid(8, 1, 1);
renderingKernel<<< grid, block>>>(image);
}
void renderFrame() {
cudaGraphicsMapResources(1, &viewCudaResource);
{
cudaArray_t viewCudaArray;
checkCudaErrors(cudaGraphicsSubResourceGetMappedArray(&viewCudaArray, viewCudaResource, 0, 0));
cudaResourceDesc viewCudaArrayResourceDesc;
{
viewCudaArrayResourceDesc.resType = cudaResourceTypeArray;
viewCudaArrayResourceDesc.res.array.array = viewCudaArray;
}
cudaSurfaceObject_t viewCudaSurfaceObject;
checkCudaErrors(cudaCreateSurfaceObject(&viewCudaSurfaceObject, &viewCudaArrayResourceDesc));
callCUDAKernel(viewCudaSurfaceObject);
checkCudaErrors(cudaDestroySurfaceObject(viewCudaSurfaceObject));
}
checkCudaErrors(cudaGraphicsUnmapResources(1, &viewCudaResource));
checkCudaErrors(cudaStreamSynchronize(0));
glBindTexture(GL_TEXTURE_2D, viewGLTexture);
{
glBegin(GL_QUADS);
{
glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(+1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(+1.0f, +1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f, +1.0f);
}
glEnd();
}
glBindTexture(GL_TEXTURE_2D, 0);
glFinish();
}
int main(int argc, char **argv)
{
initGLandCUDA();
glutDisplayFunc(renderFrame);
//glutKeyboardFunc(keyboard);
//glutMouseFunc(mouse);
glutMainLoop();
}
这似乎是某种超出范围的错误,但我目前没有想法(顺便说一句,这是 cc 3.0,运行到 nVidia 650M)。
编辑: 崩溃我的意思是:崩溃。电脑死机。我无法移动鼠标,我必须重新启动。
是的,我查看了所有示例,但它们并不是我想要的。将它们更改为我想要的会导致此问题。如果手册中有任何其他帮助或其他任何可以帮助我的地方,我发现我不会费心寻求帮助。您需要链接 cuda_runtime 和 glut 库
【问题讨论】:
-
您应该描述您遇到的错误。 “崩溃”的描述性不够。您收到任何错误消息吗?究竟会发生什么? macbook重启了?您应该对内核调用进行正确的 cuda 错误检查,包括。您应该提供一个简短的完整代码来演示该问题。事实上,SO 期望“有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包括有效的代码来重现它。请参阅 SSCCE.org 以获得指导。”如果您不确定那是什么意思是,请阅读 sscce.org 网站。
-
有各种 CUDA graphics samples 演示 CUDA/OpenGL 互操作,你看过那些吗?此外,您的内核似乎需要一个 2D 网格,但您正在启动一个 1D 网格。这是你的意图吗?它们在您的内核中的
y值始终为零。你可能想用cuda-memcheck运行你的内核。 -
我已经编辑了我的问题并回答了您的问题。顺便说一句,我有代码来重现问题等等。 * 请花些时间,注意 RTFM 的答案不是我们在这里需要的。 *我希望SO在某个地方也这么说。话虽如此,问题实际上似乎并不在于内核启动,因为它是一维的,它似乎仍然在写入应该超出范围的内存。
-
您提供的代码应该可以按原样编译。它不是。是的,我可以通过头文件猜测我的方式,对
window_height和window_width做出一些假设,模拟checkCudaErrors宏或编写我自己的宏等等。我选择不这样做,因为 SO 期望你来提供。 -
好的,很抱歉。我想我误会了您并没有试图提供帮助,但是(就像许多人一样)只是说“ RTFM 然后走开”。我认为现在可以了(一旦你拥有了所有需要的库就可以编译)。