C++ OpenCL内核的定时执行

C++ OpenCL内核的定时执行,c++,profiling,opencl,C++,Profiling,Opencl,这是OpenCL内核执行时间计时的正确方法吗?我非常热衷于使用C++包装器(不幸的是没有很多时间的例子)。 cl::CommandQueue队列(上下文、设备、cl\u队列\u分析\u启用,&err); checkErr(err,“无法创建命令队列”); /*热身*/ for(无符号i=0;i

这是OpenCL内核执行时间计时的正确方法吗?我非常热衷于使用C++包装器(不幸的是没有很多时间的例子)。
cl::CommandQueue队列(上下文、设备、cl\u队列\u分析\u启用,&err);
checkErr(err,“无法创建命令队列”);
/*热身*/
for(无符号i=0;i<迭代次数;++i)
{
err=queue.enqueueNDRangeKernel(kernel,cl::NullRange,cl::NDRange(512),cl::NullRange,NULL,NULL);
checkErr(err,“无法将内核排队”);
}
queue.finish();
/*时间核*/
cl::事件开始、停止;
queue.enqueueMarker(&start);
for(无符号i=0;i<迭代次数;++i)
{
err=queue.enqueueNDRangeKernel(kernel,cl::NullRange,cl::NDRange(512),cl::NullRange,NULL,NULL);
checkErr(err,“无法将内核排队”);
}
queue.enqueueMarker(&stop);
停,等等;
开始时间、结束时间;
两倍的总时间;
getProfilingInfo(CL\u PROFILING\u命令\u END和时间\u start);
stop.getProfilingInfo(CL\u PROFILING\u命令\u开始和时间\u结束);
总时间=时间结束-时间开始;
/*结果*/

我认为你的方法应该很有效(不是吗?)。或者,如果您想为每个调用计时,可以将事件传递到
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>();
cl::事件evt;
err=queue.enqueueNDRangeKernel(kernel,cl::NullRange,cl::NDRange(512),cl::NullRange,NULL,&evt);
evt.wait();
运行时间+=evt.getProfilingInfo()-
evt.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>();