用C ++测量执行时间:clock()和clock_gettime()给出了完全不同的结果

时间:2013-03-22 15:51:04

标签: c++ time clock

我正在尝试测量我的代码性能(这是OpenCL内核的执行),我真的需要了解加速。我试着使用clock()和clock_gettime()函数。

在第一种情况下,我的代码简单明了,并且测量正确:

    struct timespec start_r, start_m, stop_r, stop_m;
    double realtime, monotonic;

    time_t start2 = clock();

    if(clock_gettime(CLOCK_REALTIME, &start_r) == -1) {
        cout << "clock realtime error!" << endl;
    }

    if(clock_gettime(CLOCK_MONOTONIC, &start_m) == -1) {
        cout << "clock realtime error!" << endl;
    }

        double res = 0.0;
        for(unsigned long i = 0; i < total; i++) {
            res += data[i];
        }

    cout << "res = " << res << endl;

    time_t end2 = clock();
    if(clock_gettime(CLOCK_REALTIME, &stop_r) == -1) {
        cout << "clock realtime error!" << endl;
    }

    if(clock_gettime(CLOCK_MONOTONIC, &stop_m) == -1) {
        cout << "clock realtime error!" << endl;
    }

    cout << "Time clock() = " << (end2 - start2)/(double)CLOCKS_PER_SEC << endl;

    realtime = (stop_r.tv_sec - start_r.tv_sec) + (double)(stop_r.tv_nsec - start_r.tv_nsec) / (double)BILLION;
    monotonic = (stop_m.tv_sec - start_m.tv_sec) + (double)(stop_m.tv_nsec - start_m.tv_nsec) / (double)BILLION;

    cout << "Realtime = " << realtime << endl << "Monotonic = " << monotonic << endl;

它给出了可以理解的结果 - 所有三个结果几乎相同。

当谈到测量OpenCL内核的执行时间时,我做的完全一样,但我得到的结果很糟糕:

Time = 0.04
Realtime = 0.26113
Monotonic = 0.26113

你能告诉我它有什么问题吗? 如果这是测量OpenCL内核性能的常见问题,您能否提出测量它的最佳方法?谢谢!

2 个答案:

答案 0 :(得分:2)

如果您有权访问C ++ 11编译器,请考虑使用std :: chrono:http://en.cppreference.com/w/cpp/chrono

新的C ++标准中内置了三种时钟类型:

  1. 的std :: steady_clock
  2. 的std :: SYSTEM_CLOCK
  3. 的std :: high_resolution_clock
  4. 此外,无论您需要微秒精度还是其他内容,该库都经过精心设计,可以处理不同级别的粒度。对于我过去编写的软件(大型工业工程类型模拟),我依靠std :: steady_clock来完成所有时间而没有任何抱怨: - )。

答案 1 :(得分:2)

在某些系统中,函数clock将测量应用程序使用的CPU时间。如果您的应用程序使用OpenCL,它可能会花费大部分时间等待图形卡执行实际计算,因此clock不会给您&#34;获取结果所花费的实际时间& #34 ;.例如,从文件读取数据时使用clock类似 - 从文件读取100MB所需的时间可能是2秒。但是,只需0.01秒的CPU时间就可以将命令发送到硬盘,并在硬盘控制器将数据存储到内存中时收回数据。所以clock给出&#34; 0.01s&#34;而不是&#34; 2s&#34;。