我有通过OpenMP并行化的顺序代码。我已经放了相应的pragma并测试它。在测试时,我通过检查主要功能所花费的时间来解释性能提升。奇怪的是通过cpu_time()
和omp_get_wtime()
计算的经过时间会返回两个不同的结果。您认为原因是什么?
通过cpu_time()
函数计算的经过时间与连续时间相似。
在计算开始之前
ctime1_ = cpu_time();
#ifdef _OPENMP
ctime1 = omp_get_wtime();
#endif
计算结束后
ctime2_ = cpu_time();
#ifdef _OPENMP
ctime2 = omp_get_wtime();
#endif
cpu_time()函数定义
double cpu_time(void)
{
double value;
value = (double) clock () / (double) CLOCKS_PER_SEC;
return value;
}
打印结果
printf("%f - %f seconds.\n", ctime2 - ctime1, ctime2_ - ctime1_);
示例结果
7.009537 - 11.575277 seconds.
答案 0 :(得分:16)
clock
函数测量cpu时间,主动花在CPU上的时间,OMP函数测量执行期间的时间,两个完全不同的东西。
您的过程似乎在某个地方等待阻止。
答案 1 :(得分:9)
您观察到的是任何并行应用程序的完全有效结果 - clock()
返回的所有线程的组合 CPU时间通常超过挂钟时间由omp_get_wtime()
测量,除非您的应用程序主要是睡眠或等待。
答案 2 :(得分:6)
clock()
函数返回 CPU 时间,而不是 wall 时间。相反,请使用gettimeofday()
。