參考資料
問題描述
在完成並行程序作業的過程中(題目如圖所求),遇到一個十分詭異的問題。就是計數排序的串行用時始終要小於並行用時,剛開始以爲自己的程序有問題,就在網上找來了相同問題的代碼進行了對比,參照資料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);
至此,問題得到解決。程序用時合理。如表所示。