定时间隔始终计算为零(Timed interval always evaluates to zero

2019-10-29 05:32发布

主机上的代码是这样的:

#include<time.h>
clock_t start,finish;
start=clock();
ret = clEnqueueNDRangeKernel(.........);
finish=clock();
double time = (double)(finish-start)/(double)(CLOCK_PER_SEC);

为什么完成 - 总是开始0? 是不是因为低分辨率的,或者是有什么错我的计时器代码?

Answer 1:

排队-ING内核是非常便宜的,因为在执行前内核函数调用可以返回。

直到内核被实际执行,你可以使用由clEnqueueNDRangeKernel产生的事件clWaitForEvents。



Answer 2:

clEnqueueNDRangeKernel仅排队内核向上运行。 不同于传统的C代码大多数人用来调试时,OpenCL是不是一个连续的过程。 要强制你的代码以串行方式既可以让他们封锁行动(可用时,看到clEnqueueWriteBuffer和clEnqueueReadBuffer),或使用cl_command_queue每个OpenCL的命令后抛出clFinish()。 clFinish()强制在cl_command_queue完成所有的命令。

这使您可以轻松地使用主机的定时器。

其他人所说的剖析,它是剖析的OpenCL调用预期方法事件。



Answer 3:

正如其他人已经推断出,如果您使用的是解锁clEnqueueNDRangeKernel(这是不明确的在你的代码),你是不是测量内核的执行时间,因为入列函数返回不作任何保证该内核执行完毕(或者甚至开始它)。 您可以传递给剖析事件的排队方法的引用,然后询问关于它开始和结束时间。 使用CPP包装:

cl::Event timingEvent;
queue_0.enqueueNDRangeKernel(mx_kernel,cl::NullRange,global,local,NULL,&timingEvent);
queue_0.finish();//wait for kernel to be executed
timingEvent.getProfilingInfo(CL_PROFILING_COMMAND_START,&start_time);
timingEvent.getProfilingInfo(CL_PROFILING_COMMAND_END,&end_time);
unsigned long elapsed = (unsigned long)(end_time - start_time);

对于这个工作,你必须启用分析中在对象的构造你的队列:

cl::CommandQueue queue_0 = cl::CommandQueue(context, devices[0], CL_QUEUE_PROFILING_ENABLE);


文章来源: Timed interval always evaluates to zero
标签: c++ c timer opencl