Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

Stack Overflow and FORALL

ScottBoyce
Beginner
646 Views

I have a simulation software that I am part of the development which runs a variety of different model inputs. For one of the model inputs triggers a stackoverflow crash that only occurs in debug mode. Below is what is printed to the command prompt and I have attached an image of what pops up when I run debug within VS. (I apologize for deleting the information pertaining the specific files.)

######################################################

forrtl: severe (170): Program Exception - stack overflow

Image              PC           Routine    Line      Source

PROG_Debug   0000000141A3CB77 

PROG_Debug   00000001405ED7D0 

PROG_Debug   00000001400C4C4A

PROG_Debug   0000000141815D36 

PROG_Debug   0000000141ABA386  Unknown      Unknown  Unknown

PROG_Debug   0000000141A3D1FC  Unknown      Unknown  Unknown

PROG_Debug   0000000141A3D33E  Unknown      Unknown  Unknown

kernel32.dll 00000000770959ED  Unknown      Unknown  Unknown

ntdll.dll    00000000771CC541  Unknown      Unknown  Unknown

######################################################

Looking at the line numbers for the code it crashes on the following FORALL statement

         FORALL(I=1:NROW,J=1:NCOL,K=1:NLAY,ILOC(J,I,K).NE.0)
     +     BUFF(J,I,K)=BUFF(J,I,K)/( DR(J)*DC(I)*(BTM(J,I,LM(K)-1)-BTM(J,I,LM(K))) )

(Note that in this run NROW=150, NCOL=150, NLAY=6, so they are not big arrays and the LM index pointer array is correct)

The indexing is fine and all the variables are fine (used in other parts of the code). When I run the code on release it does not crash, but the variable BUFF is dumped to a file after that FORALL, but that happens as if the FORALL acts like a RETURN statement.

When I change the FORALL to a DO CONCURRENT as follows:

         DO CONCURRENT (I=1:NROW,J=1:NCOL,K=1:NLAY,ILOC(J,I,K).NE.0)
          BUFF(J,I,K)=BUFF(J,I,K)/( DR(J)*DC(I)*(BTM(J,I,LM(K)-1)-BTM(J,I,LM(K))) )
         END DO

The code in debug mode behaves as expected. Is this a bug, or am I missing something with regards to FORALL statements. Should I go through my code and clean out the FORALL in favor of DO CONCURRENT.

Thanks as always.

 

 

0 Kudos
5 Replies
ScottBoyce
Beginner
646 Views

Correction: DO CONCURRENT crashes on release, but not on debug. I am assuming its at the same location because the program runs when I comment out both the DO CONCURRENT and FORALL. The DO CONCURRENT on release gives the following error:

forrtl: error (65): floating invalid
Image              PC                Routine            Line        Source
PROG_x64.exe    000000013FCB045A  Unknown               Unknown  Unknown
PROG_x64.exe    000000013FB815AF  Unknown               Unknown  Unknown
PROG_x64.exe    0000000140049858  Unknown               Unknown  Unknown
PROG_x64.exe    00000001401547C6  Unknown               Unknown  Unknown
PROG_x64.exe    0000000140138548  Unknown               Unknown  Unknown
kernel32.dll       00000000770959ED  Unknown               Unknown  Unknown
ntdll.dll          00000000771CC541  Unknown               Unknown  Unknown

 

However the following code runs fine on both debug and release:

         DO I=1,NROW
         DO J=1,NCOL
         DO K=1,NLAY
           IF(ILOC(J,I,K).NE.0) THEN
             BUFF(J,I,K)=BUFF(J,I,K)/( DR(J)*DC(I)*(BTM(J,I,LM(K)-1)-BTM(J,I,LM(K))) )
          END IF
         END DO
         END DO
         END DO

 

and produces the correct result to the output file.

 

Also I realized that error image I uploaded before did not upload correctly. It will work, you just have to add a jpg extension. I reattached it here, so this is the error I get with the FORALL and debug mode running through VS:

 

Error.jpg

0 Kudos
Steven_L_Intel1
Employee
646 Views

Stack overflow is pretty simple. Either raise the stack reserve limit in the Linker properties (default is 1MB), or compile with /heap-arrays (Fortran > Optimization > Heap Arrays > 0)

Floating invalid is also pretty simple. Without seeing an actual test case, it's hard to speculate further.

0 Kudos
ScottBoyce
Beginner
646 Views

