基于OpenCL事件的计时器(c ++包装器)

时间:2018-06-13 21:00:10

标签: c++ timer opencl

我是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秒。

我的代码中是否遗漏了一些重要内容?有没有同步或无效初始化的东西?谢谢!

1 个答案:

答案 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);