平行演算法期末報告

Huffman coding

國立中山大學應用數學系碩士班一年級

張震達

8724617

changjd@ibm7.math.nsysu.edu.tw

 

動機 :

之所以會選這個題目,我想它的來由就是...,廢話不多說,所以當我決定要做這個題目時,直覺反應是它有哪些地方可以被平行化? 想不通,所以去找看看是否有這方面的paper,很可惜的是沒找到所想要的paper,所以就只好問問別人和自己想想看是否有好的方法了。

 

實作方法:

基本上,直覺反應在建構tree時很難去平行化,應該是有方法,只是我沒想到罷了,再加上自己考量會用到的符號應該不會超過255個,所以就把平行化的重心放在計算各個符號之頻率。而我的作法是每個CPU個自去計算在它自己內的每個符號出現之頻率,然後再將計算結果傳到一個CPU(在自己的程式內是第0CPU),累加各個符號的頻率得到每個符號出現之所有頻率後,最後再在此CPU上做建構tree則即完成本程式。

另外,原本是考量各個CPU對欲coding之檔案作分割然後個別讀取檔案內容,後來在寫好之後測試,發現到當檔案很大時,I/O會影響到計算的時間,所以後來就改版成各個CPU用亂數產生符號,然後計算每個符號之頻率。

 

執行結果:

N=75 (會出現的符號之個數, 0 (Dec 值為 48) z (Dec值為 122) )

LEN=40320 (coding 之文字長度,40320=1*2*3*4*5*6*7*8 )

# of CPU 1 2 3 4 5 6 7 8
Time 0.025097 0.015497 0.0117566 0.0102273 0.0092523 0.0086053 0.0084583 0.00819967

說明:上表的資料是Run三次的結果取平均值,我們也可以由上表的資料明顯的看出當CPU個數越多,程式執行時間也相對的越少,與理論和推測相符合,再由下兩表更可以明顯看出其效果

N=75, LEN=40320000 (Run三次取平均值)

# of CPU 1 2 3 4 5 6 7 8
Time 41.65631 20.48742 17.20463 12.47761 10.45706 8.22231 7.12300 6.13203

說明:由上表我們可以看出單個CPU2 CPU執行結果差兩倍,而單個CPU8CPU執行結果差了6.7932倍,由此可知對於2 CPU而言,其執行結果提升了兩倍是很理想的,而後來8 CPU之所以效果沒有提升至8倍,主要原因應該是受到訊息傳遞的影響所以才只提升了6.7932。故由此可知當資料量越大時,訊息傳遞的時間會影響到計算時間。

N=75, LEN=201600000 (201600000 = 40320*5000, Run三次取平均值)

# of CPU 1 2 3 4 5 6 7 8
Time 無法執行 106.21976 90.13014 68.47756 54.15564 44.66882 39.28789 34.27537

說明:上表的單個CPU內會有無法執行的原因,經過測試,應該是因為單個CPU無法配置如上 LEN量多之記憶體,而多個CPU 則因為平均分配,而每個CPU 動態配置記憶體的量較少,故可以成功地執行。

以下為上述各表之曲線圖:

parall-1.gif (4058 bytes)

parall-2.gif (3972 bytes)

parall-3.gif (4022 bytes)

結論:

由這次結果我們可以知道,當要處理的資料量越大時,使用越多的CPU 來處理固然可以增加執行效率,不過同時也要考慮各個CPU 間的訊息傳遞所需的時間,因為訊息傳遞的時間會使得結果不如預期來的理想,甚至會影響真正要處理資料的時間,而把大多時間花在彼此的訊息傳遞上,這樣所得的效益是不大的

附上:Source Code