交大三上修課心得(二)

2022-01-23


課程心得

數值軟體開發

課程資訊

教學方式

課程網站: https://yyc.solvcon.net/en/latest/nsd/index.html

老師上課也是講自己的投影片,雖然不會公佈投影片,但是內容基本上對應到課程網站的文件,上課漏聽了也可以看。

因為這堂課的主旨是如何設計數值軟體,所以上課涵蓋的範圍很廣,從底層知識到抽象設計都有涉略。課程內容可以分成四大類:Computer Fundamental, Performance Considerations, System Management, Design Techniques ,具體內容可以參考課程網站首頁。

考試作業

總共有六次作業、一個期中考和 final project 。 作業一個佔 5%,總共 30%,期中佔 30%,final project 佔 40% (proposal 也會被列為計分範圍內),不會調分。

作業會要求用 C++ 實作 functions ,然後寫 Python wrapper (pybind11) 與寫測試腳本 (pytest) ,然後有些後面的作業是為之前的作業加上一些額外的功能。

作業評分與繳交流程如下:

  1. Fork 課程專案相對應的作業分支
  2. 寫作業
  3. 每個作業都會附上不同的評測腳本 (validate.py),跑完會顯示拿到的分數,滿分為五分。
  4. 發 PR ,跑 CI (github workflows) , 基本上如果評測腳本對了, CI 也可以跑過。 但是我也發生過因為環境不同導致跑 CI 時編譯錯誤,還要額外修改 Makefile 。
  5. 基本上有 CI 有成功跑過該作業就是滿分

期中考內容包括基本的 C++ 與 Python/Numpy 還有基本的計算機知識。

我印象中考了這些題目:

Final project 在學期的前三分之一就要交 proposal ,期末要用英文報告。

其他事項

這堂課是早七,但是不會點名,雖然這學期有叫我們簽到,不過似乎沒有算進去學期成績,應該只是防疫規定而已。

老師上課很熱情,也會丟很多問題給大家問大家想法。

課程感想

這門課教了很多有關軟體工程的東西,這算是一般資工系的課比較少涉及的部分。而且老師本身背景是在職工程師,英文也非常的流利,在解釋技術細節非常的清楚明瞭,上課時偶爾也會當場 trace code 給我們看。

作業其實都不難,有些只是把前面寫過的作業做小修改而已,更何況繳交方式是在 github 發公開的 PR ,早七準時上課應該才是本門課最難的部分。

課程中最有收穫的地方應該是後面課程的 Modern C++ 和 Advanced Python , 學到了很多實用的知識與技術,也發現之前寫的 C++ 其實很不 C++。

