主机上的代码是这样的:
#include<time.h>
clock_t start,finish;
start=clock();
ret = clEnqueueNDRangeKernel(.........);
finish=clock();
double time = (double)(finish-start)/(double)(CLOCK_PER_SEC);
为什么完成 - 总是开始0? 是不是因为低分辨率的,或者是有什么错我的计时器代码?
主机上的代码是这样的:
#include<time.h>
clock_t start,finish;
start=clock();
ret = clEnqueueNDRangeKernel(.........);
finish=clock();
double time = (double)(finish-start)/(double)(CLOCK_PER_SEC);
为什么完成 - 总是开始0? 是不是因为低分辨率的,或者是有什么错我的计时器代码?
排队-ING内核是非常便宜的,因为在执行前内核函数调用可以返回。
直到内核被实际执行,你可以使用由clEnqueueNDRangeKernel产生的事件clWaitForEvents。
clEnqueueNDRangeKernel仅排队内核向上运行。 不同于传统的C代码大多数人用来调试时,OpenCL是不是一个连续的过程。 要强制你的代码以串行方式既可以让他们封锁行动(可用时,看到clEnqueueWriteBuffer和clEnqueueReadBuffer),或使用cl_command_queue每个OpenCL的命令后抛出clFinish()。 clFinish()强制在cl_command_queue完成所有的命令。
这使您可以轻松地使用主机的定时器。
其他人所说的剖析,它是剖析的OpenCL调用预期方法事件。
正如其他人已经推断出,如果您使用的是解锁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);