使用OpenGL运行cuda程序时出现分段错误
我正在编写一个cuda代码,可在 我将标题替换为明确提及标题,并将其提及如下:使用OpenGL运行cuda程序时出现分段错误,opengl,ubuntu,cuda,segmentation-fault,Opengl,Ubuntu,Cuda,Segmentation Fault,我正在编写一个cuda代码,可在 我将标题替换为明确提及标题,并将其提及如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <GL/gl.h> #include <GL/glut.h> #include <cuda.h> #include <cuda_runtime.h> #include "cutil.h" #incl
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include "cutil.h"
#include <cuda_gl_interop.h>
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“cutil.h”
#包括
我正在编译发出命令的代码
nvcc-o测试\u cuda基本\u程序编号\u 1.cu-lGL-lGLU-lglut
编译程序时没有任何错误,并创建test_cuda可执行文件。但是当我试图运行可执行文件时
/测试
然后它给了我一个错误。有一件事我想提一提,以前当我用“cutil.h”编译时,发生了一个错误,即没有像cutil.h这样的文件或目录。因此,我明确下载了“cutil.h”,并将其包含在与程序相同的文件夹中。程序编译时没有任何错误,但在运行时返回分段错误
代码如下:
PFNGLBINDBUFFERARBPROC glBindBuffer = NULL;
PFNGLDELETEBUFFERSARBPROC glDeleteBuffers = NULL;
PFNGLGENBUFFERSARBPROC glGenBuffers = NULL;
PFNGLBUFFERDATAARBPROC glBufferData = NULL;
#define DIM 512
GLuint bufferObj;
cudaGraphicsResource *resource;
__global__ void kernel( uchar4 *ptr ) {
// map from threadIdx/BlockIdx to pixel position
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x;
// now calculate the value at that position
float fx = x/(float)DIM - 0.5f;
float fy = y/(float)DIM - 0.5f;
unsigned char green = 128 + 127 *
sin( abs(fx*100) - abs(fy*100) );
// accessing uchar4 vs unsigned char*
ptr[offset].x = 0;
ptr[offset].y = green;
ptr[offset].z = 0;
ptr[offset].w = 255;
}
static void key_func( unsigned char key, int x, int y ) {
switch (key) {
case 27:
HANDLE_ERROR( cudaGraphicsUnregisterResource( resource ) );
glBindBuffer( GL_PIXEL_UNPACK_BUFFER_ARB, 0 );
glDeleteBuffers( 1, &bufferObj );
exit(0);
}
}
static void draw_func( void ) {
glDrawPixels( DIM, DIM, GL_RGBA, GL_UNSIGNED_BYTE, 0 );
glutSwapBuffers();
}
int main( int argc, char **argv ) {
cudaDeviceProp prop;
int dev;
memset( &prop, 0, sizeof( cudaDeviceProp ) );
prop.major = 1;
prop.minor = 0;
HANDLE_ERROR( cudaChooseDevice( &dev, &prop ) );
cudaGLSetGLDevice( dev );
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOU@harrism : BLE | GLUT_RGBA );
glutInitWindowSize( DIM, DIM );
glutCreateWindow( "bitmap" );
/*glBindBuffer = (PFNGLBINDBUFFERARBPROC)GET_PROC_ADDRESS("glBindBuffer");
glDeleteBuffers = (PFNGLDELETEBUFFERSARBPROC)GET_PROC_ADDRESS("glDeleteBuffers");
glGenBuffers = (PFNGLGENBUFFERSARBPROC)GET_PROC_ADDRESS("glGenBuffers");
glBufferData = (PFNGLBUFFERDATAARBPROC)GET_PROC_ADDRESS("glBufferData");*/
glGenBuffers( 1, &bufferObj );
glBindBuffer( GL_PIXEL_UNPACK_BUFFER_ARB, bufferObj );
glBufferData( GL_PIXEL_UNPACK_BUFFER_ARB, DIM * DIM * 4,
NULL, GL_DYNAMIC_DRAW_ARB );
cudaGraphicsGLRegisterBuf@harrism : fer( &resource,
bufferObj,
cudaGraphicsMapFlagsNone );
cudaGraphicsMapResources( 1, &resource, NULL );
uchar4* devPtr;
size_t size;
cudaGraphicsResourceGetMappedPointer( (void**)&devPtr,
&size,
resource);
dim3 grids(DIM/16,DIM/16);
dim3 threads(16,16);
kernel<<<grids,threads>>>( devPtr );
cudaGraphicsUnmapResources( 1, &resource, NULL );
// set up GLUT and kick off main loop
glutKeyboardFunc( key_func );
glutDisplayFunc( draw_func );
glutMainLoop();
}
PFNGLBINDBUFFERARBPROC glBindBuffer=NULL;
PFNGLDELETEBUFFERSARBPROC glDeleteBuffers=NULL;
PFNGLGENBUFFERSARBPROC GLGENBULTS=NULL;
PFNGLBUFFERDATAARBPROC glBufferData=NULL;
#定义尺寸512
GLuint bufferObj;
cudaGraphicsResource*资源;
__全局无效内核(uchar4*ptr){
//从threadIdx/BlockIdx映射到像素位置
int x=threadIdx.x+blockIdx.x*blockDim.x;
int y=线程IDX.y+块IDX.y*块DIM.y;
int offset=x+y*blockDim.x*gridDim.x;
//现在计算该位置的值
浮动汇率=x/(浮动)尺寸-0.5f;
浮动fy=y/(浮动)尺寸-0.5f;
无符号字符绿色=128+127*
sin(资产负债表(外汇*100)-资产负债表(财年*100));
//访问uchar4与无符号字符*
ptr[offset].x=0;
ptr[offset].y=绿色;
ptr[offset].z=0;
ptr[offset].w=255;
}
静态无效键_func(无符号字符键,int x,int y){
开关(钥匙){
案例27:
句柄_错误(cudaGraphicsUnregisterResource(资源));
glBindBuffer(GL\u像素\u解包\u缓冲区\u ARB,0);
glDeleteBuffers(1和bufferObj);
出口(0);
}
}
静态空心绘制函数(空心){
GLDRAW像素(暗、暗、GL_RGBA、GL_无符号_字节,0);
glutSwapBuffers();
}
int main(int argc,字符**argv){
cudaDeviceProp支柱;
国际开发署;
memset(&prop,0,sizeof(cudaDeviceProp));
prop.major=1;
小号道具=0;
处理错误(cudaChooseDevice(&dev,&prop));
cudaGLSetGLDevice(开发);
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOU@harrism:BLE | GLUT_RGBA);
glutInitWindowSize(DIM,DIM);
创建窗口(“位图”);
/*glBindBuffer=(PFNGLBINDBUFFERARBPROC)获取进程地址(“glBindBuffer”);
glDeleteBuffers=(PFNGLDELETEBUFFERSARBPROC)获取进程地址(“glDeleteBuffers”);
glGenBuffers=(PFNGLGENBUFFERSARBPROC)获取进程地址(“glGenBuffers”);
glBufferData=(PFNGLBUFFERDATAARBPROC)获取进程地址(“glBufferData”)*/
glGenBuffers(1和bufferObj);
glBindBuffer(GL_像素_解包_缓冲区_ARB,bufferObj);
glBufferData(GL_像素_解包_缓冲区_ARB,尺寸*DIM*4,
空,总帐、动态、绘图和仲裁);
cudaGraphicsGLRegisterBuf@harrism:fer和资源,
bufferObj,
cudaGraphicsMapFlagsNone);
cudaGraphicsMapResources(1,&resource,NULL);
uchar4*devPtr;
大小;
cudaGraphicsResourceGetMappedPointer((void**)和devPtr,
&大小,
资源);
dim3网格(DIM/16,DIM/16);
dim3螺纹(16,16);
内核(devPtr);
cudaGraphicsUnmapResources(1,&resource,NULL);
//设置GLUT并启动主回路
键盘功能(按键功能);
glutDisplayFunc(绘图功能);
glutMainLoop();
}
在代码中注释掉了原著示例中的几行关键行。我不知道您为什么这样做,但最终的效果是您在正确创建openGL渲染上下文之前尝试了某些OGL调用(GLGENBuffer是seg错误的来源)
取消对这4行的注释会导致代码和标题中缺少“GET_PROC_ADDRESS”宏。这让我发现您没有正确地包含原始书头。您的代码中还包含一些垃圾,例如不同位置的@harrism
无论如何,我接受了您的代码并添加了一些内容,以下内容对我很有用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <cuda.h>
#include <cuda_runtime.h>
// #include "cutil.h"
#include <cuda_gl_interop.h>
#include <GL/glext.h>
#include <GL/glx.h>
#define GET_PROC_ADDRESS( str ) glXGetProcAddress( (const GLubyte *)str )
static void HandleError( cudaError_t err, const char *file, int line ) {
if (err != cudaSuccess) {
printf( "%s in %s at line %d\n", cudaGetErrorString( err ), file, line );
exit( EXIT_FAILURE );
}
}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
PFNGLBINDBUFFERARBPROC glBindBuffer = NULL;
PFNGLDELETEBUFFERSARBPROC glDeleteBuffers = NULL;
PFNGLGENBUFFERSARBPROC glGenBuffers = NULL;
PFNGLBUFFERDATAARBPROC glBufferData = NULL;
#define DIM 512
GLuint bufferObj;
cudaGraphicsResource *resource;
__global__ void kernel( uchar4 *ptr ) {
// map from threadIdx/BlockIdx to pixel position
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x;
// now calculate the value at that position
float fx = x/(float)DIM - 0.5f;
float fy = y/(float)DIM - 0.5f;
unsigned char green = 128 + 127 *
sin( abs(fx*100) - abs(fy*100) );
// accessing uchar4 vs unsigned char*
ptr[offset].x = 0;
ptr[offset].y = green;
ptr[offset].z = 0;
ptr[offset].w = 255;
}
static void key_func( unsigned char key, int x, int y ) {
switch (key) {
case 27:
HANDLE_ERROR( cudaGraphicsUnregisterResource( resource ) );
glBindBuffer( GL_PIXEL_UNPACK_BUFFER_ARB, 0 );
glDeleteBuffers( 1, &bufferObj );
exit(0);
}
}
static void draw_func( void ) {
glDrawPixels( DIM, DIM, GL_RGBA, GL_UNSIGNED_BYTE, 0 );
glutSwapBuffers();
}
int main( int argc, char **argv ) {
cudaDeviceProp prop;
int dev;
memset( &prop, 0, sizeof( cudaDeviceProp ) );
prop.major = 1;
prop.minor = 0;
HANDLE_ERROR( cudaChooseDevice( &dev, &prop ) );
cudaGLSetGLDevice( dev );
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );
glutInitWindowSize( DIM, DIM );
glutCreateWindow( "bitmap" );
glBindBuffer = (PFNGLBINDBUFFERARBPROC)GET_PROC_ADDRESS("glBindBuffer");
glDeleteBuffers = (PFNGLDELETEBUFFERSARBPROC)GET_PROC_ADDRESS("glDeleteBuffers");
glGenBuffers = (PFNGLGENBUFFERSARBPROC)GET_PROC_ADDRESS("glGenBuffers");
glBufferData = (PFNGLBUFFERDATAARBPROC)GET_PROC_ADDRESS("glBufferData");
glGenBuffers( 1, &bufferObj );
glBindBuffer( GL_PIXEL_UNPACK_BUFFER_ARB, bufferObj );
glBufferData( GL_PIXEL_UNPACK_BUFFER_ARB, DIM * DIM * 4,
NULL, GL_DYNAMIC_DRAW_ARB );
cudaGraphicsGLRegisterBuffer( &resource,
bufferObj,
cudaGraphicsMapFlagsNone );
cudaGraphicsMapResources( 1, &resource, NULL );
uchar4* devPtr;
size_t size;
cudaGraphicsResourceGetMappedPointer( (void**)&devPtr,
&size,
resource);
dim3 grids(DIM/16,DIM/16);
dim3 threads(16,16);
kernel<<<grids,threads>>>( devPtr );
cudaGraphicsUnmapResources( 1, &resource, NULL );
// set up GLUT and kick off main loop
glutKeyboardFunc( key_func );
glutDisplayFunc( draw_func );
glutMainLoop();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//#包括“cutil.h”
#包括
#包括
#包括
#定义GET_PROC_ADDRESS(str)glXGetProcAddress((const GLubyte*)str)
静态void HandleError(cudaError\u t err,const char*文件,int行){
if(err!=cudaSuccess){
printf(“%s在%s中的%d行\n”,cudaGetErrorString(err),文件,行);
退出(退出失败);
}
}
#定义句柄错误(err)(句柄错误(err,文件,行)
PFNGLBINDBUFFERARBPROC glBindBuffer=NULL;
PFNGLDELETEBUFFERSARBPROC glDeleteBuffers=NULL;
PFNGLGENBUFFERSARBPROC GLGENBULTS=NULL;
PFNGLBUFFERDATAARBPROC glBufferData=NULL;
#定义尺寸512
GLuint bufferObj;
cudaGraphicsResource*资源;
__全局无效内核(uchar4*ptr){
//从threadIdx/BlockIdx映射到像素位置
int x=threadIdx.x+blockIdx.x*blockDim.x;
int y=线程IDX.y+块IDX.y*块DIM.y;
int offset=x+y*blockDim.x*gridDim.x;
//现在计算该位置的值
浮动汇率=x/(浮动)尺寸-0.5f;
浮动fy=y/(浮动)尺寸-0.5f;
无符号字符绿色=128+127*
sin(资产负债表(外汇*100)-资产负债表(财年*100));
//访问uchar4与无符号字符*
ptr[offset].x=0;
ptr[offset].y=绿色;
ptr[offset].z=0;
ptr[offset].w=255;
}
静态空隙