contributed by < Risheng1128
>
參考 Linux 效能分析的提示 為了分析效能而做的措施
首先保留特定的處理器,以便我們執行程式時有空閒的處理器可以直接使用,輸入命令 sudo vim /etc/default/grub
開啟檔案,並新增以下的內容
接著輸入命令 sudo update-grub
,以下為預期輸出
重新開機後,輸入命令 taskset -p 1
查看 PID 1 可使用的處理器編號
可以發現編號 0 已經被保留了
接著抑制 ASLR
設定 scaling_governor ,執行以下的 shell script (使用命令 sudo sh filename.sh
)
針對 Intel 處理器,關閉 turbo mode
首先在編譯核心模組時,發生了以下警告
產生原因是建立核心和模組的編譯器不同,這裡修改 Makefile 的內容,指定 x86_64-linux-gnu-gcc
編譯核心模組
這裡做了一個修改,主要是讓 fibdrv 可以主動偵測編譯 kernel 的編譯器,完整修改可見 commit
在原本的 fibdrv 中,是使用 repeated addition 的方法計算 Fibonacci 數,可見論文 Algorithms for Computing Fibonacci Numbers Quickly ,額外的分析放在 研讀 Algorithms for Computing Fibonacci Numbers Quickly
參考作業說明 加速 Fibonacci 運算 的部份,裡頭提到
而 fibdrv 原始的實作則是使用迭代的方式計算,因此這裡使用 fast doubling 的方法改進計算 Fibonacci 數的效能
透過 fast doubling 可以得知,目標的 Fibonacci 數可由以下兩式計算取得
因此,假設 且 ,可以開始往下計算
當 時
以此類推
接著參考 Bottom-up Fast Doubling 的邏輯實作 fast doubling
首先計算變數 k
使用的位元數
接著在迴圈內根據 fast doubling 的公式計算出新的 fibonacci 數
最後更新變數,用來計算下一個 fibonacci 數
根據這樣的方法,一樣可以計算 fibonacci 數,一樣算到第 92 個數都是正確的
以上的修改可見 commit
參考核心模式的時間測量裡頭提到的 ktime 來量測計算 fibonacci 數所需的時間
首先宣告一個型態為 ktime_t
的全域變數
接著修改函式 fib_read
的內容,使其執行時會量測計算 fibonacci 數的時間,如下所示
接著修改 fib_write
的功能,使其回傳最近一次計算 fibonacci 的時間
以上的完整修改可見 commit
可以量測時間後,可以接著比較使用 fast doubling 前後的差異,如下所示
很明顯使用 fast doubling 後,效能明顯提升許多