[comp.lang.fortran] Fortran optimization

fsjohnv@alliant1.lerc.nasa.gov (Richard Mulac) (04/03/91)

   While optimizing a code last year I ran across a situation which on the
surface appears to contradict some of the basic rules one abides by when
trying to write efficient Fortran code.  I was trying to merge several DO
loop blocks to eliminate the overhead associated with redundant index
calculations and also to reduce memory access.  The code was written to
be run on a CRAY Y-MP, compiling with cft77 4.0.1.6.  What I found can
be described using the following program TEST, which calls subroutines
JOINED and SPLIT (It's a few hundred lines long, but the majority of the
code is redundant).

      PROGRAM TEST
      PARAMETER (IX=10000,JX=100,NX=100)
      COMMON /GLOBAL/
     .  A(IX,JX),B(IX,JX),C(IX,JX)
      CALL JOINED
      CALL SPLIT
      STOP
      END
      SUBROUTINE JOINED
      PARAMETER (IX=10000,JX=100,NX=100)
      COMMON /GLOBAL/
     .  A(IX,JX),B(IX,JX),C(IX,JX)
C
      DO N=1,NX
      DO I=1,IX
      A(I,  1) = A(I,  1) * B(I,  1) + C(I,  1)
      A(I,  2) = A(I,  2) * B(I,  2) + C(I,  2)
      A(I,  3) = A(I,  3) * B(I,  3) + C(I,  3)
      A(I,  4) = A(I,  4) * B(I,  4) + C(I,  4)
      A(I,  5) = A(I,  5) * B(I,  5) + C(I,  5)
      A(I,  6) = A(I,  6) * B(I,  6) + C(I,  6)
      A(I,  7) = A(I,  7) * B(I,  7) + C(I,  7)
      A(I,  8) = A(I,  8) * B(I,  8) + C(I,  8)
      A(I,  9) = A(I,  9) * B(I,  9) + C(I,  9)
      A(I, 10) = A(I, 10) * B(I, 10) + C(I, 10)
      A(I, 11) = A(I, 11) * B(I, 11) + C(I, 11)
      A(I, 12) = A(I, 12) * B(I, 12) + C(I, 12)
      A(I, 13) = A(I, 13) * B(I, 13) + C(I, 13)
      A(I, 14) = A(I, 14) * B(I, 14) + C(I, 14)
      A(I, 15) = A(I, 15) * B(I, 15) + C(I, 15)
      A(I, 16) = A(I, 16) * B(I, 16) + C(I, 16)
      A(I, 17) = A(I, 17) * B(I, 17) + C(I, 17)
      A(I, 18) = A(I, 18) * B(I, 18) + C(I, 18)
      A(I, 19) = A(I, 19) * B(I, 19) + C(I, 19)
      A(I, 20) = A(I, 20) * B(I, 20) + C(I, 20)
      A(I, 21) = A(I, 21) * B(I, 21) + C(I, 21)
      A(I, 22) = A(I, 22) * B(I, 22) + C(I, 22)
      A(I, 23) = A(I, 23) * B(I, 23) + C(I, 23)
      A(I, 24) = A(I, 24) * B(I, 24) + C(I, 24)
      A(I, 25) = A(I, 25) * B(I, 25) + C(I, 25)
      A(I, 26) = A(I, 26) * B(I, 26) + C(I, 26)
      A(I, 27) = A(I, 27) * B(I, 27) + C(I, 27)
      A(I, 28) = A(I, 28) * B(I, 28) + C(I, 28)
      A(I, 29) = A(I, 29) * B(I, 29) + C(I, 29)
      A(I, 30) = A(I, 30) * B(I, 30) + C(I, 30)
      A(I, 31) = A(I, 31) * B(I, 31) + C(I, 31)
      A(I, 32) = A(I, 32) * B(I, 32) + C(I, 32)
      A(I, 33) = A(I, 33) * B(I, 33) + C(I, 33)
      A(I, 34) = A(I, 34) * B(I, 34) + C(I, 34)
      A(I, 35) = A(I, 35) * B(I, 35) + C(I, 35)
      A(I, 36) = A(I, 36) * B(I, 36) + C(I, 36)
      A(I, 37) = A(I, 37) * B(I, 37) + C(I, 37)
      A(I, 38) = A(I, 38) * B(I, 38) + C(I, 38)
      A(I, 39) = A(I, 39) * B(I, 39) + C(I, 39)
      A(I, 40) = A(I, 40) * B(I, 40) + C(I, 40)
      A(I, 41) = A(I, 41) * B(I, 41) + C(I, 41)
      A(I, 42) = A(I, 42) * B(I, 42) + C(I, 42)
      A(I, 43) = A(I, 43) * B(I, 43) + C(I, 43)
      A(I, 44) = A(I, 44) * B(I, 44) + C(I, 44)
      A(I, 45) = A(I, 45) * B(I, 45) + C(I, 45)
      A(I, 46) = A(I, 46) * B(I, 46) + C(I, 46)
      A(I, 47) = A(I, 47) * B(I, 47) + C(I, 47)
      A(I, 48) = A(I, 48) * B(I, 48) + C(I, 48)
      A(I, 49) = A(I, 49) * B(I, 49) + C(I, 49)
      A(I, 50) = A(I, 50) * B(I, 50) + C(I, 50)
      A(I, 51) = A(I, 51) * B(I, 51) + C(I, 51)
      A(I, 52) = A(I, 52) * B(I, 52) + C(I, 52)
      A(I, 53) = A(I, 53) * B(I, 53) + C(I, 53)
      A(I, 54) = A(I, 54) * B(I, 54) + C(I, 54)
      A(I, 55) = A(I, 55) * B(I, 55) + C(I, 55)
      A(I, 56) = A(I, 56) * B(I, 56) + C(I, 56)
      A(I, 57) = A(I, 57) * B(I, 57) + C(I, 57)
      A(I, 58) = A(I, 58) * B(I, 58) + C(I, 58)
      A(I, 59) = A(I, 59) * B(I, 59) + C(I, 59)
      A(I, 60) = A(I, 60) * B(I, 60) + C(I, 60)
      A(I, 61) = A(I, 61) * B(I, 61) + C(I, 61)
      A(I, 62) = A(I, 62) * B(I, 62) + C(I, 62)
      A(I, 63) = A(I, 63) * B(I, 63) + C(I, 63)
      A(I, 64) = A(I, 64) * B(I, 64) + C(I, 64)
      A(I, 65) = A(I, 65) * B(I, 65) + C(I, 65)
      A(I, 66) = A(I, 66) * B(I, 66) + C(I, 66)
      A(I, 67) = A(I, 67) * B(I, 67) + C(I, 67)
      A(I, 68) = A(I, 68) * B(I, 68) + C(I, 68)
      A(I, 69) = A(I, 69) * B(I, 69) + C(I, 69)
      A(I, 70) = A(I, 70) * B(I, 70) + C(I, 70)
      A(I, 71) = A(I, 71) * B(I, 71) + C(I, 71)
      A(I, 72) = A(I, 72) * B(I, 72) + C(I, 72)
      A(I, 73) = A(I, 73) * B(I, 73) + C(I, 73)
      A(I, 74) = A(I, 74) * B(I, 74) + C(I, 74)
      A(I, 75) = A(I, 75) * B(I, 75) + C(I, 75)
      A(I, 76) = A(I, 76) * B(I, 76) + C(I, 76)
      A(I, 77) = A(I, 77) * B(I, 77) + C(I, 77)
      A(I, 78) = A(I, 78) * B(I, 78) + C(I, 78)
      A(I, 79) = A(I, 79) * B(I, 79) + C(I, 79)
      A(I, 80) = A(I, 80) * B(I, 80) + C(I, 80)
      A(I, 81) = A(I, 81) * B(I, 81) + C(I, 81)
      A(I, 82) = A(I, 82) * B(I, 82) + C(I, 82)
      A(I, 83) = A(I, 83) * B(I, 83) + C(I, 83)
      A(I, 84) = A(I, 84) * B(I, 84) + C(I, 84)
      A(I, 85) = A(I, 85) * B(I, 85) + C(I, 85)
      A(I, 86) = A(I, 86) * B(I, 86) + C(I, 86)
      A(I, 87) = A(I, 87) * B(I, 87) + C(I, 87)
      A(I, 88) = A(I, 88) * B(I, 88) + C(I, 88)
      A(I, 89) = A(I, 89) * B(I, 89) + C(I, 89)
      A(I, 90) = A(I, 90) * B(I, 90) + C(I, 90)
      A(I, 91) = A(I, 91) * B(I, 91) + C(I, 91)
      A(I, 92) = A(I, 92) * B(I, 92) + C(I, 92)
      A(I, 93) = A(I, 93) * B(I, 93) + C(I, 93)
      A(I, 94) = A(I, 94) * B(I, 94) + C(I, 94)
      A(I, 95) = A(I, 95) * B(I, 95) + C(I, 95)
      A(I, 96) = A(I, 96) * B(I, 96) + C(I, 96)
      A(I, 97) = A(I, 97) * B(I, 97) + C(I, 97)
      A(I, 98) = A(I, 98) * B(I, 98) + C(I, 98)
      A(I, 99) = A(I, 99) * B(I, 99) + C(I, 99)
      A(I,100) = A(I,100) * B(I,100) + C(I,100)
      A(I,  1) = A(I,  1) * B(I,  1) + C(I,  1)
      A(I,  2) = A(I,  2) * B(I,  2) + C(I,  2)
      A(I,  3) = A(I,  3) * B(I,  3) + C(I,  3)
      A(I,  4) = A(I,  4) * B(I,  4) + C(I,  4)
      A(I,  5) = A(I,  5) * B(I,  5) + C(I,  5)
      A(I,  6) = A(I,  6) * B(I,  6) + C(I,  6)
      A(I,  7) = A(I,  7) * B(I,  7) + C(I,  7)
      A(I,  8) = A(I,  8) * B(I,  8) + C(I,  8)
      A(I,  9) = A(I,  9) * B(I,  9) + C(I,  9)
      A(I, 10) = A(I, 10) * B(I, 10) + C(I, 10)
      A(I, 11) = A(I, 11) * B(I, 11) + C(I, 11)
      A(I, 12) = A(I, 12) * B(I, 12) + C(I, 12)
      A(I, 13) = A(I, 13) * B(I, 13) + C(I, 13)
      A(I, 14) = A(I, 14) * B(I, 14) + C(I, 14)
      A(I, 15) = A(I, 15) * B(I, 15) + C(I, 15)
      A(I, 16) = A(I, 16) * B(I, 16) + C(I, 16)
      A(I, 17) = A(I, 17) * B(I, 17) + C(I, 17)
      A(I, 18) = A(I, 18) * B(I, 18) + C(I, 18)
      A(I, 19) = A(I, 19) * B(I, 19) + C(I, 19)
      A(I, 20) = A(I, 20) * B(I, 20) + C(I, 20)
      A(I, 21) = A(I, 21) * B(I, 21) + C(I, 21)
      A(I, 22) = A(I, 22) * B(I, 22) + C(I, 22)
      A(I, 23) = A(I, 23) * B(I, 23) + C(I, 23)
      A(I, 24) = A(I, 24) * B(I, 24) + C(I, 24)
      A(I, 25) = A(I, 25) * B(I, 25) + C(I, 25)
      A(I, 26) = A(I, 26) * B(I, 26) + C(I, 26)
      A(I, 27) = A(I, 27) * B(I, 27) + C(I, 27)
      A(I, 28) = A(I, 28) * B(I, 28) + C(I, 28)
      A(I, 29) = A(I, 29) * B(I, 29) + C(I, 29)
      A(I, 30) = A(I, 30) * B(I, 30) + C(I, 30)
      A(I, 31) = A(I, 31) * B(I, 31) + C(I, 31)
      A(I, 32) = A(I, 32) * B(I, 32) + C(I, 32)
      A(I, 33) = A(I, 33) * B(I, 33) + C(I, 33)
      A(I, 34) = A(I, 34) * B(I, 34) + C(I, 34)
      A(I, 35) = A(I, 35) * B(I, 35) + C(I, 35)
      A(I, 36) = A(I, 36) * B(I, 36) + C(I, 36)
      A(I, 37) = A(I, 37) * B(I, 37) + C(I, 37)
      A(I, 38) = A(I, 38) * B(I, 38) + C(I, 38)
      A(I, 39) = A(I, 39) * B(I, 39) + C(I, 39)
      A(I, 40) = A(I, 40) * B(I, 40) + C(I, 40)
      A(I, 41) = A(I, 41) * B(I, 41) + C(I, 41)
      A(I, 42) = A(I, 42) * B(I, 42) + C(I, 42)
      A(I, 43) = A(I, 43) * B(I, 43) + C(I, 43)
      A(I, 44) = A(I, 44) * B(I, 44) + C(I, 44)
      A(I, 45) = A(I, 45) * B(I, 45) + C(I, 45)
      A(I, 46) = A(I, 46) * B(I, 46) + C(I, 46)
      A(I, 47) = A(I, 47) * B(I, 47) + C(I, 47)
      A(I, 48) = A(I, 48) * B(I, 48) + C(I, 48)
      A(I, 49) = A(I, 49) * B(I, 49) + C(I, 49)
      A(I, 50) = A(I, 50) * B(I, 50) + C(I, 50)
      A(I, 51) = A(I, 51) * B(I, 51) + C(I, 51)
      A(I, 52) = A(I, 52) * B(I, 52) + C(I, 52)
      A(I, 53) = A(I, 53) * B(I, 53) + C(I, 53)
      A(I, 54) = A(I, 54) * B(I, 54) + C(I, 54)
      A(I, 55) = A(I, 55) * B(I, 55) + C(I, 55)
      A(I, 56) = A(I, 56) * B(I, 56) + C(I, 56)
      A(I, 57) = A(I, 57) * B(I, 57) + C(I, 57)
      A(I, 58) = A(I, 58) * B(I, 58) + C(I, 58)
      A(I, 59) = A(I, 59) * B(I, 59) + C(I, 59)
      A(I, 60) = A(I, 60) * B(I, 60) + C(I, 60)
      A(I, 61) = A(I, 61) * B(I, 61) + C(I, 61)
      A(I, 62) = A(I, 62) * B(I, 62) + C(I, 62)
      A(I, 63) = A(I, 63) * B(I, 63) + C(I, 63)
      A(I, 64) = A(I, 64) * B(I, 64) + C(I, 64)
      A(I, 65) = A(I, 65) * B(I, 65) + C(I, 65)
      A(I, 66) = A(I, 66) * B(I, 66) + C(I, 66)
      A(I, 67) = A(I, 67) * B(I, 67) + C(I, 67)
      A(I, 68) = A(I, 68) * B(I, 68) + C(I, 68)
      A(I, 69) = A(I, 69) * B(I, 69) + C(I, 69)
      A(I, 70) = A(I, 70) * B(I, 70) + C(I, 70)
      A(I, 71) = A(I, 71) * B(I, 71) + C(I, 71)
      A(I, 72) = A(I, 72) * B(I, 72) + C(I, 72)
      A(I, 73) = A(I, 73) * B(I, 73) + C(I, 73)
      A(I, 74) = A(I, 74) * B(I, 74) + C(I, 74)
      A(I, 75) = A(I, 75) * B(I, 75) + C(I, 75)
      A(I, 76) = A(I, 76) * B(I, 76) + C(I, 76)
      A(I, 77) = A(I, 77) * B(I, 77) + C(I, 77)
      A(I, 78) = A(I, 78) * B(I, 78) + C(I, 78)
      A(I, 79) = A(I, 79) * B(I, 79) + C(I, 79)
      A(I, 80) = A(I, 80) * B(I, 80) + C(I, 80)
      A(I, 81) = A(I, 81) * B(I, 81) + C(I, 81)
      A(I, 82) = A(I, 82) * B(I, 82) + C(I, 82)
      A(I, 83) = A(I, 83) * B(I, 83) + C(I, 83)
      A(I, 84) = A(I, 84) * B(I, 84) + C(I, 84)
      A(I, 85) = A(I, 85) * B(I, 85) + C(I, 85)
      A(I, 86) = A(I, 86) * B(I, 86) + C(I, 86)
      A(I, 87) = A(I, 87) * B(I, 87) + C(I, 87)
      A(I, 88) = A(I, 88) * B(I, 88) + C(I, 88)
      A(I, 89) = A(I, 89) * B(I, 89) + C(I, 89)
      A(I, 90) = A(I, 90) * B(I, 90) + C(I, 90)
      A(I, 91) = A(I, 91) * B(I, 91) + C(I, 91)
      A(I, 92) = A(I, 92) * B(I, 92) + C(I, 92)
      A(I, 93) = A(I, 93) * B(I, 93) + C(I, 93)
      A(I, 94) = A(I, 94) * B(I, 94) + C(I, 94)
      A(I, 95) = A(I, 95) * B(I, 95) + C(I, 95)
      A(I, 96) = A(I, 96) * B(I, 96) + C(I, 96)
      A(I, 97) = A(I, 97) * B(I, 97) + C(I, 97)
      A(I, 98) = A(I, 98) * B(I, 98) + C(I, 98)
      A(I, 99) = A(I, 99) * B(I, 99) + C(I, 99)
      A(I,100) = A(I,100) * B(I,100) + C(I,100)
      ENDDO
      ENDDO
      RETURN
      END
      SUBROUTINE SPLIT
      PARAMETER (IX=10000,JX=100,NX=100)
      COMMON /GLOBAL/
     .  A(IX,JX),B(IX,JX),C(IX,JX)
