Wie profiliert man sequentiell gestartete mehrere OpenCL-Kernel mit einem clFinish?

Ich habe mehrere Kernel und sie werden nacheinander wie folgt gestartet:

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

und mehrere Kernel teilen sich einen globalen Puffer.

Jetzt profiliere ich jede Kernelausführung und addiere sie, um die gesamte Ausführungszeit zu zählen, indem ich den Codeblock nach clEnqueueNDRangeKernel hinzufüge:

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

Meine Frage ist, wie man drei Kernel zusammen mit einem clFinish profiliert. (wie das Hinzufügen eines clFinish () nach dem letzten Start des Kernels).

Ja, ich gebe jedem clEnqueueNDRangeKernel eine andere Zeit und erhalte eine große negative Zahl. Die detailinformationen:

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;

Wenn ich jedes clFinish habe, sind alle Profiling-Werte vernünftig, aber time_spent_all_1 ist ungefähr zweimal so lang wie time_spent_all_0. Wenn ich bis auf das letzte clFinish alle clFinish entferne, sind alle Profiling-Werte nicht sinnvoll.

Dank Eric Bainville habe ich das gewünschte Ergebnis erzielt: Profilerstellung mehrerer clEnqueueNDRangeKernel durch einen clFinish. Folgendes ist der endgültige Code, den ich verwende:

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;

Antworten auf die Frage(1)

Ihre Antwort auf die Frage