如何定时器英伟达SDK的例子?

如何定时器英伟达SDK的例子?,sdk,opencl,nvidia,Sdk,Opencl,Nvidia,我试着给这个例子计时。我使用clGetProfilingInfo,GPU计时器来记录内核执行所花费的时间。时间是以毫秒为单位计算的。但是输出很奇怪。 代码和输出如下: cl_ulong start,end; cl_event event_ker_x; ciErr1 = clEnqueueNDRangeKernel(cqCommandQueue, ckKernel, 1, NULL, &szGlobalWorkSize, &szLocalWorkSize, 0, NULL,

我试着给这个例子计时。我使用clGetProfilingInfo,GPU计时器来记录内核执行所花费的时间。时间是以毫秒为单位计算的。但是输出很奇怪。 代码和输出如下:

    cl_ulong start,end;
cl_event event_ker_x;
ciErr1 = clEnqueueNDRangeKernel(cqCommandQueue, ckKernel, 1, NULL, &szGlobalWorkSize, &szLocalWorkSize, 0, NULL, &event_ker_x);
shrLog("clEnqueueNDRangeKernel (VectorAdd)...\n");
if (ciErr1 != CL_SUCCESS)
{
    shrLog("Error in clEnqueueNDRangeKernel, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
    Cleanup(argc, argv, EXIT_FAILURE);
}
clGetEventProfilingInfo(event_ker_x, CL_PROFILING_COMMAND_START, sizeof(cl_ulong), &start, NULL);
clGetEventProfilingInfo(event_ker_x, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &end, NULL);
float ker_x_time= (end-start) * 1.0e-6f;
shrLog("kernel execution time is : %f\n", ker_x_time);
clEnqueueNDRangeKernel (VectorAdd)...
kernel execution time is : 18446744027136.000000
clEnqueueReadBuffer (Dst)...

看起来您与此人有类似的问题:


在OpenCL中,
clEnqueueNDRangeKernel
将内核排队运行,但不一定立即执行内核。若要使用事件评测内核,请尝试在
clenqueueredbuffer
之后检查执行时间,或者在
clEnqueueNDKernelRange
之后添加一个
clFinish(…)

也许在检索评测信息之前我需要添加clWaitForEvents(),对吗?看起来您和此人有相同的问题:thx。我已经掌握了处理内核时间的方法。但是你能告诉我如何记录总的执行时间吗?我也希望使用clGetEventProfilingInfo,因为它似乎是我们能获得的最高分辨率。在clEnqueuNDKernelRange()之后添加clFinish()。我指的是程序的总执行时间,而不仅仅是内核执行时间。THX查看其他线程,您可以使用主机计时器和clFinish()或者,您可以对每个OpenCL调用使用分析事件,并对时间进行汇总。取决于你需要的精度,主机定时器通常对我的工作足够好。