001 002 import java.util.concurrent.Executors; 003 import java.util.concurrent.ExecutorService; 004 import java.util.concurrent.Future; 005 import java.util.concurrent.ExecutionException; 006 007 008 /** 009 * Parallel Matrix Multiplication using util.concurrent. 010 * Using dim(A) number of parallel tasks but given number of threads. 011 */ 012 013 public class ConMult implements MMInf { 014 015 int anzahl = 1; 016 017 public ConMult(int threads) { 018 anzahl = threads; 019 } 020 021 022 /** 023 * Performs the multiplication of two matrices. 024 * C = A * B. 025 * @param C result matrix. 026 * @param A matrix. 027 * @param B matrix. 028 */ 029 public void multiply(double[][] C, double[][] A, double[][] B) { 030 ExecutorService pool = Executors.newFixedThreadPool(anzahl); 031 Future[] f = new Future[A.length]; 032 System.out.print("Starting " + A.length + " tasks ..."); 033 for (int i=0; i < A.length; i++) { 034 f[i] = pool.submit( new ConRowMult(C,A,B,i) ); 035 } 036 System.out.print(" started ..."); 037 for (int i=0; i < A.length; i++) { 038 try { 039 f[i].get(); 040 } catch (InterruptedException ignored) { 041 } catch (ExecutionException ignored) { 042 } 043 } 044 pool.shutdown(); 045 System.out.println(" done ConMult"); 046 } 047 048 049 public void multiplyDoesNotWork(double[][] C, double[][] A, double[][] B) { 050 ExecutorService pool = Executors.newFixedThreadPool(anzahl); 051 System.out.print("Starting " + A.length + " tasks ..."); 052 for (int i=0; i < A.length; i++) { 053 pool.submit( new ConRowMult(C,A,B,i) ); 054 } 055 System.out.print(" started ..."); 056 pool.shutdown(); 057 System.out.println(" done ConMult"); 058 } 059 060 } 061 062 063 /** 064 * This class is derived from the class Thread. 065 * It performs a row multiplication. 066 */ 067 068 class ConRowMult extends Thread { 069 070 double[][] A; 071 double[][] B; 072 double[][] C; 073 int i; 074 075 /** 076 * Constructor. 077 * @param Cp two dimensional result matrix. 078 * @param Ap two dimensional matrix. 079 * @param Bp two dimensional matrix. 080 */ 081 ConRowMult(double[][] Cp, double[][] Ap, double[][] Bp, int ip) { 082 A = Ap; B = Bp; C = Cp; i = ip; 083 } 084 085 /** 086 * Runs the multiplication. 087 */ 088 public void run() { 089 for (int j=0; j < B[0].length; j++) { 090 double c = 0.0; 091 for (int k=0; k < B.length; k++) { 092 c += A[i][k] * B[k][j]; 093 } 094 C[i][j] = c; 095 } 096 } 097 } 098