Die Methode seqmult implementiert zum Vergleich eine sequenzielle Version des Programms. Die Matrizen C, A, und B werden durch double[][] Felder implementiert. A und B werden multipliziert und das Ergebnis wird in C abgelegt.
public void seqmult(double[][] C, double[][] A, double[][] B) { for (int i=0; i < A.length; i++) { for (int j=0; j < B[0].length; j++) { double c = 0.0; for (int k=0; k < B.length; k++) { c += A[i][k] * B[k][j]; } C[i][j] = c; } } }
Die Methode parmult implementiert die parallele Version des Programms.
public void parmult(double[][] C, double[][] A, double[][] B) { Thread[] t = new Thread[A.length]; for (int i=0; i < A.length; i++) { t[i] = new RowMult(C,A,B,i); t[i].start(); }
for (int i=0; i < A.length; i++) { try { t[i].join(); } catch (InterruptedException e) { } } }
Die äußere for-Schleife wird hierbei durch zwei Schleifen ersetzt, von der die erste die entsprechenden Threads startet und die zweite Schleife auf deren Beendigung wartet. In den Threads wird die run-Methode der Klasse RowMult ausgeführt, die für jeden Wert von i die inneren Schleifen abarbeitet. Der Konstruktor übernimmt die Matrizen und den Indexwert i. RowMult erweitert die Klasse Thread, dadurch genügt oben ein new RowMult(.), um den Thread zu erzeugen. start() und join() werden dann von Thread bereitgestellt.
class RowMult extends Thread { double[][] A; double[][] B; double[][] C; int i; RowMult(double[][] Cp, double[][] Ap, double[][] Bp, int ip) { A = Ap; B = Bp; C = Cp; i = ip; }
public void run() { for (int j=0; j < B[0].length; j++) { double c = 0.0; for (int k=0; k < B.length; k++) { c += A[i][k] * B[k][j]; } C[i][j] = c; } } }
© Universität Mannheim, Rechenzentrum, 2004-2010.
Heinz KredelLast modified: Wed Sep 12 21:29:14 CEST 2009