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