Try   HackMD

2017q1 Homework1 (compute-pi)

contributed by < hunng >

Reviewed by divazone

  • 請盡快將修改提交至github上
  • 為何OpenMP(2 threads)的突起較多?而4 threas卻沒這現象?

開發環境

  • OS: Ubuntu 16.04.2 LTS
  • Architecture: x86_64
  • CPU op-mode(s): 32-bit, 64-bit
  • CPU(s): 4
  • CPU Model name: Intel® Core i5-4200U CPU @ 1.60 GHz
  • L1d cache: 32 K
  • L1i cache: 32 K
  • L2 cache: 256 K
  • L3 cache: 3072 K
  • MemTotal: 8056592 KB

原程式分析

圖中有過多的突起,並且因為這些突起導致其他數據的增益不明顯

    clock_gettime(CLOCK_ID, &start);
    for (i = 0; i < loop; i++) {
        compute_pi_baseline(N);
    }
    clock_gettime(CLOCK_ID, &end);

可以利用信賴區間來捨棄部份不合理數據(參考自 廖健富

信賴區間程式碼實作

因為設想未來可能可以在資料分析的狀況使用

設計一個 struct 去實現

typedef struct __SIGMA_NODE {
    double stor;
    int confide;
    struct __SIGMA_NODE *NEXT;
} numb;

多設定一個 confide 是要在 confidenum() 後,認定此數據不具參考性,即忽略此數據

以下為對應的 function

numb *appendnum(numb *a, double addit);
double sumnum(numb *a);
double avernum(numb *a);
double sigmanum(numb *a);
void confidenum(numb *a);

套用進 benchmark_clock_gettime.c

    for (i = 0; i < loop; i++) {
	clock_gettime(CLOCK_ID, &start);	
        compute_pi_baseline(N);
	clock_gettime(CLOCK_ID, &end);
	a = appendnum(a, (double) (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec)/ONE_SEC);
    }
    confidenum(HEAD);
    printf("%lf ", avernum(HEAD));