Просто для других, которые приходят к ней за помощью: краткое введение в профилирование времени выполнения ядра с OpenCL
Включить режим профилирования:
cmdQueue = clCreateCommandQueue(context, *devices, CL_QUEUE_PROFILING_ENABLE, &err);
Профилирование ядра:
cl_event prof_event;
clEnqueueNDRangeKernel(cmdQueue, kernel, 1 , 0, globalWorkSize, NULL, 0, NULL, &prof_event);
Считать данные профилирования в:
cl_ulong ev_start_time=(cl_ulong)0;
cl_ulong ev_end_time=(cl_ulong)0;
clFinish(cmdQueue);
err = clWaitForEvents(1, &prof_event);
err |= clGetEventProfilingInfo(prof_event, CL_PROFILING_COMMAND_START, sizeof(cl_ulong), &ev_start_time, NULL);
err |= clGetEventProfilingInfo(prof_event, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &ev_end_time, NULL);
Рассчитать время выполнения ядра:
float run_time_gpu = (float)(ev_end_time - ev_start_time)/1000; // in usec
Профилирование отдельных рабочих элементов / рабочих групп пока невозможно.
Вы можете установить globalWorkSize = localWorkSize для профилирования. Тогда у вас есть только одна рабочая группа.
Кстати: профилирование одного рабочего элемента (некоторых рабочих элементов) не очень полезно. Только с некоторыми рабочими элементами вы не сможете скрыть задержки памяти и накладные расходы, ведущие к бессмысленным измерениям.