Hadoop:用平行計算求圓周率π

來源:互聯網
上載者:User
關鍵字 平行計算 可以 java nbsp;
關於圓周率大家再熟悉不過了: 我們從課本上學習到早在一千多年前,祖沖之將圓周率計算到3.1415926到3.1415927之間... 電腦誕生後,計算圓周率被用來檢測電腦的硬體性能,晝夜燃燒cpu看會不會出問題... 另外一些人也想看看這個無限延伸的神秘數位背後是否有規律,能發現一些宇宙的秘密...








提起圓周率,不能不提及Fabrice Bellard,他被認為是一位電腦天才,在業界有著重要的影響。 1996年他編寫了一個簡潔但是完整的C編譯器和一個JAVA虛擬機器Harissa。 Fabrice Bellard發明的TinyCC是GNU/Linux環境下最小的ANSI C語言編譯器,是目前號稱編譯速度最快的C編譯器。 Fabrice Bellard傑作眾多且涉及廣泛,1998年編寫了一個簡潔的OpenGL實現TinyGL,2003年開發了Emacs克隆QEmacs,2005年還設計了一個廉價的數位電視系統。








Fabrice Bellard使用一台普通的臺式電腦,完成了衝擊由超級電腦保持的圓周率運算記錄的壯舉,他使用桌上型電腦將圓周率計算到了小數點後2.7萬億位,超過了由目前排名世界第47位的T2K Open超級電腦于去年8月份創造的小數點後2.5萬億位的記錄。





Bellard使用的電腦是一台基於2.93GHz Core i7處理器的電腦,這部電腦的記憶體容量是6GB,硬碟則使用的是五塊RAID-0配置的1.5TB容量的希捷7200.11,系統運行64位Red Hat Fedora 10作業系統,檔案系統則使用Linux的ext4.





這次計算出來的圓周率資料占去了1137GB的硬碟容量,Bellard花了103天的時間計算出了這樣的結果。





計算圓周率的方法有很多種:


微積分割圓法求:








或者利用便於電腦計算的丘德諾夫斯基公式法求:








不過這些計算方法都比較複雜,難以讓讀者理解和使用平行計算來求,所幸數學上的泰勒級數是個好東西,它將微積分的東西改成用無限級數來表示,這樣很容易進行平行計算分解:





π=4*∑(-1)^n+1/(2n-1) 或者寫為: π=4*( 1-1/3+1/5-1/7+...)


也可以得到:πn =πn-1+(-1)^n+1/(2n-1),也就是可以通過反覆運算前面的π值去求當前π值。





我們根據上面公式先寫個單機程式來求:





public class PiTest{ public static void main(String[] args) { double pi=0.0; for(double i=1.0;i<1000000001d;i++){ pi += Math.pow(-1,i+1)/(2*i-1); } System.out.println(4*pi); }}





運行以上程式,並對照pi的標準值:3.141592653589793238462643383279...


如果i<10000,得到pi = 3.1416926635905345 (從紅色部分以後不精確了)


如果i<1000000,得到pi = 3.1415936535907742 (從紅色部分以後不精確了)


如果i<1000000000,得到pi = 3.1415926525880504(從紅色部分以後不精確了)


......


可以看到,當反覆運算的輪數越大,求出的π值越精確。





由於是無限累加,我們可以很容易改成並行程式求解,比如i=4n,可以分成4段並行求解,再將4部分和合併起來得到最終π值。 假設我們有4台電腦,平行計算設計如下:








我們這裡通過fourinone提供的各種平行計算模式去設計,第一次使用可以參考分散式運算上手demo指南,開發包下載位址:HTTP://code.google.com/p/fourinone/





程式實現:


PiWorker:是一個π計算工人實現,我們可以看到它通過命令列輸入一個計算π值的起始值和結束值,我們同時啟動4個PiWorker實例,啟動時指定不同的起始結束參數。





PiCtor:是一個π計算包工頭實現,它的實現很簡單,獲取到線上工人後,通過doTaskBatch進行階段計算,等待每個工人計算完成後,將各工人返回的π計算結果合併累加。





運行步驟:


1、啟動ParkServerDemo(它的IP埠已經在設定檔指定)


java -cp fourinone.jar; ParkServerDemo








2、運行4個PiWorker,將反覆運算100,000,000輪的計算拆分到4個工人並行完成,這裡方便演示是在同一台機器上,現實應用中可以在多台電腦上完成。


java  -cp fourinone.jar; PiWorker localhost 2008 1 250000000


java  -cp fourinone.jar; PiWorker localhost 2009 250000000 500000000


java  -cp fourinone.jar; PiWorker localhost 2010 500000000 750000000


java  -cp fourinone.jar; PiWorker localhost 2011 750000000 100000000








3、運行PiCtor


java  -cp fourinone.jar; PiCtor








可以看到,4個工人實例在同台機器並行完成計算π值的時間為29秒,如果是運行單機程式PiTest完成的時間在45秒,精准度都是到小數點後8位「3.14159265」,但是耗時上有明顯差距,如果多機多實例, 效率還會進一步提升,平行計算性能提升分析可以參考「使用平行計算大幅提升遞迴演算法效率」。





完整demo源碼如下:


// ParkServerDemo


import com.fourinone.BeanCoNtext;public class ParkServerDemo{ public static void main(String[] args) { BeanCoNtext.s tartPark(); }}





// PiWorker


import com.fourinone.MigrantWorker;import com.fourinone.WareHouse;public class PiWorker extends MigrantWorker{ public double m=0.0,n=0.0; public PiWorker(double m, double n){ this.m = m; this.n = n; } public WareHouse doTask(WareHouse inhouse) { double pi=0.0; for(double i=m;i<n;i++){ pi += Math.pow(-1,i+1)/(2*i-1); } System.out.println(4*pi); inhouse.setObj("pi",4*pi); return inhouse; } public static void main(String[] args) { PiWorker mw = new PiWorker(Double.parseDouble(args[2]),Double.parseDouble(args [3])); mw.waitWorking(args[0],Integer.parseInt(args[1]),"PiWorker"); }}


// PiCtor


import com.fourinone.Contractor;import com.fourinone.WareHouse;import com.fourinone.WorkerLocal;import java.util.Date;public class PiCtor extends Contractor{ public WareHouse giveTask(WareHouse inhouse) { WorkerLocal[] wks = getWaitingWorkers("PiWorker"); System.out.println("wks.length:"+wks.length); WareHouse[] hmarr = doTaskBatch(wks, inhouse); double pi=0.0; for(WareHouse result:hmarr){ pi = pi + (Double)result.getObj("pi"); } System.out.println("pi:"+pi); return inhouse; } public static void main(String[] args) { PiCtor a = new PiCtor(); long begin = (new Date()).getTime(); a.giveTask(new Wa reHouse()); long end = (new Date()).getTime(); System.out.println("time:"+(end-begin)/1000+"s"); a.exit(); }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.