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 <sys/time.h>   //引入頭文件
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);

至此,問題得到解決。程序用時合理。如表所示。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章