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