2013-03-13 29 views
0

我有一段與串行編譯和執行完美配合的實驗代碼。當我在ifort(在Ubuntu上)上用openmp選項編譯它時,編譯進行得很好,但執行突然停止。代碼如下:fortran90中的數組和子程序幫助

!!!!!!!! module 
module array 
implicit none 
    real(kind=8),allocatable :: y(:) 
end module array 

module nonarray 
implicit none 
real(kind=8):: aa 
end module nonarray 

use nonarray; use array 
implicit none 
integer(kind=8):: iter,i 
integer(kind=8),parameter:: id=1 
real(kind=8),allocatable:: yt(:) 

allocate(y(id)); allocate(yt(id)); y=0.d0; yt=0.d0 

aa=4.d0 !!A SYSTEM PARAMETER 

!$OMP PARALLEL PRIVATE(y,yt,iter,i) 
!$OMP DO 

    loop1: do iter=1,20 !! THE INITIAL CONDITION LOOP 
    call random_number(y)!! RANDOM INITIALIZATION OF THE VARIABLE 

     loop2: do i=1,10000 !! ITERATION OF THE SYSTEM 
     call evolve(yt) 
     y=yt 
     enddo loop2  !! END OF SYSTEM ITERATION 

    write(1,*)aa,yt 

    enddo loop1 !!INITIAL CONDITION ITERATION DONE 

!$OMP ENDDO 
!$OMP END PARALLEL 
stop 
end 

recursive subroutine evolve(yevl) 
use nonarray; use array 
implicit none 
integer(kind=8),parameter:: id=1 
real(kind=8):: xf 
real(kind=8),intent(out):: yevl(id) 

    xf=aa*y(1)*(1.d0-y(1)) 
    yevl(1)=xf 

end subroutine evolve 

編譯我用下面的命令: ifort -openmp -fpp test.f90

test.f90是程序的名稱。 任何建議或幫助,高度讚賞。

回答

0

我不是一個OMP的專家,但我認爲,如果子程序evolve應該看到一個不同的(私人)y在每個線程,則應該從並行代碼塊的子程序中直接通過它,而不是從導入它的外部模塊:

module common 
    use iso_fortran_env 
    implicit none 

    integer, parameter :: dp = real64 
    real(dp) :: aa 

contains 

    subroutine evolve(y, yevl) 
    implicit none 
    real(dp), intent(in) :: y(:) 
    real(dp), intent(out):: yevl(:) 

    yevl(1) = aa * y(1) * (1.0_dp - y(1)) 

    end subroutine evolve 

end module common 


program test 
    use common 
    implicit none 

    integer :: iter, i 
    real(dp), allocatable :: yt(:), y(:) 

    allocate(yt(1), y(1)) 
    y(:) = 0.0_dp 
    yt(:) = 0.0_dp 
    aa = 4.0_dp 

    !$OMP PARALLEL DO PRIVATE(y,yt,iter,i) 
    loop1: do iter = 1, 20 
    call random_number(y) 
    loop2: do i = 1, 10000 
     call evolve(y, yt) 
     y = yt 
    end do loop2 
    write(*,*) aa, yt 
    end do loop1 
    !$OMP END PARALLEL DO 

end program test 

只是一個額外的警告:以上各種編譯工作的代碼(nagfor 5.3.1,4.6.3 gfortran,ifort 13.0.1),但與ifort 12.1.6。所以,雖然我看不出任何明顯的問題,但我可能已經搞砸了一些東西。

+0

非常感謝您的評論。問題與您的建議完全相同。代碼運行良好。我會看到還有什麼其他問題出現(如果他們顯示出來的話)並且保持這個討論主題更新。此外,也許我對ifort12.1.6的問題有了一個想法。舊版本缺少一些我認爲可分配數組的特性(儘管我可以通過閱讀不同的論壇來理解),問題源於此。我只是將我的版本更新到ifort 13.1.0,它似乎運行良好。再次感謝你的回答。這是一個很大的幫助。 – legol18 2013-03-14 10:28:57

+0

根據Stackoverflow的習慣,你不應該在這個線程中討論更多(不同的)問題。每個線程通常只包含一個問題。如果你認爲這個問題已經完全回答了任何答案,你應該考慮在某個時候接受它作爲最終答案。如果你遇到其他問題,你應該把它作爲一個單獨的問題。有關詳細信息,請參閱[Stackoverflow FAQ](http://stackoverflow.com/faq)。 – 2013-03-14 10:43:35