Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich möchte das Programm nicht selbst n*Mal mit unterschiedlich großen Matrizen starten und dann die Laufzeit aufschreiben. Daher dachte ich, es wäre sinnvoll ein batch-file zu schreiben, dass diese arbeit für mich übernimmt und die Laufzeit für die jeweilige Matrixgröße in eine *.txt Datei schreibt.
Java:
public class ParaMulti {
static boolean debug = false;
static int LEN = 100;
static int THREADS = 5;
static double[][] matrixA;
static double[][] matrixB;
static double[][] matrixC = new double[LEN][LEN];
static double[][] matrixErg = new double[LEN][LEN];
public static void main(String[] args) {
if (args.length >= 1) {
THREADS = Integer.valueOf(args[0]);
LEN = Integer.valueOf(args[1]);
}
matrixA = createMatrix(LEN);
matrixB = createMatrix(LEN);
paraMultiplyMatrix thread[] = new paraMultiplyMatrix[THREADS];
for (int i = 0; i < THREADS; i++) {
thread[i] = new paraMultiplyMatrix();
thread[i].ID = i;
thread[i].matrixA = matrixA;
thread[i].matrixB = partitionMatrix(matrixB, i);
thread[i].run();
System.out.print(thread[i].Time + ";");
matrixC = addMatrix(thread[i].matrixErg, i);
}
if (debug) {
print2dMatrix(matrixA);
print2dMatrix(matrixB);
print2dMatrix(matrixC);
}
}
static double[][] addMatrix(double[][] matrixErg, int i) {
int numberOfColumns = matrixErg.length / THREADS;
for (int j = 0; j < LEN; j++) {
for (int k = 0; k < numberOfColumns; k++) {
matrixC[j][k + (i * numberOfColumns)] = matrixErg[j][k];
}
}
return matrixC;
}
static double[][] partitionMatrix(double[][] matrixB, int i) {
int numberOfColumns = matrixB.length / THREADS;
// System.out.println("numberOfColumns=" + numberOfColumns);
int residual = matrixB.length % THREADS;
// System.out.println("residual=" + residual);
double[][] splitMatrix = new double[matrixB.length][numberOfColumns];
if (residual == 0) {
for (int j = 0; j < matrixB.length; j++) {
for (int k = 0; k < numberOfColumns; k++) {
splitMatrix[j][k] = matrixB[j][k + (i * numberOfColumns)];
}
}
} else {
if (i < residual) {
for (int j = 0; j < matrixB.length; j++) {
for (int k = 0; k < i * (numberOfColumns) + 1; k++) {
splitMatrix[j][k + (i * (numberOfColumns + 1))] = matrixB[j][k
+ (i * (numberOfColumns + 1))];
}
}
}
else {
for (int j = 0; j < matrixB.length; j++) {
for (int k = (i * (numberOfColumns + 1)); k < (i * numberOfColumns)
+ numberOfColumns; k++) {
splitMatrix[j][k + (i * numberOfColumns)] = matrixB[j][k
+ (i * numberOfColumns)];
}
}
}
}
return splitMatrix;
}
static void print2dMatrix(double[][] matrix) {
System.out.println();
for (int i = 0; i < matrix.length; i++) {
for (int k = 0; k < matrix[i].length; k++) {
System.out.print("\t[" + matrix[i][k] + "]");
}
System.out.println();
}
}
static double[][] createMatrix(int matrixSize) {
double[][] matrix = new double[matrixSize][matrixSize];
int z = 0;
for (int i = 0; i < matrixSize; i++) {
for (int k = 0; k < matrixSize; k++) {
matrix[i][k] = z++;
}
}
return matrix;
}
}
class paraMultiplyMatrix extends Thread {
int ID = -1;
double[][] matrixA;
double[][] matrixB;
double[][] matrixErg;
boolean debug = false;
long Time = 0;
@Override
public void run() {
long Time_Start = System.currentTimeMillis();
// System.out.println("ID=" + ID);
// Multiply
matrixErg = new double[matrixA.length][matrixB[0].length];
int result = 0;
for (int i = 0; i < matrixA.length; i++) {
for (int j = 0; j < matrixB[0].length; j++) {
result = 0;
for (int k = 0; k < matrixA.length; k++)
result += matrixA[i][k] * matrixB[k][j];
matrixErg[i][j] = result;
}
}
// print block b
if (debug) {
System.out.println("MatrixB:");
for (int i = 0; i < matrixB.length; i++) {
for (int k = 0; k < matrixB[i].length; k++) {
System.out.print("\t[" + matrixB[i][k] + "]");
}
System.out.println();
}
}
// print block c
if (debug) {
System.out.println("MatrixErg:");
for (int i = 0; i < matrixErg.length; i++) {
for (int k = 0; k < matrixErg[i].length; k++) {
System.out.print("\t[" + matrixErg[i][k] + "]");
}
System.out.println();
}
}
Time = System.currentTimeMillis() - Time_Start;
}
}