2013-03-15 58 views
0

正在寫入的文件數總是少於線程數。在邏輯上,對於我來說,當我有4個線程並且CPU工作在400%時,我期望文件數量爲4(每個對應於每個線程一個)。我不知道我的代碼是否有問題,或者它是如何工作的。代碼如下:FORTRAN90上的OpenMP線程問題?

 !!!!!!!! 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。感謝大家的任何意見或建議。

回答

0

變量IXD應該明確聲明爲private,以確保每個線程都有自己的副本。改變線(S)

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

解決了這個問題。

+0

是的,它的確做到了。非常感謝你的快速見解。完美的作品。我正在考慮一些種族問題,但是這樣做了。 – legol18 2013-03-15 10:25:00