1

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

4

2 回答 2

2

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

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

  1. std::steady_clock
  2. 标准::系统时钟
  3. std::high_resolution_clock

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

于 2013-03-22T16:06:04.080 回答
2

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

于 2013-03-22T16:24:53.890 回答