# 2024q1 Homework5 (assessment) contributed by < `vax-r` > ## 閱讀〈因為自動飲料機而延畢的那一年〉與課程啟發 ### 閱讀心得 作者很勇敢在學生時期選擇延畢創業,過程中遇到的問題跟心路歷程帶給我很大 的啟發。首先是解決真實世界的問題,跟在學校課程當中解決問題、考試或做實驗那是完全不同的,或許這也是現在教育的問題,不教學生真的東西,老師們自己都在自欺欺人,領域換來換去一個禮拜就可以變成深度學習專家。不過身為學生的我們沒必要把成長的機會浪費掉,這個作者在做自動飲料機的過程,從一開始發現真的要做出一台飲料機,需要的知識實在太多,從寫程式、機械、電路設計到飲料的銷售都要懂,一個人怎麼可能懂這麼多,所以他過程中找了很多不同人來幫忙,這讓我覺得社會把各種科系分貴賤的風氣有很大的問題,我們談到醫學系學生自然覺得他很聰明有能力,談到土木系學生就覺得他應該素質平庸,確實就考上對應科系的難度差非常多,但這不代表我們在解決真實問題的時候就只需要特定某些科系的學生,反之,這會使得這個社會更加不能解決問題,因為想做出某個產品,我們不可能只懂某個領域,但現在的社會好像就在倡導我們這樣做,包括我自己也是其中的信徒。 更做到後期的時候作者還談到了跟創業朋友的溝通與爭吵,還有跟許久沒聯絡的父親因為這件事再度有交集,還有一直到最後飲料機終於做出來的時候,他的內心感到的不是狂喜,而是比任何人都平靜,他比起任何人都知道這個成品背後每個零件的由來,還有各種取捨與可能存在的問題,親手做事的人永遠知道自己的作品不是完美的,往往只有外行人才會有對於某個產品是完美的這種評價。 ### 課程心得 Linux 核心實作課程經過了五週,這堂課是我進入資工系研究所後最期待的課,我很期待從這堂課可以學到很多東西,本來就對於貢獻開源軟體有憧憬的我,一開始參加這門課的目的十分明確,讓自己具備能力貢獻 Linux Kernel 程式碼,而不是來每次測驗考 100 分。這堂課算是真的讓我感受到我有在真實的學習成長,每個作業每個問題都沒有標準答案,他們是真實世界的問題,當然還是有經過包裝避免難度太誇張,以便讓只是學生的我們有機會慢慢著手發展解決真實問題的能力。從第一份作業 la0-c 開始讓我重頭審視自己對於 C 語言的理解,真的是零,沒讀規格書怎麼會知道指標、 function specifier 存在的意義、例外用法等等,每種程式語言都有自己的特色與定位,不閱讀規格書怎麼能說自己理解該程式語言,頂多說會打字。每次課堂測驗老師都不會事先讓我們知道題目,當場問就像面試場合一樣,老師說不會也沒關係畢竟缺什麼補什麼,當然不會怎麼可能沒關係,印象中我考了三次零分,這可是會算進我 GPA 的怎麼可能沒關係,但是我清楚考零分代表我不會,這種強烈的不足感會驅使我去學習,這比分數寶貴多了,我寧願把那些分數當成讓我真正學會這些題目背後原理的代價,也不要靠某些伎倆拿 100 分但是根本不會。 我也把學會某項東西的標準,設定為能夠用該知識解決問題才算會,背的出來不算,例如作業三要把兩個 AI 演算法還有監聽鍵盤事件、更新螢幕畫面這四個任務拆分成四種 coroutine ,本來要我背出 process 、 thread 或 coroutine 或者排程演算法我可以說一長串,但是我花了快一週才把這一小題給完成,其中怎麼在單工的程式裡面實現多個 coroutine ,還要做到 userspace context switch 我就因為看不懂重看了三次以上,然後要計算 load average 的部分我到現在還做不出來,公式定義都看了也知道它怎麼計算的,但要我為一個簡單的 userspace program 設計計算 load average 的方法我還是寫不出來。 要解決一小題就要看好多教材然後經過很多思考,不懂的部分跟學到並完成某些目標的比較我想是 5:1 ,但這個過程我很享受,進入碩班以來我第一次感覺我真的有在進步。 還有對於細節的重視真的很重要,我在作業四寫出了比原先題目給的整數開平方根更快的實作方法,我把計算結果利用 gnuplot 做圖比對看起來是完全貼合,我提交 patch 到 Linux 核心後獲得回覆才發現我的方法誤差是比原先的方法還要大,但是我因為檢查的方法是做圖用眼睛看覺得對就提交了,而且我的方法包含整數除法,但是某些硬體架構是缺乏整數指令集的,對於 Linux 核心這樣要跑在很多種不同架構上的程式碼來說要避免這種實作,這裡就體現我對於細節不夠重視,從測試方法到實作方法上都還要更進步。 ## 教材閱讀及提問 * 教材當中提到 memory hierarchy ,包括 main memory 、 disk 再帶到因為 processor 處理速度的高速成長但 main memory 處理速度卻沒有跟上而延伸出的 cache ,包括 L1 、 L2 、 L3 cache 等,首先我思考 cache 讀取的速度比 DRAM 也就是 main memory 快,但是要是成本足夠,我們是不是可以直接使用 SRAM 做為 main memory ?這樣的性能是不是會比使用多層結構的 L1 、 L2 和 main memory 還要好呢? * Redis 身為 in-memory database ,儲存資料在 main memory 當中,他是怎麼做到指定把資料存在哪個層的記憶體階層而確保不會往下存到 disk 的? * 為什麼需要記憶體對齊?因為讓資料存放位置對其 2 的指數倍才容易快速存取,這又是為什麼?因為處理器在拿取資料的時候要先將 virtual memory 透過 MMU 映射到 physical memory ,這過程類似 hashing ,如果以典型取餘數來說,記憶體位址對齊 2 的指數倍,我們可以很輕易的利用 bitwise 操作得到餘數,前六週課程很重要的一點在於我們怎麼樣才可以,不使用 `/` 做除法?不使用 `%` 取餘數?不使用 `*` 做乘法?對於 2 的指數倍的數字來說以上的操作可以輕易換成一連串 shift ,但不是 2 的指數倍數字則牽涉到不同數字有不同數字的處理方式,每個數字都要分開處理太昂貴。 * MMU 的映射方式有哪些?單純的取餘數 hashing 太簡單是不是很容易被惡意使用者猜到 physical memory 位址? * program 的本質是一連串指令、 file 本質是一系列連續 bytes 的集合, concurrency 其實就是把來自不同 process 的指令交叉執行,多數我們認為特別的概念其實都非常單純,但這些單純的概念卻能帶來系統效能上很大的影響。 * 單工的處理器 (uniprocessor) 可以透過 signal 和 user-level context switch 達成多工的假象,現代則是有 multi-processor 架構與 hyperthreading 技術, hyperthreading 是如何做到單一處理器同時執行數個 thread 的? * SIMD 如何在我們撰寫普通程式例如 C 語言程式的時候直接運用到? * [類神經網路的 ReLU 及其常數時間複雜度實作](https://hackmd.io/@sysprog/constant-time-relu) 、定點數運算、 bloat16 等技術運用在深度學習上可以達成訓練效果的優化或訓練速度的加快,現在深度學習模型的訓練速度多數人都選擇直接砸錢無腦升級 GPU ,會不會背後撰寫訓練模型框架的方式利用 pytorch 等沒有完整運用到這些技術使得相同的硬體沒有發揮最大潛能?一個產業的進步速度很大程度被解決問題的速度影響,現在訓練大型模型的時間如果能進一步縮短,對於發展 AI 軟體部分來說是更有利,我們也不一定要去訓練許多模型才能進入這個產業。 ## 自訂題目 我的自訂題目即是貢獻程式碼到 Linux 核心,不確定能否做到但我要嘗試,規劃如下 * 貢獻一個 driver 或某個新的設計過度困難,我的程度不足而且維護者也不容易收錄我的程式碼,研究現有程式碼當中可能的小缺陷或效能能改進之處並予以實作較為可行。 * 與授課老師討論哪些部分程式碼較有可能有我現階段能做出貢獻的機會,先了解該部分程式碼還有在哪些技術當中有使用到。 * 我認為針對子系統或 driver 進行研究的投報率較低,要了解許多 domain knowledge 才能了解一個子系統,與其研究這些部分,我想研究更基礎但卻被多個部分的程式使用的地方,例如 `/lib` 或 `/kernel` 目錄底下程式碼。 ## 專題題目簡述 ### eBPF multi-layer load balancer * 我自己發想的題目,不確定是否可行,還要跟授課老師進一步討論 * 利用 eBPF 做一個可以在 OSI model 當中數個 layer 都能進行 load balancing 的通用 load balancer ,例如擺在 layer 2 就能做到 wifi frames 的負載平衡,輔助 AP 等、擺在 layer 4 可以做 tcp packets 的負載平衡等等。 ### 輕量化排程器 * 延伸自去年的 [Linux 排程器研究](https://hackmd.io/@sysprog/linux2023-projects#Linux-%E6%8E%92%E7%A8%8B%E5%99%A8%E7%A0%94%E7%A9%B6) 專案 * 實作一個輕量化的排程器 * 單一目標,例如只盡量做到降低 makespan 或降低 energy cost ### vwifi * 延伸自去年的 [vwifi 虛擬無線網路裝置驅動程式和實驗環境](https://hackmd.io/@sysprog/linux2023-projects#vwifi-%E8%99%9B%E6%93%AC%E7%84%A1%E7%B7%9A%E7%B6%B2%E8%B7%AF%E8%A3%9D%E7%BD%AE%E9%A9%85%E5%8B%95%E7%A8%8B%E5%BC%8F%E5%92%8C%E5%AF%A6%E9%A9%97%E7%92%B0%E5%A2%83) 專案 * 現有的 vwifi 架構只有一個 AP ,擴增 AP 數量並模擬 wireless device 在不同 AP 之間移動時的情況 * 利用 cfg80211 目前提供的 WEP 實作對封包進行加密 * 尋求貢獻 Linux 核心之機會,例如 cfg80211 、 mac80211 。 ### Faster mathematics in kernel space for ML algorithm * 受到作業當中定點數實作 MCTS 等人工智慧演算法的啟發,我認為可以探討如何加速當前許多深度學習或生成式 AI 演算法當中使用到的數學運算 * 由於 kernel space 不適合儲存大量參數,我們應該把參數放在 user space * 運算過程若能交由 kernel space 進行可以減少許多做 context switch 的 overhead ### More * 和授課老師討論或許有更合適我的題目