第108章 降維解構

投票推薦 加入書籤 小說報錯

  計算機學院。

  陳啟明的辦公室在四樓,門虛掩著。

  江臨敲門進去時,這位髮際線後撤的系統工程師正盯著兩塊屏幕。

  屋裡除了他,還坐著兩個學生。

  靠窗那個二十出頭,長著一張帶著幾分學生氣的圓臉,原本正百無聊賴地轉著手裡的碳素筆。

  聽見推門聲,他下意識地轉過頭。

  在看清江臨模樣的一瞬間,他手裡的筆啪地一聲掉在桌面上,整個人騰地從椅子上彈了起來。

  因為起得太猛,轉椅向後滑出半米,重重磕在後方的鐵皮文件柜上,發出一聲悶響。

  圓臉男生張大了嘴,喉結劇烈地滾動了一下,硬生生把一聲即將脫口而出的臥槽咽回了肚子裡。

  這張臉,就在過去的半個月裡,幾乎席捲了全網各大論壇的學術版塊,甚至跨界引起了廣泛的社會關注。

  辦公室的角落裡,另一個學生則顯得沉靜多了。

  二十六七歲,瘦高個,抱著胳膊靠在機櫃邊,看到江臨進來,淡淡點了下頭,算是打過招呼。

  倒是陳啟明,反應非常迅速,也很是熱情。

  「來了來了,快坐!」

  說著,他把椅子上一摞列印紙搬到地上,又指了指屋內的兩個年輕人。

  「這是我帶的兩個學生,喬越,研一,剛進組,跟我做程序綜合。那個是裴礪,老博士了,在自己啃超優化。」

  老博士這三個字一出口,江臨的心裡就猶如明鏡一般,讀懂了角落裡那道不動聲色的審視目光究竟來源於何處。

  在計算機系統工程的行當里,一個老博士往往意味著無數個熬夜排查內存泄漏的通宵,意味著在彙編指令的汪洋與微架構特性的迷宮中摸爬滾打出了厚重的繭子。

  你一個搞密鋪搞純數的,跨界跑到系統組來談論底層性能優化的活計,這在任何一個實幹派的工程師看來,都透著荒謬。

  所以裴礪保持著一個資深系統工程師的嚴謹與警惕。

  而他的姿態也已經明確表達了他的潛台詞。

  江氏磚的數學構造確實華麗無雙,但這跟底層硬體優化,根本就是兩碼事。

  理論的鋒刃再利,也未必斬得斷工程上盤根錯節的亂麻。

  「你這一趟過來,那是不是rank5、sort5,都看過了?」

  陳啟明搓著手,問得滿臉期待之餘,又有些擔心江臨直接拋出一句那是個毫無意義的外行問題,來終結這次跨界合作的可能。

  「看了。」

  江臨沒有多餘的客套,找陳啟明要來一部專門用來離線測試的那台機器。

  「陳老師,我們先說結論。這條路徑在理論和工程上都能走得通。但具體的走法,可能跟您一開始設想的不太一樣。」

  他握住滑鼠,點開U盤根目錄,在一排規整的目錄樹中,雙擊打開了第一個文件夾。

  verify_sort5_zero_one。

  江臨轉過身,迎著陳啟明的目光,問道:「陳老師,我想先確認一個基礎問題。您團隊現在跑的這版 sort5 代碼,它的正確性是如何被確認的?你們怎麼保證它在任何極端情況下都不會出錯?」

  陳啟明微微一愣,似乎沒料到江臨切入問題的角度會如此基礎。

  推了推鼻樑上的眼鏡,如實答道:「主要靠高強度壓測。不是簡單測五個互異整數排列,而是把真實管線里抽出來的五元組形態都灌進去。重複值,缺失哨兵,復權尺度異常,低流動性標的的零成交窗口,極端漲跌幅邊界,還有溢出附近的整數值。流水線跑了幾十億組,沒抓到錯誤。」

  江臨點頭:「這些壓測能覆蓋大量工程髒樣本,但它仍然是抽樣。它能證明這幾十億次沒錯,不能證明排序網絡拓撲本身沒有錯。」

  陳啟明臉上的笑微微一滯。

  作為一個常年在系統底層遊走的架構師,一個絕不敢把帶有哪怕萬分之一隱患的代碼合進主幹框架的嚴謹學者,江臨的這句話,切中了他內心深處最敏感也是最無奈的那根神經。

  工程上的窮舉往往是不可能的,他們只能依靠龐大的概率來安慰自己。

  「我換一種驗證的做法。」


  江臨重新將視線投向屏幕,指尖在鍵盤上敲下回車鍵。

  黑色終端窗口彈出,一段簡短的腳本程序在光標的閃爍中開始運行。

  「在排序網絡理論里,有一個並不新鮮,但很少被系統工程師真正拿來當工程門衛用的結論——零一原理。」

  「我們現在面對的是五個位置的排序問題。根據零一原理,每個位置只有兩種可能:非0即1。」

  「2的5次方,滿打滿算,一共也就三十二個狀態。」

  終端屏幕上,進度條幾乎是在江臨話音落下的同一瞬間便已跑滿。

  一個鮮艷的綠色提示符躍然屏上。

  PROVED。

  「陳老師,只要這三十二個邊緣狀態全部通過測試,您這段sort5的正確性,就不再是依靠測了幾十億次沒翻車所建立起來的概率學底氣。」

  江臨指著屏幕上那個綠色的字符,說。

  「而是被嚴密的數學定理蓋章認證了,它不僅過去沒有錯,而且被證明了永遠不會翻車。」

  「因為幾十億次的資源消耗與漫長等待,被降維壓縮成了僅僅三十二次。而且這三十二次,提供的是一份不留任何死角的證明。」

  辦公室里的空氣仿佛在這一瞬間凝滯了。

  「這就三十二組了?」喬越從側面湊近屏幕,聲音因為難以置信而有些變調,「把幾十億組的測試規模直接壓成三十二組,居然還能在邏輯上升格為證明?」

  「這是底層定理賦予的保證,在抽象排序網絡這一層,它不僅過去沒錯,而且可以證明不會因為輸入組合翻車。當然,前提是比較器語義沒有變形,輸入域滿足全序,後面的源碼、編譯器、機器碼層面還要另驗。」

  江臨解釋說。

  「只要0和1的輸入序列全排對,那麼對於任何滿足全序關係的輸入,這個排序網絡拓撲都必定排對。但浮點裡的NaN、signed zero,或者比較器本身帶副作用,就不在這條定理直接保護的範圍內。」

  陳啟明注視著屏幕上那個綠色的PROVED,喉結不由自主地滾動了一下。

  他做了一輩子的底層系統,在寄存器和指令集的泥潭裡掙扎了無數個日夜,他比任何人都清楚,高置信度的測試與被數學證明的正確之間,究竟橫亘著一條多麼深邃的鴻溝。

  隨機測試賦予工程師的是將代碼推向生產環境的底氣。

  而眼前這看似輕描淡寫的東西賦予的,是不可推翻的判決。

  角落裡的裴礪,一直抱著的胳膊,不知什麼時候慢慢放了下來。

  江臨那句抽樣不是證明,刺痛的並不僅僅是陳啟明。

  裴礪在這三年裡,日復一日地構建著自己的超優化器。

  他試圖用算法在海量的指令組合中尋找最優解。

  但那些由算法搜出來的、性能卓越的機器碼,他十有八九是不敢直接上線部署的。

  原因無他。

  他無法從數學上證明那些千奇百怪的指令組合在邏輯上是絕對等價且正確的。

  能用,是機器夜以繼日跑測試跑出來的。

  對不對,他的心裡卻始終懸著一根尖銳的刺,時刻擔憂著在某一個罕見的微架構狀態下,程序會全盤崩潰。

  而此刻,眼前屏幕上那個靜靜發光的綠色PROVED,恰好就是拔出他心中那根刺的唯一解藥。

  辦公室里陷入了長達十幾秒的安靜。

  「你這個驗證夾具是對任何一段不同結構的sort5代碼,都能做到這樣一錘定音的評判嗎?」

  陳啟明再次開口時,聲音變得有些發緊。

  「任何一段由compare-exchange原語表達出來的sort5排序網絡,都可以。」

  江臨的回答沒有絲毫猶豫。

  「但它證明的是抽象網絡層的正確性,不是證明任意C代碼、任意編譯器、任意機器碼都安全。輸入域必須滿足全序,比較器必須嚴格等價於 min/max。至於GCC、Clang、SIMD 指令、整數溢出、NaN和未定義行為,那是下一層驗證要處理的東西。」

  江臨沒有在這個綠色的勝利上過多停留,他熟練地操作滑鼠,退回上一級目錄,切到了第二個文件夾。


  「正確性這塊基石既然已經焊死,接下來,才是您在工程落地時真正覺得頭疼的那一半,如何做到極致的快。」

  陳啟明的注意力一下子被吸引了過去。

  屏幕上展現出來的,不再是簡單的測試腳本,而是一套由江臨親手搭建的框架骨架。

  對於普通人而言,那可能只是一堆枯燥的英文目錄和層級結構。

  但對於陳啟明這種浸淫系統架構數十年的老手來說,僅僅是掃了一眼整個工程的目錄依賴關係,他的瞳孔就不由自主地收縮了一下。

  因為這套旨在尋找最優指令排列的超優化框架,被乾乾淨淨地切分成了三個相互獨立卻又嚴密咬合的層次。

  「第一層,我稱之為候選生成器。」

  江臨的滑鼠指針在一個名為Generator的模塊上懸停。

  「它的唯一職責,就是根據規則不斷向外吐出各種可能的排序網絡拓撲結構。它負責添加比較器、執行初步的冗餘剪枝、進行等價狀態排重。這一層完全運作在抽象的數學空間裡,跟代碼最終要跑在什麼機器上,沒有半點關係。」

  「第二層,就是我們剛才演示過的那個零一驗證器,在這個系統里扮演著絕對冷酷的門衛角色。底層搜索算法吐出來的候選網絡里,必定會存在大把跑得飛快,但邏輯其實是錯誤的垃圾結構。這一層不看任何性能指標,只看正確性,把那些偽劣產品全部當場槍斃,一個不漏。」

  「至於第三層,也就是代價評估引擎。」江臨的語速放緩,加重了語氣,「它的任務是給那些存活下來的正確的候選網絡打分,判斷哪一個在實際運行中會更快。」

  「而這一層,是整個框架中,唯一與具體的底層物理硬體產生綁定的部分。」

  江臨轉過頭,看著三人說。

  「最關鍵的是,它是熱插拔的。」

  聽到熱插拔三個字,陳啟明的呼吸頻率,肉眼可見地變得重了一分。

  「插拔,這怎麼理解?」喬越的工程經驗尚淺,大腦的運轉速度沒太跟上這跳躍的架構設計。

  「意思是,如果我們的目標環境換了一台不同微架構的機器,我們只需要把這塊後端的代價評估板子單獨拆下來換掉。」

  江臨耐心地解釋道。

  「如果我們餵給評估引擎的是英特爾某代架構的延遲表和埠競爭模型,它就按英特爾的脾氣打分。如果我們換成ARM架構的模型,它就按ARM的吞吐上限去評估。而前面兩層的搜索和驗證邏輯,哪怕是一個標點符號的代碼,都不需要修改。」

  實驗室里的空氣仿佛被瞬間抽乾。

  直到裴礪走過來。

  「架構切開不難,難的是切開之後別漏血。」

  他走到屏幕前,指著第二層驗證器。

  「你的零一驗證器證明的是compare-exchange網絡。可我的超優化器吐出來的東西,不一定老老實實長成比較器。它可能是cmov,可能是blend,可能是pminsd,也可能靠某種未定義行為省一條指令。」

  「你怎麼證明這些髒東西,真的等價於你抽象層里的compare-exchange?」

  「所以零一驗證器只是第一道門。」

  江臨拿起馬克筆在一旁的白板上寫下五行字。

  抽象網絡。

  原語語義。

  源碼實現。

  二進位等價。

  微架構代價。

  「你卡了三年的,不是一塊鐵板,而是五層東西混在一起,我們得先把它拆開。」

  喬越在一旁張大了嘴巴,目光在裴礪和江臨之間來回遊移。

  直到這一刻,他才具象地意識到,眼前這個總是帶著平靜神情的少年,絕對不僅僅是數學非常厲害那麼簡單。

  他還擁有著對複雜工程進行降維解構的恐怖直覺。

  「陳老師,在開始實際搜索之前,我必須先向您確認一個工程上的約束條件。」江臨卻沒有沉浸在旁人的驚嘆中,而是迅速將話題拉回了最硬核的實操層面,「您團隊需求的這個sort5,它的核心訴求是單發延遲敏感,還是批量吞吐敏感?」

  陳啟明聞言,微微一怔。


  喬越幾乎是下意識地接話道:「快不就是快嗎,時間短了自然就快了,這還分……」

  話剛說了一半,喬越自己就卡殼了,他隱約察覺到自己可能暴露出了底層的認知盲區。

  「這兩者在現代微架構上,截然不同。」

  替喬越把話補全的,是裴礪,語氣中帶著複雜的感慨。

  「如果你一次只排一組五個數字,要求這組數據從輸入到輸出的時間最短,那麼你追求的是最低的延遲。但如果你面對的是海量數據,比如一天要排上億組,你的目標是單位時間內能處理多少組數據。在現代 CPU 那些複雜的亂序執行和超標量流水線上,這兩個目標往往是互斥的。」

  裴礪深深地看了江臨一眼。

  這個問題,即使是在他們這個專門搞系統底層的課題組裡,也鮮少有人在寫代碼前正經八百地提出來討論過。

  所有人在面對優化這個詞時,都默認了單一維度的快。

  然後下意識去死摳比較器的絕對數量,去計較少寫了一條彙編指令。

  然而,在擁有多個ALU 埠、複雜分支預測和重排序緩衝區的現代處理器上,最少的指令條數,並不意味著最高的吞吐量。

  「我們要跑在批處理的場景里,看重的是極限吞吐。」陳啟明沒有任何猶豫,直接給出了定調。

  「那就好辦了。」

  江臨點了點頭,將代價評估後端的配置文件打開,掛上了陳啟明之前提供的機器A的硬體埠爭用模型數據。

  「我把搜索目標明確設定為最大化吞吐量,然後,在這個特定模型下跑一個受限空間內的定向搜索。」

  江臨並沒有啟動全量搜索。

  全量搜索整個指令狀態空間,在沒有算力集群支撐的情況下,是一個需要在算力廢土裡用幾十年的時間去慢慢熬的浩大工程。

  他僅僅是在一個被嚴密數學剪枝後的極窄範圍內,讓這套三層架構運轉了不到五分鐘。

  工作站的散熱風扇發出一陣短暫而急促的轟鳴後,屏幕上吐出了一排排新鮮出爐的候選結果。

  「陳老師,您看一下。」

  江臨調出內置的對比工具,將兩段代碼並排展示。

  「這裡頭排在第一梯隊的,有一個排序網絡,它的拓撲結構跟您團隊耗費數月手工調優出來的那一版,幾乎完全吻合。這個結果首先印證了一點,您團隊在底層優化的手藝沒有任何毛病。在人類能夠憑藉直覺和經驗觸及的邊界內,你們確實已經摸到了比較器數量最優的那一檔基準線。」

  聽到這番話,陳啟明緊繃的臉色終於舒緩了許多。

  「但是,請看這一個。」江臨的滑鼠向下滑動,點開了另一個評分稍高的候選方案,「這套方案的比較器數量同樣是九個,一個都不比你們的多,也沒有減少。可是它將這九個比較器的指令排布順序,進行了一種看似反直覺的錯位編排。這種錯位,恰好避開了機器A在特定周期內的ALU埠資源擁堵。」

  「在機器A上,並且僅僅是在機器A的微架構下,它的極限吞吐量,比你們手工調優的那一版,快了不到百分之三。」

  百分之三。

  在日常應用的軟體開發中,這是一個小到幾乎不值一提,很容易就會被環境噪聲輕易淹沒的數字。

  然而裴礪一言不發,在一旁的副屏上調出自己的終端環境,將江臨搜索出的那段甚至沒有加任何注釋的候選代碼拷貝了進去。

  他親自動手掛上編譯器,開啟最高級別的優化選項,連接上Linux內置的perf性能分析工具,屏息凝神地連跑了三遍基準測試。

  然後鎖CPU affinity,關掉睿頻波動,把governor固定到performance,預熱緩存,perf stat-r50連跑五十組。

  他盯著cycles、instructions、uops issued、branch-misses幾列數字看了很久。

  三十組之後,趨勢還在。

  五十組之後,置信區間沒有壓回原版。

  那不到百分之三的差距,終於從噪聲里站了出來。

  「五分鐘?」裴礪指著桌上的設備,聲音有些發澀,「這就只是在普通的機器上跑了五分鐘的結果?」


  「嗯,五分鐘不到,因為設定了嚴苛的剪枝條件。」江臨平靜地回答。

  陳啟明長長地嘆息了一聲:「一個僅僅跑了五分鐘的自動化受限搜索,就憑藉著針對性的硬體模型,在一個被我們翻來覆去研究過的用例上,硬生生地壓過了我們整個團隊手工雕琢了大半年的版本。」

  一旁的喬越,此時已經完全失去了語言組織能力。

  但裴礪畢竟是經歷過無數次架構失敗的老兵。

  短暫的震撼過後,他的眼神閃動了一下,似乎從這近乎神跡的展示中,敏銳地捕捉到了某個隱秘的破綻。

  「等等,sort5終究還是太小了。五個元素的排列組合畢竟有限,靠著精妙的受限搜索,你確實可以在短時間內糊弄過去。」

  裴礪緊緊盯著江臨的眼睛,語速加快。

  「可是,陳導真正想要鋪開的,是把這套排序邏輯集成到我們整套底層數據處理內核里。我們需要一次性排八個數,十六個數,甚至更長。你比我清楚,一旦元素數量上升,底層網絡的狀態空間是呈指數級爆炸的。受限搜索的算力一旦撞上那面指數級的高牆,根本就頂不住。」

  這是裴礪在系統架構層面,在這套優美框架上面所能想到的,可能面臨的最後一次崩塌危機。

  然而,江臨沒有顯露出任何被拆穿的窘迫。

  他反而十分贊同地點了點頭,仿佛這一切早就在他的推演沙盤之中。

  「你說得很準,所以剛才演示的這百分之三的性能提升,是機器A獨占的。如果把同樣的底層代碼扔到微架構不同的機器B或機器C上,這個優勢大概率會蕩然無存,甚至可能出現負優化。」

  江臨順著裴礪的話接了下去。

  「這套三層架構真正的價值,並不在於此刻生成了某一段神奇的代碼,而是在於那塊隨時可以重定向的代價評估後端。」

  江臨面對著兩位資深的系統研究者,語氣依舊沒有太多的起伏。

  「此外,剛才裴師兄用perf實測出來的數字,在真實複雜的作業系統環境中,本身就是帶有大量環境噪聲的。緩存命中率波動,作業系統調度中斷,都會導致同段代碼一次跑得快,一次跑得慢。在未來的全量搜索中,代價模型必須進行反覆的模擬與抽樣,取最穩健的統計學中位數,否則算法搜出來的最快,只是一座建立在沙灘上的堡壘。」

  「當然,還有你剛才提到的一點,當 N 的規模變大時,狀態空間的指數爆炸問題。」

  江臨看著裴礪,毫不避諱這個技術盲點。

  「受限搜索和零一原理確實能輕鬆處理sort5,但絕對應付不了sort16這種量級的怪獸。要想讓這套框架在你們龐大的全套微內核上跑出具有系統性顛覆的成果,我們需要更激進的剪枝算法,更貼近矽片物理特性的代價模型,以及前所未有的啟發式搜索策略。從前端到後端,每一塊板子,都得重新打磨。」

  「這部分是塊難啃的硬骨頭,不可能一蹴而就,我需要一點時間去構建新的數學工具。」

  江臨用陳述客觀事實的語氣,為這場展示畫上了句號。

  裴礪微微張了張嘴,喉嚨里發出低微的氣音。

  他原本準備好的,試圖挽回底層工程師顏面的那一記殺招,原來早就在對方的預料之中。

  物理邊界的限制,性能測試的隨機噪聲,以及那座似乎高不可攀的指數級運算大山。

  江臨一條都沒有遺漏,坦誠得令人嘆服。

  陳啟明定定地看著站在辦公桌前的江臨。

  這個僅僅十八歲的少年,在剛剛過去的半個小時裡,用一個不容置疑的綠 PROVED和一段壓榨出百分之三性能的機器碼,差點讓他這個幹了大半輩子底層架構的老兵,對自己團隊長久以來的手藝和信念產生動搖。

  然而,在取得如此壓倒性優勢的時刻,對方非但沒有趁勢將話語權全部攬走,更沒有大包大攬地吹噓未來的前景。

  相反,他一條一條如履薄冰般地將這套工具現存的邊界,硬體底層的客觀噪聲,以及那座還未翻越的數學大山,冷靜地向他們剖析得一清二楚。

  在這個浮躁的學術圈裡,懂得炫技的人如過江之鯽。

  但懂得在光芒最盛的時刻,在最該收斂的地方穩穩收住鋒芒的人,鳳毛麟角。

  「我明白了。」

  陳啟明重重地點了點頭,臉上的神情前所未有地鄭重與肅穆。

  「這件事情的意義太大,不能只靠我們倆在這個閉塞的辦公室里私下拍板。關於後續的署名權,專利歸屬,以及聯合研發的流程,我們必須走最正規最嚴謹的合作通道。」

  「嗯。」江臨表示贊同,「陳老師這邊可以主導走計算機學院的行政流程。我目前的臨時訪問人員身份掛靠在物理學院,歸陸老師負責。該向院系報備的報備,該簽的保密與合作協議,我們一步一步簽清楚。」

  他稍微停頓了一下,補充道:「我可以先把零一驗證夾具的源碼授權給您做內部科研驗證。它只包含五輸入排序網絡的0-1 測試、日誌輸出和接口模板,不包含候選生成器,也不包含完整MPS搜索框架。授權範圍,是否開源,是否用於論文和後續商業項目,我們寫進協議。」

  「至於那座由指數爆炸堆砌起來的大山?」

  江臨隨手關掉了工作站上的測試屏幕,拔下那個黑色的U盤,語氣平靜如水。

  「給我一點時間。」

  一直在旁邊插不上話,憋得滿臉通紅的喬越,直到這一刻才像是大夢初醒般回過神來。

  他急吼吼地往前猛湊了兩步,掏出手機:「江師兄,咱們能加個微信嗎,以後在框架編譯上有不懂的地方,我能隨時請教您嗎?」

  裴礪在旁邊看著自己師弟這副模樣,忍不住輕嗤了一聲。

  隨後,他又默默轉回身,將終端上那段由江臨用五分鐘搜出來的候選代碼,再一次翻出來,盯著那幾條打破常規的比較彙編指令,看第三遍。

章節目錄