C=A*BのFORTRANプログラムNO.4

    2007/05/30 東京工芸大学 後 保範 ( Ushiro Yasunori )
--------------------------------------------------------------

1. 概要

 実密行列を係数とする行列乗算C=A*Bを計算する。計算機のキャッシュを有効に使用するため
ブロッキングしている。ブロックサイズは実行時に与える。NO.3のプログラムを使用している。
行列A,B,CのサイズはそれぞれNxL,LxM,NxMである。

2. プログラム

C=================================================================C
      SUBROUTINE MULT4(A,B,C,N,M,L,MB,ND)
C=================================================================C
C  Real-Dense Matrix Multiplication                               C
C   C = A*B  with Cache Blocking                                  C
C-----------------------------------------------------------------C
C    A(ND,L)   R*8, In,  First Input Matrix (A) , Size N*L        C
C    B(ND,M)   R*8, In,  Second Input Matrix (B), Size L*M        C
C    C(ND,M)   R*8, Out, Output Matrix (C)      , Size N*M        C
C    N         I*4, In,  Matrix Size of A(Column), C(Column)      C
C    M         I*4, In,  Matrix Size of B(Row), C(Row)            C
C    L         I*4, In,  Matrix Size of A(Row), B(Column)         C
C    MB        I*4, In,  Blocking Size                            C
C    ND        I*4, In,  Array Size of A,B,C                      C
C-----------------------------------------------------------------C
C    Written by Yasunori Ushiro ,  2007/05/30                     C
C        ( Tokyo Polytechnic University )                         C
C=================================================================C
      IMPLICIT REAL*8(A-H,O-Z)
      DIMENSION A(ND,L), B(ND,M), C(ND,M)
C   C=A*B with Blocking
      do j=1,M,MB
        MS = min(MB, M+1-j)
        do i=1,N,MB
          NS = min(MB, N+1-i)
          ID = 0
          do k=1,L,MB
            LS = min(MB, L+1-k)
            CALL MULT3(A(i,k),B(k,j),C(i,j),NS,MS,LS,ND,ID)
            ID = 1
          end do
        end do
      end do
C
      RETURN
      END