想著開通部落格已經有幾年了,大概從大學快要畢業的時候吧。但是一次次舉棋未定,最終鎩羽而歸,直到今天才正式算開通。
今天終於想著開通了,又是什麼原因呢?這也就是我開博的動機所在了。接下來徐徐講來。
我最近兩個多月都在忙乙個任務。其實是乙個不算複雜的任務,只是把乙個使用qt編寫的基於遺傳演算法的程式用cuda進行改造,加快速度。但是由於沒人催,任務進行得極其緩慢。前半個月主要忙著配置環境,由於cuda7.5需要64位環境的支援,而qt一般只有32位的。因此我需要根據網上資料自己編譯64位qt。具體的方法可以參考我的另一篇文章。
接下來就開始使用cuda進行改造。我曾經使用過一段時間的cuda,但是也過了兩年了,忘得差不多了。經過一段時間的回顧,我開始動手改造程式,為了簡單起見,我按著原來程式的架構進行改造。這個時候我的第乙個毛病犯了:我拿到初始的cpu版本的程式後,並沒有仔細思考與分析程式,而是隨意看了看就開始動手改造,這裡給我自己挖了乙個大坑x。這個坑x也是今天促使我立即開博的最大因素。
這個坑是什麼呢?我並沒有仔細分析整個原始的程式,只是粗略的看了一下結構,便匆忙地分析出計算量最大的模組a。於是接下來的改造都是針對a的。最近幾天改造並除錯完成後,結果還不錯,比之前的版本有著很大效率的提公升。但是出現了乙個不能算大但是也必須解決的問題b:程式中有個地方用到了互斥鎖,這個地方明明操作很簡單,但是卻耗費了很大的時間,而且特點是,迭代次數越多,每次耗費的時間越長。(這裡就是第二個坑y了!)因此我對這乙個互斥鎖進行分析,並查閱了很多資料。但是最終竟然發現,耗費時間長這個問題並不是因為互斥鎖的緣故,而是由於繪製模組的原因!——初始程式作者(坑!)把清除快取函式中的一段**注釋了,因此每次繪製完成後,快取並未清除,導致下一次繪製時間增加。我為什麼沒有去仔細閱讀**呢?這是我需要改進的。同時也是自己經驗不夠吧,每次迭代耗費時間不斷增加,不就意味著資料的規模在不斷增長嗎?
解決問題b之後,突然發現,當我完善了清除快取的**後,cpu版本的程式快得飛起——直接從數十分鐘的數量級提公升到數秒鐘,甚至超越了gpu的速度!(這就是我之前說的大坑x。)那我修改了兩個月有什麼意義呢?原來程式之前的瓶頸在於繪製部分,以及沒有清除快取這個bug。——(結論下的太早了,經過調整引數,gpu版本的效率還是要高上不少的。11.3 改)
最終的結果是,cpu和gpu的速度是差不多的,gpu的大部分時間用於記憶體的交換了。當然,隨著資料規模的不斷增大,gpu計算的優勢會進一步凸顯。
總之,根據這個事情,我需要改善的地方是:
1、遇到乙個問題,不要一上手就幹,而是先思考怎麼幹,並閱讀**,了解**結構與內容;
2、不要鑽牛角尖,學會退一步看問題,能夠進退自如;
3、接到任務時,不能想當然,必須要搞清楚任務的具體需求與條件,要盡量問清楚(這次沒發生這個問題,但是這也是我需要注意的)。
喵星球上的點名(字尾自動機 dfs序 莫隊)
一道據傳言有多種解法的題 不過大多是因為資料太弱過的 先用ac自動機搞了一上午,無果 看了題解,字尾自動機 莫隊?正好是我最喜歡的演算法之一 正在學習的演算法,就這個了!然後由於廣義自動機的las tlast last 標記有個地方忘了初始化。然後在大物課上調了三節課,洛谷一頁都是我,hhh 題意 ...