[Beowulf] g77 limits...

Toon Moene toon at moene.indiv.nluug.nl
Thu Feb 23 11:40:21 PST 2006


Robert G. Brown wrote:

> What are the current limits on the size of arrays that can be allocated
> in g77?  I know that this is almost a FAQ, but I cannot look back at the
> archives because it is so time dependent an answer.  In particular, can
> an x64 box with a modern linux kernel and a modern g77 allocate 4-8 GB
> arrays (presuming, of course, that one uses a long int for an index)?  I
> have seen references to "using an offset" in a few google hits (that
> were not very informative) -- does that basically mean doing pointer
> arithmetic in fortran?

> (I know Toone works on this and am hoping he's paying attention so I can
> get a really authoritative and informative answer...:-)

Well (thanks), I did work on removing a rather silly limit whereby no 
array could be larger than 2^32 *bits* in g77 (due to the backend 
expressing every size in bits).

I was able to show that - due to the fact that the minimum *unit* in 
Fortran indexing was a byte - that the real limit was 2^32 *bytes* (by 
showing that constant folding in the compiler's backend would always 
remove the bit size "limitation").

However, I never have been able to try out the limits of using a > 2 
Gbyte array - while doing the indexing with INTEGER*8 - because my 64 
bit machines are simply to small.

The following code works on my 0.5 Gbyte RAM / 1.5 Gbyte SWAP Athlon 64 
laptop with gfortran (the new Fortran 95 GNU Fortran), albeit horribly 
slowly:

       INTEGER*8 I, NSIZE
       PARAMETER (NSIZE = 100 000 000_8)
       DIMENSION A(3*NSIZE), A1(NSIZE), A2(NSIZE), A3(NSIZE)
       EQUIVALENCE (A(        1), A1(1))
       EQUIVALENCE (A(  NSIZE+1), A2(1))
       EQUIVALENCE (A(2*NSIZE+1), A3(1))
       DO I = 1, NSIZE
          A1(I) = 0.0
          A2(I) = 0.0
          A3(I) = 0.0
       ENDDO
       DO I = 1, 3*NSIZE
          A(I) = I
       ENDDO
       DO I = 1, NSIZE
          IF (A1(I) .NE. A(        I)) CALL ABORT
          IF (A2(I) .NE. A(  NSIZE+I)) CALL ABORT
          IF (A3(I) .NE. A(2*NSIZE+I)) CALL ABORT
       ENDDO
       DO I = 1, NSIZE
          A1(I) = 0.0
          A2(I) = 0.0
          A3(I) = 0.0
       ENDDO
       CALL SUB(A, 3*NSIZE)
       DO I = 1, NSIZE
          IF (A1(I) .NE. A(        I)) CALL ABORT
          IF (A2(I) .NE. A(  NSIZE+I)) CALL ABORT
          IF (A3(I) .NE. A(2*NSIZE+I)) CALL ABORT
       ENDDO
       END
       SUBROUTINE SUB(A, N)
       DIMENSION A(N)
       DO I = 1, N
          A(I) = I
       ENDDO
       END

This is the compiler that will be in GCC 4.1 (which will be out in about 
a week).  Perhaps you can jazz this up by increasing NSIZE so that you 
go over the 4 Gbyte limit on a machine with enough memory ...

Hope this helps,

-- 
Toon Moene - e-mail: toon at moene.indiv.nluug.nl - phone: +31 346 214290
Saturnushof 14, 3738 XG  Maartensdijk, The Netherlands
A maintainer of GNU Fortran 95: http://gcc.gnu.org/fortran/
My next laptop will have a crank



More information about the Beowulf mailing list