Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA和x2B;OpenGL。未知代码=4(cudaErrorLaunchFailure)错误_Opengl_Cuda - Fatal编程技术网

CUDA和x2B;OpenGL。未知代码=4(cudaErrorLaunchFailure)错误

CUDA和x2B;OpenGL。未知代码=4(cudaErrorLaunchFailure)错误,opengl,cuda,Opengl,Cuda,我正在CUDA上做一个简单的n体模拟,然后我尝试用OpenGL可视化 在我在CPU上初始化粒子数据、分配相应内存并在GPU上传输该数据后,程序必须进入以下循环: 1) 计算每个粒子上的力(CUDA部分) 2) 更新粒子位置(CUDA零件) 3) 显示此时间步的粒子(OpenGL部件) 4) 返回到1) CUDA和OpenGL之间的接口由以下代码实现: GLuint dataBufferID; particle_t* Particles_d; particle_t* Particles_h; cu

我正在CUDA上做一个简单的n体模拟,然后我尝试用OpenGL可视化

在我在CPU上初始化粒子数据、分配相应内存并在GPU上传输该数据后,程序必须进入以下循环:

1) 计算每个粒子上的力(CUDA部分)

2) 更新粒子位置(CUDA零件)

3) 显示此时间步的粒子(OpenGL部件)

4) 返回到1)

CUDA和OpenGL之间的接口由以下代码实现:

GLuint dataBufferID;
particle_t* Particles_d;
particle_t* Particles_h;
cudaGraphicsResource *resources[1];
void createVBO()
{

    // create buffer object
    glGenBuffers(1, &dataBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, dataBufferID);
    glBufferData(GL_ARRAY_BUFFER, bufferStride*N*sizeof(float), 0, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

checkCudaErrors(cudaGraphicsGLRegisterBuffer(resources, dataBufferID, cudaGraphicsMapFlagsNone));
我在OpenGLs Array_Buffer上分配空间,并使用以下代码将后者注册为cudaGraphicsResource:

GLuint dataBufferID;
particle_t* Particles_d;
particle_t* Particles_h;
cudaGraphicsResource *resources[1];
void createVBO()
{

    // create buffer object
    glGenBuffers(1, &dataBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, dataBufferID);
    glBufferData(GL_ARRAY_BUFFER, bufferStride*N*sizeof(float), 0, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

checkCudaErrors(cudaGraphicsGLRegisterBuffer(resources, dataBufferID, cudaGraphicsMapFlagsNone));
}

最后,我描述的程序周期(步骤1到4)通过以下函数更新(int)实现

void更新(int值)
{
//映射用于从CUDA写入的OpenGL缓冲区对象
浮点*数据ptr;
检查cudaErrors(cudaGraphicsMapResources(1,resources,0));
大小\u t数量\u字节;
//获取指向该缓冲区对象的指针,以便使用cuda进行操作!
检查CUDAErrors(cudaGraphicsResourceGetMappedPointer((void**)和dataPtr,&num_字节,资源[0]);
//用粒子位置数据填充图形资源!
启动内核(粒子d,数据ptr,1);
//取消映射缓冲区对象
检查CUDAErrors(cudaGraphicsUnmapResources(1,resources,0));
再发现();
glutTimerFunc(毫秒,更新,0);
}
在编译结束时,我收到以下错误:

src/main.cu处的CUDA错误:390代码=4(cudaErrorLaunchFailure)“cudaGraphicsMapResources(1,资源,0)”

src/main.cu:392 code=4(cudaErrorLaunchFailure)“cudaGraphicsResourceGetMappedPointer((void**)和dataPtr,&num_字节,资源[0])”

src/main.cu处的CUDA错误:397代码=4(cudaErrorLaunchFailure)“cudaGraphicsUnmapResources(1,resources,0)”

有人知道这一例外的原因吗?我是否应该在每次执行更新(int)之前使用createVBO()创建数据缓冲区

p、 为了更清楚,我的内核函数如下:

__global__ void launch_kernel(particle_t* Particles,float* data, int KernelMode){

int i = blockIdx.x*THREADS_PER_BLOCK + threadIdx.x;

if(KernelMode == 1){
//N_d is allocated on device memory 
if(i > N_d) 
    return;
//and update dataBuffer! 
updateX(Particles+i);

for(int d=0;d<DIM_d;d++){
    data[i*bufferStride_d+d] = Particles[i].p[d]; // update the new coordinate positions in the data buffer! 
}
    // fill in also the RGB data and the radius. In general THIS IS NOT NECESSARY!! NEED TO PERFORM ONCE! REFACTOR!!!
data[i*bufferStride_d+DIM_d] =Particles[i].r;
data[i*bufferStride_d+DIM_d+1] =Particles[i].g;
data[i*bufferStride_d+DIM_d+2] =Particles[i].b;
data[i*bufferStride_d+DIM_d+3] =Particles[i].radius;

}else{
// if KernelMode = 2 then Update Y
    float* Fold = new float[DIM_d];
    for(int d=0;d<DIM_d;d++)
        Fold[d]=Particles[i].force[d];

    //of course in parallel :)
    computeForces(Particles,i);
    updateV(Particles+i,Fold);
    delete [] Fold;
    }
// in either case wait for all threads to finish! 
__syncthreads();


}
\uuuuu全局\uuuuu无效启动\u内核(particle\t*粒子,float*数据,int-KernelMode){
int i=blockIdx.x*每个块的线程数+threadIdx.x;
if(KernelMode==1){
//N_d在设备内存上分配
如果(i>N\d)
返回;
//更新数据缓冲!
updateX(粒子+i);

对于(int d=0;d正如我在上面的一条评论中提到的,结果证明我弄错了computing capability compiler选项。我运行了cuda memcheck,发现cuda Api启动失败。找到正确的编译器选项后,一切都很顺利。

使用cuda-m可以缩小启动失败的原因emcheck。另外,你知道CUDA工具包中有一个用于OpenGL可视化的nbody代码示例吗?你可能会发现它很有用。事实上,结果证明我弄错了computing capability编译器选项。我运行了CUDA memcheck,结果证明CUDA Api启动失败。在我找到正确的编译器选项后,所有我ng工作得很有魅力。请发布一个答案,然后接受它(我想必须等一天),所以这个问题就结束了。