contributed by < ItisCaleb
>
原本使用 read
來傳遞結果,但因為 ssize_t
最多只有 64 位元,所以改用 copy_to_user
把計算的結果傳遞到 user 提供的 buffer
支援大數運算後則是把 int
陣列傳遞到 buffer,然後回傳陣列的長度
加了 bn.h
後需要修改 Makefile
fibdrv-objs
是 module 所需要的 object,由於 target 不能跟其他 obj 重複命名,所以把 fibdrv.c
重新命名成 fibdrvko.c
新增 digit_t
使得大數運算使用的類別可以根據使用的是 32 位元或是 64 位元的架構來切換
commit a440b72 Decouple the type used during computation
把 bn_alloc
及 bn_free
等跟記憶體配置相關的函式分離到 bn_client.c
及bn_kernal.c
,使得可以在 client 使用大數運算,不需要再透過 Kernal Module 去測試,避免在實作或是改進原本函式時導致 Segment fault,造成需要重新開機
commit b0426ea Separate some utility function
引入大數運算後,原本先用迭代法來作為大數運算的測試
最新版的是用 Fast Doubling 的手法去實作
乘二以及平方的操作改用 bn_lshfit
及 bn_sqr
Makefile 增加選項 test
並且使用sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"
及sudo sh -c "echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"
來分別關閉 ASLR 跟 turbo mode 避免影響效能分析
同時使用 taskset 來指定 cpu 給程式使用
plot.py
則會對資料的極端值並且畫成圖表
taskset 0x2
如果使用 isolcpus=0
及 taskset 0x1
是沒辦法跑出如此平滑的曲線的,並且指定其他的 CPU 也同樣都會有很大的波動
只有當設置 isolcpus=0
且指定為 CPU1 的時候才會有上圖的結果
不知道是什麼原因造成的
閱讀 SMP IRQ affinity 並留意到每個處理器核的中斷事件。
taskset 0x1
在使用 Fast Doubling 手法後,可以很明顯看到效率遠優於使用迭代法
在改用 u64 後,效率相比原本使用 u32 明顯提昇
而在實作 bn_lshift
後,執行效率也有些許提昇