Fortran optimization
Richard Mulac
fsjohnv at alliant1.lerc.nasa.gov
Wed Apr 3 16:26:44 AEST 1991
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 at alliant1.lerc.nasa.gov *
* Cleveland, Ohio 44135 * *
* (216) 433-5936 * *
*******************************************************************************
More information about the Comp.unix.cray
mailing list