OpenMP time 和 clock() 给出两个不同的结果
Posted
技术标签:
【中文标题】OpenMP time 和 clock() 给出两个不同的结果【英文标题】:OpenMP time and clock() give two different results 【发布时间】:2012-05-27 06:34:01 【问题描述】:我有通过 OpenMP 并行化的顺序代码。我已经输入了相应的编译指示并对其进行了测试。我通过检查在 main 函数中花费的时间来衡量性能增益。
奇怪的是通过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.
【问题讨论】:
【参考方案1】:clock
函数测量 CPU 时间,即您在 CPU 上花费的时间,OMP 函数测量执行期间经过的时间,这是两个完全不同的东西。
您的进程似乎在某处等待时被阻塞了。
【讨论】:
在 Windows 上,clock()
实际上测量的是挂墙时间。
@Mysticial,再次,他们似乎遵循自己的心情,而不是标准。标准规定:clock 函数返回实现与程序使用的处理器时间的最佳近似值,因为该实现定义的时代开始时仅与程序调用相关。
@JensGustedt 听起来他们遵循标准。 实现的最佳近似似乎是墙上时间kek【参考方案2】:
您观察到的结果对于任何并行应用程序都是完全有效的 - clock()
返回的所有线程的组合 CPU 时间 通常超过 挂钟时间由omp_get_wtime()
衡量,除非您的应用程序大部分时间处于休眠或等待状态。
【讨论】:
【参考方案3】:clock()
函数返回 CPU 时间,而不是 wall 时间。请改用gettimeofday()
。
【讨论】:
以上是关于OpenMP time 和 clock() 给出两个不同的结果的主要内容,如果未能解决你的问题,请参考以下文章