OpenCL 内核的定时执行
Posted
技术标签:
【中文标题】OpenCL 内核的定时执行【英文标题】:Timing execution of OpenCL kernels 【发布时间】:2014-04-14 21:38:17 【问题描述】:这是为 OpenCL 计时内核执行时间的正确方法吗?我非常热衷于使用 c++ 包装器(不幸的是,它没有很多计时示例)。
cl::CommandQueue queue(context, device, CL_QUEUE_PROFILING_ENABLE, &err);
checkErr(err, "Cannot create the command queue");
/* Warm-up */
for (unsigned i = 0; i < NUMBER_OF_ITERATIONS; ++i)
err = queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(512), cl::NullRange, NULL, NULL);
checkErr(err, "Cannot enqueue the kernel");
queue.finish();
/* Time kernels */
cl::Event start, stop;
queue.enqueueMarker(&start);
for (unsigned i = 0; i < NUMBER_OF_ITERATIONS; ++i)
err = queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(512), cl::NullRange, NULL, NULL);
checkErr(err, "Cannot enqueue the kernel");
queue.enqueueMarker(&stop);
stop.wait();
cl_ulong time_start, time_end;
double total_time;
start.getProfilingInfo(CL_PROFILING_COMMAND_END, &time_start);
stop.getProfilingInfo(CL_PROFILING_COMMAND_START, &time_end);
total_time = time_end - time_start;
/* Results */
cout << "Execution time in milliseconds " << total_time / (float)10e6 / NUMBER_OF_ITERATIONS << endl;
【问题讨论】:
【参考方案1】:我认为您的方法应该可以正常工作(不是吗?)。或者,如果您想为每次通话计时,您可以将一个事件传递给enqueueNDRangeKernel
,然后在该enqueueNDRangeKernel
上调用getProfilingInfo
。
cl::Event evt;
err = queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(512), cl::NullRange, NULL, &evt);
evt.wait();
elapsed += evt.getProfilingInfo<CL_PROFILING_COMMAND_END>() -
evt.getProfilingInfo<CL_PROFILING_COMMAND_START>();
【讨论】:
以上是关于OpenCL 内核的定时执行的主要内容,如果未能解决你的问题,请参考以下文章