迄今為止押寶多核的策略幾乎都失敗了,為什麼開發者如此抵觸多核?

剛才看到Apple關於Mac Pro的新展望,說過去他們開發垃圾桶的時候使用了雙顯卡架構,講到當年(2013)為了支持雙顯卡Apple還頗費力氣,然而幾年過去了,並沒有什麼開發者理他們, 而依舊只是開發單顯卡的軟體.

再聯想到現在的CPU,聽說當年AMP就是信奉了"將來的CPU都是多核低主頻"才發展成今天這個鳥樣子的, 而且當年無論是AMD還是Intel都推出各種多核心,甚至多CPU架構,然而這麼多年過去了, 真正能發揮出多核心優勢的軟體(消費級,伺服器那種不算)少之又少, 在消費級領域高主頻少核心的CPU直到今天依然有著巨大的優勢. 拿遊戲引擎來說,無論是虛幻還是Unity,都把多線程優化大講特講,依然拿把任務分配給多個CPU這種技術當至寶,每次升級都要提一提. 而且,甚至還有個別遊戲引擎出現"一個核打天下"的情況. 同樣的,手機上也有一核工作,多核圍觀的情景.

那麼問題來了:

1. 多核技術也十多年了,按理說軟體部分該探索的也差不多了,那為什麼消費級的軟體支持多核依然這麼難?

2. 既然開發起來這麼難, 那當年Intel推多核, 豈不是逆天而動? 為什麼會這樣選擇? 為什麼不推出核更少而主頻老高老高的CPU?


開發者沒有抵制多核啊,是你沒有意識到。

最早的3D圖形就是用單核CPU(那個年代離雙核CPU還有將近一代人)硬去計算的,性能奇低,效果慘不忍睹,出門右轉Minecraft就能回味當年的景觀。大家很快意識到這種搞法不行,於是堆了無數微小核心去並行計算,世上就有了顯卡。現代的顯卡,其實就是個成百上千核心一擁而上的超級多核處理器,再加上配套的內存(顯存)、匯流排等設施構成的運算平台。直到現在,許多繁重運算里顯卡的表現都比CPU強得多。

題主你大概是想專門問CPU的問題。但計算機發展這麼多年以來,一直存在的一個思路就是特事特辦,專門設計的硬體去完成專門的運算。上古時代的VCD解壓卡,現在的顯卡,CPU里的視頻編碼器,蘋果手機里的協處理器,專用計算卡,硬體隨機數生成器等等……最後留給CPU的,常常是變化最多,最靈活的那部分運算。

很顯然,這往往不是容易並行化處理的問題。用數學來比喻的話,這不是一萬道四則運算分給4個小學生,每人做2500道的問題,而是一道一萬個步驟的證明題分給4個人,每人負責2500個步驟,而且四個人的步驟還互相交錯的問題。分配、協調、整合結果的難度,是不是比四則運算高了很多倍?

這就是程序並行化進展緩慢的癥結。那些留給CPU的複雜邏輯處理,許多都並不適合於並行化。如果有並行化難度不高,而且壓力繁重的運算,很快就會有人考慮研發專用硬體。

但是CPU不擴展核心數也不行了。因為CPU單核性能已經遇到理論和技術瓶頸,想快速提高已經不現實。而且因為多程序並行等問題,多核心CPU仍然是能明顯提高系統整體性能的。另外,運算需求是千變萬化的,硬體研發遠遠沒有軟體編寫靈活,所以很多並行運算仍然在使用CPU,這時候多核就會很有用處。


不評價策略問題,僅說說線程並行的難點:

1、並非所有問題都能並行化

串列(單線程)計算在時間上和邏輯上是線性的,第二步計算一定在第一步之後,這和我們的物理法則是吻合的。而並行計算(多線程)在時間和邏輯上不是線性的,可能要求第二步與第一步同時進行。可問題是很多時候第二步計算需要第一步的結果,例如計算這麼一個數組:

a(i+1)=a(i)+1

不考慮用解析法求出通項公式的情形,那麼求a(1)必然要知道a(0)。這種情況下想要同時計算,只能先用線程0算出a(0),然後用時間機器將a(0)的值返回到計算前,再用線程1同時計算a(1)。

我要是有時間機器,還要啥並行啊,一次性算完返回結果不是更好么。

2、n線程並行的計算速度低於單線程的n倍

計算1+2+3+4+5+6,串列和並行處理的過程一般如下圖:

串列演算法總共需要5次加法,假設每次加法耗時1s,那麼串列演算法需要5s完成

並行同樣需要2x2+1=5次加法,由於前面四次加法分發給兩個線程,最後一次加法只能由單個線程完成,所以並行演算法需要2+1=3s完成