The reason I think its a bug is that the stack overflow does not occur for release, but instead the code does not even run. Also when I changed the code to a series of DO loops and if statement the stack is fine. So why would there be an overflow for identical code in a FORALL, a floating point error with a DO CONCURRENT, and the code runs fine with a double DO and IF statements.

0 Kudos
Steven_L_Intel1
Employee
646 Views

Please provide a test case we can investigate.

0 Kudos
ScottBoyce
Beginner
646 Views

Here is a simple program at triggers the error when I run it in debug mode in Visual Studio 2012. I was not able to recreate the floating point error I got with the DO CONCURRENT and release mode. The first part of the code is just setup and the initial values in BUFF are just random numbers so its not doing a 0/1 case.

 

[fortran]

      PROGRAM LOOP_EVAL

      IMPLICIT NONE

      INTEGER::NROW,NCOL,NLAY

      INTEGER,DIMENSION(:,:,:),POINTER,CONTIGUOUS::ILOC

      DOUBLE PRECISION,DIMENSION(:,:,:),POINTER,CONTIGUOUS::BUFF,BTM

      DOUBLE PRECISION,DIMENSION(:),    POINTER,CONTIGUOUS::DR,DC,LM

      REAL,DIMENSION(150,150,10)::TEMP

      INTEGER:: I,J,K

      !

      !##########################################################

      !SET UP PARAMETERS

      NROW=150

      NCOL=150

      NLAY=10

      !

      ALLOCATE(BUFF(NROW,NCOL,NLAY),ILOC(NROW,NCOL,NLAY))

      ALLOCATE(DR(NCOL),DC(NROW),BTM(NROW,NCOL,0:NLAY),LM(NLAY))

      !

      CALL RANDOM_NUMBER(TEMP)

      WHERE(TEMP>0.3)       !JUST USED TO POPULATE ILOC.NE.0

        ILOC=1

      ELSEWHERE

        ILOC=0

      END WHERE

      !

      DR=200D0

      DC=100D0

      !

      BTM(:,:,0)=0D0

      DO I=1,NLAY

        LM(I)=I

        BTM(:,:,LM(I))=-100D0*DBLE(I)

      END DO

      !

      CALL RANDOM_NUMBER(TEMP)

      BUFF=DBLE(TEMP+0.1)*100

      !

      !##########################################################

      DO I=1,NROW                                               !WORKS FINE

      DO J=1,NCOL

      DO K=1,NLAY

          IF (ILOC(I,J,K).NE.0) THEN

             BUFF(I,J,K)=BUFF(I,J,K)/( DR(J)*DC(I)

     +                    *(BTM(I,J,LM(K)-1)-BTM(I,J,LM(K))) )

          ELSE

              BUFF(I,J,K)=0D0

          END IF

      END DO

      END DO

      END DO

      !

      !##########################################################

      BUFF=DBLE(TEMP+0.1)*100                                      !RESET BUFF FOR NEXT TEST

      !

      DO CONCURRENT (I=1:NROW,J=1:NCOL,K=1:NLAY,ILOC(I,J,K).NE.0)  !UNABLE TO CAUSE FLOATING POINT ERROR WITH RLS AS WAS SEEN IN ORIGINAL CODE

          BUFF(I,J,K)=BUFF(I,J,K)/( DR(J)*DC(I)

     +                    *(BTM(I,J,LM(K)-1)-BTM(I,J,LM(K))) )

      END DO

      DO CONCURRENT (I=1:NROW,J=1:NCOL,K=1:NLAY,ILOC(I,J,K).EQ.0)  !UNABLE TO CAUSE FLOATING POINT ERROR WITH RLS  

          BUFF(I,J,K)=0D0

      END DO

      !

      !##########################################################

      BUFF=DBLE(TEMP+0.1)*100                                      !RESET BUFF FOR NEXT TEST

      !

      WHERE(ILOC.EQ.0) BUFF=0D0                           !CAUSES ASSERTION FAILURE WHEN RUNNING DEBUG MODE IN VISUAL STUDIO

      FORALL(I=1:NROW,J=1:NCOL,K=1:NLAY,ILOC(I,J,K).NE.0) !IF WHERE IS COMMENTED THE FOLLOWING STILL CAUSES ASSERTION FAILURE

          BUFF(I,J,K)=BUFF(I,J,K)/( DR(J)*DC(I)

     +                    *(BTM(I,J,LM(K)-1)-BTM(I,J,LM(K))) )

      END FORALL

      !

      !##########################################################

      !

      END PROGRAM

 

[/fortran]

 

0 Kudos
Reply