jeeyi345 wrote:
那可以請教一下為什麼在做耗費cpu工作(遊戲、轉檔、解壓縮)時
我的雙核心只有一邊高呢
...(恕刪)
一件工作,一個人作需要一小時,由兩個人來作,您確定"任何工作"都能變成半小時完成?由四個人來作,也並非一定就能十五分鐘完成。有些工作本身沒有全程的平行度,天生就無法將勞役全程平均分配給兩個CPU執行。也有些工作本身的屬性,分給兩人執行,花在傳遞資料跟溝通時間反而更高,不如一個人全程執行到完,您想想看身邊職場的工作,有沒有這樣的例子?並非任何工作都能完美平行化或簡簡單單就達到最佳Load Balancing,例如影像解壓縮/轉檔過程中的Entropy coding/decoding部分,就是一項sequential屬性、很難完美平行化的工作。
寫平行程式的Load Balancing,某種程度也可套用80/20法則,花20%的時間,或許就可達到80%的平行度,但要追求那剩下20%的平行度求完美,可能要多花那80%的時間,許多公司、設計師,或限於公司產品上市時程、或限於專案時程、或限於個人資質,很可能就把這20%平行度放棄掉了。
也可用工廠排程的例子來看,一條生產線idle,排程的負責人理論上當然應該排上另一件工作去生產,但如果工廠沒有另一張訂單呢?以轉檔來說,如果您不想換平行性最佳化程度較高的轉檔程式,那您何不同時轉兩個檔?同時解壓縮兩個檔案?同時玩兩個遊戲?但同時正好有兩個檔要解壓縮的機率可能不大,同時玩兩個遊戲,您也知道,意義也不大。那乾脆玩遊戲時在背景轉檔呢?要考慮的事也不少,會不會太操當機、轉完了要不要先中斷遊戲轉另一個、轉檔會不會在生死關頭當下干擾到遊戲這端....等。
所以,您真有那麼多的工作需要讓兩顆核心隨時滿載、或如此介意隨時負載平衡嗎?若您真的很希望看到兩顆CPU核心隨時負載平衡/滿載,那您也得要主動負起排程的責任,不能期待光靠應用程式、作業系統、處理器就能自然達成。
只有在process level的平行度、thread level的平行度、instruction level的平行度都達到完美平行化時,您才有機會看到雙CPU兩邊隨時使用率同樣高的理想世界。CPU的Dynamic Execution跟編譯器有一定的彈性來幫助提高某個CPU核心內instruction level的平行性,但畢竟CPU不是人腦,編譯器分析也有一定的極限;SIMD指令集所能幫忙的資料平行度,必須看工作本身是否有資料平行度、適合去運用SIMD指令集改寫,以及程式設計師本身的分析跟努力程度;作業系統所能處理的平行性在於將系統內所有process/thread輪流分配給多核心處理器內的不同核心執行的排程,也就是process level跟thread level的平行性,但排程邏輯也是作業系統程式寫死的,而且對於系統內的某一應用程式來說,還是得看程式設計師寫程式時分析該應用工作的平行性、適當切割計算量差不多的tasks、再各自寫成thread的功力。整個過程,完全操之在您的在於要平行執行哪些應用、選擇那一家的平行最佳化程度較高的程式(如轉檔程式),是可由您自己決定的。
畢竟這是您的個人電腦,並不是國家級、造價昂貴、最好隨時滿載、將空閒的CPU time都租出去才划算、作業系統/編譯器還可以不時客製修改針對平行處理/Load Balancing最佳化、有些還有專人負責程式上線排程的超級電腦唷!別太鑽牛角尖了。