zoukankan      html  css  js  c++  java
  • 并行计算

    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);
    }
    }


    fork/join framework将被整合进入JDK 7版本。

    当然,新的语言有更方便简洁的实现,Scala 或 Clojure也许成为替代ROR/Groovy的明日之星,
    或者这两个语言有各自的细分市场。在未来某个时刻,也许应该死亡的是PHP/ROR。

    多核时代开启了软件编程新时代,我们面临更多挑战和创新,好的工具和平台可以帮助我们更好地进入新时代。

  • 相关阅读:
    CodeForces 219D Choosing Capital for Treeland (树形DP)
    POJ 3162 Walking Race (树的直径,单调队列)
    POJ 2152 Fire (树形DP,经典)
    POJ 1741 Tree (树的分治,树的重心)
    POJ 1655 Balancing Act (树的重心,常规)
    HDU 2196 Computer (树形DP)
    HDU 1520 Anniversary party (树形DP,入门)
    寒门子弟
    JQuery选择器(转)
    (四)Web应用开发---系统架构图
  • 原文地址:https://www.cnblogs.com/jamesldj/p/3369510.html
Copyright © 2011-2022 走看看