我是OpenCL的新手,遇到了测量内核运行时的一些问题。 我使用c ++包装器来处理事件和分析。
context = Context(device);
queue = CommandQueue(context, device);
/** do something */
cl_ulong time_end, time_start, time_total;
Event event;
// Launch the kernel
queue.enqueueNDRangeKernel(kernel, NULL, global_work_size, local_work_size, NULL, &event);
queue.finish();
// Get event info and print GPU runtime
event.wait();
event.getProfilingInfo(CL_PROFILING_COMMAND_START, &time_start);
event.getProfilingInfo(CL_PROFILING_COMMAND_END, &time_end);
time_total = time_end - time_start;
printf("%lu\t%lu\t", time_total);
printf("\nRendering time (ms): \t%lu\n\n", time_total);
我得到的结果显然不符合规模。
6052843157020279026 140734592538400
Rendering time (ms): 12394041651281810990
然后我使用sys / time.h提供的普通计时器,得到0.02秒。
我的代码中是否遗漏了一些重要内容?有没有同步或无效初始化的东西?谢谢!
答案 0 :(得分:0)
需要使用明确请求创建命令队列,以包括分析信息,或者它们的分析命令无法正常工作。
我不认识您用来创建OpenCL对象的API,但这就是原生OpenCL API中的样子:
//OpenCL versions 1.1-
cl_command_queue queue = clCreateCommandQueue(context, device, CL_QUEUE_PROFILING_ENABLE, &err);
//OpenCL versions 1.2+
cl_command_queue_properties properties[] {CL_QUEUE_PROPERTIES, CL_QUEUE_PROFILING_ENABLE, 0};
cl_command_queue queue = clCreateCommandQueueWithProperties(context, device, properties, &err);