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