我刚刚用 ifort 和 openmp 运行了你的代码,它喷出了 0d0。我不得不手动退出执行。你的预期输出是什么?我不喜欢不必要地动态分配数组。您知道要将矩阵分配为什么,因此只需制作参数并静态执行即可。我会弄乱一些东西,并在一些内容中编辑此回复。
好的,这是我的编辑:
program main
implicit none
integer :: l, j
integer, parameter :: lmax = 15e3
integer, parameter :: jmax = 25
integer, parameter :: nk = 300
complex*16, dimension(9*nk) :: x0, xin, xout
complex*16, dimension(lmax) :: e_pump, e_probe
complex*16 :: e_pumphlp, e_probehlp
character*25 :: problemtype
real*8 :: m
! OpenMP variables
integer :: myid, nthreads, omp_get_num_threads, omp_get_thread_num
x0 = 0.0d0
problemtype = 'type1'
if (problemtype .ne. 'type1') then
write(*,*) 'Problem type not specified. Quitting'
stop
else
! Spawn a parallel region explicitly scoping all variables
!$omp parallel
myid = omp_get_thread_num()
if (myid .eq. 0) then
nthreads = omp_get_num_threads()
write(*,*) 'Starting program with', nthreads, 'threads'
endif
!$omp do private(j,l,m,e_pumphlp,e_probehlp,e_pump,e_probe)
do j = 1, jmax - 1
do l = 1, lmax
call electricfield(0.0d0, 0.0d0, e_pumphlp, &
e_probehlp, 0.0d0)
! print *, e_pumphlp, e_probehlp
e_pump(l) = e_pumphlp
e_probe(l) = e_probehlp
print *, e_pump(l), e_probe(l)
end do
end do
!$omp end parallel
end if
end program main
请注意,我删除了您对模块的使用,因为它是不必要的。您有一个包含子例程的外部模块,因此只需将其设为外部子例程即可。另外,我将您的矩阵更改为静态分配。case 语句是 if 语句的一个花哨且昂贵的版本。你是 15e3*25 次而不是一次(昂贵),所以我把它们移到外面。我更改了 OpenMP 调用,但只是在语义上。我给了你一些输出,以便你知道 OpenMP 实际在做什么。
这是新的子程序:
subroutine electricfield(t, tdelay, e_pump, e_probe, phase)
implicit none
real*8, intent(in) :: t, tdelay
complex*16, intent(out) :: e_pump, e_probe
real*8, optional, intent (in) :: phase
e_pump = 0.0d0
e_probe = 0.0d0
return
end subroutine electricfield
我刚刚删除了它周围的模块外壳并更改了一些变量名。Fortran 不区分大小写,所以不要用大写字母和自始至终重复它来折磨自己。
我编译了这个
ifort -o diffeq diffeq.f90 电场.f90 -openmp
并与
./diffeq > 输出
捕捉程序呕吐 0 并查看我使用了多少线程:
(0.000000000000000000000E + 000,0.000000000000000000000000000000 0.000000000000000E + 000)(+ 0.000000000000000E + 000,0.000000000000000E 000)(+ 0.000000000000000E + 000,0.000000000000000E 000)(+ 0.000000000000000E + 000,0.000000000000000E 000)(+ 0.000000000000000E + 000,0.000000000000000E 000)( 0.000000000000000E+000,0.000000000000000E+000)
32线程启动程序
(0.000000000000000000000E + 000,0.000000000000000000000000000000 0.000000000000000E+000) (0.000000000000000E+000,0.000000000000000E+000)
希望这可以帮助!