That’s what I think.

-Mei

From: Roy Ju [mailto:roy_dc...@yahoo.com]
Sent: Thursday, January 27, 2011 3:09 PM
To: open64-devel@lists.sourceforge.net; Ye, Mei
Subject: Re: [Open64-devel] Fortran parameter no-alias rule?

Does this mean that 416.gamess violates the Fortran param no aliasing rule?

Roy

--- On Thu, 1/27/11, Ye, Mei <mei...@amd.com> wrote:

From: Ye, Mei <mei...@amd.com>
Subject: [Open64-devel] Fortran parameter no-alias rule?
To: "open64-devel@lists.sourceforge.net" <open64-devel@lists.sourceforge.net>
Date: Thursday, January 27, 2011, 10:11 AM

Hello,



I am seeking your opinion on what is the best way to solve a problem that I 
observed.



Compiler assumes that formal parameters based on different symbols in Fortran 
programs are not aliased.  This leads to a runtime error for CPU2006 416.gamess 
when "-Ofast -LNO:fusion=2" is used.



In the following code snippet, formal parameter array "D" and "DO" in 
subroutine “SYMTRD” have the same storage as their corresponding actual 
parameter "X(I40)".  Therefore the read of "D" in the 1st loop must alias with 
the write of "DO" in the 2nd loop.  When the two outermost loops are fused 
together, we got incorrect results.



In summary, the Fortran parameter no-alias rule makes loop transformations 
illegal.



For legality concern, we could rely on interprocedual analysis to track whether 
formal parameters have the same base.  But compiler analysis tends to be 
conservative and therefore could hurt performance.  It might not always be 
feasible to implement "copy-in copy-out" which may hurt performance as well.



Will that be reasonable to treat this as an user error?



Code snippet:

callsite:

CALL SYMTRD(X(I30),X(I40),X(I10),X(I40),X(I60),IA,L1,L1)



callee:

SUBROUTINE SYMTRD(SH,D,DT,DO,DOD,IA,N,NDIM)

 DIMENSION SH(*),D(*),DT(NDIM,*),DO(*),DOD(*),IA(*)

  ......

  DO 140 I = 1,N

         DO 120 J = 1,N

            DTEMP = ZERO

            DO 100 K = 1,N

               IK = IA(I)+K

               IF (I .LT. K) IK = IA(K)+I

               JK = IA(J)+K

               IF (J .LT. K) JK = IA(K)+J

               DTEMP = DTEMP+SH(IK)*D(JK)   // read of D

  100       CONTINUE

            DT(I,J) = DTEMP

  120    CONTINUE

  140 CONTINUE



      IJ = 0

      DO 200 I = 1,N

         DO 180 J = 1,I

            IJ = IJ+1

            DTEMP = ZERO

            DO 160 K = 1,N

               JK = IA(J)+K

               IF (J .LT. K) JK = IA(K)+J

               DTEMP = DTEMP+DT(I,K)*SH(JK)

  160       CONTINUE

            DO(IJ) = DTEMP                 // write of DO

  180    CONTINUE

  200 CONTINUE



-Mei Ye

-----Inline Attachment Follows-----
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires
February 28th, so secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsight-sfd2d

-----Inline Attachment Follows-----
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net<http://us.mc1620.mail.yahoo.com/mc/compose?to=Open64-devel@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/open64-devel


------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires 
February 28th, so secure your free ArcSight Logger TODAY! 
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to