OpenCL测量内核时间

OpenCL测量内核时间,opencl,Opencl,我有个问题。我在循环中有两个内核,位于顶部。我希望看到所有运行内核的总时间,即使第一个内核每秒运行10次,例如5次 多谢各位 对于(int-arrayLength=minLengthArray;arrayLength部分取决于如何“安排”时间 一些一般提示: 创建命令队列时,必须通过传递CL\u queue\u profiling\u enable标志,为命令队列启用事件分析: commands = clCreateCommandQueue( context, device, CL_QU

我有个问题。我在循环中有两个内核,位于顶部。我希望看到所有运行内核的总时间,即使第一个内核每秒运行10次,例如5次

多谢各位


对于(int-arrayLength=minLengthArray;arrayLength部分取决于如何“安排”时间

一些一般提示:

创建命令队列时,必须通过传递
CL\u queue\u profiling\u enable
标志,为命令队列启用事件分析:

commands = clCreateCommandQueue(
    context, device, CL_QUEUE_PROFILING_ENABLE, &err);
在循环中,您必须为内核调用创建事件。这里有不同的选项:您可以收集内核调用的事件(在某些向量、列表或数组中),或者单独执行每个事件的计时。基本方法如下,对第一个内核使用sketeched(错误处理省略)

然后可以相应地累积持续时间(以纳秒为单位)。第二个内核可以使用相同的方案

但是,你应该考虑一些事情:

  • 其中包含一些样板代码。也许您希望将其提取到一个方便的方法中,类似于
    duration=processEvent(event0)
    ,它等待给定事件,然后计算事件持续时间,释放事件并返回计算的持续时间
  • 在某些情况下,代码等待事件可能会影响运行时行为
最重要的是:

    <> LI>如果你不需要这个“编程访问”,你应该考虑简单地在一个剖析器中运行你的代码。这会给你所需的信息,即命令队列中每个内核所花费的时间。
需要澄清的是,您是想要一个数字来表示“运行所有这些内核总共花费了T秒”,还是想要每个单独内核调用的执行时间?
cl_event event0;  // creating an event variable for timing 
clEnqueueNDRangeKernel(commands, ddEvenMergeSortSharedKernel, 
    1, NULL, &global, &local, 0, NULL, &event0); // Pass in event here

clWaitForEvents (1, &event0); // Wait for the event

// Obtain the start- and end time for the event
unsigned long start = 0;
unsigned long end = 0;
clGetEventProfilingInfo(event0,CL_PROFILING_COMMAND_START,
    sizeof(cl_ulong),&start,NULL);       
clGetEventProfilingInfo(event0,CL_PROFILING_COMMAND_END,
    sizeof(cl_ulong),&end,NULL);

// Compute the duration in nanoseconds
unsigned long duration = end - start;

// Don't forget to release the vent
clReleaseEvent(event0);