Ho il seguente ciclo che misura il tempo dei miei kernel:Misurare il tempo di esecuzione di OpenCL kernel
double elapsed = 0;
cl_ulong time_start, time_end;
for (unsigned i = 0; i < NUMBER_OF_ITERATIONS; ++i)
{
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, NULL, 0, NULL, &event); checkErr(err, "Kernel run");
err = clWaitForEvents(1, &event); checkErr(err, "Kernel run wait fro event");
err = clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START, sizeof(time_start), &time_start, NULL); checkErr(err, "Kernel run get time start");
err = clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END, sizeof(time_end), &time_end, NULL); checkErr(err, "Kernel run get time end");
elapsed += (time_end - time_start);
}
Poi divido elapsed
da NUMBER_OF_ITERATIONS
per ottenere la stima finale. Tuttavia, temo che il tempo di esecuzione dei singoli kernel sia troppo piccolo e quindi possa introdurre incertezza nelle mie misurazioni. Come posso misurare il tempo impiegato da tutti i kernel NUMBER_OF_ITERATIONS
combinati?
Puoi suggerire uno strumento di profilazione, che potrebbe essere d'aiuto, poiché non è necessario accedere a questi dati a livello di programmazione. Uso NVCLIA's OpenCL.
Grazie per la risposta ! Stiamo parlando di decine di microsecondi e "NUMBER_OF_ITERATIONS" è arbitrario in realtà. Per ora stavo usando 30. Ho bisogno di un buon numero per sbarazzarsi degli errori. – user1096294