Try   HackMD

2016q3 Homework 1 (compute-pi) ElfayR

系統環境

  • AMD Athlon 64 X2 Dual Core Processor 4400+
  • Core: 2
  • Memory: 3GB ram
  • L1d cache: 64K
  • L1i cache: 64K
  • L2 cache: 512K

作業要求

  • 在 GitHub 上 fork compute-pi,嘗試重現實驗,包含分析輸出
    • 注意: 要增加圓周率計算過程中迭代的數量,否則時間太短就看不出差異
  • 詳閱廖健富提供的詳盡分析,研究 error rate 的計算,以及為何思考我們該留意後者
  • phonebok 提到的 gnuplot 作為 $ make gencsv 以外的輸出機制,預期執行 $ make plot 後,可透過 gnuplot 產生前述多種實做的效能分析比較圖表
  • 可善用 rayatracing 提到的 OpenMP, software pipelining, 以及 loop unrolling 一類的技巧來加速程式運作
  • 詳閱前方 "Wall-clock time vs. CPU time",思考如何精準計算時間
  • 除了研究程式以外,請證明 Leibniz formula for π,並且找出其他計算圓周率的方法
  • 將你的觀察、分析,以及各式效能改善過程,並善用 gnuplot 製圖,紀錄於「作業區

實作

  • 一開始下make check就發生 coredump,用gdb dump出來發現死在奇怪的地方。死在第1行double的宣告沒啥道理。
(gdb) r
Starting program: /home/elfay/github/compute-pi/time_test_baseline 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGILL, Illegal instruction.
main (argc=1, argv=0x7fffffffde28) at time_test.c:7
7	    double pi = 0.0;
(gdb) bt
#0  main (argc=1, argv=0x7fffffffde28) at time_test.c:7
(gdb) Quit

去linux program manual查了一下signal SIGILL,是當程式執行非法的指令的時候才會發生。

後來在參考大家的筆記中找到遇到一樣狀況 hackMD筆記
因為電腦太舊所以不支援AVX SIMD 只好到makefile裏面把-mavx 移除並將AVX 和AVXUNROLL的方法用define隔開。

  • 先測試 N 從 1 ~ 500000,隔間 1000繪製的圖形如下(每個區間測試 25 次)。因我的電腦只有 2 Core 所以 OpenMP 2 thread & 4 thread 圖形是重疊的。
  • 因資料離散值很大,嘗試加入信心區間的過濾 95% 兩個標準差。
  • 看出來圖表離散程度有比較好 不過還是有一些時候的執行時間會比較離散。

問題討論

  • 看起來時間增加的趨勢很接近一個直線斜率,可以使用數學函式來表示y=f(x)+b。可以先做線性回歸再用信心區間來過濾。

線性回歸 (linear regression)

如何精準計算時間

未來工作

參考資料

tags: ElfayR