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

版本 a4f7d0a38b6d2108a7a4e5d60b3b86df0d82ed82

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級分)

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