2009年3月6日 星期五

單核心多執行緒會有效益嗎?

為了尋找某主機傳說中的關鍵,我受到了勇者的請託,必須寫程式嘗試解除重重的枷鎖,才能打開光明之門,取得寶箱!不過用暴力攻擊法攻擊那些鎖大約需要10年的時間,我才會知道有沒有答案(暈)!而且也只是冰山一角。最終還是必須以現有資料推演的方式去找出關鍵,希望能借助電腦強大的運算能力,順利的解決。

目前資料推演的方式,是必須跑2的48次方個迴圈,來嘗試各種不同的組合,這是個很笨的方法,但我天真的認為,現代CPU的速度要跑這樣的運算,簡直是一塊蛋糕!在很快的寫了個單執行緒的程式去跑之後,我發現我錯了。用Intel Core 2 Duo 1.86G去算,竟然8小時也跑不完!後來才發現,光跑2的32次方就大約10分鐘,這樣的運算要跑65536次,所需的時間是655360分鐘,也就是10922.67小時,換算成天數的話,只要455天就可以跑完了!

如果455天後才知道答案,我想我會先被砍吧?!正苦思該怎麼加速運算時,想到可以善用多核心的機制。由於各種組合之間沒有相關,很適合將運算的迴圈分割,以並行的方式來執行。所以我把單執行緒的程式,改成一次發出4個運算執行緒,然後主程式作為執行緒監測用,每10秒印出各執行緒目前的運算進度,果然速度大幅提昇,10分鐘至少可以完成4組運算,真是感謝多核心的進化呀!不過系統反應就變非常遲鈍了,唉~看來是必須開電腦牧場還是去借超級電腦(笑)來找答案了。

剛好身邊有台超過10年,暱稱Serina的精英DeskNote電腦,CPU是VIA Samuel 733MHz,跑Windows 2000。雖然很慢(不是現採哦!)風扇聲又大,不過還是可以幫忙算些零星的部份,減少整體時間。由於CPU是單核心,我想多執行緒反而更慢完成吧?

因為懶惰改程式,所以便4執行緒直上。從印出的執行緒進度來看,單核心電腦在(Windows 2000)分配每個執行緒的執行時間都還蠻平均的,計算數值的差距不大,而雙核心(Windows XP)則是有些執行緒的進度會超前,不過也許這是作業系統使用不同排程的關係。

最後Serina花了99分鐘完成8組運算,由每個執行緒分別計算2組運算工作。聽著Serina的風扇怒吼,為了不太難為她,所以我又為Serina改了一組程式,同樣也是完成8組運算,不過是2執行緒的,每個執行緒分別計算4組運算工作,最終2執行緒版本用了114分鐘完成,比4執行緒還慢!

沒想到即使是單核心,如果運算分割得當的話,也可以引出更高的運算效能出來呢!等會兒在C2D上試試看8執行緒會不會更快,呵呵。

不過這樣下去要算到何年何月呢?有沒有更快的方法呀?

〔後記〕剛測4執行緒,又落在113分鐘完成!看來是樣本數不夠多囉~~

沒有留言:

張貼留言