你對基於機器學習的編譯技術有什麼看法?
補充下問題,最近看到了這篇論文《Improving compiler optimizations using machine learning》才來提這個問題的。這篇論文考慮更多的是:通過機器學習的方法從可用的編譯優化選項集合中選擇出一個較優的優化子集(Optimization Selection,Optimization Phase Ordering)。其中每個優化選項又可以通過參數來優化(Optimization Tuning)。還可以對不同的函數分別進行不同的優化(Method-specific)。就像GCC提供了上百個優化的選項,但不會每個選項都使用。而一般的-O1,-O2,-O3所選的優化子集不一定對所有程序都是最優的。
題目的編譯技術想表達更多的是編譯後端以及高級語言虛擬機run time方面相關技術,編譯前端估計也沒什麼戲。
大家輕鬆點,談談機器學習和編譯交匯方面有什麼東西可以做,或者有什麼有趣的點子都行。
部分任務可以考慮比如前面答案提到的superoptimization。 推薦Alex Aiken實驗室最近的工作"Stochastic Superoptimization[ASPLOS 13]"
題主表達不明確,我猜應該是想指的是 backend optimization 這塊吧。其實這個 idea 也算是一直都有,通過 collect 很多 runtime 的 data,對抽取其中的 pattern, 為這類別的 program 做更針對性的優化,generate 更高效的 code。
其實我一直覺得這個 idea 肯定是很好了,可惜搞了這麼多年(cTuning、ck 印象中都有10年了吧)一直還是有點不溫不火的狀態。
現在 profile-guide 的 optimizaiton 各大 compiler 其實都有,我印象很深的是 Jim Radigan 大大在 cppcon 15 那時的 share 說 vc14 的新 c2 的 PGO(當然,現在已經是舊 c2 了,笑,很久前小測了下「15」的 beta c2 進化也是很大,不過是其他方面)能在自家 1st party 大作中得到再10~20%的提升 (可惜在自己 project 來看淺試了一下,並木有啥效果 囧)。
所以我覺得以現在的 context 下用 ml 在 compiler 這塊應用,PGO 應該就算是主戰場。這idea 也算是有點沉寂了很久了。cTuning 各種感覺幾乎沒啥大的 update。幸好的是,這兩年感覺重新活躍了起來,像 ck-caffe 一類的 project 也算是有一點關注度和活躍度(當然 不敢說當下能取得的效果是 ml 到來的,也可能是有規模的 runtime data 帶來了,當然我相信有 data 了之後,結合 ml 這方面是能做的更好的)。
另一塊沒準就是 superoptimizing,現在畢竟是有點 brute-force 加簡單的剪枝,可以想像這塊跟 ml 結合沒準能有更大的前途的。
我覺得在 backend 這塊肯定離完美還是差非常非常遠的,當下 backend 在很多 hotspot 生成出來的 code 在很多 tuning 經驗豐富,對 hardware architecture 比較熟悉的人看來,空間還是相當大的,畢竟現在很多 CGO 的 policy 還是有點依賴經驗。希望最終有一天能不用為各個平台、各個硬體寫各自的 kernel,直接 gen 後的 code 就能跑得歡,那沒準 blas lib 都不用咋維護了(雖然不大可能)
結合 runtime data,原則上終於能克服 AOT 和 JIT 的「理論」差距(笑
本人對這塊並不是特別熟,所以只能瞎扯些東西,也希望 zhihu 做 backend 這塊無論是工業屆或者學術界的大大能提供更多的 insight,如果上述有啥說錯了,也請多多包涵,歡迎提出。
我覺得,傳統的三大浪漫,需要解決的是well-defined的問題,也就是說問題本身,輸入和輸出都是可以精確描述的。
具體說,編譯器:對於滿足語言標準的合法的串,輸出行為正確且優化的執行程序/位元組碼。
而機器學習解決的是那些不是十分well-defined的問題,或者因為問題規模太大,沒法用well-defined的解法來解決的問題,比如圖像識別,比如下圍棋。
==
評論區沙沙指點,編譯器優化這個方向還是不怎麼well-defined的
我記得好幾年前有一段時間有不少論文關於用ml來決定運行哪些優化,以及優化的順序。論文寫的數據都不錯,不過好像沒怎麼聽過主流編譯器有用到。
題主知道有什麼相應解決方案么?目前沒見到特別好的機遇機器學習的優化
不看
看都不用看,還要什麼演算法。。。
沒看法,題主知識水平不夠,還是需要學習。
正常編譯啊,有什麼區別嗎?
那我還真得懷疑是不是編譯器有問題了……
推薦閱讀:
※為什麼C++預處理期編譯期的支持比較薄弱?
※想用用flex和bison寫個C的編譯器,應該如何處理C的宏?
※peg, ometa 解決什麼問題,ometa-js怎麼入門/正確理解和認知?
※(發散性問題,請隨意加上假設)一門編程語言同時擁有解釋器和編譯器的必要性有多大?
※如何快速而準確地判斷一門語言的語法(或部分語法)屬於哪個Chomsky Hierarchy?