做軟體的需要上Computer Architecture這門課嗎?

CA這門課在國外歷來都被稱為神課,難度大,作業多,分數低,學的內容也和軟體工作沒有直接關係,但又有些工作的人說工作後又回頭學這些底層的東西。那請問有必要學這門課嗎?謝謝,注意不是Computer Organization喲,主要是我們學校的的CA課要用verilog寫出整個computer system,難度超大。另外,大家可以用自己的實際經歷來回答嗎?戲謔的話聽起來雖爽快,但仔細斟酌還是有些出入的。

節選自課程介紹:

Throughout the semester, students will gradually design, implement, test, and evaluate a complete multicore system capable of running real parallel applications at the register-transfer level.


同樣在國外上過computer architecture,被虐的很慘但也學到了很多。簡單說兩句。

這門課在CS里被稱為最硬的軟體課,在EE里又被稱為最軟的硬體課。其實形容的還是很好的,我們課的內容基本上就是「用軟體(C++)去寫模擬硬體的程序。」

首先關於難度。的確是我上過的課中最難的一個。首先難在對寫程序能力的要求比較高。硬體的許多邏輯用軟體寫起來就是極度容易出錯,並且蹩腳。比方說CPU pipeline里的每個stage,在現實里是並行執行的。也就是說每一個cycle里,fetch,decode,execute,writeback同時發生並且傳遞結果給下一個階段。而在軟體的邏輯里是不存在這種一個cycle同時發生多件事情的邏輯的,所以要硬逼著把這種狀態改變模擬出來很麻煩,尤其再加上還要模擬多指令在cpu里的並發,相當蛋疼。以上只是舉個例子。我自認為算寫過不少大型程序,要寫對這個課的作業還是相當相當頭疼。所以我們班第一個作業完了之後一半人直接退課,第二個作業完了之後剩下的又退了一半。。

其次關於作用。可以很明確的說,除非你以後去intel,qualcomm,nvidia等硬體公司設計晶元架構,這門課上學的東西是不會直接被你用到的。而去做晶元架構師的程序員畢竟現在相當少,門檻也不低,是不是說明這個課就沒用呢。當然不是。簡單的來說,這門課會讓你變成一個更好的程序員。如果你寫程序的時候曾經因為一些細節問題而糾結,糾結不同的選擇會在底層對性能造成什麼樣的影響,那這門課會減少一些你這方面的疑慮。其次,對計算機系統的理解有助於你儘可能的多了解你的代碼是如何從一堆字元串最後變成能執行的結果的,這對於你以後要是選其他系統方向的課程,例如操作系統,編譯器等都會有互補的作用。而對這些的了解我認為了解計算機架構是一個優秀軟體工程師的必備素養。再次,自己用軟體模擬出計算機系統這件事情本身就是一個非常好的鍛煉會,而且最後也會帶來非常大的成就感。

總的來說,雖然有很大概率你不會直接用到這些知識,但是這門課會提高你CS的綜合素養,長期來說,益處還是很大的。如果你認為我說的這些作用你感興趣就選吧。希望你覺得我的回答有用:)


來來來,我就上過這種課,verilog寫過整個處理器和內存,之前實習在A公司的操作系統組當碼農。

我就不說這門課的意義了,我就說以我本科還沒畢業的經歷哪裡用到了這門課的知識,你自己判斷要不要學吧。

1. 上高性能並行計算,必須精熟各種內存設計,懂pipeline的過程,了解計算機架構,才能精準分析演算法的效率和並行模型的差別。如果所有程序都考慮到cache和內存的話,這個世界會美好很多。

2. N公司面試題,設計並行計算加法,並分析演算法複雜度

3. 分散式系統課,某些分散式演算法概念和多核處理器的同步如出一轍

4. A公司4輪面試,兩輪操作系統,一輪演算法,一輪處理器,一次一個半到兩小時,口述多核處理器如何處理內存和cache的關係,最後拿到offer

5. L公司實習,DSP晶元寫LTE演算法,11級pipeline處理器架構,6核VLIW計算,效率以cycle為單位計算,不精通pipeline,程序就會浪費cycle,多浪費幾個cycle,你手機上網就要罵娘

你自己說你要不要上吧。


我想說,其實很多回答沒有在點子上。不上Architecture的課,不代表不去了解Architecture。

一句話回答,如果你真的志在純軟體,不搞高性能和並行計算,不搞編譯器,不搞體系結構方面學術的,不必要上Computer Architecture的課,但要讀一本Computer Architecture相關的書。

深度根據需要選擇。例如:

CS:APP2e, Bryant and O"Hallaron,