你看,2線程的效果並不簡單的等於單線程的2倍。更重要的是,上述並行演算法的最後一步還需要對兩個線程之間的數據進行通信,而線程間通信通常是很慢的,一不小心就會變成計算耗時3s通信耗時30s,導致實際上並行的效率並不高。

3、並行化開發成本高於串列,性價比不一定划算

從上面的例子就能看出來了,並行編程的幺蛾子太多,一個不小心反而比串列更慢,所以對計算速度要求不高的軟體(把0.01s的響應時間變成0.001秒也沒什麼ruan用),以及付不起程序員工資的公司,都不會採用並行化編程。

並行編程使用最廣泛的還是科學計算領域。一個用單線程1天才能跑完的任務,用2顆e5 24核暴力計算1小時多就搞定了,能大大的減少刷知乎的時間。


建議修改問題。

硬體廠商押寶多核,是因為單核心頻率已經到達瓶頸了,能輕易做出10GHz的處理器,英特爾早就賣給你了。多核沒有在民用普及,不是做不了,而是作了你也買不起,普通用戶不會為你志強多出的4核8線程多花5000塊。

軟體開發者對於硬體性能的提升要求是無止境的,抵制多線程這事根本不存在。硬體的能力只會限制軟體,反之不成立。這也是為什麼老黃能趁著機器學習和vr大賺一筆。


我的天哪!!!!!

押寶多核失敗了!!

這是吹捧7350k么?手動滑稽

稍微嚴肅一點

多核非常成功,在高性能計算領域沒有單核啥事了,連定製計算都講並行化,你想想顯卡多少核

桌面也非常成功,zen這次非常好,希望幹掉牙膏廠騙錢的雙核系列

如果你感受不到多核的好處,請多開幾個複雜網頁

至於某些老遊戲,呵呵


非軟工方向,強答一番

1. 多核技術也十多年了,按理說軟體部分該探索的也差不多了,那為什麼消費級的軟體支持多核依然這麼難?

比如你要算一百萬次1+1+1+1+1+1+1

這是一個簡單計算,你當然可以
線程1: +1+1+1 ...【25w次】
線程2: +1+1+1 ...【25w次】
線程3: +1+1+1 ...【25w次】
線程4: +1+1+1 ...【25w次】

但是問題來了,最終你還是得輸出

所以在四個線程完成後,你需要線程x=線程1+線程2+線程3+線程4

有沒有感覺整個結構已經變複雜了?

+1+1+1+1+1變成了(1+1+1+1)+(1+1+1+1)+(1+1+1+1)+(1+1+1+1)

演算法要重寫,這就涉及到了很多問題,現實中的編程語言改演算法是很頭疼的,要錢的

只有現行的演算法真的不行了,而且導致了大面積的問題被管理知道了,那時候再考慮有沒有必要去做這個改進

有些操作本身是原子的,比如最後的這一步線程x的操作,只有等1234運行完了,才能接著操作

那就意味著你還得等其他線程完了,然後才能做,而且這一步操作別人還不能做,為啥?分不開了

如果用更簡單一點的表述的話:

1+1=2這件事你怎麼分成多線程?

軟體部分確實探索的差不多了……

但是現實世界並不是少年漫畫……

此外無關消費級軟體……只是商用應用一般本身就是低負載多並發的……

此外多核優化牽涉到一個問題:線程安全

背書一樣的仨條件:原子性,可見性,有序性

原子性上述

可見性……比如上面的問題,改成1*2*3*4*5的話

如果你線程2先行計算完了,那需要線程x=線程2,而後面的線程都是線程x*=,這裡要做判斷

有序性的話……因為線程的性能是不固定的,所以多線程應用輸出結果的順序也是不固定的,你得控制輸出結果本身的有序

所以一旦進入多線程領域,你需要編寫成堆的代碼去保證線程的安全……

然後保證線程安全這件事本身還要吃性能……

2. 既然開發起來這麼難, 那當年Intel推多核, 豈不是逆天而動? 為什麼會這樣選擇? 為什麼不推出核更少而主頻老高老高的CPU?

當核心真的很少的時候,一個程序因為處理器性能而卡死可能會導致整機的卡死,因為系統分不出更多的核心維護電腦正常的io和其他程序的流暢運行……

至於為什麼現在不興堆主頻了……看情況是因為真的開發不出來了……


不是開發者抵制多核,是intel過於傻逼

你適合用這個CPU


摩爾定理逐漸失效,主頻提升帶來的高功耗問題都阻礙了單核高頻(高性能)的發展。

gpu就是一個很成功的多核並行結構,題主憑什麼說押寶多核並行的都失敗了?你不用gpu試試!

