这是我的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秒似乎更合理。
答案 0 :(得分:8)
clock()
函数返回进程自启动以来使用的 CPU时间的数量,而不是根据实时时钟的绝对时间。
在另一条评论中你说CODE_BLOCK
是一个并行循环 - 这意味着在你的情况下,它在2秒的实际(“挂钟”)时间内使用相当于11.41秒的CPU时间。很明显,你并行使用大约6个CPU的功能。
答案 1 :(得分: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倍。
答案 2 :(得分:0)
您没有发布代码块中的内容,但一般情况下,时间会有所不同,因为您正在测量自程序启动以来程序运行的时钟周期中的绝对时间以及测量程序消耗的实际CPU时间量。这是两个截然不同的事情。
从clock()
返回的值也不是浮点值;它们应该是clock_t
类型值,这是一个整数类型。返回time()
类型的time_t
也是如此。因此,在执行某种类型的除法之前,不需要将它们分配给浮点类型,并且您希望将浮点值作为结果。