gpt4 book ai didi

profiling - 如何通过一个 clFinish 分析顺序启动的多个 OpenCL 内核?

转载 作者:行者123 更新时间:2023-12-02 23:40:21 26 4
gpt4 key购买 nike

我有多个内核,它们按顺序启动,如下所示:

        clEnqueueNDRangeKernel(..., kernel1, ...);
clEnqueueNDRangeKernel(..., kernel2, ...);
clEnqueueNDRangeKernel(..., kernel3, ...);

并且,多个内核共享一个全局缓冲区。

现在,我分析每个内核的执行情况,并通过在 clEnqueueNDRangeKernel 之后添加代码块来将它们相加以计算总执行时间:

        clFinish(cmdQueue);
status = clGetEventProfilingInfo(...,&starttime,...);
clGetEventProfilingInfo(...,&endtime,...);
time_spent = endtime - starttime;

我的问题是如何通过一个 clFinish 来分析三个内核? (就像在最后一次内核启动后添加一个 clFinish() 一样)。

是的,我给每个 clEnqueueNDRangeKernel 不同的时间事件,并得到大的负数。详细信息:

clEnqueueNDRangeKernel(cmdQueue,...,&timing_event1);
clFinish(cmdQueue);
clGetEventProfilingInfo(timing_event1,CL_PROFILING_COMMAND_START,sizeof(cl_ulong),&starttime1,NULL);
clGetEventProfilingInfo(timing_event1,CL_PROFILING_COMMAND_END,sizeof(cl_ulong),&endtime1,NULL);
time_spent1 = endtime1 - starttime1;

clEnqueueNDRangeKernel(cmdQueue,...,&timing_event2);
clFinish(cmdQueue);
clGetEventProfilingInfo(timing_event2,CL_PROFILING_COMMAND_START,sizeof(cl_ulong),&starttime2,NULL);
clGetEventProfilingInfo(timing_event2,CL_PROFILING_COMMAND_END,sizeof(cl_ulong),&endtime2,NULL);
time_spent2 = endtime2 - starttime2;

clEnqueueNDRangeKernel(cmdQueue,...,&timing_event3);
clFinish(cmdQueue);
clGetEventProfilingInfo(timing_event3,CL_PROFILING_COMMAND_START,sizeof(cl_ulong),&starttime3,NULL);
clGetEventProfilingInfo(timing_event3,CL_PROFILING_COMMAND_END,sizeof(cl_ulong),&endtime3,NULL);
time_spent3 = endtime3 - starttime3;

time_spent_all_0 = time_spent1 + time_spent2 + time_spent3;
time_spent_all_1 = endtime3 - starttime1;

如果我有每个 clFinish,则所有分析值都是合理的,但 time_spent_all_1 大约是 time_spent_all_0 的 2 倍。如果我删除除最后一个 clFinish 之外的所有 clFinish,则所有分析值都是不合理的。

感谢 Eric Bainville,我已经得到了我想要的结果:通过一个 clFinish 分析多个 clEnqueueNDRangeKernel。以下是我使用的最终代码:

clEnqueueNDRangeKernel(cmdQueue,...,&timing_event1);
clEnqueueNDRangeKernel(cmdQueue,...,&timing_event2);
clEnqueueNDRangeKernel(cmdQueue,...,&timing_event3);
clFinish(cmdQueue);

clGetEventProfilingInfo(timing_event1,CL_PROFILING_COMMAND_START,sizeof(cl_ulong),&starttime,NULL);
clGetEventProfilingInfo(timing_event3,CL_PROFILING_COMMAND_END,sizeof(cl_ulong),&endtime,NULL);
time_spent = endtime - starttime;

最佳答案

每个clEnqueueNDRangeKernel都会创建自己的cl_event:调用的最后一个参数是指向cl_event的指针;如果最后一个参数不为 0,则会创建一个新事件。

命令完成后,可以查询关联事件的开始/结束分析信息。该事件必须在使用后释放(调用clReleaseEvent)。

clFinish 会阻塞,直到所有排队的命令完成为止。

您只需调用一次clFinish,即可查询所有事件的分析信息。

关于profiling - 如何通过一个 clFinish 分析顺序启动的多个 OpenCL 内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11363780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com