Search code examples
javamultithreadingparallel-processingmatrix-multiplication

Making a matrix multiplication work in parallel java


Ive created this code from what i have been taught to create a matrix multiplication.

But i want to parallise this code so it works on multiple threads.

Could someone help/do this for me please? Im quite unsure how to do it!

Updated:

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

Solution

  • You could calculate each cell of Matrix C in a separate thread, for example:

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

    Makes more sense to do it for whole columns or rows though.