lovesharepc wrote:
以現實中來舉例程式能不能平行化
比如說蓋房子
你要先有組模型才能灌水泥
你不可能 組模型跟灌水泥同時進行
不過你是有可能把 模型交由好幾個工人一起處理...(恕刪)
蓋房子也許現場灌漿的,但大型工程比如高架橋之類的,都採用預鑄工法,RC橋面先在多個工廠預先鑄造好,在用大型載具搬到現場組裝,如此才能縮短工期。
不然混凝土的終擬+保養,需要數天的時間,否則強度會不夠,如果每次只做一小段就要等好幾天,加上天氣因素下雨天就不能施工,那麼蓋好一座高架橋恐怕要幾十年功夫。
其實這是工法的差別。
比方說一支手機,外殼、主機板、電池、各式零件,可以先在各個工廠做好,然後拿去生產線組裝。如此才有利於大量生產。
藉由工法的創新,原本無法平行化的工作,也能變成可以平行化。
比如電路生產線
你可以安排每塊電路上每個元件交由 2 人焊上
也可以安排 10 個人
不過 10 個人效率就未必比 2 個人好...(恕刪)
人腦和電腦機器的差別:
人會疲倦、會出錯,會偷懶。一個和尚挑水喝,三個和尚沒水喝。
電腦不會疲倦,不會偷懶,幾乎不會出錯,容錯機制、例外處理 可增加可靠性。
在人類的世界中,10個人去焊接元件,效率未必比 2個人好。
但是在電腦的世界中,愈多線程就是愈快的。
唯一有可能影響效率的考量是:資料量是否足夠大到需要多線程處理?
比方說:某一筆資料,單線程處理須 100ms,而打散成多線程處理需要花到 120ms,那麼這筆資料量太小,用多線程處理反而拖慢。
甚至也可以拿超級電腦舉例
如果程式(演算法)都可以做到完全平行處理
一張 40W 的顯卡 可以買 1W *40張 普通顯卡
但效能可能只有快上 3 倍
那超級電腦何需用什麼新的工作站繪圖卡 一張 40W 來提升效能
只要拿普通的顯卡一直並聯就好了
事實上超級電腦前 500大,超過 2/3 以上都是叢集式的
叢集式:由大量的「一般平價電腦」並聯組成一個分散式運算系統
泰坦 (超級電腦,當前第二名,美國)
以下資料節錄自 WIKI:
-----------------------------------------
整台泰坦共計18,688顆中央處理器和相同數量的圖形處理器,理論峰值效能是27petaFLOPS(每秒27×1015次浮點運算)
完整的泰坦超級電腦上有18,688個運算節點,每部刀鋒伺服器擁有四個運算節點,24部刀鋒主機為一個機櫃。
--------------------------------------------
京(超級電腦,當前第四名,日本)
以下資料節錄自 WIKI:
-----------------------------------------
系統配備了864個機櫃,88,128顆八核心富士通生產的SPARC64CPU,為45奈米的CMOS製程。它的水冷系統可以把故障率和能耗降到最低。
--------------------------------------------
天河二號(超級電腦,當前第一名,中國)
以下資料節錄自 WIKI:
-----------------------------------------
天河二號共有16,000個運算節點,每節點配備兩顆Xeon E5 12核心的中央處理器、三個Xeon Phi 57核心的協處理器(運算加速卡)。累計32,000顆Xeon E5主處理器和48,000個Xeon Phi協處理器,共312萬個計算核心。
--------------------------------------------
御風者 (超級電腦,2011年時是全球42名,台灣,國網中心)
以下資料節錄自 WIKI:
-----------------------------------------
「御風者」擁有25,600顆計算核心(AMD Opteron 12 Core 2200 MHz,每顆8.8 GFlops)、73,728 GB記憶體及1074 TB儲存,計算量每秒高達177兆次浮點運算(Tflops),相當於2萬台個人電腦。
--------------------------------------------
所有這些超級電腦,都是用一般電腦(零件市面上就有賣),成千上萬台,去組成叢集分散式運算系統。
附帶一提:
其上運行的軟體,只能是平行運算的軟體。否則沒有意義。
比方說:軟體如果只能跑單核心的,無法平行運算的,那麼放到這些超級電腦上執行,運行速度可能會比一般人家用電腦還不如。
lovesharepc wrote:
在程式的世界
也是同樣的道理
有些工作是需要前一級的工作完成才可能繼續
至於前一級的工作就不一定能拆分平行處理
如果一件工作,真的不能拆成平行處理,那倒也不必拆。
但假如這件工作,有成千上萬件要處理,讓每一件都平行處理依然可以增快。
電腦通常是用來處理:重複、繁瑣的工作。
比方說轉圖軟體,批次裁尺寸、批次銳化...之類的,我就不明白為何有些軟體要一張圖跑完,才要跑下一張。假如它可以一次跑多張圖的批次處理,那時間就可以節省好幾倍。
即便它在處理一張圖片的時候,無法平行處理,但有幾百上千張的圖片等著讓它處理,也不該是一張圖片處理完畢,才要去處理下一張吧。
像壓縮軟體(WinRAR、7zip 之類),就算只壓一個檔案,多核心 CPU 也可跑全速。估計它應該是先行計算要把檔案拆分成幾份,然後每份都同時壓縮,來達到平行處理加速。
就像網路下載檔案,有的伺服器可以多線程下載,一次分割10點下載的(一個檔案拆分成10份,同時下載),就會比單點下載快很多。