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