如何在看不懂演算法代碼的情況下,等價的優化演算法?
02-05
最近在修改公司的博士寫的代碼(博士是數學系的),演算法的代碼沒有看的太懂。然後在改寫的過程中會發現各種結果不一樣,不得不回去看原來的代碼。有沒有什麼方法可以在不看懂原來的代碼的情況下,進行等價優化。
你得先看懂數學模型,然後再去看代碼。
如果懂了模型並了解其中各參數的作用,還是有一定可能看不懂代碼,但可以調試出好結果的。因為如果代碼是完全按照模型寫而並沒有trick在裡面的話,那麼重要的是模型參數,而不是代碼的具體實現過程。畢竟很多數學上一行帶過的公式,其代碼實現會特別的冗長,在只關注結果的前提下,可以不去關注它們是具體怎麼實現的。
這就相當於軟體測試中的黑盒子測試,測試者並不知道軟體內部模塊結構等,僅通過其提供的參數借口去儘可能的嘗試不同組合已發現潛在的bug。而這就要求測試者對該軟體的模型有一定了解。
一言以蔽之,先看懂數學模型,再去調參數,是個可行的方法。先寫好單元測試,確保覆蓋現有功能。
然後profiler查找性能黑洞,有針對性的優化,不做無用功。
再針對性優化,每一步都要運行單元測試,過程中順手重構程序流程,該提取子函數的,該修改變數名的,該添加註釋的,該添加輔助函數的等等。
如果可以,先設定優化目標,先寫好性能測試,修改優化代碼,直到滿足性能測試後結束。沒辦法
作為一個Berkeley的學生,表示我們的機器結構61C的第三個project,就是要我們優化一個看不懂演算法的。。。嗯,這個project要我們優化一個神經網路識別貓的演算法,要把250Cats/s提速到3K+Cats/s,最後我們是這樣優化的,把用到的參數都弄出來,為每種特定的函數寫一個Specialized Function,然後把循環展開,使用Intel提供的AVX寄存器的功能每次計算4個浮點數(這個可以在https://software.intel.com/sites/landingpage/IntrinsicsGuide/找到),然後使用OpenMP使得程序在線程層面上進行Parallel Computation。
當然這是我們的入門課程,不一定能夠幫上樓主。
假如不懂原理的話你能做的事情並不比編譯器多多少,至多是參考JIT用profile優化一下數據結構。別的。。。人干不過現代編譯器
自己實現一遍。。
推薦閱讀:
※誰能用軟體跑一下6+大牌德州的牌型概率不?
※計算器為什麼能實現保留根式、分數或含π的結果的功能?
※演算法相關學習資料整理
※【修真院「純潔」系列之五】醉酒和加班