# 2024q1 Homework5 (assessment) contributed by < [`teresasa0731`](https://github.com/teresasa0731) > ## 紀錄閱讀〈因為自動飲料機而延畢的那一年〉的啟發 >"從來就沒有一件事情是容易的。" 看完文章後真的非常有感觸,因為我也是機械系,加上畢業專題做的也是無中生有變出一個輔助醫療器材的機械手臂,文中講到各種機械零件馬達的規格適配問題、跟不同的廠商反覆討論出圖加工(過程中還被學校的加工工廠薛了一筆...)、自己加工遇到的各種疑難雜症(最誇張的是有一個小小的止付螺絲因為送來的零件誤差超出預期鎖到滑牙,只能整套重新加工;另一個號稱"精密級規格&不鏽鋼"的日本進口高級貨螺桿,在放了一個連假後直接生鏽???),對於作者的開發過程血淚完全是心有戚戚焉。 讀到最後一個章節(23)的時候我特別感動也特別啟發, >"除了資工系的學生不會寫程式,機械系的學生不會做機械,現在又多一條電工系的學生不會焊電路,這世界到底怎麼了啊。" 我相信很多人(至少我自己就有想過),我在學校學的東西到底懂了多少,讀進去的書有多少自己真的可以實際用出來?當然我也相信很多日常的累積在某一個時刻會有他發揮的地方,就像作者說他們三個人在寫網站、加工、電路上的貢獻。 >"如果我們提早告訴他結局,他還會願意走這麼一遭嗎?" 如果做每件事前都知道結局的話,還需要努力嗎?**「你最大的問題在太害怕失敗了」**、**「你該學習的不是看到事情要完蛋了就去避免失敗,而是應該學習如何處理與承受失敗,你才能變得比以前更強大。」** 老師對作者說的話也在點醒我自己,如果我在過程中懷疑自己會失敗,甚至在一開始就知道註定不會成功,然後選擇逃避、選擇放棄的話,下一次面對問題的自己只會更差勁,更沒有面對困難的勇氣吧,我覺得這是我還需要去修煉的課題。 **「現在放棄的話,比賽就結束了」--《灌籃高手》** ## 課程心得 一開始對於可以挑戰自己能力有很大的鬥志,開頭的幾周不顧老師的勸退(?)仍然跨校慕名選了這堂課,結果在第一個作業就發現:我根本不會寫程式吧!!!花了大把時間才搞懂 linux 系統運作的模式(對比之下,前陣子用樹莓派灌 linux 做嵌入式開發,根本就是小學生程度了),接下來在三月中旬發生了一些危及畢業證書的課業壓力,加上每週觀摩其他同學與老師上課時間提到的各種知識一股腦湧入,我開始認真懷疑我是不是不應該現在就去去念研究所xd,lab0面對一個龐大的專案完全無從下手,在寫測驗題實作回顧的時候也發現我不會編譯器也不會設計實驗,以前用 github 更多是拿來備份,看完文獻更提不出精準的解析,導致進度上完全落後,真的認真思考攸關 GPA 要不要二退了 qq ,雖然老師都說缺什麼補什麼,但我覺得我缺的可能是基本功了,好像不是一個學期我可以追上的進度。 後來收到催繳作業通知後我認真開始思考,要是沒有這封信、沒有正式選擇這堂課,我現在真的已經放棄了,那為什麼不要趁這一次的課程壓力把基本功打好呢?我在這之前的確也已經學到了東西,至少我認為從「見山是山」進到「見山不是山」的境界了,像是學會怎麼好好寫 github commit ,學會翻閱規格書的技巧,學會解析程式碼。這個學期我肯定沒辦法達到「見山還是山」的境界,無論是實力還是貢獻我都遠遠不夠,但我希望至少今年九月進研究所時可以有自信的說,我是來念電機所的,而不是像現在覺得是僥倖考上、沒準備好的。老師說來這堂課是來「翻身」的,那我也要努力一把! :::danger 注意書寫規範,空白字元! ::: ## 簡述想投入的專案 ### lab0-c + Linux 亂數產生器研究 除完成 lab0 剩餘的進度外,參考2023年期末專題中 [ShamrockLee 開發紀錄](https://hackmd.io/@sysprog/r18z86NHh),想要深入探討亂數產生器的原理並研究其開發紀錄提及的未完成任務,包含引入其他快速的 PRNG 實作並比較。 > lab0-c [當前進度](https://hackmd.io/zj5u8tG_RnyD6fz7_m59fg) ### 矩陣乘法 針對[第九週測驗2](https://hackmd.io/@sysprog/linux2024-quiz9#%E6%B8%AC%E9%A9%97-2)提到的矩陣乘法加速,完成測驗題外並研究矩陣乘法的性能。 ### 開平方根效能 針對[第三週測驗1](https://hackmd.io/@sysprog/linux2024-quiz3#%E6%B8%AC%E9%A9%97-1)對於開平方根的效能比較,探討延伸問題中論文提到的改進方法,實作並設計比較。 > 測驗題實作: [當前進度](https://hackmd.io/@teresasa/linux2024-homework4#%E5%BB%B6%E4%BC%B8%E8%A8%8E%E8%AB%96) ### 與授課老師討論更多合適題目 --- ## 5/11 討論 IEEE 754, assume float is 32-bit. ```c // Purpose: return x * 2^n float float_lshift(float x, int n) { // multiply power of 2. Use bitwise operation. No mul/div uint32_t y = (uint32_t) x; uint32_t sign = (y >> 31) & 0x1; uint32_t exponent = (y >> 23) & 0xff; uint32_t mantissa = y & 0x7fffff; mantissa <<= n; exponent += (mantissa >> 23) & 1; // carry on y = (sign << 31) | (exponent << 23) | (mantissa & 0x7fffff); return y; } ``` - [x] TODO: 撰寫出更精簡的程式碼 TODO: Linux RNG 架構: [Documentation and Analysis of the Linux Random Number Generator](https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/Studies/LinuxRNG/LinuxRNG_EN_V4_5.pdf?__blob=publicationFile&v=9) > Page 53: Big picture! 看到 section 3.9 TODO: 解釋 `xoroshiro128+` 的原理 (對照〈[Scrambled Linear Pseudorandom Number Generators](https://arxiv.org/pdf/1805.01407.pdf)〉論文),並利用 [ksort](https://github.com/sysprog21/ksort) 提供的 `xoro` 核心模組,比較 Linux 核心內建的 `/dev/random` 及 `/dev/urandom` 的速度,說明 `xoroshiro128+` 是否有速度的優勢?其弱點又是什麼? > $\to$ 搭配閱讀: [不亂的「亂數」](https://blog.cruciferslab.net/?p=599) - [x] 解釋 [ksort](https://github.com/sysprog21/ksort) 如何運用 CMWQ 達到並行的排序; * $\to$ [Homework6 (integration)](https://hackmd.io/gX5lpgMmRIWzVkMlBDrViw?both) Q: 為何要提供 getrandom 系統呼叫? A: 安全! PRNG 需要 seed! ==> entropy,可是在 userspace 無法保證 --------+------------*------------> time P1 P2 \ latency | P1 https://github.com/sysprog21/lab0-c/blob/master/qtest.c#L1208 linux 正常使用時需要計算很多隨機數。計算隨機數,需要“各種隨機因子” entropy,基於這些資料來計算隨機數。 正常是從 /dev/random 獲得隨機數。 /dev/random 計算隨機數時用到 entropy pool,此池的 entropy 總數的多少直接影響所有隨機數的計算快慢。所以會在開機時,儘量收集足夠的 entropy。(此問題的 systemd-random-seed 執行階段間過長應該就是因為 entropy pool 準備的比較慢導致的) 正常情況下預設使用的 /dev/random 是比較慢的,它是從驅動程式、環境噪音等地方收集 entropy ,然後彙總到 entropy pool。 它通常在啟動時阻塞,直到收集到足夠的 entropy ,然後永久解除阻塞。 Raspberry Pi 4 RNG > Hardware-based Random Number Generators > https://yehnan.blogspot.com/2013/08/raspberry-pi.html TODO: check https://hackmd.io/@jhan1998/HJaVavfXu#PRNG and https://hackmd.io/@PHD/ryiV8GolP#Linear-Feedback-Shift-Register-LFSR