C
      DO N=1,NX
      DO I=1,IX
      A(I,  1) = A(I,  1) * B(I,  1) + C(I,  1)
      A(I,  2) = A(I,  2) * B(I,  2) + C(I,  2)
      A(I,  3) = A(I,  3) * B(I,  3) + C(I,  3)
      A(I,  4) = A(I,  4) * B(I,  4) + C(I,  4)
      A(I,  5) = A(I,  5) * B(I,  5) + C(I,  5)
      A(I,  6) = A(I,  6) * B(I,  6) + C(I,  6)
      A(I,  7) = A(I,  7) * B(I,  7) + C(I,  7)
      A(I,  8) = A(I,  8) * B(I,  8) + C(I,  8)
      A(I,  9) = A(I,  9) * B(I,  9) + C(I,  9)
      A(I, 10) = A(I, 10) * B(I, 10) + C(I, 10)
      A(I, 11) = A(I, 11) * B(I, 11) + C(I, 11)
      A(I, 12) = A(I, 12) * B(I, 12) + C(I, 12)
      A(I, 13) = A(I, 13) * B(I, 13) + C(I, 13)
      A(I, 14) = A(I, 14) * B(I, 14) + C(I, 14)
      A(I, 15) = A(I, 15) * B(I, 15) + C(I, 15)
      A(I, 16) = A(I, 16) * B(I, 16) + C(I, 16)
      A(I, 17) = A(I, 17) * B(I, 17) + C(I, 17)
      A(I, 18) = A(I, 18) * B(I, 18) + C(I, 18)
      A(I, 19) = A(I, 19) * B(I, 19) + C(I, 19)
      A(I, 20) = A(I, 20) * B(I, 20) + C(I, 20)
      A(I, 21) = A(I, 21) * B(I, 21) + C(I, 21)
      A(I, 22) = A(I, 22) * B(I, 22) + C(I, 22)
      A(I, 23) = A(I, 23) * B(I, 23) + C(I, 23)
      A(I, 24) = A(I, 24) * B(I, 24) + C(I, 24)
      A(I, 25) = A(I, 25) * B(I, 25) + C(I, 25)
      A(I, 26) = A(I, 26) * B(I, 26) + C(I, 26)
      A(I, 27) = A(I, 27) * B(I, 27) + C(I, 27)
      A(I, 28) = A(I, 28) * B(I, 28) + C(I, 28)
      A(I, 29) = A(I, 29) * B(I, 29) + C(I, 29)
      A(I, 30) = A(I, 30) * B(I, 30) + C(I, 30)
      A(I, 31) = A(I, 31) * B(I, 31) + C(I, 31)
      A(I, 32) = A(I, 32) * B(I, 32) + C(I, 32)
      A(I, 33) = A(I, 33) * B(I, 33) + C(I, 33)
      A(I, 34) = A(I, 34) * B(I, 34) + C(I, 34)
      A(I, 35) = A(I, 35) * B(I, 35) + C(I, 35)
      A(I, 36) = A(I, 36) * B(I, 36) + C(I, 36)
      A(I, 37) = A(I, 37) * B(I, 37) + C(I, 37)
      A(I, 38) = A(I, 38) * B(I, 38) + C(I, 38)
      A(I, 39) = A(I, 39) * B(I, 39) + C(I, 39)
      A(I, 40) = A(I, 40) * B(I, 40) + C(I, 40)
      A(I, 41) = A(I, 41) * B(I, 41) + C(I, 41)
      A(I, 42) = A(I, 42) * B(I, 42) + C(I, 42)
      A(I, 43) = A(I, 43) * B(I, 43) + C(I, 43)
      A(I, 44) = A(I, 44) * B(I, 44) + C(I, 44)
      A(I, 45) = A(I, 45) * B(I, 45) + C(I, 45)
      A(I, 46) = A(I, 46) * B(I, 46) + C(I, 46)
      A(I, 47) = A(I, 47) * B(I, 47) + C(I, 47)
      A(I, 48) = A(I, 48) * B(I, 48) + C(I, 48)
      A(I, 49) = A(I, 49) * B(I, 49) + C(I, 49)
      A(I, 50) = A(I, 50) * B(I, 50) + C(I, 50)
      A(I, 51) = A(I, 51) * B(I, 51) + C(I, 51)
      A(I, 52) = A(I, 52) * B(I, 52) + C(I, 52)
      A(I, 53) = A(I, 53) * B(I, 53) + C(I, 53)
      A(I, 54) = A(I, 54) * B(I, 54) + C(I, 54)
      A(I, 55) = A(I, 55) * B(I, 55) + C(I, 55)
      A(I, 56) = A(I, 56) * B(I, 56) + C(I, 56)
      A(I, 57) = A(I, 57) * B(I, 57) + C(I, 57)
      A(I, 58) = A(I, 58) * B(I, 58) + C(I, 58)
      A(I, 59) = A(I, 59) * B(I, 59) + C(I, 59)
      A(I, 60) = A(I, 60) * B(I, 60) + C(I, 60)
      A(I, 61) = A(I, 61) * B(I, 61) + C(I, 61)
      A(I, 62) = A(I, 62) * B(I, 62) + C(I, 62)
      A(I, 63) = A(I, 63) * B(I, 63) + C(I, 63)
      A(I, 64) = A(I, 64) * B(I, 64) + C(I, 64)
      A(I, 65) = A(I, 65) * B(I, 65) + C(I, 65)
      A(I, 66) = A(I, 66) * B(I, 66) + C(I, 66)
      A(I, 67) = A(I, 67) * B(I, 67) + C(I, 67)
      A(I, 68) = A(I, 68) * B(I, 68) + C(I, 68)
      A(I, 69) = A(I, 69) * B(I, 69) + C(I, 69)
      A(I, 70) = A(I, 70) * B(I, 70) + C(I, 70)
      A(I, 71) = A(I, 71) * B(I, 71) + C(I, 71)
      A(I, 72) = A(I, 72) * B(I, 72) + C(I, 72)
      A(I, 73) = A(I, 73) * B(I, 73) + C(I, 73)
      A(I, 74) = A(I, 74) * B(I, 74) + C(I, 74)
      A(I, 75) = A(I, 75) * B(I, 75) + C(I, 75)
      A(I, 76) = A(I, 76) * B(I, 76) + C(I, 76)
      A(I, 77) = A(I, 77) * B(I, 77) + C(I, 77)
      A(I, 78) = A(I, 78) * B(I, 78) + C(I, 78)
      A(I, 79) = A(I, 79) * B(I, 79) + C(I, 79)
      A(I, 80) = A(I, 80) * B(I, 80) + C(I, 80)
      A(I, 81) = A(I, 81) * B(I, 81) + C(I, 81)
      A(I, 82) = A(I, 82) * B(I, 82) + C(I, 82)
      A(I, 83) = A(I, 83) * B(I, 83) + C(I, 83)
      A(I, 84) = A(I, 84) * B(I, 84) + C(I, 84)
      A(I, 85) = A(I, 85) * B(I, 85) + C(I, 85)
      A(I, 86) = A(I, 86) * B(I, 86) + C(I, 86)
      A(I, 87) = A(I, 87) * B(I, 87) + C(I, 87)
      A(I, 88) = A(I, 88) * B(I, 88) + C(I, 88)
      A(I, 89) = A(I, 89) * B(I, 89) + C(I, 89)
      A(I, 90) = A(I, 90) * B(I, 90) + C(I, 90)
      A(I, 91) = A(I, 91) * B(I, 91) + C(I, 91)
      A(I, 92) = A(I, 92) * B(I, 92) + C(I, 92)
      A(I, 93) = A(I, 93) * B(I, 93) + C(I, 93)
      A(I, 94) = A(I, 94) * B(I, 94) + C(I, 94)
      A(I, 95) = A(I, 95) * B(I, 95) + C(I, 95)
      A(I, 96) = A(I, 96) * B(I, 96) + C(I, 96)
      A(I, 97) = A(I, 97) * B(I, 97) + C(I, 97)
      A(I, 98) = A(I, 98) * B(I, 98) + C(I, 98)
      A(I, 99) = A(I, 99) * B(I, 99) + C(I, 99)
      A(I,100) = A(I,100) * B(I,100) + C(I,100)
      ENDDO
      DO I=1,IX
      A(I,  1) = A(I,  1) * B(I,  1) + C(I,  1)
      A(I,  2) = A(I,  2) * B(I,  2) + C(I,  2)
      A(I,  3) = A(I,  3) * B(I,  3) + C(I,  3)
      A(I,  4) = A(I,  4) * B(I,  4) + C(I,  4)
      A(I,  5) = A(I,  5) * B(I,  5) + C(I,  5)
      A(I,  6) = A(I,  6) * B(I,  6) + C(I,  6)
      A(I,  7) = A(I,  7) * B(I,  7) + C(I,  7)
      A(I,  8) = A(I,  8) * B(I,  8) + C(I,  8)
      A(I,  9) = A(I,  9) * B(I,  9) + C(I,  9)
      A(I, 10) = A(I, 10) * B(I, 10) + C(I, 10)
      A(I, 11) = A(I, 11) * B(I, 11) + C(I, 11)
      A(I, 12) = A(I, 12) * B(I, 12) + C(I, 12)
      A(I, 13) = A(I, 13) * B(I, 13) + C(I, 13)
      A(I, 14) = A(I, 14) * B(I, 14) + C(I, 14)
      A(I, 15) = A(I, 15) * B(I, 15) + C(I, 15)
      A(I, 16) = A(I, 16) * B(I, 16) + C(I, 16)
      A(I, 17) = A(I, 17) * B(I, 17) + C(I, 17)
      A(I, 18) = A(I, 18) * B(I, 18) + C(I, 18)
      A(I, 19) = A(I, 19) * B(I, 19) + C(I, 19)
      A(I, 20) = A(I, 20) * B(I, 20) + C(I, 20)
      A(I, 21) = A(I, 21) * B(I, 21) + C(I, 21)
      A(I, 22) = A(I, 22) * B(I, 22) + C(I, 22)
      A(I, 23) = A(I, 23) * B(I, 23) + C(I, 23)
      A(I, 24) = A(I, 24) * B(I, 24) + C(I, 24)
      A(I, 25) = A(I, 25) * B(I, 25) + C(I, 25)
      A(I, 26) = A(I, 26) * B(I, 26) + C(I, 26)
      A(I, 27) = A(I, 27) * B(I, 27) + C(I, 27)
      A(I, 28) = A(I, 28) * B(I, 28) + C(I, 28)
      A(I, 29) = A(I, 29) * B(I, 29) + C(I, 29)
      A(I, 30) = A(I, 30) * B(I, 30) + C(I, 30)
      A(I, 31) = A(I, 31) * B(I, 31) + C(I, 31)
      A(I, 32) = A(I, 32) * B(I, 32) + C(I, 32)
      A(I, 33) = A(I, 33) * B(I, 33) + C(I, 33)
      A(I, 34) = A(I, 34) * B(I, 34) + C(I, 34)
      A(I, 35) = A(I, 35) * B(I, 35) + C(I, 35)
      A(I, 36) = A(I, 36) * B(I, 36) + C(I, 36)
      A(I, 37) = A(I, 37) * B(I, 37) + C(I, 37)
      A(I, 38) = A(I, 38) * B(I, 38) + C(I, 38)
      A(I, 39) = A(I, 39) * B(I, 39) + C(I, 39)
      A(I, 40) = A(I, 40) * B(I, 40) + C(I, 40)
      A(I, 41) = A(I, 41) * B(I, 41) + C(I, 41)
      A(I, 42) = A(I, 42) * B(I, 42) + C(I, 42)
      A(I, 43) = A(I, 43) * B(I, 43) + C(I, 43)
      A(I, 44) = A(I, 44) * B(I, 44) + C(I, 44)
      A(I, 45) = A(I, 45) * B(I, 45) + C(I, 45)
      A(I, 46) = A(I, 46) * B(I, 46) + C(I, 46)
      A(I, 47) = A(I, 47) * B(I, 47) + C(I, 47)
      A(I, 48) = A(I, 48) * B(I, 48) + C(I, 48)
      A(I, 49) = A(I, 49) * B(I, 49) + C(I, 49)
      A(I, 50) = A(I, 50) * B(I, 50) + C(I, 50)
      A(I, 51) = A(I, 51) * B(I, 51) + C(I, 51)
      A(I, 52) = A(I, 52) * B(I, 52) + C(I, 52)
      A(I, 53) = A(I, 53) * B(I, 53) + C(I, 53)
      A(I, 54) = A(I, 54) * B(I, 54) + C(I, 54)
      A(I, 55) = A(I, 55) * B(I, 55) + C(I, 55)
      A(I, 56) = A(I, 56) * B(I, 56) + C(I, 56)
      A(I, 57) = A(I, 57) * B(I, 57) + C(I, 57)
      A(I, 58) = A(I, 58) * B(I, 58) + C(I, 58)
      A(I, 59) = A(I, 59) * B(I, 59) + C(I, 59)
      A(I, 60) = A(I, 60) * B(I, 60) + C(I, 60)
      A(I, 61) = A(I, 61) * B(I, 61) + C(I, 61)
      A(I, 62) = A(I, 62) * B(I, 62) + C(I, 62)
      A(I, 63) = A(I, 63) * B(I, 63) + C(I, 63)
      A(I, 64) = A(I, 64) * B(I, 64) + C(I, 64)
      A(I, 65) = A(I, 65) * B(I, 65) + C(I, 65)
      A(I, 66) = A(I, 66) * B(I, 66) + C(I, 66)
      A(I, 67) = A(I, 67) * B(I, 67) + C(I, 67)
      A(I, 68) = A(I, 68) * B(I, 68) + C(I, 68)
      A(I, 69) = A(I, 69) * B(I, 69) + C(I, 69)
      A(I, 70) = A(I, 70) * B(I, 70) + C(I, 70)
      A(I, 71) = A(I, 71) * B(I, 71) + C(I, 71)
      A(I, 72) = A(I, 72) * B(I, 72) + C(I, 72)
      A(I, 73) = A(I, 73) * B(I, 73) + C(I, 73)
      A(I, 74) = A(I, 74) * B(I, 74) + C(I, 74)
      A(I, 75) = A(I, 75) * B(I, 75) + C(I, 75)
      A(I, 76) = A(I, 76) * B(I, 76) + C(I, 76)
      A(I, 77) = A(I, 77) * B(I, 77) + C(I, 77)
      A(I, 78) = A(I, 78) * B(I, 78) + C(I, 78)
      A(I, 79) = A(I, 79) * B(I, 79) + C(I, 79)
      A(I, 80) = A(I, 80) * B(I, 80) + C(I, 80)
      A(I, 81) = A(I, 81) * B(I, 81) + C(I, 81)
      A(I, 82) = A(I, 82) * B(I, 82) + C(I, 82)
      A(I, 83) = A(I, 83) * B(I, 83) + C(I, 83)
      A(I, 84) = A(I, 84) * B(I, 84) + C(I, 84)
      A(I, 85) = A(I, 85) * B(I, 85) + C(I, 85)
      A(I, 86) = A(I, 86) * B(I, 86) + C(I, 86)
      A(I, 87) = A(I, 87) * B(I, 87) + C(I, 87)
      A(I, 88) = A(I, 88) * B(I, 88) + C(I, 88)
      A(I, 89) = A(I, 89) * B(I, 89) + C(I, 89)
      A(I, 90) = A(I, 90) * B(I, 90) + C(I, 90)
      A(I, 91) = A(I, 91) * B(I, 91) + C(I, 91)
      A(I, 92) = A(I, 92) * B(I, 92) + C(I, 92)
      A(I, 93) = A(I, 93) * B(I, 93) + C(I, 93)
      A(I, 94) = A(I, 94) * B(I, 94) + C(I, 94)
      A(I, 95) = A(I, 95) * B(I, 95) + C(I, 95)
      A(I, 96) = A(I, 96) * B(I, 96) + C(I, 96)
      A(I, 97) = A(I, 97) * B(I, 97) + C(I, 97)
      A(I, 98) = A(I, 98) * B(I, 98) + C(I, 98)
      A(I, 99) = A(I, 99) * B(I, 99) + C(I, 99)
      A(I,100) = A(I,100) * B(I,100) + C(I,100)
      ENDDO
      ENDDO
      RETURN
      END

   The code was compiled with the -o aggress option which vectorized all of the
