[Bug fortran/82495] New: forall is very slow comparing to other compilers!

chinoune.mehdi at hotmail dot com gcc-bugzilla@gcc.gnu.org
Mon Oct 9 15:37:00 GMT 2017


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82495

            Bug ID: 82495
           Summary: forall is very slow comparing to other compilers!
           Product: gcc
           Version: 7.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: chinoune.mehdi at hotmail dot com
  Target Milestone: ---

This forall construct is very slow comparing to other compilers:

PROGRAM FORALL_EXECUTION
  IMPLICIT NONE

  REAL, ALLOCATABLE :: A(:,:,:), B(:,:,:), C(:,:,:)
  INTEGER :: I, J, K
  REAL :: TIC
  INTEGER :: START, FINISH1, FINISH2, FINISH3, FINISH4, FINISH5, FINISH6
  INTEGER, PARAMETER :: L = 1024, M = 512, N = 512

  ALLOCATE(A(L,M,N), B(L,M,N), C(L,M,N) )
  CALL RANDOM_NUMBER(A)
  CALL RANDOM_NUMBER(B)
  CALL RANDOM_NUMBER(C)

  CALL SYSTEM_CLOCK(START, TIC)

  FORALL(I=1:L, J=1:M, K=1:N)
    C(I,J,K) = A(I,J,K) + B(I,J,K)
  END FORALL

  CALL SYSTEM_CLOCK(FINISH1)
  PRINT*,'I,J,K ',(FINISH1-START)/TIC

  FORALL(I=1:L, K=1:N, J=1:M)
    C(I,J,K) = A(I,J,K) +B(I,J,K)
  END FORALL

  CALL SYSTEM_CLOCK(FINISH2)
  PRINT*,'I,K,J ',(FINISH2-FINISH1)/TIC

  FORALL(J=1:M, I=1:L, K=1:N)
    C(I,J,K) = A(I,J,K) +B(I,J,K)
  END FORALL

  CALL SYSTEM_CLOCK(FINISH3)
  PRINT*,'J,I,K ',(FINISH3-FINISH2)/TIC

  FORALL(J=1:M, K=1:N, I=1:L)
    C(I,J,K) = A(I,J,K) +B(I,J,K)
  END FORALL

  CALL SYSTEM_CLOCK(FINISH4)
  PRINT*,'J,K,I ',(FINISH4-FINISH3)/TIC

  FORALL(K=1:N, I=1:L, J=1:M)
    C(I,J,K) = A(I,J,K) +B(I,J,K)
  END FORALL

  CALL SYSTEM_CLOCK(FINISH5)
  PRINT*,'K,I,J ',(FINISH5-FINISH4)/TIC

  FORALL(K=1:N, J=1:M, I=1:L)
    C(I,J,K) = A(I,J,K) +B(I,J,K)
  END FORALL

  CALL SYSTEM_CLOCK(FINISH6)
  PRINT*,'K,J,I ',(FINISH6-FINISH5)/TIC

END PROGRAM

This program gives:
MinGW 7.2.0 : -Ofast
 I,J,K   0.453000009
 I,K,J   0.531000018
 J,I,K    9.34400082
 J,K,I    14.0630007
 K,I,J    24.0460014
 K,J,I    25.9690018
Ubuntu 7.2.0 : -Ofast
 I,J,K   0.454000026
 I,K,J   0.441000015
 J,I,K    9.14200020
 J,K,I    13.2140007
 K,I,J    22.3860016
 K,J,I    24.7680016

But with other compilers:
PGI Fortran 17.04 : -fast
 I,J,K    0.5161750
 I,K,J    0.3963450
 J,I,K    0.2786350
 J,K,I    0.3162010
 K,I,J    0.3141180
 K,J,I    0.2789040
Flang : -Ofast
 I,J,K    0.4740010
 I,K,J    0.2965370
 J,I,K    0.3045340
 J,K,I    0.4017220
 K,I,J    0.2853640
 K,J,I    0.3081510
Intel Fortran 18.0 : -fast
 I,J,K   0.4370000
 I,K,J   0.3910000
 J,I,K   0.2810000
 J,K,I   0.3600000
 K,I,J   0.3280000
 K,J,I   0.2810000

I think this bug is independent of do-concurrent!


More information about the Gcc-bugs mailing list