MacOS (High Sierra) with intel compiler version 19.0.2.184 Build 20190117
I checked the documentation. I either missed a limitation or it might be a bug. I know OMP reduction of arrays have evolved, so maybe I missed something. Any feedback is greatly appreciated.
Thanks,
Roy
I could not get the file uploader to work, so here is "test_hcore.F":
C Test example to demonstrate problem with subroutine hcore using C an allocated array with reduction in an openmp parallel section. C This does not reproduce the crash observed in our code, but does C demonstrate a genuine problem. C C Compilation command: C ifort -O3 test_hcore.F -qopenmp -o test_hcore.exe C C Expected results: C ENUCLR = 5*NUMAT*(NUMAT-1)/2 C DBLKH(I) = (NUMAT-1) for all values of I C C Problem: For macos10 (High Sierra) with intel compiler version 19.0.2.184 Build 20190117 C the final elements of DBLKH are zero. The problem likely existed in the 2018 intel compiler. C C This test works as expected for other compilers, including C macos10 (El Capitan) with intel compiler version 15.0.1.108 Build 20141022. C It also works if DBLKH is statically allocated or passed in as a dummy argument, C or if openmp is not used. C PROGRAM TEST IMPLICIT REAL*8 (A-H,O-Z) INTEGER, PARAMETER :: NUMAT=5 DIMENSION NFIRST(NUMAT),NLAST(NUMAT),IBAND(NUMAT),NBAND(NUMAT) DIMENSION E1B(45),E2A(45) ALLOCATABLE :: DBLKH(:) C C EXPLICITLY FILL IN NECESSARY ARRAYS C DO I=1,NUMAT NFIRST(I) = (I-1)*4+1 NLAST(I) = I*4 IBAND(I) = (I-1)*10+1 NBAND(I) = 10 ENDDO !I NDSIZE = 10*NUMAT C ALLOCATE( DBLKH(NDSIZE), STAT=IORR ) IF( IORR.NE.0 ) STOP ENUCLR = 0D0 DBLKH = 0D0 C C$OMP PARALLEL DO SCHEDULE(AUTO) C$OMP& PRIVATE(II,JJ,IA,IB,N1,IBND,ILEN,JA,JB,N2,JBND,JLEN) C$OMP& PRIVATE(E1B,E2A,ENUC) C$OMP& REDUCTION(+:ENUCLR,DBLKH) DO II=2,NUMAT IA = NFIRST(II) IB = NLAST(II) N1 = IB-IA+1 IBND = IBAND(II) ILEN = NBAND(II) DO JJ=1,II-1 JA = NFIRST(JJ) JB = NLAST(JJ) N2 = JB-JA+1 JBND = IBAND(JJ) JLEN = NBAND(JJ) C C REPLACE CALL TO INTEGRALS WITH ARBITRARY FILL VALUES C E1B = 1.D0 E2A = 1.D0 ENUC = 5.D0 C C INCLUDE THE ELECTRON-NUCLEAR ATTRACTION TERMS FOR ATOMS II, THEN JJ (E1B, E2A) C AND THE NUCLEAR-NUCLEAR TERM ENUC. C IF( ILEN.GT.0 )CALL VECADD(ILEN,DBLKH(IBND),E1B,DBLKH(IBND)) IF( JLEN.GT.0 )CALL VECADD(JLEN,DBLKH(JBND),E2A,DBLKH(JBND)) ENUCLR = ENUCLR + ENUC ENDDO !JJ ENDDO !II C$OMP END PARALLEL DO C C PRINT RESULT C WRITE(6,*) 'PRINT DBLKH AT END',ENUCLR WRITE(6,'(6F12.6)') (DBLKH(I),I=1,NDSIZE) WRITE(6,*) 'EXPECTED RESULTS',5.D0*DBLE(NUMAT*(NUMAT-1)/2) WRITE(6,'(6F12.6)') (DBLE(NUMAT-1),I=1,NDSIZE) END C**********************************************************************+ SUBROUTINE VECADD ( N, A, B, C ) IMPLICIT REAL*8 (A-H,O-Z) INTEGER, INTENT(IN) :: N REAL*8, INTENT(IN) :: A(N),B(N) REAL*8, INTENT(OUT) :: C(N) C----------------------------------------------------------------------+ C ADD COMPONENTS OF TWO VECTORS TO PRODUCE A THIRD VECTOR C C(I) = A(I) + B(I) C----------------------------------------------------------------------+ DO I=1,N C(I) = A(I) + B(I) ENDDO !I END Output:
PRINT DBLKH AT END 50.0000000000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000
EXPECTED RESULTS 50.0000000000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000 4.000000 4.000000 4.000000 4.000000
4.000000 4.000000