并行計(jì)算的難點(diǎn)與數(shù)學(xué)原理解析
大約在五年前的那段時(shí)期內(nèi),計(jì)算速度的你追我逐曾一度陷入僵局。直到那個(gè)時(shí)候,設(shè)計(jì)師還一直是通過人盡皆知的三種技術(shù)來實(shí)現(xiàn)狂飆的性能:縮小本來已經(jīng)非常微小的晶體管、在每顆處理器中整合更多數(shù)量的晶體管以及讓它們以更高的頻率運(yùn)行。
問題是,更高的處理器性能意味著更大的功耗和更多發(fā)熱量,即使你在芯片燒焦之前找到了一種方法來解決掉發(fā)熱量過大的問題,延續(xù)這種趨勢(shì)也會(huì)造成成本過高以及對(duì)環(huán)境的破壞過大。
另一種實(shí)現(xiàn)更快計(jì)算性能的方法也已經(jīng)有一段時(shí)間的歷史了。這種方法并不是讓處理器突破速度極限,而是采用更多的處理器。大型計(jì)算機(jī)與服務(wù)器長(zhǎng)期以來一直采用眾多的處理器來處理繁重的工作。然而芯片技術(shù)的進(jìn)步讓人們能夠在單一芯片中集成多個(gè)處理器,這種方法不僅效率更高而且還便宜很多。當(dāng)今,高性能計(jì)算的方式是將計(jì)算任務(wù)進(jìn)行分割,然后交由諸多處理器核心進(jìn)行處理。假如是個(gè)人計(jì)算機(jī),這意味著不僅CPU能夠擁有大量核心,而且圖形處理器(GPU)也能夠包含數(shù)十個(gè),甚至是數(shù)以百計(jì)的核心。
然而,多處理器硬件所帶來的問題是軟件上的巨大挑戰(zhàn)。從20世紀(jì)40年代現(xiàn)代計(jì)算的初期開始,各種程序就一直是設(shè)計(jì)成順序執(zhí)行的方式。美國國防部高級(jí)研究計(jì)劃署提供了大部分資金用來開發(fā)包含大量處理器的系統(tǒng),并取得了一定的成功。在這類系統(tǒng)中,計(jì)算任務(wù)被分割成諸多細(xì)小部分,這些細(xì)小的任務(wù)可以同時(shí)運(yùn)行,這些系統(tǒng)旨在通過這種方式來解決計(jì)算難題。然而,這些大規(guī)模并行系統(tǒng)沒有能夠在商業(yè)市場(chǎng)中生根發(fā)芽。
原因之一便是最常見的計(jì)算難題以及用于解決這些難題的算法不能很好地適應(yīng)這種「分割」的處理方式。而順序的想法似乎已經(jīng)在我們的大腦中根深蒂固。神經(jīng)系統(tǒng)科學(xué)家Jill Bolte Taylor指出,大腦的右半部分能夠處理感官信號(hào),它所做的是并行處理。而大腦的左半部分負(fù)責(zé)分析想法,「其運(yùn)行方式就像是一個(gè)串行處理器?!共还苁呛眠€是壞,編程都是一項(xiàng)左腦的活動(dòng)。
并行方法在數(shù)學(xué)上的最大障礙便是,許多進(jìn)程是遞歸的:每一步都依賴上一步的結(jié)果??紤]一下找出兩個(gè)整數(shù)的最大公約數(shù)這一簡(jiǎn)單問題。解決這一問題的標(biāo)準(zhǔn)方法是歐幾里德算法,這種算法已經(jīng)有2,000多年的歷史,所使用的是重復(fù)減法。
例如,如果你想要找出2,987與1,751的最大公約數(shù),那么可以先用2,987來減1,751。重復(fù)地減掉差數(shù)(視需要顛倒順序,以防出現(xiàn)負(fù)數(shù)),直到結(jié)果為零。在這一例子中,這兩個(gè)數(shù)的最大公約數(shù)是103。這是一個(gè)完美而高效的方法,但是它是一個(gè)天生的串行式方法,因?yàn)槊恳淮螠p法都依賴于上一次的結(jié)果。
串行思想雖然占據(jù)主導(dǎo)地位,但是也有例外。最好的例子便是圖形。在圖形中,一個(gè)非常簡(jiǎn)單、常見以及典型的需求就是旋轉(zhuǎn)圖像。如果你還記得一些三角學(xué)的話,你可能會(huì)想起一個(gè)簡(jiǎn)單的公式,將某個(gè)點(diǎn)逆時(shí)針旋轉(zhuǎn)一個(gè)角度& Theta:
其重點(diǎn)在于,每個(gè)點(diǎn)的處理都可以獨(dú)立于所有其它點(diǎn)之外。如果你的處理器數(shù)目與點(diǎn)數(shù)一樣多的話,那么整個(gè)轉(zhuǎn)換過程即可在一個(gè)大規(guī)模并行運(yùn)算中完成計(jì)算。諸多更加復(fù)雜的圖形任務(wù)也是如此。
圖形任務(wù)的并行友好性特點(diǎn)導(dǎo)致了早期人們?cè)趫D形處理器(GPU)中融入多處理器架構(gòu)。NVIDIA®(英偉達(dá)™)頂級(jí)Tesla GPU目前包含240個(gè)處理器核心。雖然這些核心并不像CPU處理器那樣靈活,但是它們?cè)谔囟ㄈ蝿?wù)上卻更勝一籌,例如諸多計(jì)算密集型難題當(dāng)中重要的向量運(yùn)算。
無論是針對(duì)CPU還是GPU來說,能夠有效利用大量核心的軟件仍然是個(gè)難題,但是情況已經(jīng)變得越來越好。NVIDIA®(英偉達(dá)™)憑借著CUDA™并行編程模型以及C語言擴(kuò)展充當(dāng)開路先鋒,該模型讓通用計(jì)算能夠在NVIDIA®(英偉達(dá)™)GPU上運(yùn)行,而其C語言擴(kuò)展則消除了對(duì)這種處理器進(jìn)行編程的門檻。因此,開發(fā)人員能夠分別通過CUDA™工具包以及PGI的CUDA™ Fortran編譯器來利用C、C++以及Fortran語言對(duì)NVIDIA®(英偉達(dá)™)CUDA™ GPU進(jìn)行編程。同時(shí)還能夠利用諸多驅(qū)動(dòng)程序級(jí)的API,例如OpenCL以及DirectCompute。
軟件開發(fā)人員所面臨的最大難題之一便是在現(xiàn)有應(yīng)用程序上實(shí)現(xiàn)更高性能以及開發(fā)出更多全新的計(jì)算密集型應(yīng)用程序。無論是選擇多核CPU還是核群GPU,除了考慮將其應(yīng)用程序?qū)崿F(xiàn)并行化以外,他們別無選擇。根據(jù)近幾年的發(fā)展,CUDA™并行編程模型已經(jīng)成為一款公認(rèn)的「更簡(jiǎn)單的」并行編程方式(它仍然不簡(jiǎn)單,但是CUDA™的確使特定操作變得更加簡(jiǎn)單)。而且,與CPU相比,GPU還能夠提供巨大的性能優(yōu)勢(shì)。因此這兩大元素的有機(jī)結(jié)合為開發(fā)人員提供了一條開發(fā)更多創(chuàng)新應(yīng)用程序的途徑。
了解更多請(qǐng)參閱
【編輯推薦】