clCreateContext在OpenCL中花费大量时间

clCreateContext在OpenCL中花费大量时间,opencl,gpu,nvidia,Opencl,Gpu,Nvidia,我正在开发一个openCL程序,一切都很好,但问题是clCreateContext函数调用占用了大部分程序执行时间(程序运行约400毫秒,其中380毫秒仅用于创建上下文) 内核在创建上下文和命令队列后在线编译。我的系统只包含一个OpenCL设备(Nvidia Pascal) 我在Nvidia GeForce GT 640上尝试了相同的程序,创建上下文所需的时间更少(大约100毫秒),但与执行时间相比仍然太长(我打印了设备名称,它们都很好) 向量平台; cl_设备id设备id; clGetPlat

我正在开发一个openCL程序,一切都很好,但问题是clCreateContext函数调用占用了大部分程序执行时间(程序运行约400毫秒,其中380毫秒仅用于创建上下文)

内核在创建上下文和命令队列后在线编译。我的系统只包含一个OpenCL设备(Nvidia Pascal)

我在Nvidia GeForce GT 640上尝试了相同的程序,创建上下文所需的时间更少(大约100毫秒),但与执行时间相比仍然太长(我打印了设备名称,它们都很好)

向量平台;
cl_设备id设备id;
clGetPlatformIDs(0、NULL和ret_num_平台);
ret=clGetPlatformIDs(ret_num_platforms,&platforms[0],NULL);
ret=CLGetDeviceID(平台[0],设备类型,1,&device\u id,&ret\u num\u设备);
时间戳[0]=get_timestamp();
context=clCreateContext(NULL,1,&device\u id,NULL,NULL,&ret);
时间戳[1]=get_timestamp();
contextTime=(时间戳[1]-时间戳[0])/1000.0L;

为什么你觉得它太慢了?这似乎是您在执行过程中会使用的一次调用类型。我创建了以前的openCL程序,而clCreateContext并没有花费那么多时间,可能是构建程序,但我认为创建上下文并不是一个花费那么多时间的过程(程序构建时间为7毫秒,创建上下文为380毫秒!),这是有意义的吗?你考虑过通过<代码> char */COD>来查看你是否有错误消息?是的,这只是一个简化的版本,我在每个调用下都有一个错误检查功能。在一个典型的OpenCL应用程序中,您只需要创建一次上下文,并且希望程序将大部分时间花在OpenCL设备上的实际计算上。因此,如果clCreateContext花费大量时间,这应该没有多大关系。但在某些情况下,如果这成为瓶颈,那么驱动程序供应商必须解决这个问题。任何事情都可能发生,一些内核可能被构建等等。
vector<cl_platform_id> platforms;
cl_device_id device_id;
clGetPlatformIDs(0, NULL, &ret_num_platforms);
ret = clGetPlatformIDs(ret_num_platforms, &platforms[0], NULL);
ret = clGetDeviceIDs(platforms[0], deviceType, 1, &device_id, &ret_num_devices);
timeStamps[0] = get_timestamp();
context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
timeStamps[1] = get_timestamp();
contextTime=(timeStamps[1]-timeStamps[0]) / 1000.0L;
cout << "   Context Time: " << contextTime << " ms\n";
command_queue = clCreateCommandQueue(context, device_id, CL_QUEUE_PROFILING_ENABLE, &ret);