引用:
killer00寫到:
crazydark、badcat 兩位講的其實都沒問題,只不過是站在不同角度看這件事情罷了。
Linux、Unix系統被設計成能善用多CPU架構,所以該煩惱的就是OS設計師,但一般程式要在這些OS上工作除了符合規範外,的確不需要考慮CPU使用的問題,因為這一切交給OS幫忙管理,這原本就是OS的工作,這也就是badcat的論點。
將多個工作排到多個CPU上的確是OS份內的事,不過要他將一個工作同時排上兩個以上的核心工作的話,我想是一定要改寫你的程式以支援雙/多核工作的。
引用:
badcat寫到:
所以從「作業系統」層面來解決,至少減少「軟體程式」層面要解決 CPU 硬體的問題,那程式在面對單/雙/多核時,都不用改寫程式,才不會每新增新的 CPU 硬體變動,「每套」軟體的最佳化都要改寫,才會有明顯效能改進的窘境。
其實前文主要還是針對batcat兄所提的上面這段話提出我的看法,如果只是要能動,那當然不用改寫,但如果在雙/多核上要說最佳化,我認為勢必得善用雙/多核心;而如果要善用雙/多核心,就一定要改寫程式。
我在37樓的文章就是
1.
我認為要善用雙/多核心,一定要改寫程式,不大可能透過OS的支援就讓你的程式可以善用雙核心。
2.
要最佳化,無可避免一定要面對不同硬體架構做不同軟體架構改變的問題,而且也不是OS可以幫你處理的。x86上麻煩的地方是core 2 duo跟Athlon64x2雙核需要的最佳化方式有點不一樣,一般寫x86的,通常要嘛取折衷,要嘛就西瓜餵大邊。
真要不用改寫
就看看傳聞中那個"Reverse Hyper-Threading"有沒有辦法真的實作並滿足大家的想像囉
引用:
killer00寫到:
雙核心的問題在於工作的分派問題無法解決,但前面的人有的以為資料就像是水,CPU是尺寸固定的水管,核心越多,代表資料流過的越多,即使單個程序也可以用這樣的推論去跑,但其實完全不對。
單一程序無法被兩個核心同時運作(頂多是輪流分派),這點是絕對無庸置疑。
要知道CPU運作的方式是將程序從記憶體載入至CPU中開始運算,但如果把這個程序的資料分成兩邊做運算會有什麼下場?比如:t=2x*3y,ans=t/2,這樣一組運算式要被雙核心運算,可能拆成兩個部分算嗎?(t=2x*3給core A,ans=t/2給core B),不可能,對OS而言他是無法分辨這是數學運算式還是其它資料,他只會依照它的演算法去判斷這筆資料是否有關聯,沒有關聯性的才讓他被兩顆核心同時運作,但有關聯性的仍是單科核心運作,至於為何轉檔時可以看到兩顆核心都在運作,要知道CPU本身能存放的資料原本就不多,當然依照OS的演算法去推測,他可以先找出沒有相關聯性的部分分派出來,使得兩個CPU都可以處於工作狀態,但影像畢竟是一連串的資料,能分開處理的部分畢竟不再多數,所以能發會的空間自然不多。
上面的說法比較像是CPU內的指令分派器做的事。CPU在進入多管線架構後,希望單一程式能善用多管線就是使用這種做法。
這事不適合OS去做的原因,主要是要OS去看執行檔一個個的binary code,分析再分派工作,是比較沒有效率的事情。第二是現在x86的CPU在內部多半會將x86指令做轉譯再丟進管線,轉譯過程可能會有指令打散或融合的動作,所以OS只針對x86指令做的分析,是不夠的;但如果還要先將x86指令轉成現在CPU內部的RISC再分析,工作只會更重且效率再降低。