一尘不染

如何在Linux中创建高分辨率计时器以测量程序性能?

linux

我正在尝试比较GPU与CPU的性能。对于NVIDIA GPU,我一直在使用这些cudaEvent_t类型来获得非常精确的时间。

对于CPU,我一直在使用以下代码:

// 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;

显然,这段代码只有在您数秒的情况下才是好的。而且,结果有时出来很奇怪。

有谁知道在Linux中创建高分辨率计时器的某种方法?


阅读 317

收藏
2020-06-02

共1个答案

一尘不染

签出clock_gettime,这是高分辨率计时器的POSIX接口。

如果已经阅读手册页,留给你想知道的区别CLOCK_REALTIMECLOCK_MONOTONIC,看到CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别?

有关完整的示例,请参见以下页面:http : //www.guyrutenberg.com/2007/09/22/profiling-code-
using-clock_gettime/

#include <iostream>
#include <time.h>
using namespace std;

timespec diff(timespec start, timespec end);

int main()
{
    timespec time1, time2;
    int temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    for (int i = 0; i< 242000000; i++)
        temp+=temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
    return 0;
}

timespec diff(timespec start, timespec end)
{
    timespec temp;
    if ((end.tv_nsec-start.tv_nsec)<0) {
        temp.tv_sec = end.tv_sec-start.tv_sec-1;
        temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
    } else {
        temp.tv_sec = end.tv_sec-start.tv_sec;
        temp.tv_nsec = end.tv_nsec-start.tv_nsec;
    }
    return temp;
}
2020-06-02