至於cpu並行程序為什麼出現一核有難n核圍觀的情況,還是因為現在軟體優化不到位 前面幾個答案已經說的很好 cpu多核並行程序要大改,帶來的收益也不是很大 所以在很多對性能要求不是極端苛刻的情況,就直接單進程了。這只是投入產出的平衡點,主要原因還是當前單核性能基本夠用,如果不夠用,你看看那些遊戲引擎會不會極端優化多核性能


說那些沒用的幹嘛,就是程序員水平低而已

看了其他答案多說一句,並行是為了提高運行速度而非效率


我不說技術,我說點實際的,多核在實際上有沒有用。

多顯卡:

現在的大型遊戲還有多少不支持多顯卡的?你隨便搜一下雙路泰坦的測試,看一下有沒有用?至於渲染、建模這些方向我就不說了。

多核CPU:

實際使用中消費級的軟體很多不支持這是事實,但這些軟體大多數是給一個線程就可以很順暢地跑的了呀!

另外你的電腦只打開一個軟體嗎?(我上班的時候一般打開常駐一個everything、QQ、微信客戶端、一個計算器、3-4個資源管理器窗口、十多個網頁標籤、PS打開3-4個窗口、AI打開1-2個窗口、CDR打開一個窗口、還有4-5個txt文件)一個軟體用不完你的多核CPU,多幾個還用不完嗎?即使你說只要打開chrome我啥都可以在上面跑了,那也可以一個標籤佔一個線程呀。多線程還不是用起來了。你說你用不到,那你是不是某村評測7350K的小編?

當然也有單核跑不順暢,又沒有多核優化的,但這是極少數吧。

你說壓寶多核策略失敗,那你試試關閉超線程,關閉其他核心,讓CPU在單核單線程下面運行一段時間,看看卡不卡?


沒太明白怎麼這個問題大家都喜歡匿名回答?

樓上有同學說『是因為軟體優化不夠』

並用1加到100萬舉例。

竊以為是不合適的。多線程運行這是在應用程序級別的優化,而每次都把問題推給應用級別的程序員這是不合適的。

正確的發展方向,是應該有操作系統來執行調度,事實上Windows已經是這樣乾的了只不過不是把進程拆開成線程,而是在不同進程自動調度CPU資源,這樣當進程比較多時,已經實現了最優調度。

除非一個進程要佔用的CPU資源非常高並且內部是用單線程執行的。操作系統要實現這樣的線程拆分難度很大但不是不可能。但是在商用環境CPU資源顯然過剩的情況下,微軟當然不會做這樣吃力不討好的事。


程序員水平低。消費領域花那麼大代價優化設計收效不大。


哪裡失敗了?

你試試進bios裡面關掉ht, 關掉多核特性用用電腦。

你top一下看同時有多少進程線程。

你打開windows任務管理器看看同時跑多少程序。

在買得起的情況下核心數多多益善好不好。

開發者超愛多核好不好,make -j biubiu的快,各種操蛋IDE多耗系統資源造嗎?多核稍微緩解噁心感。


頻率提高到一定地步後功耗會巨幅上升。

多線程優化是趨勢。

程序改起來沒那麼快,可以用積重難返來形容。


抵制多核?沒個多核的工作站,你編視頻會累成狗好吧。多攢點見識啦


多核哪裡失敗了……

沒有多核哪有現在虛擬化的蓬勃發展……


這個問題感覺有的詭異?指的是一般的應用和遊戲開發嗎?

寫一個函數要求指定某個核去執行?

感覺有幾個問題可能理解上有不一致。

GPU和CPU並不是一回事。

一般並發交給線程就好了。

多核調度應用一般不管,系統處理線程和多核的調度。

畫面渲染和邏輯(調用)又不是同一個層面的問題,各有不同的引擎和調用(載入)及交互方式。

好亂...

如要應用的並發直接由開發者管理到核分配上,可以想像這個應用開發的繁雜度非常高和硬體適用性非常窄。


因為他們沒想好把一列火車切開成一節節的時候要分別給火車箱什麼速度的車頭才能保證大家準時入列


如果一個計算過程可以做到和主線程無關,那麼為什麼我不幹脆直接事先把所有的結果都算出來然後存到文件里隨時調用呢?現在硬碟又不貴,傳播的載體也不受容量限制


現在的晶元行業是Intel一家獨大啊,這是問題所在啊


推薦閱讀:

Qt Creator和codeblocks相比,哪個更好用?
軟體開發工程師轉建築行業、工程造價行業?
計算機科學與技術和軟體工程,這兩個專業的區別在哪?
請問大家,App 製作出來後,怎麼樣才能讓別人不容易解密、抄襲?如果加密會不會影響用戶註冊登錄?
水利數值模擬軟體的現狀和發展是怎樣的?

TAG:軟體 | 軟體開發 | 中央處理器CPU | 編程 | 計算機科學 |