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