PROGRAM MATRIX_MULTIPLICATION
	
	REAL A,B,C
	DIMENSION A(1000,1000), B(1000,1000), C(1000,1000)
	
	CALL INIT(A)
	CALL INIT(B)
	
	CALL MUL_DEF(A,B,C)	
	CALL MUL(A,B,C)	
	END
	
	SUBROUTINE MUL(A,B,C)
	REAL A,B,C
	DIMENSION A(1000,*), B(1000,*), C(1000,*)
	N=1000
	N2=500
	
	DO J=1, N	
	DO K=1, N
	R=B(K,J)
	DO I=1, N2
	II=2*I-1
	C(II,J)=C(II,J)+A(II,K)*R	
	II=II+1
	C(II,J)=C(II,J)+A(II,K)*R	
	ENDDO
	ENDDO
	ENDDO
	END
	
		
	
	SUBROUTINE MUL_DEF(A,B,C)
	REAL A,B,C
	DIMENSION A(1000,*), B(1000,*), C(1000,*)
	N=1000
	
	DO I=1, N
	DO J=1, N
	DO K=1, N
	
	C(I,J)=C(I,J)+A(I,K)*B(K,J)
	
	ENDDO
	ENDDO
	ENDDO
	END
	
	SUBROUTINE INIT(M)
	REAL M
	DIMENSION M(1000,*)
	N=1000
	
	DO J=1, N
	DO I=1, N
	
	M(I,J)=RAND()
	
	ENDDO
	ENDDO
	END

c	AMD K6-2 300 MHz 64 Mb RAM Linux g77 -- egcs 2.91.66
c	czas w sekundach mierzony przy pomocy gprof

c	200x200	
c	                  | MUL_DEF |   MUL  
c	surowa kompilacja |   2.53  | **1.97 
c	optymalizowana O1 |   0.79  |   0.66
c	optymalizowana O2 |  *0.52  |   0.44
c	 **/* = 3.8

c	400x400
c	                  | MUL_DEF |    MUL  
c	surowa kompilacja |  21.67  | **15.89  
c	optymalizowana O1 |   7.60  |    5.50
c	optymalizowana O2 |   5.61  |    3.72
c	**/* = 2.8

c	1000x1000
c	                  | MUL_DEF |   MUL  
c	surowa kompilacja | 434.77  |**252.04  
c	optymalizowana O1 | 199.10  |   78.69
c	optymalizowana O2 |*191.80  |   62.21
c	**/* = 1.3

c	Wniosek: staranniej napisany kod jest lepiej optymalizowany.