【问题标题】:Measuring execution time in C++: clock() and clock_gettime() give absolutely different results在 C++ 中测量执行时间:clock() 和 clock_gettime() 给出完全不同的结果
【发布时间】:2013-03-22 15:51:03
【问题描述】:

我正在尝试测量我的代码性能(即 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 内核性能的常见问题,您能否提出衡量它的最佳方法?谢谢!

【问题讨论】:

    标签: c++ time clock


    【解决方案1】:

    如果您可以访问 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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-27
        • 2017-04-10
        • 2018-10-12
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        相关资源
        最近更新 更多