Computer Organization and Design, 5th Edition

Computer Architecture: A Quantitative Approach, 5th Edition Welcome

下面是解釋。

國外CA這門課是很多國內大學的同學無法想像的,主要是因為Lab繁多而且Lab的細節極多。

舉個例子,大多數國外CA課程的Lab設置跟這個差不多:

第一個Lab,做一個ARM/MIPS ISA的Emulator,這就要求你將ARM/MIPS的ISA全部看明白,文檔讀透,各個寄存器操作不容有失,左移右移是第三位規定的不是第四位……大量的這種細節,即便是Emulator,也已經能耗費大量精力了。

第二個Lab,做一個具有Micro-Coded的CPU,這就要求你會System-Verilog或者Verilog,熟悉數字電路,熟悉寄存器傳輸級的代碼規範,熟悉微控制器和微序列器的狀態機,而且任何代碼裡面,一個bit都不能錯,經常調bug調到鬼哭狼嚎。

第三個Lab,怎麼也得開搞Pipeline了吧,即使你明白各種Hazard是如何發生的,明白各種By-passing應該怎麼設計,明白分支預測的機理,不行,你得手寫每一次by-passing每一個信號的開閉,匯流排讀寫,寄存器狀態等,更重要的是,要求你是一個良好的verilog coder,能夠有效率有組織地將這些組織起來。

第四個Lab,算是Cache吧,就是對Cache的理解滾瓜爛熟,懂什麼是組相連,知道十幾種降低Cache miss的策略,沒用。你得考慮用什麼樣參數的FIFO,在分支預測的什麼階段在那些標誌位上記號,在硬體上使用怎樣的scoreboard和tag機制,這些機制又該如何用verilog組織,時序bound是不是滿足。

第五個Lab,多核CPU和多核Cache Coherence,絕對是大坑,具體大家可以參考各種會議的Paper參考實現方法有多少trade off,加上實現細節和調bug,一個學期真的就別搞其他的了……

大學課程琳琅滿目,人類知識浩如煙海,沒有人能學完全部,即便有很多充滿智慧和美感的事物沒有學習很遺憾,但這種遺憾必然無法避免。

當然,你要說對高性能計算不感興趣,幹嘛要用Verilog寫一個具有多核Cache Coherence亂序發射超標量CPU的話,其實還是有用的。

比如有人跟你說:「什麼,你居然還沒有寫過編譯器?居然還沒寫過渲染器?居然還沒寫過操作系統?居然還沒寫過圖像搜索引擎?」

你可以理直氣壯的跟他說:「TM我上學期上了體系結構課。」

保管他閉嘴。


如果你關心軟體實際的運行性能(時間複雜度中被略去的常數),有必要學習計算機架構。


一個只想要砌磚蓋瓦的磚瓦工確實沒有必要去讀十年建築系



其實計算機不應該分軟硬體的,馮諾依曼計算機只是圖靈機的一種實現而已。

王垠就曾經說過,他讀懂lambda表達式以後,才明白為什麼計算機要那樣設計。

從這點上來講,計算機體系結構和任何一門編程課是殊途同歸的。

千拳歸一路,不要分彼此,如果你真的當計算機是門科學的話。


若已明確走軟體方向了,花這麼大力氣上這節課無異於以CS之劣馬賽EE之良馬 -- 你再硬也沒人家硬,夾生飯未必好吃? CS系的挑戰一門高階演算法課性價比更高.


樓主是怎麼判斷一門技術自己需不需要掌握的?


記得當初學計算機組成的時候稀里糊塗的,學完體系結構之後才感覺有點明白啦

然後就想順序為什麼不換一下,不過可能反過來也是一樣吧T_T


要學

以後工作方向如果偏底層coding或者偏硬體方向,會經常用到

如果不是,也要了解,多懂點總不是壞事


很多人都是實用角度考慮問題的 。 這樣說,如果腦子還不錯,幹啥不用用 。難道就是吃喝玩 ?


講真,上了computer architecture之後,感覺leetcode簡單多了。

所以google intern面試前一個月順利刷了一遍leetcode,過了technical interview。現在滿地打滾求過host match。

最後寫兩句感悟

1. 沒有上過computer architecture的人不足以談人生

2. 這個課對提高智商有奇效


學好計算機架構和演算法,你就是當設計師; 只會寫業務代碼,那就是工人。擼主自己體會…


推薦閱讀:

設計優秀的 API 有什麼特徵?
近幾年有服務端有哪些新技術?
做一個APP要多少錢?

TAG:互聯網 | 軟體開發 | 操作系統 | 編程 | 計算機科學 |