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