gsg0384@uxa.cso.uiuc.edu (08/17/89)
Hi, How much illegal are the following two statements? program main real b, c, a(10,10) data a/100*1./ ! or assign them by two do loops b = 0*a(0,2) c = 0*a(1,0) print*, b,c stop end 1. Is the first line equivalent to b = 0*a(10,1) on every machine? If it is, can't we say it's legal? Anyway, is the outcome machine-dependent? 2. Does the second line always give c = 0. on every machine? This kind of cases always occur when one wants to vectorize do loops. Hugh song@ardent1.ceg.uiuc.edu or gsg0384@uxa.cso.uiuc.edu
brainerd@unmvax.unm.edu (Walt Brainerd) (08/19/89)
In article <116400001@uxa.cso.uiuc.edu>, gsg0384@uxa.cso.uiuc.edu writes: > > > Hi, > How much illegal are the following two statements? > > program main > > real b, c, a(10,10) > data a/100*1./ ! or assign them by two do loops > > b = 0*a(0,2) > c = 0*a(1,0) > The standard says (p. 5-5, lines 9-14) that the values of the subscripts must be withing the declared bounds, so both are illegal. There has been much discussion about how much trouble you can get into using nonstandard extensions. This is not allowed because some vendors have an "explicit extension", but rather because nonstandard usage is not checked. It is hoped that in future you will at least have an option to turn on during development that will catch errors of this kind. -- Walt Brainerd Unicomp, Inc. brainerd@unmvax.cs.unm.edu 2002 Quail Run Dr. NE Albuquerque, NM 87122 505/275-0800
afs@ardent.com (08/20/89)
Hugh Song asked about illegality of Fortran constructs that come up in vectorizing programs. (Judging by the name of his machine, I'd guess that it is one of ours... \_/ ). Perhaps a few observations are in order: 1. IF his intention is to make use of the subscript 0 as a legitimate element of his arrays, ANSI 77 provides a mechanism for declaring this: real a(0:10,0:10) which makes both of his subscript expressions legal. 2. IF the intention is to make use of the forced overlap of array element subscripts with each other, the official mechanism is (assuming valid declaration of a as having 0 as a valid subscript): equivalence (a(0,0),c(10,10)) where c is suitably declared as an array elsewhere. 3. It IS legally the decision of the compiler as to where arrays are placed in storage; they do NOT have to be stored in the order in which they are listed in the declarations statement. Thus, the result of his execution of an statement addressing a(0,i) which precedes the beginning of the declared region of memory CAN produce a segmentation fault type error instead of picking up a zero from another array. 4. Vectorization of programs does NOT force the accessing of array elements outside of the defined boundaries of arrays. If the goal is to force particular elements to "appear" as elements of an array so that they may be accessed by a "vector" operation, the array declarations should be made (and/or equivalenced) so that what the programmer has in mind is explicitly declared. Vectorization / Optimization generally does not proceed well when non-standard assumptions are made about the object code/memory layout. ----- Al Shpuntoff afs@ardent.com or afs%ardent.com@uunet.uu.net, Ardent Computer 408-732-0400 880 West Maude Avenue Sunnyvale, CA 94086 UUCP: {hplabs, ubvax,decwrl, ucbcad, uunet}!ardent!afs Dialcom: 134:CMP2016 ----- ----- Al Shpuntoff, Senior Instructor/Course Developer Ardent Computer 408-732-0400 880 West Maude Avenue
jerry@violet.berkeley.edu ( Jerry Berkman ) (08/21/89)
In article <116400001@uxa.cso.uiuc.edu> gsg0384@uxa.cso.uiuc.edu writes: > >How much illegal are the following two statements? > > real b, c, a(10,10) > data a/100*1./ ! or assign them by two do loops > > b = 0*a(0,2) > c = 0*a(1,0) > > print*, b,c > >1. Is the first line equivalent to b = 0*a(10,1) on every machine? If it is, > can't we say it's legal? Anyway, is the outcome machine-dependent? This does not necessarily work on all machines, or more correctly, with all compilers. For example, on our IBM: watfor77 test *ERR* SS-04 subscript expression out of range; A(0,2) does not exist TraceBack: Executing in MAIN, statement 4 in file TEST FORTRAN Ready(01001); T=0.02/0.05 10:27:06 WATFOR77 gives a fatal error, and never executes the print statement. I believe there have been descriptor based implementations of Fortran (Burroughs?) which would also abort on illegal subscripts. Most Fortran systems don't check subscripts. However, optimizing compilers move code around and vectorizing compilers check for recurrences assuming that array subscripts are legal. Consider: do 100 j=1,100 a(1,j+ind1) = sqrt(b(j))+d(j)+e(j) a(2,j+ind2) = b(j) 100 continue the compiler may decide to do the second line first in order not to tie up a register with b. If these overlap due to illegal subscripts, the result in general is unpredictable. > >2. Does the second line always give c = 0. on every machine? No, not with WATFOR77. The location of a(1,0) using the storage layout of the standard would be equivalent to a1(-9) in an equivalent linear array a1. There is no guarantee this storage location is available for this user; i.e. there could be a segmentation violation. Also, this is a bad test as many compilers will see it is "0*" and not even bother compiling code for the array reference. > >This kind of cases always occur when one wants to vectorize do loops. I've vectorized a lot of DO loops and rarely encountered this problem. This is very bad programming practice; it leads to unreadable and unmaintainable code. > >Hugh song@ardent1.ceg.uiuc.edu or gsg0384@uxa.cso.uiuc.edu Jerry Berkman, U.C. Berkeley, jerry@violet.berkeley.edu
gsg0384@uxa.cso.uiuc.edu (08/22/89)
Ok, Ok. The more detailed one that I wanted to ask is as follows: program main real a(200), b(10, 20), c(200) data b/200*1./, a/200*1./ do 10 i = 1, 10 b(i,1) = 0. 10 continue do 20 j = 1, 10 b(1,j) = 0. 20 continue call sub(10, 10, a, b, c) print*, c stop end c--------------- subroutine sub(m, n, a, b, c) real a(m,n), b(m,n), c(m,n) do 20 i = 1, m do 10 j = 1, n c(i,j) = b(i,j)*a(i-1,j-1) 10 continue 20 continue return end On Ardent1, there is a compiler switch -subcheck which gives warning at run time. But the result is what I intended, the c(.,.) = zero's for the out-of-bounds. Without the switch, the result is again what I intended. On Apollos (SR10.1), with the BSD f77 switch -C, the program terminates with a message. 'Arithmetic exception: Subscript range'. However, without -C, the result was again what I inteded. OK. SO they are illegal. Then how about this modified sub? c-------------- subroutine sub(m, n, a, b, c) real a(m,n), b(m,n), c(m,n) do 20 i = 1, m do 10 j = 3, n c ^ Notice! c(i,j) = b(i,j)*a(i-1,j-1) 10 continue 20 continue return end The behavior on Apollo is the same. But on Ardent, the compiler does not catch anything wrong, even at the run time with -subcheck switch. Ok, OK, They are still illegal. Then how can I vectorize this without if's and without introducing more do loops? Thank you for kind replies in the past and for the new replies I get. Hugh SONG