contributed by < xl86305955
>
sysprog2019
Homework4
compute-pi
OpenMP
是一種 API,使程式開發者能夠過這類的指令達成程式的平行執行,其中就是透過多執行緒來實現
當然,內建的 thread library 如 PThreads 也可以達成透過多執行緒達成程式的平行分解,但是若是僅要對一個 for 迴圈分解,使用 thread library 是否有點大材小用?除此之外,OpenMP 也據可跨平台的特性
OpenMP 語法分為三類
使用語法大致如下:
使用上僅需 #include <omp.h>
並在欲平行化的程式前加入 pragma omp <directive> [clause[[,] clause] ...]
即可,並在編譯選項加入 -fopenmp
,使用上相當簡單
以本次計算 baseline 計算 pi 之 OpenMP 版本為例:
在 line 6
中,代表下面程式將被 num_threads
所指定的執行緒數目平行處理
在 line 9
中,將 x 變數設為各 threads 私有 (OpenMP default 設定為 public,這樣可能會有 data race 狀況發生),並對每條 threads 對 pi 加法的結果合併加入到主 threads 之中
AVX(Advanced Vector Extensions)是一種由 intel 所提出來的指令擴充,可藉此實現 SIMD
compute_pi 所使用到的程式碼功能解析:
在 Makefile 中,可以根據 METHOD ?=
選項,對相對應計算方法繪圖
畫圖之前,需先從 Makefile 選項執行$ make gencsv
檔案生成 result_clock_gettime.csv
檔
其中測試從將 N 切割成 1008 份開始,每次增加 4000 直到 1000000 為止,從 .csv 檔中可以很清楚得到當 N 切割的愈細,所需執行時間愈久
接著,利用 $ make plot
透過 gnuplot
將圖匯出
gnuplot 會依據在 /scripts
下的 runtime.gp
檔,利用 gencsv.csv 欄位內容畫出圖表
其中
考慮右式,第 n+1 項會等於零當 n 驅近於無限大
因此,當 n 趨近於無限大時
得證
閱讀:圆周率是怎么计算的?祖冲之的缀术已经失传?李永乐老师5分钟带你了解割圆法
阿基米德利用正多邊形慢慢逼近出圓的周長,從正六邊形開始,一路逼近到正九十六邊型
若正 N 邊型的邊長為
則正 2N 邊型的邊長為
假設一圓半徑為一公分,則由半徑切割出來的正六邊形邊長
依此可一直逼近到邊型,當邊越多時,則誤差越小
未完待續