FORTRANのC=A*Bテストプログラム
2007/05/30 東京工芸大学 後 保範 ( Ushiro Yasunori )
--------------------------------------------------------------
1. 概要
行列乗算C=A*Bのテストプログラム。1000次元までの行列で、計算時間及びMFLOPSを各乗算
ルーチンごとに出力する。計算する次元数(N)とブロックサイズを(MB)画面より与える。
2. プログラム
C=================================================================C
C Test Program of C=A*B for 4-Case C
C-----------------------------------------------------------------C
C Written by Yasunori Ushiro , 2007/05/30 C
C ( Tokyo Polytechnic University ) C
C=================================================================C
PARAMETER(ND=1000, NO=4)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION A(ND,ND), B(ND,ND), C(ND,ND)
C Open File
OPEN(unit=1,FILE='F-MULT.txt')
CALL XCLOCK(T1,3)
C Size Input
WRITE(6,*) 'Type In N(Matrix Size) and MB(Block Size)'
READ(5,*) N,MB
if(N.gt.ND) N=ND
if(MB.gt.N) MB=N
WRITE(1,200) N,MB
WRITE(6,200) N,MB
M = N
L = N
C Loop for All Type of C=A*B
do k=1,NO
C Set A,B
CALL SETAB(A,B,N,ND)
CALL XCLOCK(T1,5)
if(k.le.2) then
if(k.le.1) then
C IKJ-Type Multiplication
CALL MULT1(A,B,C,N,M,L,ND)
else
C JKI-Type Multiplication
CALL MULT2(A,B,C,N,M,L,ND)
end if
else if(k.le.3) then
C Unrolling-Type Multiplication
CALL MULT3(A,B,C,N,M,L,ND,0)
else
C Cache Blocking=type Multiplication
CALL MULT4(A,B,C,N,M,L,MB,ND)
end if
CALL XCLOCK(T2,5)
C Output
CPU = T2 - T1
FLOP = 0.0
IF(CPU.gt.0.0) FLOP = 2.0*N*N*N*1.0D-6/CPU
PRC = 0.0
SUM = 0.0
do j=1,N
do i=1,N
SUM = SUM + C(i,j)
end do
end do
if(k.eq.1) then
SUM1 = SUM
IER = 0
else
IER = 1
if(SUM.eq.SUM1) IER = 0
end if
WRITE(1,300) k,IER,CPU,FLOP
WRITE(6,300) k,IER,CPU,FLOP
end do
C
stop
200 FORMAT('Matrix Multiplication(C=A*B) Test N,MB=',I5,I4/
1 ,'Type. IER Time(s) MFLOPS')
300 FORMAT(1H ,2I4,1X,F9.2,F9.1)
end
C=================================================================C
SUBROUTINE SETAB(A,B,N,ND)
C-----------------------------------------------------------------C
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION A(ND,ND), B(ND,ND)
C Set A,B
do j=1,N
do i=1,N
A(i,j) = i + j
B(i,j) = 2*i - j
end do
end do
C
RETURN
END
C=================================================================C
SUBROUTINE XCLOCK(CPU,ID)
C=================================================================C
C CPU time Subroutine C
C CPU R*8 Out, CPU Time C
C ID I*4 In, Dummy ( Same Hitachi FORTRAN XCLOCK ) C
C-----------------------------------------------------------------C
C Written by Y. Ushiro ( Waseda and Hitachi ) 2002.10.29 C
C=================================================================C
REAL*8 CPU
INTEGER*2 I1, I2, I3, I4
C
IF(ID.GE.1) THEN
CALL GETTIM(I1,I2,I3,I4)
CPU = ( I1*60.0 + I2 )*60.0 + I3 + I4*0.01
END IF
C
RETURN
END