使用O3优化时,我的fortran代码存在问题:为数组的范数计算的值在有和没有O3的情况下会发生变化,而对于O3则不正确。以下显示了我的代码的最小示例
program main
use wavefunction
implicit none
integer(I4B) :: Na, Nb, Npes
complex(DPC), ALLOCATABLE, DIMENSION(:,:,:) :: phi
real(DP), ALLOCATABLE, DIMENSION(:) :: normPerPes1
real(DP) :: sigma
integer(I4B) :: i,j
Na=100
Nb=100
Npes=4
ALLOCATE(phi(Na,Nb,Npes), normPerPes1(Npes))
sigma=10
phi=(0.D0,0.D0)
do i=1,Na
do j=1,Nb
!gaussian on pes 1
phi(i,j,1)=1.D0/(sigma**2*2.D0*pi)*exp(-(dble(i-50)**2+dble(j-50)**2/(2.D0*sigma**2))
end do
end do
!total norm
write(*,*) norm(Na,Nb,Npes,phi)
!norm on each pes
CALL normPerPes(Na,Nb,Npes,phi,NormPerPes1)
write(*,*) NormPerPes1
end program main
使用以下模块
module wavefunction
use nrtype
implicit none
contains
function norm(Na,Nb,Npes, phi)
implicit none
INTEGER(I4B), INTENT(IN) :: Na, Nb, Npes
COMPLEX(DPC), INTENT(IN) :: phi(Na,Nb,Npes)
REAL(DP) :: norm
INTEGER(I4B) :: i,j, pesNr
norm=0.D0
do i=1,Na
do j=1,Nb
do pesNr=1, Npes
norm=norm+abs(phi(i,j,pesNr))**2
end do
end do
end do
end function norm
!----------------------------------------------------------
subroutine normPerPes(Na, Nb, Npes, phi, normPerPes1)
IMPLICIT none
REAL(DP) :: normPerPes1(Npes)
INTEGER(I4B), INTENT(IN) :: Na, Nb, Npes
COMPLEX(DPC), INTENT(IN) :: phi(Na,Nb,Npes)
INTEGER(I4B):: i,j,pesNr
normPerPes1=0.0d0
do i=1,Na
do j=1,Nb
do pesNr=1,Npes
normPerPes1(pesNr)=normPerPes1(pesNr)+abs(phi(i,j,pesNr))**2
end do
end do
end do
return
end subroutine normPerPes
!-----------------------------------------------------------
end module wavefunction
如果我使用以下Makefile编译
# compiler
FC = ifort
# flags
FFLAGS = # -O3
main: main.o nrtype.o wavefunction.o
main.o: main.f90 nrtype.o wavefunction.o
wavefunction.o: wavefunction.f90 nrtype.o
nrtype.o: nrtype.f90
%: %.o
$(FC) $(FFLAGS) -o dynamic $^ $(LDFLAGS)
%.o: %.f90
$(FC) $(FFLAGS) -c $<
clean:
rm -f *.o *.mod *_genmod.f90
我得到以下正确的输出:
7.957747154568253E-004
7.957747154568242E-004 0.000000000000000E + 000 0.000000000000000E + 000 0.000000000000000E + 000
但是,如果我使用O3,那么我会得到以下不正确的结果
7.957747154568253E-004
1.989436788642788E-004 0.000000000000000E + 000 0.000000000000000E + 000 0.000000000000000E + 000
这对我来说,因为我的代码中有一些严重的东西,但我似乎无法找到问题。谢谢您的帮助!
答案 0 :(得分:1)
正如英特尔(见https://software.intel.com/en-us/forums/topic/516819)所证实的,这是使用的编译器版本的问题(Composer XE 2013 SP1初始版本(pkg.080))。 他们声称升级到Update 2或3有帮助 - 我还没能尝试。 平均而言,解决方法是忘记O3并使用O2优化。