clock函数在计算并行程序用时中存在的问题

参考资料

  1. CSDN - clock()函数在多线程时的问题
  2. 知乎 - C++下四种常用的程序运行时间的计时方法总结
  3. CSDN - count_sort计数排序OpenMP的并行化

问题描述


在完成并行程序作业的过程中(题目如图所求),遇到一个十分诡异的问题。就是计数排序的串行用时始终要小于并行用时,刚开始以为自己的程序有问题,就在网上找来了相同问题的代码进行了对比,参照资料3。发现主体代码写的没什么问题。然后我尝试加大数据的规模,给100000个数据排序,此时问题开始明晰了,并行程序的执行用时明显不到一分钟,但最后的计算用时是120多秒,说明clock()计时函数有问题。

然后查询到资料1,下面引用原文中的一段话。

clock()函数的功能: 这个函数返回从“开启这个程序进程”到“程序中调用C++ clock()函数”时之间的CPU时钟计时单元(clock tick)数当程序单线程或者单核心机器运行时,这种时间的统计方法是正确的。但是如果要执行的代码多个线程并发执行时就会出问题,因为最终end-begin将会是多个核心总共执行的时钟嘀嗒数,因此造成时间偏大。

我们发现多线程并发执行时,end = clock()函数返回值会偏大,下面我们需要找到一个新的计数函数来替代。

解决方法

参照资料2,我们采用方法四,使用gettimeofday()函数,用法示例代码如下:

#include    //引入头文件
int main()
{
    struct timeval t1,t2;
    double timeuse;
    gettimeofday(&t1,NULL);
    fun();
    gettimeofday(&t2,NULL);
    timeuse = (t2.tv_sec - t1.tv_sec) + (double)(t2.tv_usec - t1.tv_usec)/1000000.0;
    printf("timeuse:%lf\n", timeuse);

至此,问题得到解决。程序用时合理。如表所示。
clock函数在计算并行程序用时中存在的问题_第1张图片

你可能感兴趣的:(杂谈,clock)