contents
前提摘要
這學期修課過得相當恐懼,期初上課就受到多方刺激,因為許多課第一堂都問說以前有沒有學過什麼,易想而知地,對學店逃出的我而言,只能默默在心中說「有聽過這個詞嗎?難道就沒辦法修課,這樣子根本沒有課程可以修。」幸好地,雖然沒有受過台大大學部課程的指導,大部分的內容以前都自己研究和玩過。
回頭看看,那些英文授課以及期末實作論文之類的,內心恐懼越來越深,而在下學期要報英文論文,學長因為連發音不正確或者用詞錯誤受到老師的深入指導,每一次開會都久戰一個多小時。而連基礎英文都只能靠 google 翻譯,為了確信實驗結果,都必須親自實作一番才行。腦子不斷地去喘測未來,估量這學期不間斷地抗戰的生活,然後還要受到老師嚴厲地批判。
接下來,就以圖文的方式回顧這一學期吧!
解題相關
逐漸地放下在 UVa Online Judge 的刷題日子,更沒有參與各種線上例行賽,由於曾經寫非常多的題目,仍然有不少人經常來詢問題目,不管是學校課程或者是 UVa 上的舊題目都會被拿來問。然而,有一些特殊案例是拿著世界總決賽等級的題目來問,一看就知道要寫個天昏地暗,說不定還不會的題目呢。
只是比別人稍微努力一點,對於高難度的題目反應是相當慢的。當然,我還是盡力回答,不過那陣子還要趕作業,閒暇時間一點也不想再開題目,一開下去不知道會不會一整天就過去,這樣可就沒辦法好好寫作業,滿腦子都是揮之不去的題目。所以有忽略一些人的提問,在此向大家說聲抱歉。
實驗生活
燃燒經費
從碩一剛進來時,碩班學長已經擔任採購財務管理已經兩年,為什麼是兩年呢?這些就要留給本人來說,事實上這裡很多人都充滿兩年以上的回憶,若要成為這裡的一分子,負擔是非常沉重的。每學期都要消耗實驗室經費,經過半年的我仍然幫不上學長,沒有研究目標就不知道要怎麼樣的實驗環境,能提出的採購項目原則上都不會通過。
那一陣子,由於要架設實驗室的群集計算,花了好個星期都沒辦法把網路架設好,一部分原因都是因為想要在虛擬機器如 Xen 上面維護,這時候網路設定和應用程式之間的權限開放變得困難,這些牽涉到軟體設計,參數總是不如預期地運作。
為了解決管理介面每天都睡不好,每到實驗室看著旁邊吵到不行的伺服器,不想接觸那無法運行的廢鐵們。這時候就提案買個 安眠藥 之類的,可想而知地被老師打槍,因不久之後因為課堂要使用,建造不起來的壓力非常大,再加上實驗室已經沒人有架設經驗,對系統比較熟的蕭大帥還要忙著畢業論文,只好用毅力嘗試架設。這故事的最後,採用原生的方式完成,暫時先別為了防止系統掛掉而採用虛擬化技術保護。
巧遇英文
蕭大帥學長看我破爛的英文,設想推薦我學習英文的方法,例如去學校語言中心聽力練習,或者到圖書館借閱英文文法書籍,又或者參與大一英文課程,然而都因為時間點不對,而且修課過重而沒有動力參加,英文帶來的恐懼對我來說不是一時造成的。但是看英文字幕的動畫不是問題,可惜地歐美翻譯速度慢,再加上翻譯味道對不上,一部分是文化上的不同,這導致要找到對應詞彙困難,有機會再來採用英文字幕看新番吧,擷圖一定非常有趣。
路人搭訕
每天過著早上九點左右到實驗室,晚上十一點左右回住的地方,其一原因是要避免上班族群和補習班下課學生。每天過著像上班族往常的通勤生活。
在某次下雨的夜晚,看到窗外的雨停了,便拿著來滴著雨水的傘提早離開,快速地走在人行道上,突然一旁有聲細語傳來「你正要回家嗎?」轉過頭來看,原來是名剛打完工妹子,心想『還好不是什麼怪人,但主動跟我搭話也有一點怪人成份吧?』心中充滿地慌張回道「是的,剛從實驗室離開。」
「哦,你是研究生嗎?我剛從打工那裡下班。今天都沒有少收錢,超開心的,之前經常少收錢」帶著愉悅的語調回道
「辛苦你啦,你在活動中心打工嗎?」因為沒見過面的面孔,為了確定身分還是問些資訊來吧。
「嗯嗯,在麥當勞打工。」
『…』帶有疑惑地,可是我一點也沒印象,去過幾次麥當勞,但店員的年齡對不上的。
「不過我都在內場忙,所以可能沒有見過吧。」
聊著聊著都走到捷運站上,一路上只應答一些簡單的句子,突然來個人靠在身邊聊天,難免不受到驚嚇。到了捷運站,一般都直接走樓梯而沒有特地走到有電扶梯的入口,也許就因為要跟著我走
「可以借我攙著嗎?」她攙著我的胳膊走下去,這時候幼小的心靈受到沉重打擊。
「你有在練肌肉嗎?感覺是有肌肉的觸感 …」
「沒啦!」聽到內心不斷地尖叫、嘶吼,這一切都來得太突然。
看來經常到實驗室打混的日子,導致逐漸地看到幻覺,總算可以達到擴充實境的地步,由衷地敬佩自己。
算法數學分析
經由學長的推薦,選修陳文進老師的「演算法數學分析」課程,這門課可說是各種演算法常見的數論技巧,在競賽中也非常容易見到,但從看過數學家是如何定義這些符號以及運算性質,這門課可說是增廣嚴謹數學定義與工具的好課。
然而,每週寫起作業來非常刺激,雖然水泥數學課本〈Concrete Mathematics〉大部分都有提供解答,但是解法就不太明確,有提供驗證答案正確性的參考,於是乎有各種神妙的解法,甚至不用套用課程所講的一些技法,老師也非常鼓勵同學用一些已知的知識來推論答案,有時還比教科書來得簡單扼要。
寫起作業每次大概花了一天到兩天,每週一個章節,老師沒講到的章節要自行閱讀,難度不會太高,花點時間坑一下基本上都能完成。作業推論則是經過一個星期的哀嚎,有時候六日推不出來,放著過好幾天才突然想到,數學的美妙近在眼前卻總是差一步就能推出。
由於這門課已經很久沒開,沒法找到合適的人選擔任助教,而常見的球員兼裁判的人選卻不選這門課,於是每週作業大家輪著改。有一次我改大家的作業,看到許多神奇的寫法,但也非常地痛苦,腦補了好幾十分鐘仍猜不出這傢伙在寫什麼,而我們寫程式的人,又經常失去一些數學常識,如 程式的等號和數學的等號是不相同的。若這門課程有助教,這助教一定會崩潰的!
奴工打雜
老闆又叫我把批改娘架設給 Data Structrue and Algorithm (簡稱 DSA) 課程使用,雖然跟他們實驗室要了一台 伺服器安裝,經過三番測試終於架設起來,只有稍微跟他們說明如何建置題目和加入使用者。畢竟是做免錢的,剩下就看他們造化。
沒想到最後還是採用老方法,繼承他們 DSA 去年的腳本改作業,畢竟要設置批改系統非常不容易。而上次交給電機系使用,他們成功地運作這到讓我感到意外,資工系反而沒有花時間架起來玩。
過了不久收到 DSA 課程來信要徵助教,想到已經擔任一門課助教,再一門會往生,有人還認為我會想去當 DSA 的助教呢?若是當了,早就來一場助教與學生之間的效能拚搏,想到若要協助架設批改系統,多麼令人感到戰慄。
超艱難修課挑戰
清明連假都在寫作業,每天都看似好像有點進展,程序仍然沒辦法跑。覺得程式越寫越退化,退化到與組語奮戰。覺得各課程作業非常噁心,一年抵四年所學,都覺得快被後輩看起來認定是個廢物。如果寫不出來,是不是都是我的錯呢?
看著作業需要的 LLVM API,看不懂文件只好猜呀猜,針對文件窮舉各種英文姿勢,歷經崩潰的驗證思路後,才察覺流程果然有點詭異,確定描述上的瑕疵後,換個思路打掉重來吧!也許還需要寫點測試,才能知道到底有沒有寫對。於是作業又再次進入輪迴,進度從零開始!
平行助教
提前研究
在學期開始前,預想而知地會受到老闆指派當平行程式助教,從上學期 C 語言程式助教那時開始,平行設計的課堂題目就開始實驗,把平行題目放上批改娘系統上,沒想到大一新生也有嘗試去解決那些題目,台大新生的學習能力遠遠超出我的想像。
研究如何平行程式不算難,但是寫得好與壞差別很多,大部分的情況都會快上一些,慘的時候甚至會慢上數倍,經過一層層地解析,研究為什麼會變慢,慢是因為什麼因素所導致?是架構嗎?還是運行流程?又或者是算法重複計算?當遇到瓶頸的時候,只能埋頭苦幹地研究,深刻地體會到研究並不會提升智力,只是增加知識層面而已,像我這種笨蛋卻過著研究生活,怎麼想都奇怪呢!
優化挑戰
平行不只有平行,牽涉到硬體架構,隨著平行的需求所進行的算法設計,若整個算法對硬體友不友善,將會影響程式的快慢。最常見的就是快取問題,第一個遇到的是 Structure Of Array / Array Of Structure 的不同,針對使用層面,沒想到他們居然會差異到 10 ~ 20% 效能差異,也就是遠本跑 50 秒的程式,居然可以提升到 40 秒內跑完,若要發這種論文,想必需要知道很多硬體設計。
製作批改系統
如果沒有正常執行完畢,莫名其妙伺服器的內存量增加,也找不到地方砍,重啟顯卡也沒辦法解決,眼睜睜地看著內存爆炸。OpenCL 要製作成 Judge 題目還有一段路要走,每次 Judge 就重新啟動 Server 是最慘的抉擇。
大致上知道 Memory Leak 的出現點,不管是程序有錯或被強制中斷都來不及執行釋放,少釋放一個物件造成內存少 100MB,經過兩三百個案例就得重開機。暫時解決方案是寫腳本偵測記憶體用量,指定超過用量自動重開,一旦沒寫好將變成不斷地重開。
好不容易架設好批改系統,但是測速度有嚴重的啟動損耗,有時候在沙盒裡面運行還特別慢,當只裝 nVidia driver,啟動 OpenCL 基本消耗一秒多。為了使用 Profiler,意外地安裝 CUDA 相關插件,頓時啟動消耗變成毫秒等級。為了解決這奇怪的現象,還一度把伺服器搞壞,整台重灌才順利解決。