第83章 搞純數的這麼逆天嗎?(爆梗1.5w 2/3求首訂)
第83章 搞純數的這麼逆天嗎?(爆梗1.5w 2/3求首訂)
當天下午,兩張英偉達GTX580顯卡還有其他一堆東西,便擺在了漆昊的工位桌子上。
看著桌子上的東西,漆昊一時間有些驚訝。
他原本以為,像這種超過五千塊錢的固定資產採購,在高校和聯合實驗室的冗長流程里,不拖上一周絕對下不來。
可沒想到,距離他跟陳工提要求,這才過去不到二十四個小時,他要的所有東西就已經送到了他的桌子上。
「怎麼樣,這效率還給力吧?」
陳工不知道什麼時候湊了過來,手裡還拎著一盒嶄新的螺絲刀和一綑紮線帶,臉上掛著掩飾不住的得意。
「咱們聯合實驗室和學校科研處那邊有綠色通道,只要是重點項目加急需要的物資,審批流程一路綠燈。」
「不過這兩塊電老虎可不好伺候,我今天特意叫了曾工過來,咱們今天手頭上的事情比較少,要不要我們搭把手,幫你把這台測試工作站給組裝起來?」
漆昊本來也是第一次親自動手做這種硬體級別的工程實驗,聽到陳工主動幫忙,自然不客氣了:「謝謝陳工和曾工,對於硬體組裝和系統環境搭建,我還真是個新手。」
「客氣啥啊!這事簡單!」
被叫過來的曾工是個典型的技術實用主義者,一看到這兩塊沉甸甸的GTX580,眼睛裡也直放光。
三人立刻在實驗室的一角忙碌了起來。
GTX580可是出了名的電老虎加大火爐,單張卡的功耗就高達244W。
為了讓雙卡在滿載下不縮水,曾工特意從庫房裡搬出了一台珍藏的1200W
安鈦克大功率金牌電源。
「這玩意兒要是兩塊同時拉滿,單單顯卡就能直接讓咱們實驗室的空氣溫度幹上去,連暖氣都省了。」
曾工像是有強迫症,一邊熟練地將顯卡插入主板上那兩條插槽中,一邊用扎線帶將臃腫的電源線理得井井有條。
「不過皮衣老闆這次確實下了血本,這卡用的是GF110架構,均熱板散熱,只要風扇轉速拉滿,應該不至於當場出現顯卡危機。」
大半個小時後,雙卡工作站組裝完畢。
隨著開機鍵的按下,工作站內部發出了輕微的聲音,漆昊迅速安裝了CUDA驅動和編譯環境。
「咦,CUDA的編譯環境?你要編程嗎?」曾工驚訝道。
漆昊回答:「有些東西想要試試。」
陳工和曾工對視一眼,都好奇了起來,一時間誰都沒走,分別站在了漆昊的左右兩側,他們倒要看看,這個純數學院出來的學霸要做什麼。
漆昊在鍵盤上敲下幾行指令,確認了雙GPU的狀態正常,隨後神色漸漸變得專注起來。
正如他之前所構想的,即便英偉達官方極其貼心地打包了cuBLAS這種最底層的矩陣乘加加速庫,能夠幫他省去一些矩陣相乘的底層彙編優化,但這並不意味著他可以什麼都不做,可以躺著把神經網絡跑起來。
神經網絡的訓練非常複雜。
除了矩陣相乘這一環之外,剩下整套網絡的配套邏輯全都要他親手落地實現,像是滑動窗口卷積核的前向與反向傳播,最大池化和平均池化的GPU線程映射,ReIu激活函數的逐元素激活核函數,反向傳播中,誤差梯度逐層遞減的GPU核函數!
這些活,沒一個輕鬆的!
當陳工和曾工看清楚漆昊在編輯器里打出的那一串串字符時,兩人的臉色變了。
「不對啊,你這是打算自己寫整個訓練框架的CUDA底層核函數?」
陳工驚訝地說:「這個東西真的不好寫,並行編程的難度和我們平時寫的C根本就不是一個級別的!」
「普通C代碼如果寫錯了,編譯器會直接給你報錯,或者運行時給你拋出一個指針異常,你很容易就能定位到,但是CUDA編程它跑在GPU那成百上千個線程上的,你很難發現異常出在哪裡!」
曾工也在旁邊補充:「在CUDA里,你的邏輯要是寫錯了,或者線程索引算歪了,它不會崩潰,也不會報錯,編譯器還會顯示編譯成功,然後顯卡也會老老實實地跑完。」
「結果呢?它只會給你吐出一堆NaN,你想在幾萬個同時運行的線程里排查出是哪一個線程的哪個寄存器出了問題,那簡直是盲人摸象,在裡面找不出根源是常有的事,簡直是傷不起!」
陳工嘆了口氣,勸道:「漆昊,聽我一句勸,咱們沒必要在這裡去浪費時間,寫這個的工程門檻太高了,你要做什麼,跟我們說,我們一起想辦法。」
漆昊不是個輕易服輸的人。
更何況,在沒有拿到結果之前,他把自己的想法說出來,這兩人也只會固守原來的技術路線不會願意嘗試新的。
想要改變根深蒂固的思維,那就只能拿出實際成果出來才行。
直覺告訴他,如果真把他的想法走通了,完成系統任務非常容易!
漆昊笑了笑:「陳工,曾工,謝謝你們提醒,不過既然硬體都買回來了,不試試怎麼知道呢?反正現在是春節假期的尾巴,我也沒什麼別的事,就當是活動活動腦子了。」
見漆昊態度堅決,陳工和曾工對視了一眼,也不再勸阻,只是默默地坐在旁邊看著。
漆昊不信邪地開始行動了。
卷積前向傳播的公式,偏導數的鏈式法則這些複雜的數學公式,他可以在腦海中快速拆解。
然而,當他真正將這些數學公式轉化為CUDA上的代碼時,缺乏系統性大規模GPU編程經驗的硬傷,瞬間暴露無遺。
他開始不可避免地遇到了各種棘手的難點。
比如顯存合併訪問的問題。
GPU的線程是以32個為一組進行硬體調度的,如果這32個線程在執行卷積計算時,訪問的全局顯存地址不是連續的,那麼原本一次訪存操作就能搞定的數據讀取,會被硬體拆分成大量高延遲的訪存請求,整個速度直接下跌!
漆昊試著寫了第一版LRN核函數,卻發現因為圖像通道和像素索引的交錯,線程束的訪存完全錯開,調試窗口裡的顯存帶寬利用率低得慘不忍睹,GPU算力被卡在了帶寬瓶頸上。
接著更讓人頭疼的是,在反向傳播更新權重時,因為不同的圖像區域,不同的Batch
樣本都在並行計算,當多個線程同時計算完各自的局部偏導數,準備將結果累加到同一個全局顯存位置時,就會發生災難性的寫入衝突!
如果使用互斥鎖,GPU會瞬間退化為單線程,如果直接使用當時Fermi架構上效率並不高的atomicadd,一旦發生高頻地址碰撞,線程排隊等待的延遲會影響整張卡。
呵呵,又卡死了。
漆昊心塞。
這小玩意跟數學比,一點都不可愛。
看著屏幕上那因為顯存衝突和同步問題而不斷陷入死鎖的測試日誌,漆昊的手指在鍵盤上停了下來,眉頭微微鎖起。
他確實低估了現代高性能計算機體系結構在這種細節上的殘酷性,數學公式是完美的對稱,可晶片不講道理啊,一不留神就罷工了。
陳工和曾工在旁邊默默看著漆昊不斷重構代碼,又不斷地看著測試結果顯示異常。
兩位資深的工程技術人員輕輕搖了搖頭,起身走到實驗室的飲水機旁。
曾工接了一杯水,低聲對陳工說道:「老陳,看到沒?我就說吧。」
「漆昊數學確實厲害,但這寫代碼,尤其是涉及CUDA編程,那真的又是另外一碼事了。
「」
陳工頗為贊同地說道:「是啊,數學好不代表編程好,單單一個非連續訪存就能把算法教授給折騰得懷疑人生,據我所知,哪怕是鴻記那樣在國內技術實力頂天的大廠,能把CUDA底層算子性能優化到極致的技術大牛,也是鳳毛麟角。」
「哪個不是月薪幾十萬還要掉光頭髮的存在?漆昊雖然很厲害,但畢竟還是太年輕了,不知道這硬體底層的險惡和坑爹啊。」
曾工無奈地笑了笑:「天之驕子嘛,總得在現實的硬牆上碰一碰,才知道什麼叫工程的毒打,不過他能在這個年紀就摸到CUDA編程的邊,已經證明他不是普通人。」
此時的他盯著屏幕上雜亂的線程索引公式,腦海中不斷地閃過卡爾采夫在《計算系統與同步算術》中提到的那句關於「物理空間與計算拓撲對稱性」的論述。
「不對,一定是我的思維方式還停留在傳統的串行CPU上。」
漆昊想了一陣,覺得頭疼。
硬鋼下去太浪費時間了,他想到最近系統給的獎勵,於是默念道:「系統,啟動獎勵靈感火花!」
【提示:檢測到達瓦里氏正在遭遇學術與工程上的雙重瓶頸,一次性道具靈感火花獎勵已成功激活!】
一瞬間,漆昊只覺得自己頭疼減輕了不少。
原本因為疲憊而產生的混亂,也逐漸被撫平。
緊接著,在靈感火花的加持下,漆昊覺得自己的思維運轉速度比平時快了不少!
過往學習到的所有知識,一個接著一個冒出來。
不對,這些冒出來的知識,都是對他當前情況有用的!
「我明白了————」
「之前我之所以卡住,是因為我試圖用CPU的分工邏輯去命令GPU,面對反向傳播的寫衝突,我不需要atomicadd鎖,我完全可以用數學空間的對稱性!」
針對反向傳播梯度累加的衝突,漆昊在靈感火花的幫助下,直接用數學公式重構了算法,在卷積反向傳播中,原本是每個輸入像素的偏導數往輸出矩陣的各個位置去散射累加,而漆昊反其道而行之,他讓每一個GPU線程直接對準輸出梯度的單點元素。
每一個線程獨立負責根據偏置公式,從對應的輸入特徵圖及對應位置聚集讀取偏導數,然後進行局部的規約求和。
這樣一來,在整個反向傳播計算中,所有的寫操作全部變成了線程內部的局部寄存器寫入,沒有任何兩個線程會同時寫入同一個內存地址!
最讓人頭疼的atomicadd鎖,被這套數學對稱轉換後,內存競爭就消失了。
漆昊繼續在忙著。
就在這時,陳工的電話響了。
陳工拿著電話匆匆走出去,隨後帶了幾個人進來。
「小漆人呢?」胡院長背著手,樂呵呵地四處張望。
「漆昊在裡面磕難題呢。」陳工指了指最裡面的工位,神色複雜地說道。
「哦?是什麼數學難題啊?」
「不是,他好像在嘗試基於CUDA編寫訓練代碼。」
「什麼?」
宋啟航詫異地挑了挑眉:「他不是學純數學的嗎?怎麼跟程式設計師搶起飯碗來了?」
宋啟航微微一愣,隨後無奈地笑了一聲,搖了搖頭:「CUDA編程可不是鬧著玩的,漆昊數學天分極高,他跑去折騰這個,簡直是在白白浪費他的數學天賦啊,有這個時間,他多推導兩個方程,價值也比寫幾行代碼大得多。」
在宋啟航看來,年輕人精力充沛,做出一定成果後,總喜歡往自己不熟悉的時髦新領域去嘗試,這很正常。
但越是聰明的孩子,越容易在錯誤的道路上因為不服輸而鑽牛角尖。
他準備作為長輩和學界前輩,等會兒進去好好勸一勸漆昊,讓他把心思放回正軌上,不要在寫代碼這種雜務上浪費了天資。
「咱們進去看看,要是他卡住了,我也順便勸勸他。」宋啟航溫和地笑道。
一眾教授邁步穿過隔斷,來到了漆昊身後。
然而,當他們站定在漆昊身後的一剎那,原本準備了一肚子勸告之詞的宋啟航,神色嚴肅了起來。
他身後那幾位燕大的博士,更是一動不動地盯著漆昊的電腦。
「欸,這代碼?!」
陳工盯著屏幕,整個人像是被施了定身法一樣定在了原地,走不動了。
屏幕上的CUDA代碼正一行行飛速向下滾動。
他先以為是漆昊隨便亂打的,仔細一看,那些都是規範的代碼!
更驚人的是那些核函數的邏輯。
「用im2coI配合cuBLAS避開了多重循環,然後用共享內存的錯位Padding徹底消除了BankConflict,我的天,他在用數學思維解決這些問題?」
搞純數的這麼逆天嗎?
曾工心情複雜。
這種將高等代數的矩陣對稱性,與GPU存儲層級的物理限制完美結合的代碼設計,是一個純數學生能寫出來的?
「老陳你掐我一下,我是不是跑數據跑魔怔了,出現幻覺了?」曾工揉著眼睛。
陳工根本沒有理會他,因為陳工此時也在看漆昊寫的代碼。
「你看他這手速,他都不思考的嗎?感覺一刻都沒停過!」
宋啟航聽著他們的對話,問:「小陳,這就是你說的,漆昊有一定的編程基礎?」
「宋教授,我是真不知道!剛才他連顯存合併訪問都還沒搞太懂,結果現在好像把之前遇到的困難全部克服了。」
至於怎麼在短時間內克服的,他很想知道!
一時間,幾位大教授和工程師們,就這麼安安靜靜地排排站。
幾位教授在原地站得雙腿都有些發麻了,才捨得挪步。
因為腿不太舒服了,胡院長和王教授陪同著宋啟航一行人,緩緩走出了實驗室。
陽光灑在科大安靜的小道上。
宋啟航深深地吸了一口早春微涼的空氣,認真地說道:「胡院長,我也不跟您藏著掖著了,從我們這次研討會結果可以看出,漆昊是個難得一見的天才。」
「他留在科大,雖然也很不錯,但無論是學術資源,國際化學界地位,還是國家級頂尖課題的參與度,我們燕大,都絕對能給他提供更好的舞台。」
「這次回去之後,我們燕大數學學院一定會竭盡全力爭取他的加入,他是一個真正能改變一些東西的孩子,不應該被局限在這裡。」
胡院長微微眯了眯眼,臉上依舊掛著那副招牌式的笑容,背著手不緊不慢地走著:「宋教授,燕大自然很好,這一點全國人民都知道,不過啊,孩子終歸是長大了,有他自己的想法,強扭的瓜不甜,咱們做老師的,還是得看他自己的意願嘛。」
宋啟航微微一笑:「他還是個十八歲左右的學生,在面對人生重大的平台抉擇時,難免會因為一時的情感羈絆而做出不那麼理智的選擇,但胡院長您是明白人,應該清楚,真龍如果一直困在淺水裡,他的天賦也是會被無形的瑣事和地方平台的局限給消磨掉的。」
「不管是清大也好,還是誰,我們都有信心爭取到漆昊。」
說完,宋啟航禮貌地與胡院長王教授告別,帶著他的團隊走了。
胡院長的笑容漸漸收斂,他背著手,看著一顆沙沙作響的大樹。
一直站在旁邊沒有說話的王教授,問道:「老胡,看宋啟航這架勢,燕大那邊估計是要搶人了,咱們真就這麼看著?」
「老王。」
胡院長忽然笑了,將雙手背在身後,邁著有些八字步的步子,悠悠地往回走去。
「這件事校長早就預料到了,無非是看誰給的待遇更好,更合適漆昊罷了。」
「普林斯頓大學都有行動了,他們肯定急。
當天下午,兩張英偉達GTX580顯卡還有其他一堆東西,便擺在了漆昊的工位桌子上。
看著桌子上的東西,漆昊一時間有些驚訝。
他原本以為,像這種超過五千塊錢的固定資產採購,在高校和聯合實驗室的冗長流程里,不拖上一周絕對下不來。
可沒想到,距離他跟陳工提要求,這才過去不到二十四個小時,他要的所有東西就已經送到了他的桌子上。
「怎麼樣,這效率還給力吧?」
陳工不知道什麼時候湊了過來,手裡還拎著一盒嶄新的螺絲刀和一綑紮線帶,臉上掛著掩飾不住的得意。
「咱們聯合實驗室和學校科研處那邊有綠色通道,只要是重點項目加急需要的物資,審批流程一路綠燈。」
「不過這兩塊電老虎可不好伺候,我今天特意叫了曾工過來,咱們今天手頭上的事情比較少,要不要我們搭把手,幫你把這台測試工作站給組裝起來?」
漆昊本來也是第一次親自動手做這種硬體級別的工程實驗,聽到陳工主動幫忙,自然不客氣了:「謝謝陳工和曾工,對於硬體組裝和系統環境搭建,我還真是個新手。」
「客氣啥啊!這事簡單!」
被叫過來的曾工是個典型的技術實用主義者,一看到這兩塊沉甸甸的GTX580,眼睛裡也直放光。
三人立刻在實驗室的一角忙碌了起來。
GTX580可是出了名的電老虎加大火爐,單張卡的功耗就高達244W。
為了讓雙卡在滿載下不縮水,曾工特意從庫房裡搬出了一台珍藏的1200W
安鈦克大功率金牌電源。
「這玩意兒要是兩塊同時拉滿,單單顯卡就能直接讓咱們實驗室的空氣溫度幹上去,連暖氣都省了。」
曾工像是有強迫症,一邊熟練地將顯卡插入主板上那兩條插槽中,一邊用扎線帶將臃腫的電源線理得井井有條。
「不過皮衣老闆這次確實下了血本,這卡用的是GF110架構,均熱板散熱,只要風扇轉速拉滿,應該不至於當場出現顯卡危機。」
大半個小時後,雙卡工作站組裝完畢。
隨著開機鍵的按下,工作站內部發出了輕微的聲音,漆昊迅速安裝了CUDA驅動和編譯環境。
「咦,CUDA的編譯環境?你要編程嗎?」曾工驚訝道。
漆昊回答:「有些東西想要試試。」
陳工和曾工對視一眼,都好奇了起來,一時間誰都沒走,分別站在了漆昊的左右兩側,他們倒要看看,這個純數學院出來的學霸要做什麼。
漆昊在鍵盤上敲下幾行指令,確認了雙GPU的狀態正常,隨後神色漸漸變得專注起來。
正如他之前所構想的,即便英偉達官方極其貼心地打包了cuBLAS這種最底層的矩陣乘加加速庫,能夠幫他省去一些矩陣相乘的底層彙編優化,但這並不意味著他可以什麼都不做,可以躺著把神經網絡跑起來。
神經網絡的訓練非常複雜。
除了矩陣相乘這一環之外,剩下整套網絡的配套邏輯全都要他親手落地實現,像是滑動窗口卷積核的前向與反向傳播,最大池化和平均池化的GPU線程映射,ReIu激活函數的逐元素激活核函數,反向傳播中,誤差梯度逐層遞減的GPU核函數!
這些活,沒一個輕鬆的!
當陳工和曾工看清楚漆昊在編輯器里打出的那一串串字符時,兩人的臉色變了。
「不對啊,你這是打算自己寫整個訓練框架的CUDA底層核函數?」
陳工驚訝地說:「這個東西真的不好寫,並行編程的難度和我們平時寫的C根本就不是一個級別的!」
「普通C代碼如果寫錯了,編譯器會直接給你報錯,或者運行時給你拋出一個指針異常,你很容易就能定位到,但是CUDA編程它跑在GPU那成百上千個線程上的,你很難發現異常出在哪裡!」
曾工也在旁邊補充:「在CUDA里,你的邏輯要是寫錯了,或者線程索引算歪了,它不會崩潰,也不會報錯,編譯器還會顯示編譯成功,然後顯卡也會老老實實地跑完。」
「結果呢?它只會給你吐出一堆NaN,你想在幾萬個同時運行的線程里排查出是哪一個線程的哪個寄存器出了問題,那簡直是盲人摸象,在裡面找不出根源是常有的事,簡直是傷不起!」
陳工嘆了口氣,勸道:「漆昊,聽我一句勸,咱們沒必要在這裡去浪費時間,寫這個的工程門檻太高了,你要做什麼,跟我們說,我們一起想辦法。」
漆昊不是個輕易服輸的人。
更何況,在沒有拿到結果之前,他把自己的想法說出來,這兩人也只會固守原來的技術路線不會願意嘗試新的。
想要改變根深蒂固的思維,那就只能拿出實際成果出來才行。
直覺告訴他,如果真把他的想法走通了,完成系統任務非常容易!
漆昊笑了笑:「陳工,曾工,謝謝你們提醒,不過既然硬體都買回來了,不試試怎麼知道呢?反正現在是春節假期的尾巴,我也沒什麼別的事,就當是活動活動腦子了。」
見漆昊態度堅決,陳工和曾工對視了一眼,也不再勸阻,只是默默地坐在旁邊看著。
漆昊不信邪地開始行動了。
卷積前向傳播的公式,偏導數的鏈式法則這些複雜的數學公式,他可以在腦海中快速拆解。
然而,當他真正將這些數學公式轉化為CUDA上的代碼時,缺乏系統性大規模GPU編程經驗的硬傷,瞬間暴露無遺。
他開始不可避免地遇到了各種棘手的難點。
比如顯存合併訪問的問題。
GPU的線程是以32個為一組進行硬體調度的,如果這32個線程在執行卷積計算時,訪問的全局顯存地址不是連續的,那麼原本一次訪存操作就能搞定的數據讀取,會被硬體拆分成大量高延遲的訪存請求,整個速度直接下跌!
漆昊試著寫了第一版LRN核函數,卻發現因為圖像通道和像素索引的交錯,線程束的訪存完全錯開,調試窗口裡的顯存帶寬利用率低得慘不忍睹,GPU算力被卡在了帶寬瓶頸上。
接著更讓人頭疼的是,在反向傳播更新權重時,因為不同的圖像區域,不同的Batch
樣本都在並行計算,當多個線程同時計算完各自的局部偏導數,準備將結果累加到同一個全局顯存位置時,就會發生災難性的寫入衝突!
如果使用互斥鎖,GPU會瞬間退化為單線程,如果直接使用當時Fermi架構上效率並不高的atomicadd,一旦發生高頻地址碰撞,線程排隊等待的延遲會影響整張卡。
呵呵,又卡死了。
漆昊心塞。
這小玩意跟數學比,一點都不可愛。
看著屏幕上那因為顯存衝突和同步問題而不斷陷入死鎖的測試日誌,漆昊的手指在鍵盤上停了下來,眉頭微微鎖起。
他確實低估了現代高性能計算機體系結構在這種細節上的殘酷性,數學公式是完美的對稱,可晶片不講道理啊,一不留神就罷工了。
陳工和曾工在旁邊默默看著漆昊不斷重構代碼,又不斷地看著測試結果顯示異常。
兩位資深的工程技術人員輕輕搖了搖頭,起身走到實驗室的飲水機旁。
曾工接了一杯水,低聲對陳工說道:「老陳,看到沒?我就說吧。」
「漆昊數學確實厲害,但這寫代碼,尤其是涉及CUDA編程,那真的又是另外一碼事了。
「」
陳工頗為贊同地說道:「是啊,數學好不代表編程好,單單一個非連續訪存就能把算法教授給折騰得懷疑人生,據我所知,哪怕是鴻記那樣在國內技術實力頂天的大廠,能把CUDA底層算子性能優化到極致的技術大牛,也是鳳毛麟角。」
「哪個不是月薪幾十萬還要掉光頭髮的存在?漆昊雖然很厲害,但畢竟還是太年輕了,不知道這硬體底層的險惡和坑爹啊。」
曾工無奈地笑了笑:「天之驕子嘛,總得在現實的硬牆上碰一碰,才知道什麼叫工程的毒打,不過他能在這個年紀就摸到CUDA編程的邊,已經證明他不是普通人。」
此時的他盯著屏幕上雜亂的線程索引公式,腦海中不斷地閃過卡爾采夫在《計算系統與同步算術》中提到的那句關於「物理空間與計算拓撲對稱性」的論述。
「不對,一定是我的思維方式還停留在傳統的串行CPU上。」
漆昊想了一陣,覺得頭疼。
硬鋼下去太浪費時間了,他想到最近系統給的獎勵,於是默念道:「系統,啟動獎勵靈感火花!」
【提示:檢測到達瓦里氏正在遭遇學術與工程上的雙重瓶頸,一次性道具靈感火花獎勵已成功激活!】
一瞬間,漆昊只覺得自己頭疼減輕了不少。
原本因為疲憊而產生的混亂,也逐漸被撫平。
緊接著,在靈感火花的加持下,漆昊覺得自己的思維運轉速度比平時快了不少!
過往學習到的所有知識,一個接著一個冒出來。
不對,這些冒出來的知識,都是對他當前情況有用的!
「我明白了————」
「之前我之所以卡住,是因為我試圖用CPU的分工邏輯去命令GPU,面對反向傳播的寫衝突,我不需要atomicadd鎖,我完全可以用數學空間的對稱性!」
針對反向傳播梯度累加的衝突,漆昊在靈感火花的幫助下,直接用數學公式重構了算法,在卷積反向傳播中,原本是每個輸入像素的偏導數往輸出矩陣的各個位置去散射累加,而漆昊反其道而行之,他讓每一個GPU線程直接對準輸出梯度的單點元素。
每一個線程獨立負責根據偏置公式,從對應的輸入特徵圖及對應位置聚集讀取偏導數,然後進行局部的規約求和。
這樣一來,在整個反向傳播計算中,所有的寫操作全部變成了線程內部的局部寄存器寫入,沒有任何兩個線程會同時寫入同一個內存地址!
最讓人頭疼的atomicadd鎖,被這套數學對稱轉換後,內存競爭就消失了。
漆昊繼續在忙著。
就在這時,陳工的電話響了。
陳工拿著電話匆匆走出去,隨後帶了幾個人進來。
「小漆人呢?」胡院長背著手,樂呵呵地四處張望。
「漆昊在裡面磕難題呢。」陳工指了指最裡面的工位,神色複雜地說道。
「哦?是什麼數學難題啊?」
「不是,他好像在嘗試基於CUDA編寫訓練代碼。」
「什麼?」
宋啟航詫異地挑了挑眉:「他不是學純數學的嗎?怎麼跟程式設計師搶起飯碗來了?」
宋啟航微微一愣,隨後無奈地笑了一聲,搖了搖頭:「CUDA編程可不是鬧著玩的,漆昊數學天分極高,他跑去折騰這個,簡直是在白白浪費他的數學天賦啊,有這個時間,他多推導兩個方程,價值也比寫幾行代碼大得多。」
在宋啟航看來,年輕人精力充沛,做出一定成果後,總喜歡往自己不熟悉的時髦新領域去嘗試,這很正常。
但越是聰明的孩子,越容易在錯誤的道路上因為不服輸而鑽牛角尖。
他準備作為長輩和學界前輩,等會兒進去好好勸一勸漆昊,讓他把心思放回正軌上,不要在寫代碼這種雜務上浪費了天資。
「咱們進去看看,要是他卡住了,我也順便勸勸他。」宋啟航溫和地笑道。
一眾教授邁步穿過隔斷,來到了漆昊身後。
然而,當他們站定在漆昊身後的一剎那,原本準備了一肚子勸告之詞的宋啟航,神色嚴肅了起來。
他身後那幾位燕大的博士,更是一動不動地盯著漆昊的電腦。
「欸,這代碼?!」
陳工盯著屏幕,整個人像是被施了定身法一樣定在了原地,走不動了。
屏幕上的CUDA代碼正一行行飛速向下滾動。
他先以為是漆昊隨便亂打的,仔細一看,那些都是規範的代碼!
更驚人的是那些核函數的邏輯。
「用im2coI配合cuBLAS避開了多重循環,然後用共享內存的錯位Padding徹底消除了BankConflict,我的天,他在用數學思維解決這些問題?」
搞純數的這麼逆天嗎?
曾工心情複雜。
這種將高等代數的矩陣對稱性,與GPU存儲層級的物理限制完美結合的代碼設計,是一個純數學生能寫出來的?
「老陳你掐我一下,我是不是跑數據跑魔怔了,出現幻覺了?」曾工揉著眼睛。
陳工根本沒有理會他,因為陳工此時也在看漆昊寫的代碼。
「你看他這手速,他都不思考的嗎?感覺一刻都沒停過!」
宋啟航聽著他們的對話,問:「小陳,這就是你說的,漆昊有一定的編程基礎?」
「宋教授,我是真不知道!剛才他連顯存合併訪問都還沒搞太懂,結果現在好像把之前遇到的困難全部克服了。」
至於怎麼在短時間內克服的,他很想知道!
一時間,幾位大教授和工程師們,就這麼安安靜靜地排排站。
幾位教授在原地站得雙腿都有些發麻了,才捨得挪步。
因為腿不太舒服了,胡院長和王教授陪同著宋啟航一行人,緩緩走出了實驗室。
陽光灑在科大安靜的小道上。
宋啟航深深地吸了一口早春微涼的空氣,認真地說道:「胡院長,我也不跟您藏著掖著了,從我們這次研討會結果可以看出,漆昊是個難得一見的天才。」
「他留在科大,雖然也很不錯,但無論是學術資源,國際化學界地位,還是國家級頂尖課題的參與度,我們燕大,都絕對能給他提供更好的舞台。」
「這次回去之後,我們燕大數學學院一定會竭盡全力爭取他的加入,他是一個真正能改變一些東西的孩子,不應該被局限在這裡。」
胡院長微微眯了眯眼,臉上依舊掛著那副招牌式的笑容,背著手不緊不慢地走著:「宋教授,燕大自然很好,這一點全國人民都知道,不過啊,孩子終歸是長大了,有他自己的想法,強扭的瓜不甜,咱們做老師的,還是得看他自己的意願嘛。」
宋啟航微微一笑:「他還是個十八歲左右的學生,在面對人生重大的平台抉擇時,難免會因為一時的情感羈絆而做出不那麼理智的選擇,但胡院長您是明白人,應該清楚,真龍如果一直困在淺水裡,他的天賦也是會被無形的瑣事和地方平台的局限給消磨掉的。」
「不管是清大也好,還是誰,我們都有信心爭取到漆昊。」
說完,宋啟航禮貌地與胡院長王教授告別,帶著他的團隊走了。
胡院長的笑容漸漸收斂,他背著手,看著一顆沙沙作響的大樹。
一直站在旁邊沒有說話的王教授,問道:「老胡,看宋啟航這架勢,燕大那邊估計是要搶人了,咱們真就這麼看著?」
「老王。」
胡院長忽然笑了,將雙手背在身後,邁著有些八字步的步子,悠悠地往回走去。
「這件事校長早就預料到了,無非是看誰給的待遇更好,更合適漆昊罷了。」
「普林斯頓大學都有行動了,他們肯定急。