将内核排入两个队列时opencl中的无效上下文错误

时间:2014-07-16 11:38:29

标签: opencl

我正在编写一个opencl代码,可以在3台设备上运行。我以下列方式创建上下文,程序,设备和内核:

cl_uint deviceCount;
err = clGetDeviceIDs(platform,CL_DEVICE_TYPE_GPU,0,NULL,&deviceCount);
err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, deviceCount, device, NULL);
cl_context_properties context_prop[3]={(cl_context_properties)CL_CONTEXT_PLATFORM,(cl_context_properties)platform,
0};
context = clCreateContext(context_prop,deviceCount,device, NULL, NULL, &err);
program = clCreateProgramWithSource(context, 1,
                                    (const char**)&program_buffer, &program_size, &err);
err = clBuildProgram(program, deviceCount, device, NULL, NULL, NULL);
queue[0]= clCreateCommandQueue(context, device[0], 0, &err);
queue[1]= clCreateCommandQueue(context, device[1], 0, &err);
for (i=0; i<NUM_KERNELS; i++) {
    kernel[i] = clCreateKernel(program,kernel_names[i],&err);
    if (err < 0) {
        perror("Couldn't create Kernel");
        printf("%d,%d",i,err);
        exit(1);
    }
}

所有缓冲区都按以下方式创建:

    buffer = clCreateBuffer(context,CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR,size,pointer,&err);

然后我按照以下方式将相同的内核排入队列[0]和队列[1]:

 err = clSetKernelArg(kernel[6],0,sizeof(cl_mem),&grad_buf[0]);
    err |= clSetKernelArg(kernel[6],1,sizeof(num_space),&num_space);
    err = clEnqueueNDRangeKernel(queue[0],kernel[6],2,NULL,global_size3,NULL,2,&waitlist1[2],&waitlist1[4]);
    err = clSetKernelArg(kernel[6],0,sizeof(cl_mem),&grad_buf[1]);
    err |= clSetKernelArg(kernel[6],1,sizeof(num_space),&num_space);
    err = clEnqueueNDRangeKernel(queue[0],kernel[6],2,NULL,global_size3,NULL,2,&waitlist2[2],&waitlist2[4]);

我在第二个clEnqueueNDRangeKernel函数中得到错误-34,这意味着CL_INVALID_ CONTEXT。 CL_INVALID_CONTEXT,如果与command_queue和内核关联的上下文不相同,或者与command_queue关联的上下文和event_wait_list中的事件不相同。 但是在我的代码中,我只有一个上下文,有人可以帮我找到为什么会出现这个错误吗? 非常感谢!

0 个答案:

没有答案