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.