一、OpenMP
OpenMP是由OpenMP Architecture Review Board牽頭提出的媳纬,并已被廣泛接受的钮惠,用于共享內(nèi)存并行系統(tǒng)的多線程程序設(shè)計的一套指導(dǎo)性注釋(Compiler Directive)七芭。OpenMP支持的編程語言包括C語言抖苦、C++和Fortran米死;而支持OpenMP的編譯器包括Sun Compiler,GNU Compiler和Intel Compiler等窗慎。
OpenMP提供了對并行算法的高層的抽象描述卤材,程序員通過在源代碼中加入專用的pragma來指明自己的意圖扇丛,由此編譯器可以自動將程序進(jìn)行并行化帆精,并在必要之處加入同步互斥以及通信。當(dāng)選擇忽略這些pragma隘蝎,或者編譯器不支持OpenMP時嘱么,程序又可退化為通常的程序(一般為串行)顽悼,代碼仍然可以正常運(yùn)作蔚龙,只是不能利用多線程來加速程序執(zhí)行府蛇。
????????OpenMP提供的這種對于并行描述的高層抽象降低了并行編程的難度和復(fù)雜度,這樣程序員可以把更多的精力投入到并行算法本身务荆,而非其具體實(shí)現(xiàn)細(xì)節(jié)函匕。對基于數(shù)據(jù)分集的多線程程序設(shè)計蚪黑,OpenMP是一個很好的選擇。同時结啼,使用OpenMP也提供了更強(qiáng)的靈活性郊愧,可以較容易的適應(yīng)不同的并行系統(tǒng)配置井佑。線程粒度和負(fù)載平衡等是傳統(tǒng)多線程程序設(shè)計中的難題躬翁,但在OpenMP中盒发,OpenMP庫從程序員手中接管了這兩方面的部分工作,提高程序員們的開發(fā)效率蝶防。
但是间学,作為高層抽象低葫,OpenMP并不適合需要復(fù)雜的線程間同步和互斥的場合仍律。OpenMP的另一個缺點(diǎn)是不能在非共享內(nèi)存系統(tǒng)(如計算機(jī)集群)上使用水泉。在這樣的系統(tǒng)上草则,MPI使用較多。
1.1 多執(zhí)行緒的概念
????????OpenMP是作為共享存儲標(biāo)準(zhǔn)而問世的源内。它是為在多處理機(jī)上編寫并行程序而設(shè)計的一個應(yīng)用編程接口膜钓。它包括一套編譯指導(dǎo)語句和一個用來支持它的函數(shù)庫颂斜。
目前雙核、四核掌唾、六核的 CPU 當(dāng)?shù)溃撕说腃PU也已經(jīng)面世多時葱她,所以在多處理機(jī)上編寫似扔、運(yùn)行并行程序會變得相當(dāng)普遍炒辉。
對於一般單一執(zhí)行緒(single thread)的程式黔寇,多核心的處理器并沒有辦法提升它的處理效能;不過對於多執(zhí)行緒(multi thread)的程式屏轰,就可以透過不同的核心同時計算霎苗,來達(dá)到加速的目的了唁盏!簡單的例子厘擂,以單執(zhí)行緒的程式來說轰传,一件事做一次要十秒的話获茬,要做十次,都丟給同一顆核心做的話渤涌,自然就是10 秒 * 10 次把还,也就是 100 秒了吊履;但是以多執(zhí)行緒的程式來說艇炎,它可以把這一件事缀踪,分給兩顆核心各自做,每顆核心各做 5 次奏候,所以所需要的時間就只需要 50 秒蔗草!
當(dāng)然蕉世,多執(zhí)行緒的程式實(shí)際上沒這么簡單婆硬。在工作的切割彬犯、結(jié)合上谐区,也是要多花時間的宋列,所以在現(xiàn)實(shí)中,即使最佳狀況盗迟,雙核心的效能也不會是 1 + 1 = 2 這樣的理想化熙含。除此之外怎静,也不是所有工作都是可以切割的蚓聘!很多工作是有關(guān)聯(lián)性的或粮,這樣如果直接切割給不同的處理核心各自去平行運(yùn)算氯材,出來的結(jié)果是肯定有問題的硝岗。而且型檀,多執(zhí)行緒的程式在編寫胀溺、維護(hù)上仓坞,也都比單一執(zhí)行緒的程式復(fù)雜上不少无埃。
不過嫉称,如果電腦本身是多處理器、多核心處理器壳繁,或是處理器擁有像 Intel Hyper-Threading Technology
這類的能在同一個時間處理多個執(zhí)行緒的功能的話闹炉,那把各自獨(dú)立的工作由單一執(zhí)行緒改成多執(zhí)行緒剩胁,在執(zhí)行的效率上昵观,大多還是會有增進(jìn)的啊犬!
1.2 多執(zhí)行緒的程式
????????寫程式的時候該怎么去寫多執(zhí)行緒的程式呢觉至?一般的方法,就是真的利用 thread 的控制峻贮,去實(shí)際在程式中去產(chǎn)生其他的 thread 來處理应闯。像 POSIX Threads 這套 library纤控,就是用來產(chǎn)生、控制執(zhí)行緒的函式庫碉纺。而像 Microsoft VisualStudio 2005 中船万,也有提供控制thread 的功能。這種方法骨田,大多就是產(chǎn)生多個 thread耿导,而再由主要的 thread 把工作拆開,分給各 thread 去運(yùn)算舱呻,最後再由主要的 thread 回收結(jié)果、整合抵卫。
但是狮荔,實(shí)際上要去控制 thread 是滿麻煩的~在程式的編寫上,也會復(fù)雜不少介粘;而如果我們只是想要把一些簡單的回圈平行化處理殖氏,用 thread library 來控制,實(shí)在有點(diǎn)殺雞用牛刀的感覺姻采。這時候雅采,用 OpenMP 就簡單多了!OpenMP 是一種能透過高階指令,很簡單地將程式平行化婚瓜、多執(zhí)行緒化的API宝鼓;在最簡單的情形,甚至可以只加一行指令巴刻,就可以將回圈內(nèi)的程式平行化處理了愚铡!
1.3 OpenMP 的基本使用
在編寫使用OpenMP的程序時,則需要先include OpenMP的頭文件:omp.h胡陪。
而要將 for 回圈平行化處理沥寥,該怎么做呢?非常簡單柠座,只要在前面加上一行#pragma omp parallel for就夠了邑雅!
也可以實(shí)際用一段簡單的程序,來弄清楚它的運(yùn)作方式妈经。
#include <stdio.h>
#include <stdlib.h>
void Test(int n) {
for (int i = 0; i < 10000; ++i){
//do nothing, just waste time
}
printf("%d, ", n);
}
int main(int argc, char* argv[]){
for (int i = 0; i < 10; ++i)
Test(i);
system("pause");
return 0;
}
????????上面的程序淮野,在 main() 是一個很簡單的回圈,跑十次吹泡,每次都會調(diào)用Test()這個函數(shù)骤星,并把是回圈的執(zhí)行次數(shù)(i)傳進(jìn)Test() 并打印出來。想當(dāng)然荞胡,它的結(jié)果會是:
????????????????????????????????????????????????????????0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
而如果想利用 OpenMP把 main() 里面的回圈平行化處理呢妈踊?只需要修改成下面的樣子:
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
void Test (int n) {
for (int i = 0; i < 10000; ++i) {
//do nothing, just waste time
}
printf("%d, ", n);
}
int main(int argc, char* argv[]) {
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
Test( i );
system("pause");
return 0;
}
????????夠簡單吧?重頭到尾泪漂,只加了兩行!而執(zhí)行后歪泳,可以發(fā)現(xiàn)結(jié)果也變了萝勤!
????????????????????????????????????????????????0, 5, 1, 6, 2, 7, 3, 8, 4, 9,
????????可以從結(jié)果很明顯的發(fā)現(xiàn),他沒有照著0到9的順序跑了呐伞!而上面的順序怎么來的敌卓?其實(shí)很簡單,OpenMP只是把回圈 0 - 9 共十個步驟伶氢,拆成 0 - 4, 5 - 9 兩部份趟径,丟給不同的執(zhí)行緒去跑,所以數(shù)字才會出現(xiàn)這樣交錯性的輸出~
????????而要怎么確定真的有跑多執(zhí)行緒呢癣防?如果本來有多處理器蜗巧、多核心處理器或有 Hyper Thread 的話,一個單執(zhí)行緒程序蕾盯,最多只會把一顆核心的使用量吃完幕屹;像比如說在 Pentium 4 HT 上跑,單一執(zhí)行緒的程序,在工作管理員中看到的 CPU 使用率最多就是50%望拖。而利用 OpenMP 把回圈進(jìn)行平行化處理后渺尘,就可以在執(zhí)行回圈時,把兩顆核心的 CPU 都榨光了说敏!也就是CPU 使用率是100%鸥跟。
1.4 OpenMP使用詳解
由于內(nèi)容太多,筆者就此內(nèi)容單獨(dú)寫了一個博客《OpenMP使用詳解》盔沫,點(diǎn)擊左側(cè)鏈接進(jìn)入锌雀。
二、MPI (Message Passing Interface)
????????對MPI的定義是多種多樣的迅诬,但不外乎下面三個方面腋逆,它們限定了MPI的內(nèi)涵和外延:
1、MPI是一個庫侈贷,而不是一門語言惩歉。許多人認(rèn)為,MPI就是一種并行語言俏蛮,這是不準(zhǔn)確的撑蚌。但是,按照并行語言的分類搏屑,可以把FORTRAN+MPI或C+MPI看作是一種在原來串行語言基礎(chǔ)之上擴(kuò)展后得到的争涌,并行語言MPI庫可以被FORTRAN77/C/Fortran90/C++調(diào)用,從語法上說辣恋,它遵守所有對庫函數(shù)/過程的調(diào)用規(guī)則亮垫,和一般的函數(shù)/過程沒有什么區(qū)別;
2伟骨、MPI是一種標(biāo)準(zhǔn)或規(guī)范的代表饮潦,而不特指某一個對它的具體實(shí)現(xiàn),迄今為止携狭,所有的并行計算機(jī)制造商都提供對MPI的支持继蜡,可以在網(wǎng)上免費(fèi)得到MPI在不同并行計算機(jī)上的實(shí)現(xiàn),一個正確的MPI程序可以不加修改地在所有的并行機(jī)上運(yùn)行逛腿;
3稀并、MPI是一種消息傳遞編程模型,并成為這種編程模型的代表单默。事實(shí)上碘举,標(biāo)準(zhǔn)MPI雖然很龐大,但是它的最終目的是服務(wù)于進(jìn)程間通信這一目標(biāo)的雕凹;(解釋來源于《高性能計算之并行編程技術(shù)——MPI并行程序設(shè)計》都志輝 編著)
????????MPI是多點(diǎn)接口(Multi Point Interface)的簡稱殴俱,是西門子公司開發(fā)的用于PLC之間通訊的保密的協(xié)議政冻。MPI通訊是當(dāng)通信速率要求不高、通信數(shù)據(jù)量不大時线欲,可以采用的一種簡單經(jīng)濟(jì)的通訊方式明场。MPI通信可使用PLC S7-200/300/400、操作面板TP/OP及上位機(jī)MPI/PROFIBUS通信卡李丰,如CP5512/CP5611/CP5613等進(jìn)行數(shù)據(jù)交換苦锨。(解釋來源于《西門子工業(yè)網(wǎng)絡(luò)通信指南》(上冊) 崔堅 主編)
MPI的實(shí)現(xiàn)包括MPICH、LAM趴泌、IBM MPL等多個版本舟舒,最常用和穩(wěn)定的是MPICH,曙光天潮系列的MPI以MPICH為基礎(chǔ)進(jìn)行了定制和優(yōu)化嗜憔。
MPICH含三層結(jié)構(gòu)秃励,最上層是MPI的API,基本是點(diǎn)到點(diǎn)通信吉捶,和在點(diǎn)到點(diǎn)通信基礎(chǔ)上構(gòu)造的集群通信(Collective Communication)夺鲜;中間層是ADI層(Abstract Device Interface),其中device可以簡單地理解為某一種底層通信庫呐舔,ADI就是對各種不同的底層通信庫的不同接口的統(tǒng)一標(biāo)準(zhǔn)币励;底層是具體的底層通信庫,例如工作站機(jī)群上的p4通信庫珊拼、曙光1000上的NX庫食呻、曙光3000上的BCL通信庫等。
MPICH的1.0.12版本以下都采用第一代ADI接口的實(shí)現(xiàn)方法澎现,利用底層device提供的通信原語和有關(guān)服務(wù)函數(shù)實(shí)現(xiàn)所有的ADI接口仅胞,可以直接實(shí)現(xiàn),也可以依靠一定的模板間接實(shí)現(xiàn)昔头。自1.0.13版本開始饼问,MPICH采用第二代ADI接口。
三揭斧、 CUDA
CUDA(Compute Unified Device Architecture),顯卡廠商N(yùn)Vidia推出的運(yùn)算平臺峻堰。
CUDA?是一種由NVIDIA推出的通用并行計算架構(gòu)讹开,該架構(gòu)使GPU能夠解決復(fù)雜的計算問題。它包含了CUDA指令集架構(gòu)(ISA)以及GPU內(nèi)部的并行計算引擎捐名。開發(fā)人員現(xiàn)在可以使用C語言來為CUDA?架構(gòu)編寫程序旦万,C語言是應(yīng)用最廣泛的一種高級編程語言。所編寫出的程序于是就可以在支持CUDA?的處理器上以超高性能運(yùn)行镶蹋。還支持其它語言成艘,包括FORTRAN以及C++赏半。
CUDA(Compute Unified Device Architecturem,統(tǒng)一計算設(shè)備架構(gòu))這一編程模型淆两,是想在應(yīng)用程序中充分利用CPU和GPU各自的優(yōu)點(diǎn)《象铮現(xiàn)在,該架構(gòu)現(xiàn)已應(yīng)用于GeForce?(精視?)秋冰、ION?(翼揚(yáng)?)仲义、Quadro以及Tesla GPU(圖形處理器)上,對應(yīng)用程序開發(fā)人員來說剑勾,這是一個巨大的市場埃撵。
在消費(fèi)級市場上,幾乎每一款重要的消費(fèi)級視頻應(yīng)用程序都已經(jīng)使用CUDA加速或很快將會利用CUDA來加速虽另,其中不乏Elemental Technologies公司暂刘、MotionDSP公司以及LoiLo公司的產(chǎn)品。
在科研界捂刺,CUDA一直受到熱捧谣拣。例如,CUDA現(xiàn)已能夠?qū)MBER進(jìn)行加速叠萍。AMBER是一款分子動力學(xué)模擬程序芝发,全世界在學(xué)術(shù)界與制藥企業(yè)中有超過60,000名研究人員使用該程序來加速新藥的探索工作。
在金融市場苛谷,Numerix以及CompatibL針對一款全新的對手風(fēng)險應(yīng)用程序發(fā)布了CUDA支持并取得了18倍速度提升辅鲸。Numerix為近400家金融機(jī)構(gòu)所廣泛使用。
CUDA的廣泛應(yīng)用造就了GPU計算專用Tesla GPU的崛起腹殿。全球財富五百強(qiáng)企業(yè)現(xiàn)在已經(jīng)安裝了700多個GPU集群独悴,這些企業(yè)涉及各個領(lǐng)域,例如能源領(lǐng)域的斯倫貝謝與雪佛龍以及銀行業(yè)的法國巴黎銀行锣尉。
3.1 CUDA發(fā)展歷程
????????隨著顯卡的發(fā)展刻炒,GPU越來越強(qiáng)大,而且GPU為顯示圖像做了優(yōu)化自沧。在計算上已經(jīng)超越了通用的CPU坟奥。如此強(qiáng)大的芯片如果只是作為顯卡就太浪費(fèi)了,因此NVidia推出CUDA拇厢,讓顯卡可以用于圖像計算以外的目的爱谁。
目前只有G80、G92孝偎、G94访敌、G96、GT200衣盾、GF100平臺(即Geforce 8~Gecorce GTX480)的NVidia顯卡才能使用CUDA寺旺,工具集的核心是一個C語言編譯器爷抓。G80中擁有128個單獨(dú)的ALU,因此非常適合并行計算阻塑,而且數(shù)值計算的速度遠(yuǎn)遠(yuǎn)優(yōu)于CPU蓝撇。
CUDA的SDK中的編譯器和開發(fā)平臺支持Windows、Linux系統(tǒng)叮姑,可以與Visual Studio2005集成在一起唉地。
3.2 CUDA體系結(jié)構(gòu)
????????從CUDA體系結(jié)構(gòu)的組成來說,包含了三個部分:開發(fā)庫传透、運(yùn)行期環(huán)境和驅(qū)動耘沼。
開發(fā)庫是基于CUDA技術(shù)所提供的應(yīng)用開發(fā)庫。目前CUDA的1.1版提供了兩個標(biāo)準(zhǔn)的數(shù)學(xué)運(yùn)算庫——CUFFT(離散快速傅立葉變換)和CUBLAS(離散基本線性計算)的實(shí)現(xiàn)朱盐。這兩個數(shù)學(xué)運(yùn)算庫所解決的是典型的大規(guī)模的并行計算問題群嗤,也是在密集數(shù)據(jù)計算中非常常見的計算類型。開發(fā)人員在開發(fā)庫的基礎(chǔ)上可以快速兵琳、方便的建立起自己的計算應(yīng)用狂秘。此外,開發(fā)人員也可以在CUDA的技術(shù)基礎(chǔ)上實(shí)現(xiàn)出更多的開發(fā)庫躯肌。
運(yùn)行期環(huán)境提供了應(yīng)用開發(fā)接口和運(yùn)行期組件者春,包括基本數(shù)據(jù)類型的定義和各類計算、類型轉(zhuǎn)換清女、內(nèi)存管理钱烟、設(shè)備訪問和執(zhí)行調(diào)度等函數(shù)〉毡基于CUDA開發(fā)的程序代碼在實(shí)際執(zhí)行中分為兩種拴袭,一種是運(yùn)行在CPU上的宿主代碼(Host Code),一種是運(yùn)行在GPU上的設(shè)備代碼(Device Code)曙博。不同類型的代碼由于其運(yùn)行的物理位置不同拥刻,能夠訪問到的資源不同,因此對應(yīng)的運(yùn)行期組件也分為公共組件父泳、宿主組件和設(shè)備組件三個部分般哼,基本上囊括了所有在GPGPU開發(fā)中所需要的功能和能夠使用到的資源接口,開發(fā)人員可以通過運(yùn)行期環(huán)境的編程接口實(shí)現(xiàn)各種類型的計算惠窄。
3.3 CUDA工具包
是一種針對支持CUDA功能的GPU(圖形處理器)的C語言開發(fā)環(huán)境逝她。CUDA開發(fā)環(huán)境主要包括:Linux、WinAll睬捶。
3.4 nvcc C語言編譯器
????????CUDA的本質(zhì)是NVIDIA為自家的GPU編寫了一套編譯器NVCC極其相關(guān)的庫文件。CUDA的應(yīng)用程序擴(kuò)展名可以選擇是.cu近刘,而不是.cpp等擒贸。NVCC是一個預(yù)處理器和編譯器的混合體臀晃。當(dāng)遇到CUDA代碼的時候,自動編譯為GPU執(zhí)行的代碼介劫,也就是生成調(diào)用CUDA Driver的代碼徽惋。如果碰到Host C++代碼,則調(diào)用平臺自己的C++編譯器進(jìn)行編譯座韵,比如Visual Studio C++自己的Microsoft C++ Compiler险绘。然后調(diào)用Linker把編譯好的模塊組合在一起,和CUDA庫與標(biāo)準(zhǔn)C/C++庫鏈接成為最終的CUDA Application誉碴。由此可見宦棺,NVCC模仿了類似于GCC一樣的通用編譯器的工作原理(GCC編譯CC++代碼本質(zhì)上就是調(diào)用cc和g++)。整個CUDA平臺是通過運(yùn)用顯卡內(nèi)的流處理器進(jìn)行數(shù)學(xué)運(yùn)算黔帕,并通過GPU內(nèi)部的緩存共享數(shù)據(jù)代咸,流處理器之間甚至可以互相通信,同時對數(shù)據(jù)的存儲也不再約束于以GPU的紋理方式成黄,存取更加靈活呐芥,可以充分利用統(tǒng)一架構(gòu)的流輸出(stream out)特性,大大提高應(yīng)用效率奋岁。
3.5 CUDA的運(yùn)算
????????目前的CUDA所用的運(yùn)算方法是分開的思瘟,一部分由CPU負(fù)責(zé),而另一部分通過CUDA編譯器使用GPU進(jìn)行運(yùn)算闻伶。在CUDA的架構(gòu)下滨攻,一個程序分為兩個部份:Host 端和Device 端。Host 端是指在CPU 上執(zhí)行的部份虾攻,而device 端則是在顯示芯片上執(zhí)行的部份铡买。Device端的程序又稱為 “kernel”。通常host端程序會將數(shù)據(jù)準(zhǔn)備好后霎箍,復(fù)制到顯卡的內(nèi)存中奇钞,再由顯示芯片執(zhí)行device端程序,完成后再由host端程序?qū)⒔Y(jié)果從顯卡的內(nèi)存中取回漂坏。
????????由于顯示芯片大量并行計算的特性景埃,它處理一些問題的方式,和一般CPU是不同的顶别。比如在內(nèi)存存取latency 的問題上谷徙,CPU 通常使用cache 來減少存取主內(nèi)存的次數(shù),以避免內(nèi)存latency 影響到執(zhí)行效率驯绎,而顯示芯片則多半沒有cache(或很小)完慧,而利用并行化執(zhí)行的方式來隱藏內(nèi)存的latency(即,當(dāng)?shù)谝粋€ thread 需要等待內(nèi)存讀取結(jié)果時剩失,則開始執(zhí)行第二個thread屈尼,依此類推)册着,效率提高不少。正如 NVIDIA(英偉達(dá))公司Tesla GPU計算事業(yè)部高級產(chǎn)品經(jīng)理Sumit Gupta先生曾經(jīng)推過一個形象的例子脾歧,CPU的順序指令執(zhí)行操作好比是一間辦公室里的多個職員甲捏,如果每人需要將杯子里的水倒入同一個桶內(nèi)時,他們需要排成長隊(duì)按順序進(jìn)行鞭执。而對于GPU來說司顿,這些職員無需排隊(duì),只要同時走到桶前將水倒入即可兄纺。所以大溜,最適合利用CUDA處理的問題,是可以大量并行化的問題囤热,才能有效隱藏內(nèi)存的latency猎提,并有效利用顯示芯片上的大量執(zhí)行單元。使用CUDA
時旁蔼,同時有上千個thread在執(zhí)行是很正常的锨苏。因此,如果不能大量并行化的問題棺聊,使用CUDA就沒辦法達(dá)到最好的效率了
3.6 GPU并行計算過程
而NVIDIA(英偉達(dá))在6月17日GeForce GTX 200系列發(fā)布之時也推出了CUDA 2.0伞租,加入雙精度運(yùn)算支持,為應(yīng)用提供更準(zhǔn)確的運(yùn)算結(jié)果限佩,而這項(xiàng)技術(shù)源自于多重處理器的專用單元葵诈。
多重處理器的專用單元框架
每一個多重處理器都包含了8個主要的FMAD處理器和8個MUL處理器來實(shí)現(xiàn)一些特殊功能的計算等。這樣祟同,一個64位的FMAD處理器就產(chǎn)生了作喘。但是這樣的處理器對于64位的計算能力相當(dāng)?shù)拖拢?X的低速FMAD和16X的低速FMUL都是導(dǎo)致計算能力低下的原因。這個支持64位也意味著可以以它為模板為將來的更高級和新一代的GPU發(fā)展提供代碼或者應(yīng)用程序的支持晕城,從而得到更好的甚至超過一個以上的64位處理器泞坦。每一個多重處理器都具有兩個流處理線,這樣就不必依賴周期而同時處理兩個信號砖顷。
引入雙精度運(yùn)算能力贰锁,可以在一定程度上增強(qiáng)GT200在科學(xué)計算領(lǐng)域的適用性.盡管在實(shí)際的相關(guān)領(lǐng)域中其實(shí)有部分甚至只需要16位精度就足夠了,但GTX200核心的每一個SM都包括了一個雙精度64Bit浮點(diǎn)運(yùn)算單元滤蝠,所以每個周期GT200能達(dá)成1MAD*30SM=30MAD豌熄,在1.5GHz的shader頻率下可以達(dá)到90 GFLOPS(MAD)的雙精度浮點(diǎn)性能, NVIDIA(英偉達(dá))對其稱之為可以與8核Xeon處理器(我想應(yīng)該是指45nm Hypertown內(nèi)核Xeon E5440 2.83GHz)的水平物咳。不過需要注意的是锣险,Xeon每個內(nèi)核的浮點(diǎn)單元組合是每兩個周期完成一個ADDPD或者一個周期完成一個MULPD,在雙精度浮點(diǎn)峰值性能上"含金量"方面似乎要比GT200每個SM單周期MAD高一些。
NVIDIA(英偉達(dá))的對手AMD在RV670上實(shí)現(xiàn)了硬件(非模擬)的FP64支持囱持,雙精度MAD性能為單精度MAD的1/5夯接,GT200架構(gòu)的雙精度浮點(diǎn)支持應(yīng)該是 NVIDIA(英偉達(dá))邁向雙精度浮點(diǎn)加速器的第一步尤辱,未來的架構(gòu)很可能會把浮點(diǎn)雙精度的性能做到單精度的1/2水平舷嗡,這將是非衬≤剑可觀的。
2007年可以說是GPU發(fā)展史上翻天覆地的一年掩幢,在這一年微軟推出了DirectX 10 API標(biāo)準(zhǔn),將傳統(tǒng)的Pixel Shader(頂點(diǎn)著色器)上鞠、Vertex Shader(像素著色器)和Geometry Shader(幾何著色器)际邻,三種硬件邏輯被整合為一個全功能的統(tǒng)一著色器Shader。
這種API發(fā)展思路背后是微軟和NVIDIA芍阎、AMD對于整個GPU發(fā)展歷程的思考與轉(zhuǎn)型世曾。它標(biāo)志著微軟開始支持GPU走向更強(qiáng)的可編程性,也標(biāo)志著Intel等傳統(tǒng)CPU制造廠商在未來幾年將要面對GPU的強(qiáng)硬挑戰(zhàn)谴咸,越來越多的高性能計算機(jī)和超級計算機(jī)已經(jīng)開始以GPU作為其運(yùn)算能力提升的重要配件轮听。
天河一號-A所采用的NVIDIA Tesla GPU
2007年同樣是NVIDIA值得回憶的一年,NVIDIA公司在這一年正式推出了CUDA整套方案岭佳,它是一個完整的通用計算產(chǎn)品血巍。CUDA是Compute Unified Device Architecture(統(tǒng)一計算架構(gòu))的簡稱,是建立在GPU基礎(chǔ)之上的通用計算開發(fā)平臺珊随,它是一個全新的軟硬件架構(gòu)述寡,可以將GPU視為一個并行數(shù)據(jù)計算的設(shè)備,對所進(jìn)行的計算進(jìn)行分配和管理叶洞。
簡單分析可知鲫凶,CUDA是一種以C語言為基礎(chǔ)的平臺,主要是利用顯卡強(qiáng)大的浮點(diǎn)運(yùn)算能力來完成以往需要CPU才可以完成的任務(wù)衩辟。這種整套方案的提出意味著程序員再也不用去鉆研繁雜的底層匯編程序螟炫,而是在C語言的基礎(chǔ)上稍加學(xué)習(xí)就能掌握CUDA并通過它來調(diào)用GPU強(qiáng)大的浮點(diǎn)運(yùn)算能力。
這一版本的CUDA大幅度降低了編程難度惭婿,同時提升了GPU的編程和執(zhí)行效率不恭。CUDA 4.0主要的功能能夠在Fermi架構(gòu)的最新GPU上被發(fā)揮出來,同時它可以讓G80财饥、G92换吧、GT200架構(gòu)的GPU也擁有編程方式上的飛躍。
上圖描述了NVIDIA CUDA發(fā)布以來钥星,從1.0版本官方大力宣傳和愛好者嘗試沾瓦,到2.0版專用領(lǐng)域開始應(yīng)用CUDA進(jìn)行編程開發(fā),3.0版本已經(jīng)引來整個行業(yè)的關(guān)注,大量軟件開始基于CUDA進(jìn)行基于GPU的加速開發(fā)贯莺,到今天推出4.0版本繼續(xù)降低開發(fā)難度提升開發(fā)效率风喇。
除了上述敘述之外,我們通過資料得到CUDA 4.0架構(gòu)版本還包含大量其它特性與功能缕探,其中包括:
1魂莫、MPI與CUDA應(yīng)用程序相結(jié)合——當(dāng)應(yīng)用程序發(fā)出MPI收發(fā)調(diào)用指令時,例如OpenMPI等改編的MPI軟件可通過Infiniband與顯卡顯存自動收發(fā)數(shù)據(jù)爹耗。
2耙考、GPU多線程共享——多個CPU主線程能夠在一顆GPU上共享運(yùn)行環(huán)境,從而使多線程應(yīng)用程序共享一顆GPU變得更加輕松潭兽。
3倦始、單CPU線程共享多GPU——一個CPU主線程可以訪問系統(tǒng)內(nèi)的所有GPU。 開發(fā)人員能夠輕而易舉地協(xié)調(diào)多顆GPU上的工作負(fù)荷山卦,滿足應(yīng)用程序中“halo”交換等任務(wù)的需要鞋邑。
4、全新的NPP圖像與計算機(jī)視覺庫——其中大量圖像變換操作讓開發(fā)人員能夠快速開發(fā)出成像以及計算機(jī)視覺應(yīng)用程序账蓉。
5枚碗、全新、改良的功能
Visual Profiler中的自動性能分析功能
Cuda-gdb中的新特性以及新增了對MacOS的支持
新增了對C++特性的支持剔猿,這些特性包括新建/刪除以及虛擬等功能
全新的GPU二進(jìn)制反匯編程序
目前CUDA能夠有效利用GPU強(qiáng)勁的處理能力和巨大的存儲器帶寬進(jìn)行圖形渲染以外的計算视译,廣泛應(yīng)用于圖像處理、視頻傳播归敬、信號處理酷含、人工智能、模式識別汪茧、金融分析椅亚、數(shù)值計算、石油勘探舱污、天文計算呀舔、流體力學(xué)、生物計算扩灯、分子動力學(xué)計算媚赖、數(shù)據(jù)庫管理、編碼加密等領(lǐng)域珠插,并在這些領(lǐng)域中對CPU獲得了一到兩個數(shù)量級的加速惧磺,取得了令人矚目的成績。