1

シリアルコンパイルと実行で完全に機能する実験的なコードがあります。ifort(ubuntu)でopenmpオプションを使用してコンパイルすると、コンパイルは正常に実行されますが、実行が突然停止します。コードは次のとおりです。

!!!!!!!! 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-fpptest.f90

test.f90はプログラムの名前です。どんな提案や助けも大歓迎です。

4

1 に答える 1

1

私は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、gfortran 4.6.3、ifort 13.0.1)で機能しましたが、ifort12.1.6では機能しませんでした。ですから、明らかな問題は見当たりませんが、何かを台無しにしたのかもしれません。

于 2013-03-13T20:57:14.213 に答える