首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCL内核的定时执行

OpenCL内核的定时执行
EN

Stack Overflow用户
提问于 2014-04-15 05:38:18
回答 1查看 3.3K关注 0票数 3

这是为OpenCL的内核执行计时的正确方式吗?我非常喜欢使用c++包装器(不幸的是,它没有很多计时的例子)。

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2014-04-15 11:41:43

我认为您的方法应该工作得很好(不是吗?)。或者,如果您想对每个调用计时,可以将一个事件传递给enqueueNDRangeKernel,然后在该enqueueNDRangeKernel上调用getProfilingInfo

代码语言:javascript
复制
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>();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23070933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档