001 002 /** 003 * Parallel Matrix Multiplication. 004 * Using dim(A) number of threads. 005 * @author Heinz Kredel. 006 */ 007 008 public class ParMult implements MMInf { 009 010 /** 011 * Performs the multiplication of two matrices. 012 * C = A * B. 013 * @param C result matrix. 014 * @param A matrix. 015 * @param B matrix. 016 */ 017 public void multiply(double[][] C, double[][] A, double[][] B) { 018 Thread[] t = new Thread[A.length]; 019 System.out.print("Starting " + A.length + " threads ..."); 020 for (int i=0; i < A.length; i++) { 021 t[i] = new RowMult(C,A,B,i); 022 t[i].start(); 023 } 024 System.out.print(" started ..."); 025 for (int i=0; i < A.length; i++) { 026 try { t[i].join(); } 027 catch (InterruptedException e) { } 028 } 029 System.out.println(" done ParMult"); 030 } 031 032 } 033 034 035 /** 036 * This class is derived from the class Thread. 037 * It performs a row multiplication. 038 */ 039 class RowMult extends Thread { 040 041 double[][] A; 042 double[][] B; 043 double[][] C; 044 int i; 045 046 /** 047 * Constructor. 048 * @param Cp Two dimensional Matrices. 049 * @param Ap Two dimensional Matrices. 050 * @param Bp Two dimensional Matrices. 051 */ 052 RowMult(double[][] Cp, double[][] Ap, double[][] Bp, int ip) { 053 A = Ap; B = Bp; C = Cp; i = ip; 054 } 055 056 /** 057 * Runs the multiplication. 058 */ 059 public void run() { 060 for (int j=0; j < B[0].length; j++) { 061 double c = 0.0; 062 for (int k=0; k < B.length; k++) { 063 c += A[i][k] * B[k][j]; 064 } 065 C[i][j] = c; 066 } 067 } 068 } 069