主板上來(lái)了一個(gè)新鄰居,CPU慌了!
主板上的新鄰居
“阿Q,快別忙了,馬上去一趟會(huì)議室,領(lǐng)導(dǎo)有重要事情開(kāi)會(huì)”,一大早,咱們CPU廠里的總線主任就挨個(gè)到8個(gè)車間通知大家開(kāi)會(huì),神色有些凝重。
“什么事情,這么著急?”
“聽(tīng)說(shuō)是主板上新來(lái)了一家單位,來(lái)?yè)屧蹅僀PU工廠的飯碗了”,主任小聲的說(shuō)到。
“還有這種事情?”,我二話沒(méi)說(shuō)趕緊起身出門了。
來(lái)到會(huì)議室,沒(méi)想到大家都已經(jīng)到齊了,就差我了。
見(jiàn)我到來(lái),領(lǐng)導(dǎo)開(kāi)始講話:“諸位,想必大家可能都有所耳聞,就在昨天,在咱們CPU工廠的不遠(yuǎn)處,主板上新來(lái)了一家叫GPU的單位,公開(kāi)搶我們飯碗,今天召集大家就是商討應(yīng)對(duì)之策”
“GPU,我知道,就是圖形處理器,就是干圖形計(jì)算的,怎么能搶我們的活呢?領(lǐng)導(dǎo)你多慮了吧”,我回頭一看,原來(lái)是六號(hào)車間的代表小六在發(fā)言。
“哦,看來(lái)你對(duì)他們很了解嘛?”,領(lǐng)導(dǎo)問(wèn)小六。
小六有些不好意思的說(shuō)到:“實(shí)不相瞞,在跳槽到這里來(lái)之前,我在另外一家CPU工廠上班,那里的主板上就有個(gè)GPU。他們主要承接一些圖形渲染相關(guān)的計(jì)算工作,不過(guò)他們都是執(zhí)行一些固定的操作,計(jì)算電路都是固定的,根本都不具備可編程的能力,跟我們CPU那是沒(méi)法比的”
“小六,士別三日都當(dāng)刮目相看,你有多久沒(méi)見(jiàn)他們了?現(xiàn)在他們不僅和我們一樣可以編程,據(jù)說(shuō)團(tuán)隊(duì)規(guī)模擴(kuò)張,現(xiàn)在已經(jīng)是通用計(jì)算架構(gòu)了,名字都要改了,叫什么GPGPU,連計(jì)算速度都比我們快了!”,領(lǐng)導(dǎo)說(shuō)的擲地有聲,會(huì)場(chǎng)一下安靜了下來(lái)。
“阿Q、小六,你們兩個(gè)想辦法混進(jìn)去他們工廠摸摸情況,匯報(bào)以后咱們?cè)倮^續(xù)討論,大家意下如何?”,領(lǐng)導(dǎo)望向大家。
我還沒(méi)反應(yīng)過(guò)來(lái),大家都紛紛說(shuō)好,看來(lái)這份差事我是躲不掉了。
潛入GPU內(nèi)部
當(dāng)天夜里,我與小六偷偷溜進(jìn)了GPU工廠,沒(méi)想到雖然夜已深,但里面還是燈火通明,一派繁忙的景象。
等到進(jìn)入了他們工作的地方,我和我的小伙伴都驚呆了!好家伙,這規(guī)模也太大了,放眼望去,全是一個(gè)個(gè)的工作車間,一眼望不到頭。
“Q哥,他們這也太猛了,咱們CPU也就8核,才8個(gè)車間,他們這我目測(cè)不下1000個(gè)車間,難道他們有1000多個(gè)核,看得我眼睛都花了!”,小六滿臉驚訝的說(shuō)到。
“我看沒(méi)那么簡(jiǎn)單,你仔細(xì)看他們的工作車間,比我們的可簡(jiǎn)陋多了”
“還真是,那些橙色的地方應(yīng)該就是緩存吧,比我們可小多了。還有他們好像大部分都是計(jì)算電路,邏輯控制電路很少”
“你們不去干活,躲在這干嘛?”,不好,我們被巡邏的給發(fā)現(xiàn)了!但好像他并沒(méi)有認(rèn)出我們的身份,把我們當(dāng)成這里的員工了。
我倆尷尬的點(diǎn)頭笑著說(shuō)到:“休息休息,我們這就回去”
“你倆快去1024號(hào)車間,那里還缺人手”
“好嘞好嘞,這就去,這就去”
我堂堂CPU一號(hào)車間的指令執(zhí)行長(zhǎng)官阿Q,居然在這里對(duì)這個(gè)小小巡邏點(diǎn)頭哈腰的,想想都?xì)?
GPU的秘密
找了好久,我倆終于來(lái)到1024號(hào)車間,這里有一個(gè)小哥正忙的不可開(kāi)交。見(jiàn)到我們到來(lái),小哥高興的說(shuō)到:“你們可算是來(lái)了,我這都忙死了”
“今天都這么晚了,這是在忙著執(zhí)行什么程序啊”,我試探性的問(wèn)到。
“今天有點(diǎn)背,程序員下班前留了一個(gè)深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)訓(xùn)練任務(wù)給我們,今兒晚上大家肯定沒(méi)法休息了,搞不好得通宵”,小哥一邊忙著操作計(jì)算電路進(jìn)行數(shù)據(jù)計(jì)算,一邊對(duì)我們說(shuō)到。
小六給我使了個(gè)眼神,然后對(duì)小哥說(shuō)到:“你空了給我們介紹下工作吧,讓我們也干點(diǎn)活”
“對(duì),對(duì),讓我們也幫你分擔(dān)點(diǎn)”,我跟著附和。
“你們先坐坐,這一輪訓(xùn)練馬上就要結(jié)束了,趁著空當(dāng)給你們介紹介紹。”,小哥說(shuō)完擦了擦額頭的汗。
趁著小哥在忙,我倆四處轉(zhuǎn)了轉(zhuǎn),“小六啊,他們這車間比起咱們CPU確實(shí)顯得寒酸了許多。我們每個(gè)車間可都是標(biāo)配了一二級(jí)緩存的,少說(shuō)也有幾百KB,他們可沒(méi)有這個(gè)待遇。而且他們的計(jì)算資源電路也簡(jiǎn)單很多,像我們用于分支預(yù)測(cè)和亂序執(zhí)行的邏輯控制電路這里都沒(méi)有”
“Q哥高手啊,這里這么多電路你都能認(rèn)得出來(lái)?”
“俺在CPU廠里混了那么多年,這都認(rèn)不出來(lái)那不白干了嗎?”
“不對(duì)啊,按照你說(shuō)的,他們這里的電路應(yīng)該很少才對(duì),可是你看怎么這么多”,小六的話引起了我的注意。
再仔細(xì)一看,計(jì)算電路雖然沒(méi)我們那么復(fù)雜,但計(jì)算單元ALU卻有很多份!要知道在咱們CPU工廠,一個(gè)車間也只有一份。
正在納悶之際,小哥忙完了手里的活,走了過(guò)來(lái),“總算可以歇口氣了”。
“大哥辛苦了,想問(wèn)一下這里怎么這么多重復(fù)的計(jì)算電路啊?這不浪費(fèi)嗎?”,我趕緊上前問(wèn)到。
小哥不以為然,“這可不是浪費(fèi),在咱們GPU工廠的車間里,每個(gè)車間都配置了很多個(gè)計(jì)算單元,我可以操作它們同時(shí)進(jìn)行批量的數(shù)據(jù)計(jì)算,提升速度”
“批量計(jì)算?還能同時(shí)?”,小六問(wèn)到。
“是啊,像我們GPU工廠承包的活基本都是這種類型,像3D圖像渲染中每個(gè)像素的計(jì)算,深度學(xué)習(xí)中張量和矩陣的計(jì)算,它們有一個(gè)特點(diǎn),都是算法固定,只是數(shù)據(jù)不一樣而已。同樣的計(jì)算邏輯,我喂給它們不同的數(shù)據(jù)就可以并行計(jì)算了!這個(gè)叫SIMT(Single Instruction,Multiple Threads)技術(shù)”,小哥得意的說(shuō)到。
“SIMT?這技術(shù)怎么感覺(jué)那么眼熟呢?”,我問(wèn)到。
小哥繼續(xù)笑著說(shuō)到:“那可不,這一招CPU他們?cè)缇陀眠^(guò)了,我們這是借鑒”
“哦,我想起來(lái)了,Q哥,他說(shuō)的應(yīng)該是SIMD(Single Instruction Multiple Data,單指令多數(shù)據(jù)流),一條指令中可以批量操作多個(gè)數(shù)據(jù),提升性能”
小六一下點(diǎn)醒了我,“原來(lái)如此!我們,哦不,是他們CPU只是批量操作數(shù)據(jù),GPU這里是批量執(zhí)行計(jì)算,真是妙啊!”
“Q哥,聽(tīng)起來(lái)不錯(cuò)啊,為什么咱們CPU不能這樣搞呢?”,小六悄悄問(wèn)我。
“你個(gè)笨蛋,咱們CPU內(nèi)部有八個(gè)車間,每個(gè)車間同時(shí)執(zhí)行一個(gè)線程不就是并行嗎?只不過(guò)咱們執(zhí)行的多個(gè)線程都是功能各異,有些是IO密集,有些是計(jì)算密集,既有緩存和邏輯控制電路的的建設(shè)成本,還要做到通用,沒(méi)有辦法像他們這樣搞很多個(gè)出來(lái)。”
接下來(lái),小哥帶我們來(lái)到了操作平臺(tái),告訴我們?nèi)绾尾僮鬟@一堆電路執(zhí)行計(jì)算工作,我自然是輕車熟路了,這比在我們那兒簡(jiǎn)單多了。
“那邊是寄存器和保存執(zhí)行上下文的地方,你們等會(huì)兒會(huì)用到。”,小哥指著一堆箱子說(shuō)到。
“哎,老哥,這執(zhí)行上下文怎么這么多,比計(jì)算單元ALU還多”,我問(wèn)到。
小哥一拍腦袋說(shuō)到:“嗨,瞧我這記性,忘記給你們說(shuō)了。咱們GPU雖然以計(jì)算見(jiàn)長(zhǎng),但還是會(huì)遇到分支判斷的場(chǎng)景,咱們這又沒(méi)有CPU那樣的分支預(yù)測(cè)和亂序執(zhí)行的能力,你們不知道內(nèi)存那家伙可慢了,有時(shí)候難免會(huì)遇到停頓等待的情況,浪費(fèi)計(jì)算資源。后來(lái)領(lǐng)導(dǎo)交代了,為了充分利用計(jì)算資源,不讓ALU閑置著,遇到這種停頓的情況,就把計(jì)算資源ALU挪出來(lái)去執(zhí)行別的計(jì)算代碼。所以就需要多預(yù)留一些執(zhí)行上下文來(lái)保存現(xiàn)場(chǎng)了。”
“臥槽,這不就是超線程技術(shù)嘛!又抄襲我們CPU”,我?guī)缀跬豢诙?,說(shuō)完看了一眼小六。
“怎么能叫抄襲呢,借鑒,是借鑒哈”,小哥齜著牙笑著。
小六突然問(wèn)了一句:“咱們GPU這么厲害,以后是不是都沒(méi)他們CPU啥事兒啦?”
小哥搖了搖頭:“這話說(shuō)的有些吹牛皮了,我們連中斷處理和虛擬內(nèi)存都沒(méi)有,還需要借助CPU他們的幫忙才能工作呢,是不可能取代他們的。他們CPU太忙了,又要忙著計(jì)算,又要忙著執(zhí)行IO,處理中斷,還有各種復(fù)雜邏輯的判斷處理,我們就簡(jiǎn)單了,沒(méi)有那么多顧慮,就是用人海戰(zhàn)術(shù),做純粹的計(jì)算工作,人多力量大,又能并行,所以在數(shù)學(xué)計(jì)算方面我們要快得多。不過(guò)總體來(lái)說(shuō)我們和CPU是合作關(guān)系,不是競(jìng)爭(zhēng)關(guān)系!”
聽(tīng)到小哥這么一說(shuō),我倆懸著的心總算放了下來(lái),這下回去可算是給領(lǐng)導(dǎo)有個(gè)交代了。
我正想的出神,小六從背后悄悄拍了拍我,使了個(gè)眼神。
順著他示意的地方望去,只見(jiàn)剛才那個(gè)巡邏正帶著幾個(gè)保安朝我們這邊走了過(guò)來(lái)。
來(lái)不及向小哥告別,我倆趕緊溜之大吉···
本文轉(zhuǎn)載自微信公眾號(hào)「 編程技術(shù)宇宙」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 編程技術(shù)宇宙公眾號(hào)。