contributed by <abba123
>
OS : ubuntu 16.04.1 LTS
首先我們先把原本 5 種 compute_pi跑一次
包含 baseline、baseline_openmp_2、baseline_openmp_4、baseline_AVX、baseline_AVX_unrolling
$ make gencsv
其中 gencsv 的參數如下
gencsv: default
for i in `seq 1000 5000 10000000`; do \
printf "%d " $$i;\
./benchmark_clock_gettime $$i; \
done > result_clock_gettime.csv
這就等於下面的 for 迴圈 從 1000 開始帶入
每次加 5000 直到大於 10000000 為止
for(int i=1000;i<10000000;i+=5000)
這時會輸出一個 result_clock_gettime.csv 用來紀錄結果的檔案
我們把檔案拿來分析作圖
下面是 gnuplot 腳本
reset
set xlabel 'N'
set ylabel 'sec'
set style fill solid
set title 'perfomance comparison'
set term png enhanced font 'Verdana,10'
set output 'runtime.png'
plot "result_clock_gettime.csv" using 1:2 smooth csplines lw 2 title "Baseline", \
''using 1:3 smooth csplines lw 2 title "Baseline with OpenMP_2", \
''using 1:4 smooth csplines lw 2 title "Baseline with OpenMP_4", \
''using 1:5 smooth csplines lw 2 title "AVX SIMD", \
''using 1:6 smooth csplines lw 2 title "VX SIMD + Loop unrolling", \
$ gnuplot plot.gp
我們拿 result_clock_gettime.csv 當作資料輸入,並會成折線圖
這邊可以發現,原版baseline效能並不好,尤其是在 N 很大的時候
2 threads 跟 4 threads 效能一樣
應該是因為我電腦只有雙核心,開到 4 個 threads
所以我後面都用 2 條 threads 下去跑
AVX SIMD + LOOP UNROLLING 的效能來到最高
這裡我找了兩個方法來計算pi
double compute_pi_Leibniz_2(size_t N)
{
double pi=0.0;
double x=0.0;
for(size_t i=0; i<N; i++) {
x=1/((double)i*2+1);
if(i%2==0) {
pi+=x;
} else
pi-=x;
}
return 4*pi;
}
double compute_pi_Wallis_Product(size_t N)
{
double pi=1.0;
double x=0.0;
for(size_t i=0; i<N; i++) {
x=2*(double)i;
pi*=((x+2)/(x+1))*((x+2)/(x+3));
}
return 2*pi;
}
把以上兩種版本加進我們的圖表裡面一起跑一次
這裡曲線平滑應該是因為在跑得時候沒用電腦,沒有外在干擾
可以發現 baselin >= Wallis >>>> Leibniz_2
前面兩個必須要在 N 很大的時候才看得出一點差距
就算用了 openmp 也是差不多情形
但第三種就明顯快很多
原來同一種方法,用不同表示式可以差到麼多!!!!!