多核平行計算時代的來臨

banq發表於2008-11-13
a worldwide shortage of people experienced in parallel computing
全世界程式設計師最大短處就是缺乏平行計算經驗

當CPU進入雙核多核,軟體架構進入分散式計算 雲端計算時代後,他們的共同點平行計算已經成為一個新的熱點。

前段時間Ruby On Rails JRuby Grails等新式語言有些熱門,但是平行計算卻是它們的殺手,新的平行計算DSL(Domain-specific language)語言 Scala Clojure 以及Erlang在這幾個月已經成為新的明星。

Scala是一個相容JVM的並行語言,後臺有IBM等大公司支援,而Erlang是最早由愛立信推出的一個開源語言,目前尷尬是缺乏象IBM這樣軟體巨頭支援。2009將有各種有關Clojure語言的介紹。

在這樣的背景下,有人就提出:Java是否已經發展到頂了,可能走下坡路了呢?(Dead like COBOL )

最近Yahoo網格雲端計算小組釋出一項驚人效能測試結果:


Java開源Apache
Hadoop贏得了TB級別的最快基準測試,Hadoop可以在209秒內完成1 TB資料排序,打破了前期297秒的年度記錄(Daytona),成為最快紀錄冠軍,這是一項1998由Jim Gray建立的基準測試,指定輸入資料( 100億個100位元組的記錄) ,徹底地排序,並寫入磁碟。

Java取得這項測試的勝利,並不是因為Java語言走上了並行語言,而是Java從誕生那天起,就是為網路而生,它是透過多臺伺服器平行計算取得了這項驕人的成績,還是那句話:Java在個體上可能拼不過你,但是整合群了就能戰勝你,就象螞蟻個體雖小,但是大量成批螞蟻也是任何生物的殺手。

Java語言因為其高瞻遠矚的前瞻性取得了生命延續,但是這並意味著其停滯不前,如今單臺伺服器進入CPU時代,如何在單臺PC的微結構中象Scala那樣提高多核併發計算效能,將是Java 7推出的新特點。

但是,這並不像以前推出的一些新功能特點,平行計算需要程式設計師思維方式的改變。其實,從jdon.com討論來看:程式設計師相當缺乏並行開發思維,從以往不習慣執行緒併發 到面對EJB這樣分散式元件開發的抓狂,都說明一些人的思維升級換代已經跟不上CPU了(最後機器人會戰勝一部分人 悲哀)。

Java執行緒模型提供了開發者很方便的併發開發,並發展到javaEE的Web,使用Jsp/Serlvet封裝多執行緒,避免一般軟體開發者涉及過於複雜的執行緒程式設計,當我們開發一個Web應用時,部署到Tomcat/Jetty/JBoss伺服器上,如果某個時刻有多個使用者同時對這個Web應用發出請求,那麼伺服器將分派多個執行緒分別接受處理這些併發請求。這實際上已經是一個多使用者併發系統,但是CPU處理併發請求任務時,由於是一個CPU,因此實際上核心是順序執行的,現在兩個CPU多核機器已經開始普遍,如何發揮多核CPU的平行計算模式呢?

這就要對以往計算模式進行顛覆性的修改,平行計算(parallel computation)這個概念的意思應該這樣定義:在單臺PC機中可以跨多核CPU執行,部署到多臺PC機中,能夠跨越多臺伺服器雲端計算。這樣的伸縮性非常類似無所不能的孫悟空了,這樣的平行計算模式才是真正可伸縮的Scalable!

而目前唯有Java最有希望做到這點,Java只要補上微結構多核並行執行這一課,而Scala Clojure 以及Erlang要補叢集 雲端計算這一課,這也是Scala非常靠近Java一個原因。

偉大平行計算專家Doug Lea的 Java fork/join framework為java這趟補課提供了及時雨,下面這段程式碼展示java平行計算方式:

import jsr166y.forkjoin.*;

class Fib extends RecursiveTask<Integer> {
         static final int threshold = 10;
         volatile int number;
         Fib(int n) { number = n; }
         public Integer compute () {
                 int n = number;
                 if (n <= threshold) 
                         return sequentialFib(n);
                 else {
                         Fib f1 = new Fib(n - 1);
                         f1.fork();
                         Fib f2 = new Fib(n - 2);
                         return f2.forkJoin() + f1.join();
                 }
         }
         public static void main(String[] args) {
                 try {
                         int groupSize = 2; // number of CPUs
                         ForkJoinPool group =
                                 new ForkJoinPool(groupSize);
                         Fib f = new Fib(40);
                         Integer result =group.invoke(f);
                         System.out.println(“Fibonacci Number: “ + result);
                 }
                 catch (Exception ex) {}
         }
         int sequentialFib(int n) {
                 if (n <= 1) return n;
                 else return sequentialFib(n-1) + sequentialFib(n-2);
         }
}
<p class="indent">

fork/join framework將被整合進入JDK 7版本。

當然,新的語言有更方便簡潔的實現,Scala 或 Clojure也許成為替代ROR/Groovy的明日之星,
或者這兩個語言有各自的細分市場。在未來某個時刻,也許應該死亡的是PHP/ROR。

多核時代開啟了軟體程式設計新時代,我們面臨更多挑戰和創新,好的工具和平臺可以幫助我們更好地進入新時代。

參考文章:
Is Scala or Clojure poised for stardom?

http://www.nofluffjuststuff.com/blog/andrew_glover/2008/10/is_scala_or_clojure_poised_for_stardom_.html

Guest View: Java + multicore = good news

http://www.sdtimes.com/link/32943

雲端計算成為現實

[該貼被banq於2008-11-13 10:08修改過]

[該貼被banq於2008-11-13 10:09修改過]

[該貼被banq於2008-11-13 10:11修改過]

相關文章