contributed by < liangchingyun
>
1
實作一個多精度整數的運算框架,也就是支援比 64-bit 更大的整數計算
解釋上方程式碼運作原理
n | d | n / d | ceil_div(n, d) |
---|---|---|---|
10 | 3 | 3.33 | 4 |
5 | 2 | 2.5 | 3 |
8 | 4 | 2 | 2 |
0 | 3 | 0 | 0 |
rop
: 多精度整數,作為輸出目標。op
: 一個 64-bit 的無號數,要被轉換並儲存。rop->data[0]
= 最低 31-bitrop->data[1]
= 中間 31-bitrop->data[2]
= 最高 2-bit(因為 31x3 = 93 > 64)例子: 假設 op1 = ABC
,op2 = DE
q = 0
,餘數 r = 0
d
減去1
,餘數更新為減掉後的值mpi_fdiv_qr
,直到餘數為 0
,得到 GCDop2 == 0
,這時 op1
就是 GCD。驗證 549755813889 ÷ 1234 = 445507142...661
是否正確。
驗證 GCD(2310, 46189) = 11
這項實作依賴遞迴呼叫,請避免使用並降低記憶體開銷
改進最大公因數的運算效率
2
解釋上述程式碼運作原理
確認最低位元是否為 1
傳統寫法:
這樣需要兩次 &
運算與一次&&
邏輯運算。
SWAR 的核心思想是:把多個資料打包在同一個暫存器中,並一次性處理,這可以減少操作次數並提升效能。
bitmask 定義:
測試程式:
memchr
搜尋步驟:
sizeof(long)
bytes,判斷這個 word 內是否有目標字元。比較 Linux 核心原本 (與平台無關) 的實作和
memchr_opt
,設計實驗來觀察隨著字串長度和特定 pattern 變化的效能影響
研讀 2022 年學生報告,在 Linux 核心原始程式碼找出 x86_64 或 arm64 對應的最佳化實作,跟上述程式碼比較,並嘗試舉出其中的策略和分析
下一步:貢獻程式碼到 Linux 核心
Phoronix 報導
3
1
在 Linux 核心原始程式碼中找到 CRC32 的應用案例至少 3 處,並探討其原始程式碼
設計實驗來分析 Fast CRC32 提出的手法 (要涵蓋 branchless 和查表的變形),並與硬體的 CRC32 指令效能進行比較。
以 x86-64 或 Arm64 為探討標的,說明 Linux 核心如何使用硬體加速的 CRC32 指令
2
解釋上述程式碼運作原理,搭配「信號與系統」教材
探討定點數的使用和其精確度
改進 MIDI 一閃一閃亮晶晶的音效輸出
3
解釋上述程式碼運作原理
學習 jserv/ttt 程式碼,在不使用 (n)curses 一類現成的函式庫前提下,改進網路聊天室的文字呈現介面
在既有的程式碼之上,實作帳號登入 (login) 及基本管理功能,並該有線上與否的提示,留意 ping value 的處理機制