作者:胖胖的小橘
因為他自己當時做這個專案的時候,可是動用了學校實驗室的高效能伺服器叢集。
透過極其嚴苛的多執行緒併發控制和CPU三級快取的命中率最佳化,他硬生生將零點計算推到了上億級的恐怖規模!
他甚至覺得,如果當時自己再把記憶體指標的回收機制打磨一下,摸到十億級的門檻也不是不可能。
“還是太業餘了呀……”
秦飛有些好為人師的搖了搖頭,索性也不看風景了,就這麼饒有興致的盯著李東的螢幕,權當是在旅途中找點樂子了。
此時,李東也沒注意旁邊有個高手在,他只最佳化自己的演算法。
秦飛看著,先是暗自點頭。
“嗯,不錯。”
“知道拋棄原始的尤拉乘積公式,直接上Riemann-Siegelformula。”
“主和項的迴圈寫得很規範,餘項展開的泰勒截斷也算合理。”
“時間複雜度標準的O(t^(1/2)),對於一個普通學生來說,這程式碼底子算得上紮實了。”
秦飛在心裡給出了一個“中規中矩”的評價。
然而,就在秦飛以為李東接下來會順理成章的去寫多執行緒加速程式碼時。
李東卻突然停了下來。
然後就按下了退格鍵,竟然把剛剛寫好的,那段堪稱教科書般標準的黎曼-西格爾主和項迴圈計算程式碼……
刪掉了一大半!
秦飛愣了一下。
“他幹嘛?寫錯撤
回了?”
但接下來李東敲出的程式碼,卻讓秦飛徹底看迷糊了。
李東沒有去糾結如何加快單次計算的速度。
他有【程式碼直覺】還有《黎曼絕筆》裡的那種降維數學思維,他現在已經可以初步找到通往現代計算機底層邏輯的完美橋樑了。
這是著名的快速傅立葉變換(FFT)開源庫。
然後又在程式碼中定義一個密集的評估網格。
voidMultiPointEvaluation_Grid(...)
他將需要逐個點代入t值去硬算的黎曼Zeta函式,透過構建區域性多項式,強行轉化為了在網格點上的泰勒級數展開。
緊接著,李東呼叫了FFT演算法,讓這些多項式在頻域內進行高速相乘。
秦飛已經把降噪耳取了下來,眼睛看著李東的電腦螢幕,呼吸都變得有些急促了。
“等等……這特麼是在幹什麼?”
秦飛想用自己學過的知識去去解析這套程式碼背後的邏輯。
“算黎曼Zeta函式,你引個快速傅立葉變換(FFT)進來幹嘛?這兩者八竿子打不著啊!”
“還有這個多點求值矩陣?他把泰勒展開放在網格上……”
突然,他好像想到了什麼
“他……他不是在算單點!他是在利用FFT的高效卷積特性,把一個大區間內的所有零點求值,強行打包成了一個並行的多項式咚悖俊�
“用多點求值去分攤黎曼-西格爾公式主和項那恐怖的計算開銷?”
這其實就是黎曼寫在手稿裡,沒未被後世學界發現的零點計算的思路。
比後來公開的Odlyzko–Schonhage演算法早了近一個半世紀,甚至在數學底層上,把後者的時間複雜度又往下壓了整整一個維度。
但秦飛不可能知道啊!
在他的認知裡,黎曼-西格爾公式帶來的O(t^(1/2))複雜度,就是單零點計算的理論下限。
哪怕是學界最快的OS演算法,也只是工程化的極限最佳化,根本不可能跳出這個數學框架。
而現在,眼前這個傢伙,他到底在幹什麼?是想要推翻整個計算架構嗎?
“這怎麼可能?!”
秦飛感覺他瘋了。
“把主和項展開成矩陣咚悖碚撋想m然能降低平均複雜度,但誤差怎麼控制?你這麼搞,浮點數的截斷誤差絕對會呈指數級爆炸的!”
然而,還沒等秦飛在心裡反駁完。
李東繼續在多點求值的網格間,穿插了幾段帶限函式的插值濾波程式碼,完美的將積分路徑的截斷誤差死死的鎖在了一個極小的數學邊界內!
每一行指標的遊走,每一次記憶體的複用,都用的很優雅。
“不對……就算是OS演算法,也不可能用這麼少的程式碼、這麼低的記憶體開銷實現!”
“他這個插值邏輯,根本不是現代數值分析的思路……這到底是哪來的演算法?!”
秦飛徹底看呆了。
雖然他認識那些C++的語法,但組合在一起的演算法邏輯,他已經完全跟不上了。
“他不會是在瞎寫吧?”
“這樣寫……真的可以跑通嗎?”
秦飛陷入了深深的自我懷疑中。
第97章 我自己想的
李東從上車沒多久就開始敲程式碼,現在已經硬生生敲了四個多小時了。
對於一個“初學者”來說,要把黎曼的降維演算法完美的巢狀進C++的底層記憶體管理中,還要呼叫FFT庫進行多點求值,確實非常的消耗腦力。
“啪!”
李東敲下了最後一行程式碼的回車鍵,然後伸了一個懶腰。
他又從頭到尾仔細檢查了一遍記憶體指標的釋放和邊界條件的設定。
“沒問題,完美。”
然後深吸了一口氣,輕輕的點了下“Run”鍵。
螢幕上的黑色控制檯視窗瞬間彈出。
首行赫然顯示著初始搜尋引數:【TargetInterval:t∈[10^20,10^20+1.5×10^6]】
緊接著,一行行綠色的數字傾瀉而下。
10,000...
100,000...
1,000,000...
每跳一次計數,都代表著成百上千個黎曼Zeta函式的非平凡零點被捕捉驗證,累計數量飛速攀升。
李東看著螢幕也不由的有些激動。
“跑得通!真的跑得通!”
而且因為演算法的時間複雜度從黎曼-西格爾公式的O(t^(1/2)),直接降到了比Odlyzko–Schonhage演算法的O(t^(1/3+ε))還要低的量級,再加上優雅的記憶體複用機制,這臺輕薄本根本沒有出現之前那種卡死藍色畫面的情況。
“我的思路是對的!黎曼的演算法真的可以代入……”
就在李東看著螢幕的時候,他並沒有注意到,被他扔在小桌板一角的手機螢幕,突然亮了一下。
微信“青龍學習小組”的介面後臺。
在李東頭像旁邊的那個【群主(實習)】的頭銜裡。
“(實習)”這兩個字,正在一點一點的變淡。
群裡……
【約翰?馮?諾依曼】:快了。
【阿爾伯特?愛因斯坦】:高三閣下那位愚蠢的侄子,看來也沒蠢到家。
【尼爾斯?玻爾】:阿爾伯特,別轉移話題,你我之間,總得有一個是對的,有一個是錯的。
【德米特里?伊萬諾維奇?門捷列夫】[戴墨鏡吃瓜]。
【艾薩克?牛頓】:你們到底在說什麼?
然而,這幾條訊息僅僅在螢幕上停留了不到三秒鐘。
就消失不見了。
而這一切,李東毫無察覺。
高鐵在華北平原上行駛著,三個小時過去了。
令人稱奇的是,這臺主打商務辦公的ThinkBook輕薄本,在長達三個小時的高強度極限咚阆拢I盤表面有些發燙,但完全沒有要宕機的跡象。
李東寫的這套演算法,太乾淨了!它沒有產生任何多餘的記憶體碎片,記憶體複用機制極其高效,幾乎沒有浪費記憶體頻寬,也沒有給CPU帶來額外的排程負擔。
此時,電腦螢幕上的區間內零點計數,已經跳到了——10^7!
10^20極高階區間內的一千萬個非平凡零點!
而坐在旁邊靠窗位置的秦飛,此刻已經完全傻掉了。
他摘下降噪耳機,就這麼傻傻的看著螢幕。
“一千萬?破千萬了?”
其實客觀的來說並不算多,但是這才三個小時呀!
“三個小時,你用一臺破輕薄本,在10^20極高階區間內跑出了一千萬個黎曼Zeta函式的非平凡零點?”
“你在開什麼國際玩笑啊!!!”
要知道,秦飛在北理工的計算實驗室裡,用那個造價幾十萬、帶有雙路32核CPU的小型伺服器叢集去跑Odlyzko-Schonhage演算法,就算只算t≈10^15量級的一千萬個零點,最少也要1.5個小時啊!更別說10^20這種極高階區間了!
表面上看,實驗室的1.5個小時確實比輕薄本的3個小時快。
但賬絕對不是這麼算的啊!
那可是算力每秒數萬億次的小型伺服器叢集!
而眼前這玩意兒,只是一臺主打文件辦公、連獨立顯示卡都沒有的輕薄本!它的硬體算力連實驗室伺服器單臺的二十分之一都不到!
用二十分之一的算力,僅僅只多花了一倍的時間,就跑完了更高階的恐怖資料量?
這在電腦科學的常識裡,是絕對不可能發生的事情!沒有任何現存的演算法可以做到這種量級的跨越!除非對方用的演算法,把現存所有的頂尖演算法都按在地上降維打擊了!
“假的……這絕對是假的!”
秦飛在心裡不停的安慰自己。
“他根本不是在跑程式!他是在放影片!對,這就是一段提前錄製好的裝逼影片!”
其實秦飛作為HPC專業的大三尖子生,怎麼可能分不清控制檯實時編譯執行和播放影片的區別?
只是他身為一個科班學霸的學術尊嚴,讓他本能的拒絕相信眼前這一幕!
“沒有任何教授教過我這種演算法,也沒有任何一篇頂會論文提到過這種操作!”
秦飛深吸了一口氣,身體朝著李東那邊靠了靠。
他準備仔細看看,這是不是一個惡搞程式。
他剛把頭湊過去……
“啪!”
電腦螢幕,毫無徵兆的黑了!
鍵盤背光熄滅,風扇的聲音也消失了。
這臺聯想筆記本直接罷工了…
“操!”
“操!”
上一篇:我家艺人太没上进心了
下一篇:返回列表