001    
002    /**
003     * Sequential Matrix Multiplication.
004     * Sequential algorithm, generating product matrix in blocks
005     * also blocking A and B.
006     * @author Heinz Kredel.
007     */
008    
009    public class SeqMult4 implements MMInf {
010    
011        int blocksize = 1;
012    
013        public SeqMult4(int size) {
014             this.blocksize = size; 
015        }
016    
017    
018    /**
019     * Performs the multiplication of two matrices.
020     * C = A * B.
021     * @param C result matrix.
022     * @param A matrix.
023     * @param B matrix.
024     */
025        public void multiply(double[][] C, double[][] A, double[][] B) {
026    
027          int na = blocksize;
028          int nb = blocksize;
029          int nc = blocksize;
030          System.out.println("#blocks = " + (A.length/na) + ", na = " + na 
031              + " SeqMultBlock4");
032    
033          for (int ii=0; ii < A.length; ii+=na) {
034              for (int jj=0; jj < B[0].length; jj+=nb) {
035                  for (int kk=0; kk < B.length; kk+=nc) {
036    
037                  for (int i=ii; i < Math.min((ii+na),A.length); i++) {
038                      for (int j=jj; j < Math.min((jj+nb),B[0].length); j++) {
039                          double c = C[i][j];
040                          for (int k=kk; k < Math.min((kk+nc),B.length); k++) {
041                              c += A[i][k] * B[k][j];
042                          }
043                          C[i][j] = c;
044                      }
045                  }
046    
047                  }
048              }
049          }
050    
051        }
052    
053    }