inner loops in both JOINED and SPLIT.  I would expect that JOINED would run
faster and more efficiently than SPLIT, but the opposite result occurred.
Using the hardware performance monitor (hpm) I found that JOINED ran in 2.8
seconds at a rate of 140 Mflops, while SPLIT ran in 2.2 seconds at a rate
of 180 Mflops.  I've skimmed through some of the assembly code and have not
seen a difference in how either subroutine handles the inner loop operations.
I've also looked at all of the output from hpm and did not notice anything
that different in either subroutine's performance statistics.
   I've bounced this off several people without coming up with a clear cut
answer.  Most people have told me it's probably a compiler bug, but I thought
I would put it out here and see if anyone has run into something like this.

*******************************************************************************
*   Richard Mulac                      *                                      *
*   NASA Lewis Research Center         *                                      *
*   21000 Brookpark Road               *    Network address:                  *
*   M.S. 5-9                           *    fsjohnv@alliant1.lerc.nasa.gov    *
*   Cleveland, Ohio  44135             *                                      *
*   (216) 433-5936                     *                                      *
*******************************************************************************

bruno@convex.csd.uwm.edu (Bruno Wolff III) (04/05/91)

In article <1991Apr3.062644.23436@eagle.lerc.nasa.gov> fsjohnv@alliant1.lerc.nasa.gov (Richard Mulac) writes:
%
%   While optimizing a code last year I ran across a situation which on the
%surface appears to contradict some of the basic rules one abides by when
%trying to write efficient Fortran code.  I was trying to merge several DO
%loop blocks to eliminate the overhead associated with redundant index
%calculations and also to reduce memory access.  The code was written to
%be run on a CRAY Y-MP, compiling with cft77 4.0.1.6.  What I found can
%be described using the following program TEST, which calls subroutines
%JOINED and SPLIT (It's a few hundred lines long, but the majority of the
%code is redundant).