Final project 也做了以前一直想做的東西:中文版的 ASCII art generator (https://github.com/Cycatz/uniramp) ,但是跟數值軟體可以說完全牽扯不上關係,不知道是不是這個原因讓我的 Presentation 分數比預期還要低。


Unicode Art Octocat in 3 different zoom levels


微處理機系統原理與實作

課程資訊

教了什麼

微處理機系統的設計與實作細節,包括介紹不同指令集的設計與差異、 I/O 子系統、作業系統與硬體的整合等等。

此外還會談到 Aquila 的架構與設計,Aquila 是教授他們實驗室 (EISL) 所開發的 open-source processor (http://github.com/eisl-nctu/aquila) ,作業就是會以 Aquila 為基礎,修改相關電路的程式碼。

教學方式

老師會講自己的投影片,這學期是線上和實體混合,不點名。

評量方式

作業總共有 5 個,總共佔 70%,一個上機考佔 30% 。 作業通常又會分 demo 成績和報告成績,各佔 50% 。 為什麼說通常呢?因為 hw4 只需要 demo 所以只有 demo 分數,hw5 只需要交報告所以只有報告分數。

學期最後會非線性調分。

考試作業

這是所有的作業列表, hw0 不算分,老師說只是為了瞭解大家的狀況用:

作業要求要會寫 C (SW design) 和 Verilog (HW design) ,可能還需要會寫 RISC-V Assembly (hw1 和 hw5 有機率會用到) 。

主要作業的實作都是使用 Xilinx Artix-7 XC7A35T FPGA 這塊板子(跟數位電路實驗用的一樣)配合 Xilinx Vivado 這套軟體。

作業寫完交報告之後要去找助教 demo ,可以在 TA hour 的時候去或是跟助教約時間。

上機考有 4 題,每題佔 25% ,會給 boot rom , 要求改電路跑模擬想辦法收集以下的數據:

  1. Total number of instructions executed (excluding flushed instructions).
  2. Total number of load/store instructions executed.
  3. Total number of stall cycles during execution.
  4. Maximal depth of stack used (in words).

其他事項

這門課需要兩個人一組共用板子,學期初會叫大家寫表單,但是作業是單人獨立完成。

如果不想跟別人共用板子也可以直接到 EC22[0-2] 實驗室拿那邊的板子寫,助教會在學期初幫忙開通門禁。

課程感想

我覺得這門課是我修課以來遇到最充實最有難度的課程,可以想像成是進階版的計算機組織加上數位電路實驗。 以 HW2 與 HW3 為例子,需要有對電路分析的能力,因此要先看懂 Aquila 某功能的實作,再想辦法修改程式碼去統計各項資訊,例如說統計 branch misprediction 的次數或者是 cache miss 的 cycles 等等。再來就是要針對範例程式對機制的演算法進行修改以最佳化效能,例如說設計新的 branch prediction 的演算法或是 cache replacement 機制等等。

這門課被劃分在軟硬體整合學程裡面,這學期是第二次開課,上次是試辦。之前有門名稱相似的課叫做「微處理機系統實驗」,是之前某些組的必修。因此有些雙主修/轉系的學生如果當時沒有修到那門課,就必須要修這門課來抵,但其實兩邊課程內容完全不同 ,想選的人看課程評價前要先注意。

寫作業的過程真是還蠻心累又困難的,因為要一直反覆燒電路,等待 bitstream 寫進板子裡面,跑出結果不如預期又要改做法然後再重燒,如此反覆。雖然這門課沒有分組,但是老師不排斥同學之間互相討論,所以我強烈建議跟其他同學分工分析電路跑實驗結果和討論實作,可以節省很多時間與心力。最後我們都有想出比原來效率還高的演算法,算是對自己有個交代了。

這五次作業的報告我都要求自己要用英文寫,雖然寫起來很痛苦,要花更多時間斟酌字詞,不過實際寫完五篇報告看起來每篇就像獨立的小論文一樣,非常有成就感。另一方面是想說可以免費練習英文寫作的機會不多了,就把老師當作免費的 Grammarly 在用,還會幫我改文法和錯字,也算值得了。

修完這門課會對計算機底層知識有更深入的瞭解,想底層功能如何實作的會變非常容易,因為作業都會要求要親手讀過和刻過程式碼。 此外我建議想修這門課的人可以先去修數位電路實驗,對 verilog 與 FPGA Design 有基本的熟悉度會少很多撞牆的時間。然後建議可以回去複習計算機組織,報告內容強烈依賴著之前學過的計組知識,有深厚的背景知識才可以知道為什麼會發生某些現象或者是要怎麼做會跑出比較好的結果。

老師很鼓勵同學自己看網路文件和動手實作,在課堂上也會分享他之前工作的經驗和趣事還有對 Hacker spirit 理念的看法等等。課程用到的東西大部分也都是 open-source 的,非常合我胃口。 老師也很希望同學可以找他聊聊,包括寫作業遇到的困難或者是職涯規劃等等。像我就曾經去找老師聊過,老師有給了我很多職涯方向的建議和分享他學生在不同公司的經驗等等。

這門課一開始有 32 個人修,最後有將近 10 個人退選, 2 個人不及格,調分後平均是 83 分。