我正在编写一个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中的事件不相同。 但是在我的代码中,我只有一个上下文,有人可以帮我找到为什么会出现这个错误吗? 非常感谢!