
常規論調
隨著計算核心數量的增加,計算機的性能也會得到大幅度的提升,所以我們應該購買多核處理器,從而得到更快的計算機運行速度。
技術事實
同時運行多個程序時,更多的CPU核心的確可以使工作更加高效。與此對應的是,如果執行單任務的話,那么這個程序必須為多核心處理器做了優化才能發揮出最佳性能,但并不是每個程序都做了相應的優化。許多程序員在開發軟件時并沒有完全考慮到雙核心、四核心甚至更多核心處理器的情況。理論上,計算核心數量的倍增會使計算性能翻番,但事實上還應該考慮所謂的“多核危機”。
在多核時代之前,程序是順序執行的:完成一步,再執行下一步。因此,更高的CPU頻率就意味著更快的軟件運行速度。但是為單核心處理器編寫的軟件,在大部分情況下無法直接利用多核心的優勢。程序員需要重新設計自己的軟件,而優化將會遇到3種情況。
首先是針對很容易找出的代碼中可以同步執行的運算,對于這類情況,不需要費大力氣修改代碼;另一種是完全不可以同步執行的運算,則完全不需要對代碼進行更改;而第三種情況也是最常見的情況,那就是代碼中的部分運算是獨立的,可以同步執行,部分運算需要基于上一步的計算結果,所以通常無法同步執行,最糟糕的時候兩個或更多代碼區塊在運算時互相干擾,導致整個程序無法運行(無響應)。分析哪些代碼可以同步運算,哪些不可以,需要花費高昂的智力成本和時間成本,所以程序員們會避免這項工作,迄今為止并非所有程序都已經為多核CPU做了優化。這導致了價格不菲的八核處理器功耗較高、產生的熱量較多,但只能發揮整體性能中極小的一部分。總之,如果軟件沒有準備好,那么多核處理器反而有可能會降低系統的整體性能,“CPU核心越多速度越快”這一判斷并不完全正確。
可直接并行計算
許多運算,例如將多個因數相乘的運算可以輕松地實現并行計算。根據核心的數量,可以將每個核心的計算結果兩兩相乘,直到得出結果。
A * B * c * d * e * f * g * h = X
分析后并行計算
匆匆一看,每一步運算都需要基于前一步的運算結果,因此不能并行計算。但是分析之后不難發現,它同樣也可以受益于多CPU核心并行計算。
優化代碼之后,就可以輕松地并行計算: A * B * d * f * H = y
不可執行并行計算
有些運算必須一步接一步進行。依照“加減乘除”運算法則,下面的例子就無法提取出部分進行并行計算。
[(A + B) * c – D] / E – F = Z