mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-25 06:18:05 +02:00
130 lines
4.2 KiB
Java
130 lines
4.2 KiB
Java
import java.io.BufferedReader;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
import java.util.ArrayList;
|
|
import java.util.concurrent.Callable;
|
|
import java.util.concurrent.ExecutionException;
|
|
import java.util.concurrent.ExecutorService;
|
|
import java.util.concurrent.Executors;
|
|
import java.util.concurrent.Future;
|
|
|
|
public class Shell {
|
|
static List<ArrayList<ArrayList<Integer>>> read(String filename) {
|
|
ArrayList<ArrayList<Integer>> A = new ArrayList<ArrayList<Integer>>();
|
|
ArrayList<ArrayList<Integer>> B = new ArrayList<ArrayList<Integer>>();
|
|
|
|
String thisLine;
|
|
|
|
try {
|
|
BufferedReader br = new BufferedReader(new FileReader(filename));
|
|
// Begin reading A
|
|
while ((thisLine = br.readLine()) != null) {
|
|
if (thisLine.trim().equals("")) {
|
|
break;
|
|
} else {
|
|
ArrayList<Integer> line = new ArrayList<Integer>();
|
|
String[] lineArray = thisLine.split("\t");
|
|
for (String number : lineArray) {
|
|
line.add(Integer.parseInt(number));
|
|
}
|
|
A.add(line);
|
|
}
|
|
}
|
|
|
|
// Begin reading B
|
|
while ((thisLine = br.readLine()) != null) {
|
|
ArrayList<Integer> line = new ArrayList<Integer>();
|
|
String[] lineArray = thisLine.split("\t");
|
|
for (String number : lineArray) {
|
|
line.add(Integer.parseInt(number));
|
|
}
|
|
B.add(line);
|
|
}
|
|
br.close();
|
|
} catch (IOException e) {
|
|
System.err.println("Error: " + e);
|
|
}
|
|
|
|
List<ArrayList<ArrayList<Integer>>> res = new LinkedList<ArrayList<ArrayList<Integer>>>();
|
|
res.add(A);
|
|
res.add(B);
|
|
return res;
|
|
}
|
|
|
|
static void printMatrix(int[][] matrix) {
|
|
for (int[] line : matrix) {
|
|
int i = 0;
|
|
StringBuilder sb = new StringBuilder(matrix.length);
|
|
for (int number : line) {
|
|
if (i != 0) {
|
|
sb.append("\t");
|
|
} else {
|
|
i++;
|
|
}
|
|
sb.append(number);
|
|
}
|
|
System.out.println(sb.toString());
|
|
}
|
|
}
|
|
|
|
public static int[][] parallelMult(ArrayList<ArrayList<Integer>> A,
|
|
ArrayList<ArrayList<Integer>> B, int threadNumber) {
|
|
int[][] C = new int[A.size()][B.get(0).size()];
|
|
ExecutorService executor = Executors.newFixedThreadPool(threadNumber);
|
|
List<Future<int[][]>> list = new ArrayList<Future<int[][]>>();
|
|
|
|
int part = A.size() / threadNumber;
|
|
if (part < 1) {
|
|
part = 1;
|
|
}
|
|
for (int i = 0; i < A.size(); i += part) {
|
|
System.err.println(i);
|
|
Callable<int[][]> worker = new LineMultiplier(A, B, i, i+part);
|
|
Future<int[][]> submit = executor.submit(worker);
|
|
list.add(submit);
|
|
}
|
|
|
|
// now retrieve the result
|
|
int start = 0;
|
|
int CF[][];
|
|
for (Future<int[][]> future : list) {
|
|
try {
|
|
CF = future.get();
|
|
for (int i=start; i < start+part; i += 1) {
|
|
C[i] = CF[i];
|
|
}
|
|
} catch (InterruptedException e) {
|
|
e.printStackTrace();
|
|
} catch (ExecutionException e) {
|
|
e.printStackTrace();
|
|
}
|
|
start+=part;
|
|
}
|
|
executor.shutdown();
|
|
|
|
return C;
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
String filename;
|
|
int cores = Runtime.getRuntime().availableProcessors();
|
|
System.err.println("Number of cores:\t" + cores);
|
|
|
|
int threads;
|
|
if (args.length < 3) {
|
|
filename = "3.in";
|
|
threads = cores;
|
|
} else {
|
|
filename = args[1];
|
|
threads = Integer.parseInt(args[2]);
|
|
}
|
|
|
|
List<ArrayList<ArrayList<Integer>>> matrices = read(filename);
|
|
ArrayList<ArrayList<Integer>> A = matrices.get(0);
|
|
ArrayList<ArrayList<Integer>> B = matrices.get(1);
|
|
int[][] C = parallelMult(A, B, threads);
|
|
printMatrix(C);
|
|
}
|
|
}
|