Possibly this is caused by the loop not fitting in the instruction cache.
It can be more efficient to have several small loops each of which entirely
fits in the instruction cache instead of a larger loop which doesn't.

bruno@convex.csd.uwm.edu (Bruno Wolff III) (04/05/91)

One other thing. If this was a real problem, you probably would not want to
use 10000 as the first subscript limit of your arrays. 10000 is divisible by 16,
so you are near the breakpoint for bank conflicts when making consecutive
references on the second subscript. You might try making the subscript limit
10001 and see if you get any speed up.

preston@ariel.rice.edu (Preston Briggs) (04/05/91)

In article <10776@uwm.edu> bruno@convex.csd.uwm.edu (Bruno Wolff III) writes:
>One other thing. If this was a real problem, you probably would not want to
>use 10000 as the first subscript limit of your arrays. 
>10000 is divisible by 16,

It is?
Or are you thinking in hex again?

preston@ariel.rice.edu (Preston Briggs) (04/06/91)

bruno@convex.csd.uwm.edu (Bruno Wolff III) writes:
>>One other thing. If this was a real problem, you probably would not want to
>>use 10000 as the first subscript limit of your arrays. 
>>10000 is divisible by 16,
>

and foolishly I wrote,
>   It is?
>   Or are you thinking in hex again?
>

and
burley@albert.gnu.ai.mit.edu (Craig Burley) writes:

>10000 / 16 = 625.  Right?

Yep.  I can't imagine what I was thinking.
Dik Winter suggested perhaps ternary...
Sorry for the useless and incorrect posting.

Preston Briggs

burley@albert.gnu.ai.mit.edu (Craig Burley) (04/06/91)

In article <1991Apr5.053603.16983@rice.edu> preston@ariel.rice.edu (Preston Briggs) writes:

   In article <10776@uwm.edu> bruno@convex.csd.uwm.edu (Bruno Wolff III) writes:
   >One other thing. If this was a real problem, you probably would not want to
   >use 10000 as the first subscript limit of your arrays. 
   >10000 is divisible by 16,

   It is?
   Or are you thinking in hex again?

10000 / 16 = 625.  Right?
--

James Craig Burley, Software Craftsperson    burley@ai.mit.edu