0

書き込まれるファイルの数は、常にスレッドの数よりも少なくなります。論理的には、4 つのスレッドを使用でき、CPU が 400% で動作している場合、ファイルの数は 4 になると予想していました (各スレッドに 1 つずつ対応)。私のコードに問題があるのか​​、それともこれが本来の動作なのかはわかりません。コードは次のとおりです。

     !!!!!!!! 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 で警告やエラーなしで正常にコンパイルおよび実行されます。コメントや提案をありがとう。

4

1 に答える 1

0

すべてのスレッドが変数の独自のコピーを持つようにするには、変数IXDを明示的にプライベートとして宣言する必要があります。行の変更

   !$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()

問題を解決します。

于 2013-03-15T09:53:32.943 に答える