分享到plurk 分享到twitter 分享到facebook

huang-me (黃牧恩)

學歷

  • 成功大學 資訊工程系111級(2018-2022)

聯絡資訊

  • email: ybyhui0107@gmail.com
  • github: huang-me

2020秋季班 個人評量

作業 & Lab

  • Lab0: GitHub / Hackmd
  • Quiz1: GitHub / Hackmd
  • Quiz2: GitHub / Hackmd
  • Quiz3: GitHub / Hackmd
  • Quiz4: GitHub / Hackmd
  • Quiz5: Hackmd
  • Quiz6: Hackmd
  • Hw3: dict
    • GitHub
    • Hackmd
    • 作業內容:
      了解 Ternary Search Tree 架構,並且使用 perf 分析使用 CPY & REF 的效能差異。
  • RNNoise:
    • GitHub
    • Hackmd
    • 作業內容:
      了解如何使用訊號處理達到降噪、IIR & FIR 之差異以及兩者的優缺點、FFT 如何進行快速傅立葉轉換、RNN, LSTM, GRU 之間的不同點,以及整理 RNNoise 的系統架構以及模型架構。

所見所聞心得

第一次選修 jserv 老師的課,在選修之前就時有耳聞老師的課很充實,需要花費比較多的時間在研究作業以及Lab。這個學期以來每個時期都有學習到很多以前不會的東西: perf 的使用、寫 leetcode 題目、處理數字相關問題時先想想數字之間的關聯性並且嘗試不用乘法除法得到適當的答案,抑或是使用 define 定義常常使用的部分程式碼。最後我在著手研究 RNNoise 時,因為自己實在沒有訊號處理相關的知識,在跟老師約時間討論之後發現自己不會的東西實在是太多太多,因此我每天到圖書館看訊號處理的書籍、看交大林源倍老師的線上課程,在短時間的密集吸收之後雖然我還是沒有辦法完全理解 RNNoise 的所有細節,不過我理解到自己的不足,之後我也會繼續研究並且持續更新我的見聞。

自我評量分數(1-10級分)

9分。學初出以及學期末幾乎所有的時間都獻給了進階電腦系統理論與實作,雖然因為自己本來的能力太差使得每次作業都必須要先花大部分的時間在看懂先備知識,不過我確實的發現自己進步了不少。儘管期中因為其他課有幾個比賽花費了比較少的時間在這堂課上,不過之後寒假一定會把跳過的 Lab 全部補齊。

  • 課程回顧問題:
    • 知道 x - y < 0 敘述為何不能寫為 x < y 嗎?
      Ans: 因為 x - y 的計算有可能 overflow ,不過單純的比較大小就不會有這個問題,進而造成兩個算式在某些值域計算之後的值並不相同。
    • 知道 Linux 核心 < include/linux/list.h> 裡頭
      #define list_for_each_prev(pos, head) for (pos = (head)->prev; pos != (head); pos = pos->prev)
      這樣的巨集到底在做什麼?以及 head 使用時需要加小括號,為何?
      Ans: 這個巨集的功能是從 list 的尾部往前遞迴,直到探索過所有的 list node 為止。 之所以需要小括號是因為在 c 語言中 -> 的 precedence 是最高的,然而使用者給予的 head 有可能包含其他的 operator 就可能因此產生錯誤,加上括號即可避免這個問題。
    • 知道如何對 linked list 進行 merge sort 嗎?真實世界中的應用場景為何? Ans: 將原本的 linked list 切割為兩份,並且分別做 merge sort,再將小 linked list 中的所有 node 依序做比較並且組合成一個新的 linked list。
      因為 merge sort 的 worst case 還是可以保持 O(nlogn) 的時間複雜度,因此如果希望可以有比較好的效能表現我們就可以使用 merge sort。另外, merge sort 只需要一份數據即可,只需要對記憶體位置做處理即可,因此不僅時間複雜度低,也不需要複製檔案可以節省記憶體。
    • 知道如何用 bit-wise operator 實作 clz / ctz (count leading/tailing zero) 嗎?
      Ans:
    int clz(int x){
        int n = 32;
        unsigned y;
    
        y = x >>16; if (y != 0) { n = n -16; x = y; }
        y = x >> 8; if (y != 0) { n = n - 8; x = y; }
        y = x >> 4; if (y != 0) { n = n - 4; x = y; }
        y = x >> 2; if (y != 0) { n = n - 2; x = y; }
        y = x >> 1; if (y != 0) return n - 2;
        return n - x;
    }
    
    int ctz(int x) {
       int n = 0;
       unsigned y;
    
       y = x & 0x0000ffff; if (y == 0) { n += 16; x >>= 16; }
       y = x & 0x000000ff; if (y == 0) { n +=  8; x >>=  8; }
       y = x & 0x0000000f; if (y == 0) { n +=  4; x >>=  4; }
       y = x & 0x00000003; if (y == 0) { n +=  2; x >>=  2; }
       y = x & 0x00000001; if (y == 0) return n + 1;
       return n;
    }
    • 知道 C 語言編譯器如何做 Tail Call Optimization (TCO) 嗎?以 gcc 來說,什麼樣的遞迴程式可做 TCO ,又有什麼樣的遞迴程式無法呢?
      Ans: 在 function 最後呼叫自己的 function 可以做 Tail Call Optimization ,如果除了呼叫以外還有做任何其他動作的遞迴程式沒有辦法再做 Tail Call Optimization。

2022春季班 個人評量

作業/隨堂測驗

期末專題

  • 〈Concurrency Primer〉校訂和範例撰寫: Hackmd
  • 一對一討論時間: 2022/05/23 10:30-11:00

在本次的期末專題中,我瞭解到現代電腦為了更快的執行速度,往往使用 multi-thread 或者 multi-process 加快執行的速度,而這麼做的同時我們需要避免不同 cpu core 之間的資料競爭,以免所有 core 皆對一個沒有任何意義的資料做運算。甚至,現在的 compiler 為了增進編譯後的程式執行速度,往往也會更改指令的順序,但是有些看似沒有資料相依性的指令可能依賴於其他 thread 中的運算結果,肆意的更改指令順序可能會造成 deadlock 或者 livelock 的形成。

所見所聞所感

雖然已經不是第一次上老師的課了,但是每次要寫測驗題或者作業時有總是不知從何下手,只能先參考其他學長姐過去的作業並且加以模仿,顯而易見我還有很多可以進步的地方。

自我評量

9分。
學期初的時候真的是投入的大量的時間和精神在這堂課上,雖然仍有許多的教材還來不及看完,但至少在作業以及隨堂考的部分,我都有盡量做好,但是到學期中開始研究實驗室加派的作業以及閱讀論文,造成很多上課文件只是看過而已沒有真正讀懂或者實作驗證。這也表示在接下來的日子裡如果有任何空閒的時間我都還有地方可以努力,以免未來又再次後悔過去自己沒有好好努力。