1

这是我的 C++ 代码。

double start_time = time(NULL);
double start_clock = clock();

#pragma omp parallel for private(i) 
for(i=0;i<max_i;i++)
      PROCESS(i);

double end_time = time(NULL);
double end_clock = clock();

printf("%lf second(s)\n", end_time-start_time);
printf("%lf second(s)\n", (end_clock-start_clock)/CLOCKS_PER_SEC);

这就是输出。

took 2.000000 second(s)
took 11.410000 second(s)

有谁知道为什么这些不一致?有没有其他方法来衡量这个?顺便说一句,根据我在这里看到的时间,2 秒似乎更合理。

4

3 回答 3

8

clock()函数返回您的进程自启动以来使用的CPU 时间量,而不是根据实时时钟的绝对时间。

在另一条评论中,您说这CODE_BLOCK是一个并行循环 - 这意味着在您的情况下,它在 2 秒的实际(“挂钟”)时间内使用了相当于 11.41 秒的 CPU 时间。显然,您正在并行使用大约 6 个 CPU 的能力。

于 2012-09-01T00:20:03.353 回答
1

这可能会有所帮助:

int main() {
    double start_time = time(NULL);
    double start_clock = clock();

    sleep(10);

    double end_time = time(NULL);
    double end_clock = clock();

    printf("%lf second(s)\n", end_time-start_time);
    printf("%lf second(s)\n", (end_clock-start_clock)/CLOCKS_PER_SEC);
}

这个的输出是:

10.000000 second(s)
0.000070 second(s)

所以,如果你以任何方式调用内核,或者跳出处理器,那只会出现在两个计时器之一中。

从说明您正在使用 OpenMP 的说明中:您可能还看到的是乘数效应。如果您的 openMP 线程使用 8 个内核,则第二个计时器的计数将是第一个计时器的 8 倍。

于 2012-09-01T00:17:45.900 回答
0

您没有发布代码块中的内容,但通常时间会有所不同,因为您正在测量自程序启动以来程序一直在运行的时钟滴答的绝对时间以及测量实际数量程序消耗的 CPU 时间。这是两个截然不同的东西。

此外,返回的值clock()也不是浮点值;它们应该是clock_t类型值,它是一个整数类型。time()返回time_t类型也是如此。因此,在您执行某种类型的除法并且您想要一个浮点值作为结果之前,无需将它们分配给浮点类型。

于 2012-09-01T00:14:17.833 回答