`
gordonAtJava
  • 浏览: 7998 次
文章分类
社区版块
存档分类
最新评论

java中的自动并行运算小试

阅读更多
前天看了 T1 大大的“关于两个世界体系的对话”http://www.iteye.com/topic/231515,获益良多,随笔写下2个类把文章中的 (1+2)*(3+4) 并行问题用java解决掉。
基于这个解决方案的java代码是可以(理论上)自动被并行运算的(在方法调用这个层面上),并行部分就是对所有无相关参数并行计算

闲话少说,上代码

客户端
为了让效果明显,加法和乘法里面都sleep了1000ms
Test类有3个method, add(a,b) , mul(a,b,c), trace(starttime,result),在传统的顺序执行中是这样调用的
Test t=new Test();
int a=t.add(1,2);
int b=t.add(3,4);
int c=t.add(2,5);
int result=t.mul(a,b,c);
运行结果
main: + 1 2 => 3
main: + 3 4 => 7
main: + 2 5 => 7
main: * 3 7 7 => 147
147 | time cost : 4003 | freeM/totalM : 1816576/2031616

用了并行运算就要这样调用
Test t=new Test();
Func add=Func.define(t,"add");
Func mul=Func.define(t,"mul");
Var a=add.c(1,2);
Var b=add.c(3,4);
Var c=add.c(2,5);
Var result=mul.c(a,b,c);
result.run();

运行结果
Thread-1: + 1 2 => 3
Thread-2: + 3 4 => 7
Thread-3: + 2 5 => 7
Thread-6: * 3 7 7 => 147
147 | time cost : 2010 | freeM/totalM : 1716992/2031616


用了并发的写法以后,3个加法是同时由3个不同线程执行的,直到3个加法都执行完毕,乘法才被调用。在一个完全按照sequence方式写的并行程序的运行时间大大的减少了,4003ms => 2010ms

Test.java
/*
 * Created on 2008-9-9
 * Title:
 * Description: 
 * @author Gordon Hu
 * @version 1.0
 */
package gordon.concurrence;

public class Test {
    
    public static void main(String[] args) throws Exception {
        Test t=new Test();
        boolean parallel=true;
        if(parallel){
            Func add=Func.define(t,"add");
            Func mul=Func.define(t,"mul");
            Func println=Func.define(t,"trace");
            Var a=add.c(1,2);
            Var b=add.c(3,4);
            Var c=add.c(2,5);
            Var i3=mul.c(a,b,c);
            long start=System.currentTimeMillis();
            Var timeMe=println.c(start,i3);
            timeMe.run();
        }else{
            long START=System.currentTimeMillis();
            int A=t.add(1,2);
            int B=t.add(3,4);
            int C=t.add(2,5);
            int I3=t.mul(A,B,C);
            t.trace(START,I3);
        }
    }
    
    public int add(Integer a,Integer b){
    	int rst=a+b;
    	try {
            Thread.currentThread().sleep(1000);
        } catch (InterruptedException e) {
            // TODO
        }
        System.out.println(Thread.currentThread().getName()+ ": + "+a+" "+b+" => "+rst);
        return rst;
    }

    public int mul(Integer a,Integer b,Integer c){
        int rst=a*b*c;
        try {
            Thread.currentThread().sleep(1000);
        } catch (InterruptedException e) {
            // TODO
        }
        System.out.println(Thread.currentThread().getName()+ ": * "+a+" "+b+" "+c+" => "+rst);
        return rst;
    }

    public void trace(Long start,Object o){
        System.out.println(o+" | time cost : "+(System.currentTimeMillis()-start)+" | freeM/totalM : "+Runtime.getRuntime().freeMemory()+"/"+Runtime.getRuntime().totalMemory());
    }
}



帮助类
Var.java
/*
 * Created on 2008-9-9
 * Title:
 * Description: 
 * @author Gordon Hu
 * @version 1.0
 */
package gordon.concurrence;

import java.util.HashSet;
import java.util.Set;

public abstract class Var implements Runnable {
    public abstract Func getFunc();
    public abstract void run();
    public abstract void update(Var n,Object rst);
    private Set<Var> updater=new HashSet<Var>();

    public void setUpdater(Set<Var> updater) {
        this.updater.addAll(updater);
    }
    
    public void addUpdater(Var updater){
        this.updater.add(updater);
    }

    public Set<Var> getUpdater() {
        return updater;
    }
}

每个Var其实就是一个方法运行时候所需要的context,包括input parameters和return结果要调用的callback

Threading.java
/*
 * Created on 2008-9-9
 * Title:
 * Description: 
 * @author Gordon Hu
 * @version 1.0
 */
package gordon.concurrence;

public class Threading {
    public static void runThread(Runnable r){
        new Thread(r).start();
    }
}

这个类就是所有异步调用的底层设施了,我这里就直接new thread了,可以用threadpool之类的,也可以用grid computation,比如coherence之类的


接下来这个Func其实就是些反射动态调用并且暴露一个统一的类似function的接口。
动态调用里面我用了方法名字匹配(不包括参数类型,只要名字符合的第一个方法就被调用,这样主要是因为本人倾向可变长参数,不喜欢overloading,所以像System.out对象里面的println方法就不能直接用)。另外还负责了生成一个Var。
Func.java
/*
 * Created on 2008-9-9
 * Title:
 * Description: 
 * @author Gordon Hu
 * @version 1.0
 */
package gordon.concurrence;

import java.util.ArrayList;
import java.util.List;

public abstract class Func {
    public abstract Object apply(Object... args);
    public Var c(final Object... args){
        final Func self=this;
        Var n=new Var(){
                //....create a Var and bind args to it
                //....具体实现省略,详情看附件中的src
            };
        //set callbacks
        for(Object o:args){
            if(o instanceof Var)((Var)o).addUpdater(n);
        }
        return n;
    }
    
    
    public static Func define(final Object worker,final String method){
        //define a Func from a given object and its method name
        return new Func(){
                public Object apply(Object... args) {
                    return run(worker,method,args);
                }
            };
    }
    
    public static Runnable getUpdateThread(final Var updater,final Var node,final Object rst){
        return new Runnable(){
            public void run(){
                updater.update(node,rst);
            }
        };
    }
    public static Object run(Object worker, String action, 
                                Object... arguments) {
        //dynamically call run a method
        //execute worker.action(arguments) and return result
        //....具体实现省略,详情看附件中的src
    }
}
分享到:
评论

相关推荐

    13.MATLAB神经网络43个案例分析 并行运算与神经网络-基于CPUGPU的并行神经网络运算.rar

    MATLAB神经网络43个案例分析 并行运算与神经网络——基于CPUGPU的并行神经网络运算MATLAB神经网络43个案例分析 并行运算与神经网络——基于CPUGPU的并行神经网络运算MATLAB神经网络43个案例分析 并行运算与神经网络...

    矩阵乘法mpi实现 并行运算

    矩阵乘法mpi实现 并行运算 在linux下成功运行 使用mpicc -o 编译 使用mpirun命令运行

    LabVIEW 2009 多核并行运算新技术.zip

    3. **并行FOR循环**:并行FOR循环(Parallel FOR Loop)是LabVIEW中的一个特殊结构,它能够自动将循环迭代分配给可用的核心。这种结构使得原本顺序执行的循环任务能够在多个核心上并行执行,显著提高了运行速度。 4...

    并行运算与神经网络-基于CPU/GPU的并行神经网络运算

    并行运算与神经网络是现代计算领域中的重要概念,尤其在大数据处理和人工智能技术中扮演着核心角色。基于CPU和GPU的并行神经网络运算,是实现高效、快速计算的关键技术,它们极大地提升了模型训练的速度,降低了计算...

    并行运算支持库

    并行运算支持库是计算机科学领域中的一个重要组成部分,它允许开发者在多核处理器或分布式计算环境中执行任务,以提升计算效率。在这个特定的案例中,我们关注的是一个名为"并行运算支持库"的资源,它声称支持所有...

    JAVA并行计算的一些资料 论文

    并行计算是现代计算机科学中的一个重要领域,尤其是在大数据处理和高性能计算中不可或缺。Java作为一种广泛使用的编程语言,具有跨平台的特性,使得它在并行计算领域也占据了一席之地。下面将详细介绍Java并行计算的...

    在.net4.0中使用Parallel并行运算的示例

    并行运算在现代计算机科学中扮演着至关重要的角色,尤其是在处理大数据量和计算密集型任务时。在.NET Framework 4.0中,微软引入了`System.Threading.Tasks.Parallel`类,使得开发人员能够更容易地利用多核处理器的...

    Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...

    Java串行程序并行化执行

    在博客“Java串行程序并行化执行”中,作者yangzl2008详细介绍了如何利用CGLIB实现这一过程。首先,我们需要引入CGLIB的依赖,通常是在Maven或Gradle构建文件中添加对应的依赖项。接着,我们可以创建一个代理工厂,...

    并行计算框架的Java实现--系列二

    通过阅读和分析这些代码,你可以深入了解如何在Java中实现线程池、任务调度以及并行数据处理。同时,这也将是你掌握并行计算框架设计思想和实践技巧的一个宝贵资源。 总之,Java实现的并行计算框架借助于多线程、...

    java8并行计算示例

    在Java 8中,`Stream` API 的并行化处理是通过`parallel()`方法实现的,它能够将一个流转换为并行流,从而使得流中的操作可以并行执行。在数列求和问题中,我们可以通过`IntStream.rangeClosed(1, 40000000000L)`...

    矩阵的并行运算

    在矩阵运算中,可以采用数据并行、任务并行或混合并行的方式进行优化。 1. 数据并行:这种方法通常用于矩阵加法和乘法。例如,在矩阵乘法A * B中,可将A和B分解为较小的子矩阵,每个处理器或核心计算一部分子矩阵的...

    Java 串行、并行算法 矩阵乘法

    分别使用串行、并行方法计算矩阵乘法,对比两者的执行时间

    基于Android平台并行运算机制的密码运算加速方案.pdf

    综上所述,文档中所述的并行运算加速方案,不仅为Android平台上的密码运算提供了新的思路和方法,而且对于移动安全领域,特别是面向大量用户的安全应用开发者来说,具有重要的参考价值和实用意义。通过利用Android...

    并行运算与神经网络_基于CPU_GPU的并行神经网络运算_matlab

    资源名:并行运算与神经网络_基于CPU_GPU的并行神经网络运算_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 ...

    并行运算进入Tilera时代.pdf

    这款CPU专为高性能并行运算设计,采用了先进的二维iMesh架构,彻底摒弃了传统多核CPU的总线互联结构,解决了并行运算中常见的效率瓶颈问题,为集成更多物理内核奠定了坚实的基础。 Tilera Pro64 CPU的创新之处在于...

    java8并行计算示例--可动态配置

    在这个示例中,我们关注的是如何使用 Java 8 的并行流(Parallel Stream)来实现大规模数据的快速求和。 并行计算是一种编程范式,它将大型任务分解为多个小任务,这些小任务可以在不同的处理器核心上同时运行,以...

    并行运算与神经网络-基于CPUGPU的并行神经网络运算.zip

    并行运算与神经网络是现代计算领域中的重要概念,特别是在深度学习和大数据处理中占据了核心地位。本资料包“并行运算与神经网络-基于CPUGPU的并行神经网络运算.zip”着重探讨了如何利用CPU和GPU进行并行化的神经...

    MATLAB并行运算和分布式运算的基本操作-解MATLAB并行运算和分布式运算的基本操作.pdf

    MATLAB并行运算和分布式运算的基本操作-解MATLAB并行运算和分布式运算的基本操作.pdf 这个文档给大家介绍如何在实验室搭建分布式运算平台,及其配置。第一次给大家分享资源,但还不太熟悉怎么操作,大家见谅。

    多线程并行运算

    在计算机科学领域,多线程并行运算是一种高效利用处理器资源的技术,特别是在现代多核处理器中,它能显著提升程序的执行效率。本篇将深入探讨多线程的概念、优势、实现方式以及如何应用于查找运算。 一、多线程概念...

Global site tag (gtag.js) - Google Analytics