實際的應用 不管是網頁還是遊戲已經沒有僅僅執行續只有1的程式了
尤其是遊戲由於分工較細 可能會到幾百個執行緒
所以我認為遊戲並沒有所謂的針對"雙核心"或"四核心"優化這種限制 有的只有針對"多核心"優化
因為遊戲可能有幾百個執行緒 設計者不可能設計偵測CPU是雙核後 某些執行緒走那些核心
四個核心時又那些執行緒走那個核心 此外還有8個16個 有的比較畸形的是6個 (FX6300)
這樣設定設不完的 此外還有另外一個更重要的問題 CPU不光只跑"一個程式"而是多個程式同時跑
設計者又怎麼會知道 其他程式在跑的時候 那一個核心做的事情比較少 可以分配比較多的工作?
對...遊戲設計者並不能控制這些 所以控制某些執行緒跑特定的核心是作繭自縛 有可能只會讓情況更糟
設計者能做的 只有盡量讓每個執行緒的工作量一樣而已
如果每個執行緒工作量一樣 不管是雙核 四核 八核 六核也沒關係 最後的結果每個核心的工作量應該差不多
我記得有一個比較經典的案例是戰車世界WOT
四核心的CPU 跑起來的時候 某一個核心使用率過高(接近100%) 其他三個都很低(10幾%)
只要更改親和性改為三個核心執行
就會看到 其他三個核心使用率就變50幾%
也就是說 打亂執行緒的分配順序(原本4個分改為3個分) 反而讓每個核心的工作平均了
單核效能強 為什麼遊戲表現比較好 理由很簡單 CPU效能強 單位時間內可以做更多的事情
不會有那種某個執行緒單位時間內做不完 要等下次輪替的情況
(前面提到執行緒是輪替使用CPU的 輪替越多次代表更多的延遲 )
還有一件事 CPUMARK 99 在WIN7 執行緒的確只有1 但在WIN10卻不是 之前有測過
有興趣可以實際跑跑看
Ans:遊戲最大的問題 就在每個執行緒的工作量不平等 有的簡單 有的複雜
複雜的很有可能在佔用CPU時的"單位時間"內沒辦法完成 造成必須等待下次的輪替
輪替的次數越多就表示延遲的時間越長 單核強可以減少輪替的次數 當然延遲的時間就短了
在CPUMark效能指標上CPU i7 4790k 4核心8緒 的分數 11179
Xeon E5-2675 16核心32緒 CPUMARK 15156
Ans: 前面提到遊戲是執行緒工作量不平等 那假如工作量很平等呢?
表示單位時間內每個核心都在盡力工作 而不會像遊戲一樣 有的核心比較忙 有的核心比較閒
每個核心能得到充分的發揮 整體展現的效能當然就比較強
這點在測試CPUMark時就可以注意到 CPU使用率可以到100% 但遊戲則比較難達到100%
機械語言與執行續等等
實際來說算是比較淺層
程式、遊戲有相對的共通性;但所使用的框架 語言 遊戲引擎等不太相同(雖然最後到達點都是一樣)
一些程序員也是以這些方式去乘載與硬體進行操作
畢竟以機械語言丟給人類來看 根本看不懂它的邏輯想法等等
因為程式或遊戲 拆解開來 有分很多段 人機 前後端等等等,不是外表看一個程式按鈕就代表那樣
(其中還要包含成本 投報之類的,為什麼要用舊系統 舊優化等等等)
白話回歸主題 比較像是所需要"多少位各國翻譯"去轉換說明給CPU這位天才但只懂一個方式 去做溝通交換資料
這各國翻譯就是所謂的溝通橋樑 語言 框架 和遊戲引擎
所以 不是CPU 不想用天才的多元想法進行溝通;而是用什麼樣的工具去與它對談
相近應用的程序 比較有可以相互對應的比較
ha9107291 wrote:
其實.....上敘都有說到一些重點
機械語言與執行續等等
實際來說算是比較淺層(恕刪)
Kenny_Din講的觀念,已經是正確的了,您這段反而岔題了。
dinosaur6x6 wrote:
在一款射击游戏里,假设第一个 CPU 核心负责子弹轨迹的运算,第二个核心负责声音资源的调度,第三个核心负责材质贴图的替换(实际上不会有游戏这么干),那么仅仅玩家开枪这一个动作就需要三个核心的互相通信与数据传递,如果这一过程中任意一个核心出了问题,那么其余两个核心就可能出现问题,反应到游戏体验上,要么是玩家开了枪没出声音,或者是打到墙上,墙面岿然不动。当然实际中的游戏程序设计要比这个复杂很多,更多的核心参与带来的不一定是性能的提升,更可能是性能损失。从单核到双核优化如果难度是翻倍,那么双核到四核,甚至六核那么对于程序维护的难度可能就是十倍、二十倍。
這就是難處為什麼以前的大作大部分只支援到四核心...(恕刪)
在資訊工程/資訊科學上,並沒有一個程式是支援幾核心的說法跟定義,"支援幾核心",是個通俗跟口語的講法,但仔細想想,卻從來沒有工程上能讓絕大多數人認可的一致嚴謹定義。
常見的一種"支援幾核心",大約就是認為要讓核心使用率到一定的%以上,但要幾%才算數?100%或80%或其他%?那下一個問題就是:那要100%或80%持續多長時間才算數呢?而另外一派卻可能覺得只要程式執行時有動用到幾個核心,就可算是支援幾核心,那麼"支援幾核心"的定義到底是誰說了算呢?與其拘泥在"支援幾核心"這個假議題,不如直接了解處理器核心、作業系統排程、以及process/thread的運作執行方式。
樓主的問題,我用過海關來當例子好了,
1. 海關每個櫃檯的硬體是一樣的(核心),多個櫃檯=>多核心
2. 以某個旅行團來代表某個程式的process (程式被安裝後,它只是靜態的,process是這個程式在作業系統環境+處理器硬體上開始執行後的動態狀態的稱呼)
3. 個別旅行團成員則是process內的一個個thread (實務上process內的thread數量是會隨時間跟process執行狀態而動態變動的,在此暫時不考慮這點)
4. 排隊隊伍前頭那位海關引導人員(相當於作業系統內的thread scheduler執行緒排程器),會指派下一個輪到的團員到空出來的海關櫃檯去
5. 典型的Windows作業系統內,隨時都有多個process同時被執行,每個process都有自己所屬的thread(s),如同海關前排隊的隊伍,會有多個旅行團/單幫商務客/自由行旅客穿插混合在一起。
只要這個旅行團的排隊成員數量(執行緒)足夠,相關單據文件也都事先備齊填好了,就有機會平均輪流使用到所有開放的海關櫃檯(所有核心)。當這個旅行團的成員全部通過海關時,這個process的工作就被(平行處理)完成了,不過實際上thread絕大多數都是會回來重新排隊等待再度被執行的,在此也先不考慮。
另外,實務上的執行緒與執行緒之間,不是全然各自獨立的,有些執行緒就算輪到它執行,但如果其所需要的某些輸入變數還沒被其他執行緒計算出來,那它也不能被分配去執行,這好比是這個旅行團人不少,卻全團卻沒帶幾支筆/或不太會填海關單,結果就算輪到某位團員上前時,卻因為他的海關單還沒填好,只好先讓自己團內已填好單的人(沒有相依性)或後面其他旅行團的人(沒有相依性)依海關引導人員指派先行上前。
誇張一點的情況是,整個團只有一兩支筆可共用,或是絕大部分團員都要看別人怎麼填單後才會填(執行緒之間倚賴彼此計算結果的相依性非常高/可平行執行程度很低),結果就是這整團過關速度會較慢,每次也只需用到一或兩個櫃台,這時其他旅行團的人員/單幫商務客/自由行旅客,就會先被海關引導人員(作業系統的thread scheduler)安排先上前,以提高海關所有開放櫃檯(核心)的整體使用率。
更極端的情況,就是當下偏又是離峰時間,只有這個團員不少卻整團沒帶幾支筆/或是絕大部分團員都要看別人怎麼填單後才會填的旅行團要過海關,那海關櫃檯就清閒了,海關引導人員,可能會把陸續填好單的團員,索性都導引到同一個櫃檯,或是輪流導引到每個櫃檯,但是同一時間其他櫃檯的海關關員,也只能坐著空等,因為其他旅行團員都還在等拿到筆才能填單/或是等別人填好參考。即使再想提高海關櫃檯的整體使用率,那也沒辦法。
一個程式的process會用到幾核心,其實是動態的,現代的程式,process內部的執行緒通常都有幾十個甚至上百個,隨process狀態動態改變,但當下是否會用到所有的核心、以及個別核心負載率會到多少,還是要看當下那些執行緒之間的獨立性/相依性,以及個別執行緒本身負責的計算量工作多寡,可以想成是旅行團內有些團員是使用來自有國安疑慮地區或是需要簽證國家的護照,而有些團員是用免簽證國家的護照,或是小小孩需要爸媽抱著一同往前櫃檯,那過海關的速度也會不同(計算量不同),加上同時間通常還會有其他旅行團/單幫商務客/自由行旅客一起排隊,這些動態狀況穿插在一起,也都會造成海關每個櫃檯(核心)的負荷不同、或者是單就某個旅行團(Process)來看、每個海關櫃檯服務這個旅行團成員的累計工作量也不是平均的。
如果可以理解上述旅行團過海關的類比,那就再次回到樓主的問題:
===========
某天,旅行團領隊問海關引導人員:放眼看去目前海關共開放了12個查驗櫃檯,請問如何得知敝旅行團會用幾個櫃檯來跑?能不能12個櫃檯都用上加速處理?
海關引導人員:(心中OS:好個#$^%#&^&問題.....)施主,回去請貴團團員們把文件該填的填一填、不要東漏西漏,不要每次都到櫃檯了才借筆來填被趕到旁邊去,帶小孩的爸媽把小小孩抱好,那幾個拿伊朗跟北韓護照的團員皮繃緊一點,其他拿免簽證國家護照的也不要太爽,咱們騎驢看唱本......此外,放眼望去貴團只有9名團員,請問我該如何用上12個櫃檯來加速處理貴團通關程序?
==========
要問一個程式是用幾個核心在跑/支援幾核心,就跟問某個旅行團是支援幾個海關櫃檯/用幾個海關櫃檯在跑一樣,其實都沒什麼意義.....






























































































