# 2023q1 Homework3 (quiz3) contributed by < `ShallowFeather` > ## 開發環境 ```shell $ uname -r 5.15.0-67-generic $ gcc --version gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0 $ lscpu 架構: x86_64 CPU 作業模式: 32-bit, 64-bit Byte Order: Little Endian Address sizes: 39 bits physical, 48 bits virtual CPU(s): 8 On-line CPU(s) list: 0-7 每核心執行緒數: 2 每通訊端核心數: 4 Socket(s): 1 NUMA 節點: 1 供應商識別號: GenuineIntel CPU 家族: 6 型號: 158 Model name: Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz 製程: 10 CPU MHz: 2400.000 CPU max MHz: 4100.0000 CPU min MHz: 800.0000 BogoMIPS: 4800.00 虛擬: VT-x L1d 快取: 128 KiB L1i 快取: 128 KiB L2 快取: 1 MiB L3 快取: 8 MiB ``` ## 開發紀錄 ### 費氏數列 ```c static long long fib_sequence(long long k) { /* FIXME: C99 variable-length array (VLA) is not allowed in Linux kernel. */ if (k < 2) return k; __uint128_t a = 0, b = 1, t1, t2; int len = 64 - __builtin_clzl(k); while (len > 0) { t1 = a * (2 * b - a); t2 = b * b + a * a; a = t1; b = t2; if (k >> (--len) & 1) { t1 = a + b; a = b; b = t1; } } return a; } ``` #### 支援大數運算 踩坑 撰寫完 `bn.h` 以及 `bn.c` 後將 Makefile 當中改成 ``` obj-m := $(TARGET_MODULE).o $(TARGET_MODULE)-objs := bn.o fibdrv.o ``` 但因為 module 名稱與輸出檔案相同 因此會報錯 ``` ERROR: modpost: missing MODULE_LICENSE() in /home/sf/fibdrv/fibdrv.o ``` 新增 `bn.c` 和 `bn.h` 用於支援大數運算,參考 bignum 以及 L04 將 `fibdrv.c` 當中的數值限制刪除,並將讀取形制從數值轉換成字串 ```c //fibdrv.c static ssize_t fib_read(struct file *file, char *buf, size_t size, loff_t *offset) { bn *res = fib_sequence(*offset); if (copy_to_user(buf, res->number, res->size * sizeof(int))) return -EFAULT; int sz = res->size; bn_free(res); return (ssize_t) sz; } ``` ```c // client.c for (int i = offset; i >= 0; i--) { lseek(fd, i, SEEK_SET); sz = read(fd, buf, 1); char *str = bn_to_string(buf, sz); printf("Reading from " FIB_DEV " at offset %d, returned the sequence " "%s.\n", i, str); free(str); } ``` ## 效能分析 在 `Makefile` 中新增一個 `plot` 指令用於分析效能,並製作線性圖方便觀察,且降低其他影響運算速度的因素。 ``` plot: all sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space" sudo sh -c "echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo" sudo sh -c "echo off > /sys/devices/system/cpu/smt/control" $(MAKE) unload $(MAKE) load @python3 plot.py $(MAKE) unload ``` 而測量結果如圖 ![](https://i.imgur.com/kr8ReBn.png)