FORTRAN90上的OpenMP线程问题?

时间:2013-03-15 09:45:08

标签: openmp fortran90

写入的文件数始终小于线程数。逻辑上对我来说,当我有4个线程并且CPU工作在400%时,我期待文件数为4(每个对应于每个线程一个)。我不知道我的代码是否有问题,或者它是如何工作的。代码如下:

     !!!!!!!! module 
      module common
      use iso_fortran_env
      implicit none
      integer,parameter:: dp=real64
      real(dp):: aa,bb

       contains

      subroutine evolve(y,yevl)
      implicit none
      integer(dp),parameter:: id=2
      real(dp),intent(in):: y(id)
      real(dp),intent(out):: yevl(id)
        yevl(1)=y(2)+1.d0-aa*y(1)**2
        yevl(2)=bb*y(1)
      end subroutine evolve

      end module common

      use common
      implicit none
      integer(dp):: iii,iter,i
      integer(dp),parameter:: id=2
      real(dp),allocatable:: y(:),yt(:)
      integer(dp):: OMP_GET_THREAD_NUM, IXD

       allocate(y(id)); allocate(yt(id)); y=0.d0; yt=0.d0; bb=0.3d0
       !$OMP PARALLEL PRIVATE(iii,iter,y,i,yt) SHARED(bb)
         IXD=OMP_GET_THREAD_NUM()
       !$OMP DO
        do iii=1,20000; print*,iii  !! EXPECTED THREADS TO BE OF 5000 ITERATIONS EACH
          aa=1.d0+dfloat(iii-1)*0.4d0/80000.d0
            loop1: do iter=1,10 !! THE INITIAL CONDITION LOOP
               call random_number(y)!! RANDOM INITIALIZATION OF THE VARIABLE
                loop2: do i=1,70000  !! ITERATION OF THE SYSTEM
                    call evolve(y,yt)
                    y=yt
                enddo loop2     !! END OF SYSTEM ITERATION
              write(IXD+1,*)aa,yt  !!! WRITING FILE CORRESPONDING TO EACH THREAD
            enddo loop1 !!INITIAL CONDITION ITERATION DONE
         enddo
        !$OMP ENDDO
        !$OMP END PARALLEL
        end

这种行为是否会因代码中的某些竞争问题而产生?代码编译并执行得很好,没有任何警告或错误与ubuntu上的ifort版本13.1.0。非常感谢任何意见或建议。

1 个答案:

答案 0 :(得分:0)

变量IXD应明确声明为private,以确保每个线程都有自己的副本。更改行

   !$OMP PARALLEL PRIVATE(iii,iter,y,i,yt) SHARED(bb)
   IXD=OMP_GET_THREAD_NUM()

  !$OMP PARALLEL PRIVATE(iii,iter,y,i,yt,ixd) SHARED(bb)
  IXD=OMP_GET_THREAD_NUM()

解决了这个问题。