使矩阵乘法在并行java中工作

时间:2015-03-23 17:12:57

标签: java multithreading parallel-processing matrix-multiplication

我已经从我所教授的创建矩阵乘法的代码中创建了这段代码。

但我希望将此代码并行化,以便它可以在多个线程上运行。

有人可以为我帮忙吗?我很不确定该怎么做!

更新:

   public class ParallelMatrix {

   public final static int N = 1000; //Random size of matrix

    public static void main(String[] args) throws InterruptedException {

    long startTime = System.currentTimeMillis();


        //Create and multiply matrix of random size N.   
        double [][] a = new double [N][N];
        double [][] b = new double [N][N];
        double [][] c = new double [N][N];

        int i,j,k;


        for(i = 0; i < N ; i++)
            for(j = 0; j < N ; j++){
                a[i][j] = i + j;
                b[i][j] = i * j;
            }

        ExecutorService pool = Executors.newFixedThreadPool(10);
                for(i = 0; i < N; i++) {
                    for(j = 0; j < N; j++) {  
                        pool.submit(new Multi(N,i,j,a,b,c));


    }
}
                       pool.shutdown();
                       pool.awaitTermination(1, TimeUnit.DAYS);
                 long endTime = System.currentTimeMillis();
                  System.out.println("Calculation completed in " +
                             (endTime - startTime) + " milliseconds");

    }
static class Multi implements Runnable {
    final int N;
    final double [][] a;
    final double [][] b;
    final double [][] c;
    final int i;
    final int j;

        public Multi(int N, int i, int j, double[][] a, double[][] b, double[][] c){
        this.N=N;
        this.i=i;
        this.j=j;
        this.a=a;
        this.b=b;
        this.c=c;
        }


    @Override
    public void run() {
        for(int k = 0; k < N; k++) c[i][j] += a[i][k] * b[k][j];
    }

}

}

1 个答案:

答案 0 :(得分:0)

您可以在单独的线程中计算Matrix C的每个单元格,例如:

class Multi implements Runnable {
    final int N;
    final double [][] a;
    final double [][] b;
    final double [][] c;
    final int i;
    final int j;
    ...
    @Override
    public void run() {
        for(int k = 0; k < N; k++) c[i][j] += a[i][k] * b[k][j];
    }

}

ExecutorService pool = ...;
for (int i = 0;...)
    for (int j = 0;...)
     pool.submit(new Multi(N,i,j,a,b,c));

pool.shutdown();
pool.awaitTermination(1, TimeUnit.DAYS);

虽然对整列或整行都有意义。