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 内核的定时执行的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核定时器

Linux内核定时器

《Linux内核设计与实现》读书笔记- 定时器和时间管理

驱动内核定时器的使用

Linux内核定时器

手把手教你写Linux设备驱动---定时器(基于友善之臂4412开发板)