The following example demonstrates inlining both with
/inline=setup
, meaning only the subroutine setup will be
inlined, and with /inline
, meaning both subroutines
are inlined. The KAP output includes optimized versions of both
routines, in addition to the expanded main program. Setting
/inline_looplevel>2
is required, since one CALL is
in a loop and one is not.
Source file: PROGRAM TSTEXP REAL A(200,200),B(200,200),C(200,200) CALL SETUP(B,200) CALL SETUP(C,200) DO 100 N = 25,200,25 CALL MXMR(N,A,B,C) WRITE(*,900) N,A(7,13) 100 CONTINUE 900 FORMAT(1X,'For N=',I5,', A(7,13):',F12.4) END SUBROUTINE SETUP(E,N) REAL E(N,N) DO 10 I=1,N DO 10 J=1,N E(I,J) = MOD( I + 7*J, 10) /10.0 10 CONTINUE RETURN END SUBROUTINE MXMR(N,A,B,C) REAL A(200,200),B(200,200),C(200,200) DO 1000 I=1,N DO 1000 J=1,N A(I,J) = 0.0 DO 1000 K=1,N A(I,J)=A(I,J)+B(I,K)*C(K,J) 1000 CONTINUE RETURN END
The /inline=setup
qualifier generates the following
main program:
PROGRAM TSTEXP REAL A(200,200),B(200,200),C(200,200) INTEGER II1, II2, II3, II4 DO 2 II1=1,200 DO 2 II2=1,200 B(II1,II2) = MOD (II1 + 7 * II2, 10) / 10.0 2 CONTINUE DO 3 II3=1,200 DO 3 II4=1,200 C(II3,II4) = MOD (II3 + 7 * II4, 10) / 10.0 3 CONTINUE DO 100 N=25,200,25 CALL MXMR(N,A,B,C) WRITE(*,900) N,A(7,13) 100 CONTINUE 900 FORMAT(1X,'For N=',I5,', A(7,13):',F12.4) END
The /inline
qualifier generates the following output:
PROGRAM TSTEXP REAL A(200,200),B(200,200),C(200,200) INTEGER II1, II2, II3, II4, II5, II6, II7 DO 3 II4=1,200 DO 3 II5=1,200 B(II4,II5) = MOD (II4 + 7 * II5, 10) / 10.0 3 CONTINUE DO 4 II6=1,200 DO 4 II7=1,200 C(II6,II7) = MOD (II6 + 7 * II7, 10) / 10.0 4 CONTINUE DO 100 N=25,200,25 DO 2 II1=1,N DO 2 II2=1,N A(II1,II2) = 0.0 DO 2 II3=1,N A(II1,II2) = A(II1,II2) + B(II1,II3) * C(II3,II2) 2 CONTINUE WRITE (*, 900) N, A(7,13) 100 CONTINUE 900 FORMAT(1X,'For N=',I5,', A(7,13):',F12.4) END