Come creare un timer ad alta risoluzione in Linux per misurare le prestazioni del programma?

Sto provando a confrontare GPU con le prestazioni della CPU. Per la GPU NVIDIA ho usato i tipi cudaEvent_t per ottenere un tempismo molto preciso.

Per la CPU ho usato il seguente codice:

 // Timers clock_t start, stop; float elapsedTime = 0; // Capture the start time start = clock(); // Do something here ....... // Capture the stop time stop = clock(); // Retrieve time elapsed in milliseconds elapsedTime = (float)(stop - start) / (float)CLOCKS_PER_SEC * 1000.0f; 

Apparentemente, quel pezzo di codice è buono solo se contate in pochi secondi. Inoltre, i risultati talvolta appaiono piuttosto strani.

Qualcuno sa di un modo per creare un timer ad alta risoluzione in Linux?

Controlla clock_gettime , che è un’interfaccia POSIX per i timer ad alta risoluzione.

Se, dopo aver letto la pagina di manuale, ti rimane la domanda sulla differenza tra CLOCK_REALTIME e CLOCK_MONOTONIC , vedi Differenza tra CLOCK_REALTIME e CLOCK_MONOTONIC?

Vedere la seguente pagina per un esempio completo: http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/

 #include  #include 

Per riassumere le informazioni presentate finora, queste sono le due funzioni richieste per le applicazioni tipiche.

 #include  

Ecco un esempio di come usarli nel cronometrare quanto tempo ci vuole per calcolare la varianza di un elenco di input.

 struct timespec vartime = timer_start(); // begin a timer called 'vartime' double variance = var(input, MAXLEN); // perform the task we want to time long time_elapsed_nanos = timer_end(vartime); printf("Variance = %f, Time taken (nanoseconds): %ld\n", variance, time_elapsed_nanos); 
 struct timespec t; clock_gettime(CLOCK_REALTIME, &t); 

c’è anche CLOCK_REALTIME_HR, ma non sono sicuro se faccia qualche differenza

Ti interessa il tempo di parete (quanto tempo è effettivamente trascorso) o il numero di cicli (quanti cicli)? Nel primo caso, dovresti usare qualcosa come gettimeofday .

Il timer con la risoluzione più alta utilizza l’istruzione di assemblaggio RDTSC x86. Tuttavia, questo misura i ticchetti dell’orologio, quindi è necessario assicurarsi che la modalità di risparmio energetico sia disabilitata.

La pagina wiki di TSC fornisce alcuni esempi: http://en.wikipedia.org/wiki/Time_Stamp_Counter

implementazione di epoll: https://github.com/ielife/simple-timer-for-c-language

usare in questo modo:

 timer_server_handle_t *timer_handle = timer_server_init(1024); if (NULL == timer_handle) { fprintf(stderr, "timer_server_init failed\n"); return -1; } ctimer timer1; timer1.count_ = 3; timer1.timer_internal_ = 0.5; timer1.timer_cb_ = timer_cb1; int *user_data1 = (int *)malloc(sizeof(int)); *user_data1 = 100; timer1.user_data_ = user_data1; timer_server_addtimer(timer_handle, &timer1); ctimer timer2; timer2.count_ = -1; timer2.timer_internal_ = 0.5; timer2.timer_cb_ = timer_cb2; int *user_data2 = (int *)malloc(sizeof(int)); *user_data2 = 10; timer2.user_data_ = user_data2; timer_server_addtimer(timer_handle, &timer2); sleep(10); timer_server_deltimer(timer_handle, timer1.fd); timer_server_deltimer(timer_handle, timer2.fd); timer_server_uninit(timer_handle); 

clock_gettime(2)