# 作業三 compute_pi 開發紀錄 * 背景知識 * 時間 * 實驗結果 * 圓周率證明 --- ## 背景知識 * [時間的測量] * [為何不要用gettimeofday()](https://blog.habets.se/2010/09/gettimeofday-should-never-be-used-to-measure-time?gclid=CL31hpnOss8CFYOWvAods_wAFQ) * [使用clock_gettime](https://starforcefield.wordpress.com/2012/08/06/c%E8%AA%9E%E8%A8%80%EF%BC%9A%E4%BD%BF%E7%94%A8clock_gettime%E8%A8%88%E7%AE%97%E7%A8%8B%E5%BC%8F%E7%A2%BC%E7%9A%84%E6%99%82%E9%96%93%E9%9C%80%E6%B1%82/) * [SIMD AVX](http://www.linuxjournal.com/content/introduction-gcc-compiler-intrinsics-vector-processing?page=0,2) --- ## 圓周率證明 * --- ## 實驗結果 * 撰寫runtime.gp的script後,直接編譯程式,使用make plot,得到結果如下圖:![](https://i.imgur.com/mHtIkp4.png)可以發現最原始的baseline方法耗時最多,使用avx指令集加上loop unrolling技巧,結果最快。 * 實做Leibniz與搭配OpenMP的成果如下:![](https://i.imgur.com/Yz1EX9n.png)。我的CPU為 Core(TM) i7-4710MQ有四個核心,推測是使用8個thread超過CPU本身的核心數,而CPU在做hyper-threading的時候,須花額外的時間做切換,因此大幅影響到系統的執行時間。 * 去掉8個thread的圖:![](https://i.imgur.com/C7Sp6Jz.png)可以看到Leibniz,OpenMP使用4個thread的效果是最好的,N接近25000時仍 < 0.001。