user1509376
user1509376

Reputation: 41

Strange gfortran compilation error when adding Openmp directives

I have legacy fortran source file named pot.f, which I need to apply OpenMP to parallel as shown below,but I can error messages about unexpected end state etc. But when I comment out $OMP lines by adding additional ! in the first column, there are not errors.

It is really weird to me. Can anybody tell me what went wrong?

subroutine pot_osc(rvp,R_pot,e_pot,pe_pot,ftmp,gtmp,vtmp,natoms)
   implicit none
   include 'sizes.h'
   include 'constants.h'
   include 'omp_lib.h'

   double precision  ftmp(maxatoms,3),gtmp(3),R_pot(maxatoms,3)

   !$OMP PARALLEL WORKSHARE  SHARED(gtmp,ftmp)
   !$OMP PARALLEL NUM_THREADS(16)
      gtmp = 0d0
      ftmp = 0d0
   !$OMP END PARALLEL WORKSHARE 
   return
end

subroutine pot_asym(rvp,vtmp)
   implicit none
   include 'constants.h'  
   return
end

Error messages:

 end
   1

Error: Unexpected END statement at (1)


  subroutine pot_asym(rvp,vtmp)
  1
Error: Unclassifiable statement at (1)

Upvotes: 3

Views: 2516

Answers (1)

Alexander Vogt
Alexander Vogt

Reputation: 18118

You start a second parallel section in the second OpenMP directive, which is not terminated by an end parallel. So the OpenMP directive should read

!$OMP PARALLEL WORKSHARE SHARED(gtmp,ftmp) NUM_THREADS(16)
       gtmp = 0d0
       ftmp = 0d0
!$OMP END PARALLEL WORKSHARE

or if you like to keep the line break use

!$OMP PARALLEL WORKSHARE SHARED(gtmp,ftmp) &
!$OMP NUM_THREADS(16)
       gtmp = 0d0
       ftmp = 0d0
!$OMP END PARALLEL WORKSHARE

In the past, I experienced some problems with exactly this kind of initialization. It seems that when compiled with gfortran the master thread did all the work. Even worse, by means of the "first-stouch principle", the whole array was located in the memory associated with the first thread. On our CCNUMA machine this lead to a huge slowdown.

To solve this I used explicit loops to initialize:

!$OMP PARALLEL DO SHARED(gtmp,ftmp) NUM_THREADS(16)
       do i=1,maxatoms
         ftmp(i,:) = 0d0
       enddo
!$OMP END PARALLEL DO
!      No need to do three elements in parallel
       gtmp = 0d0

I don't know whether they fixed this problem, but I use this way of initialization for arrays in shared memory since then.

Upvotes: 6

Related Questions