例如,如果你想要找出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è)非常簡單、常見以及典型的需求就是旋轉(zhuǎn)圖像。如果你還記得一些三角學(xué)的話,你可能會(huì)想起一個(gè)簡單的公式,將某個(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)致了早期人們在圖形處理器(GPU)中融入多處理器架構(gòu)。NVIDIA®(英偉達(dá)™)頂級(jí)Tesla GPU目前包含240個(gè)處理器核心。雖然這些核心并不像CPU處理器那樣靈活,但是它們在特定任務(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)的「更簡單的」并行編程方式(它仍然不簡單,但是CUDA™的確使特定操作變得更加簡單)。而且,與CPU相比,GPU還能夠提供巨大的性能優(yōu)勢。因此這兩大元素的有機(jī)結(jié)合為開發(fā)人員提供了一條開發(fā)更多創(chuàng)新應(yīng)用程序的途徑。